Current section

Files

Jump to
membrane_core lib membrane core element state.ex
Raw

lib/membrane/core/element/state.ex

defmodule Membrane.Core.Element.State do
@moduledoc false
# Structure representing state of an Core.Element. It is a part of the private API.
# It does not represent state of elements you construct, it's a state used
# internally in Membrane.
use Bunch.Access
alias Membrane.{Clock, Element, Pad, Sync}
alias Membrane.Core.Timer
alias Membrane.Core.Child.{PadModel, PadSpecHandler}
alias Membrane.Core.Element.EffectiveFlowController
require Membrane.Pad
@type t :: %__MODULE__{
module: module,
type: Element.type(),
name: Element.name(),
internal_state: Element.state() | nil,
pads_info: PadModel.pads_info() | nil,
pads_data: PadModel.pads_data() | nil,
parent_pid: pid,
supplying_demand?: boolean(),
delayed_demands: MapSet.t({Pad.ref(), :supply | :redemand}),
handle_demand_loop_counter: non_neg_integer(),
synchronization: %{
timers: %{Timer.id() => Timer.t()},
parent_clock: Clock.t(),
latency: Membrane.Time.non_neg(),
stream_sync: Sync.t(),
clock: Clock.t() | nil
},
initialized?: boolean(),
playback: Membrane.Playback.t(),
playback_queue: Membrane.Core.Element.PlaybackQueue.t(),
resource_guard: Membrane.ResourceGuard.t(),
subprocess_supervisor: pid,
terminating?: boolean(),
setup_incomplete?: boolean(),
effective_flow_control: EffectiveFlowController.effective_flow_control(),
handling_action?: boolean(),
pads_to_snapshot: MapSet.t()
}
defstruct [
:module,
:type,
:name,
:internal_state,
:pads_info,
:pads_data,
:parent_pid,
:supplying_demand?,
:delayed_demands,
:handle_demand_loop_counter,
:synchronization,
:demand_size,
:initialized?,
:playback,
:playback_queue,
:resource_guard,
:subprocess_supervisor,
:terminating?,
:setup_incomplete?,
:effective_flow_control,
:handling_action?,
:pads_to_snapshot
]
@doc """
Initializes new state.
"""
@spec new(%{
module: module,
name: Element.name(),
parent_clock: Clock.t(),
sync: Sync.t(),
parent: pid,
resource_guard: Membrane.ResourceGuard.t(),
subprocess_supervisor: pid()
}) :: t
def new(options) do
%__MODULE__{
module: options.module,
type: options.module.membrane_element_type(),
name: options.name,
internal_state: nil,
parent_pid: options.parent,
supplying_demand?: false,
delayed_demands: MapSet.new(),
handle_demand_loop_counter: 0,
synchronization: %{
parent_clock: options.parent_clock,
timers: %{},
clock: nil,
stream_sync: options.sync,
latency: 0
},
initialized?: false,
playback: :stopped,
playback_queue: [],
resource_guard: options.resource_guard,
subprocess_supervisor: options.subprocess_supervisor,
terminating?: false,
setup_incomplete?: false,
effective_flow_control: :push,
handling_action?: false,
pads_to_snapshot: MapSet.new()
}
|> PadSpecHandler.init_pads()
end
end