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 Bunch.Type
alias Membrane.{Clock, Element, Pad, Sync}
alias Membrane.Core.{Playback, Timer}
alias Membrane.Core.Child.{PadModel, PadSpecHandler}
alias Membrane.Core.Element.PlaybackBuffer
require Membrane.Pad
@type stateful_t(value) :: Type.stateful_t(value, t)
@type stateful_try_t :: Type.stateful_try_t(t)
@type stateful_try_t(value) :: Type.stateful_try_t(value, t)
@type t :: %__MODULE__{
module: module,
type: Element.type_t(),
name: Element.name_t(),
internal_state: Element.state_t() | nil,
pads: PadModel.pads_t() | nil,
parent_pid: pid,
playback: Playback.t(),
playback_buffer: PlaybackBuffer.t(),
supplying_demand?: boolean(),
delayed_demands: MapSet.t({Pad.ref_t(), :supply | :redemand}),
synchronization: %{
timers: %{Timer.id_t() => Timer.t()},
parent_clock: Clock.t(),
latency: non_neg_integer(),
stream_sync: Sync.t(),
clock: Clock.t() | nil
}
}
defstruct [
:module,
:type,
:name,
:internal_state,
:pads,
:parent_pid,
:playback,
:playback_buffer,
:supplying_demand?,
:delayed_demands,
:synchronization
]
@doc """
Initializes new state.
"""
@spec new(%{
module: module,
name: Element.name_t(),
parent_clock: Clock.t(),
sync: Sync.t(),
parent: pid
}) :: t
def new(options) do
%__MODULE__{
module: options.module,
type: options.module.membrane_element_type(),
name: options.name,
internal_state: nil,
pads: nil,
parent_pid: options.parent,
playback: %Playback{},
playback_buffer: PlaybackBuffer.new(),
supplying_demand?: false,
delayed_demands: MapSet.new(),
synchronization: %{
parent_clock: options.parent_clock,
timers: %{},
clock: nil,
stream_sync: options.sync,
latency: 0
}
}
|> PadSpecHandler.init_pads()
end
end