Packages
membrane_core
0.4.1
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.7
1.2.6
1.2.5
retired
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc1
1.1.2
1.1.1
1.1.0
1.1.0-rc1
1.1.0-rc0
1.0.1
1.0.0
1.0.0-rc1
1.0.0-rc0
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
retired
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Membrane Multimedia Framework (Core)
Current section
Files
Jump to
Current section
Files
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 Membrane.Log, tags: :core
alias Membrane.{Clock, Core, Element, Sync}
alias Core.{Playback, Playbackable, Timer}
alias Core.Element.{PadModel, PadSpecHandler, PlaybackBuffer}
alias Element.Pad
alias Bunch.Type
alias __MODULE__, as: ThisModule
require Pad
use Bunch.Access
@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,
watcher: pid | nil,
controlling_pid: pid | nil,
parent_monitor: reference() | nil,
playback: Playback.t(),
playback_buffer: PlaybackBuffer.t(),
delayed_demands: %{{Pad.ref_t(), :supply | :redemand} => :sync | :async},
synchronization: %{
timers: %{Timer.id_t() => Timer.t()},
pipeline_clock: Clock.t(),
latency: non_neg_integer(),
stream_sync: Sync.t(),
clock: Clock.t() | nil
},
terminating: boolean | :ready
}
defstruct [
:module,
:type,
:name,
:internal_state,
:pads,
:watcher,
:controlling_pid,
:parent_monitor,
:playback,
:playback_buffer,
:delayed_demands,
:synchronization,
:terminating
]
defimpl Playbackable, for: __MODULE__ do
use Playbackable.Default
def get_controlling_pid(%ThisModule{controlling_pid: pid}), do: pid
end
@doc """
Initializes new state.
"""
@spec new(%{
module: module,
name: Element.name_t(),
clock: Clock.t(),
sync: Sync.t(),
parent_monitor: reference()
}) :: t
def new(options) do
%__MODULE__{
module: options.module,
type: apply(options.module, :membrane_element_type, []),
name: options.name,
internal_state: nil,
pads: nil,
watcher: nil,
controlling_pid: nil,
parent_monitor: options[:parent_monitor],
playback: %Playback{},
playback_buffer: PlaybackBuffer.new(),
delayed_demands: %{},
synchronization: %{
pipeline_clock: options.clock,
timers: %{},
clock: nil,
stream_sync: options.sync,
latency: 0
},
terminating: false
}
|> PadSpecHandler.init_pads()
end
end