Current section

Files

Jump to
membrane_core lib membrane core bin state.ex
Raw

lib/membrane/core/bin/state.ex

defmodule Membrane.Core.Bin.State do
@moduledoc false
# Structure representing state of a bin. It is a part of the private API.
# It does not represent state of bins you construct, it's a state used
# internally in Membrane.
alias Membrane.{Child, Clock, Parent, Sync}
alias Membrane.Core
alias Core.{Playback, Playbackable, Timer}
alias Core.Child.PadModel
alias Core.Bin.LinkingBuffer
alias Core.Parent.ChildrenModel
alias __MODULE__, as: ThisModule
use Bunch
use Bunch.Access
@type t :: %__MODULE__{
internal_state: Parent.internal_state_t() | nil,
playback: Playback.t(),
module: module,
children: ChildrenModel.children_t(),
pending_pids: MapSet.t(pid),
terminating?: boolean,
name: Membrane.Bin.name_t() | nil,
bin_options: any | nil,
pads: PadModel.pads_t() | nil,
watcher: pid | nil,
controlling_pid: pid | nil,
linking_buffer: LinkingBuffer.t(),
clock_provider: %{
clock: Clock.t() | nil,
provider: Child.name_t() | nil,
choice: :auto | :manual
},
clock_proxy: Clock.t(),
synchronization: %{
timers: %{Timer.id_t() => Timer.t()},
parent_clock: Clock.t(),
latency: non_neg_integer(),
stream_sync: Sync.t(),
clock: Clock.t() | nil
}
}
@type internal_state_t :: map | struct
@enforce_keys [:module, :clock_proxy]
defstruct @enforce_keys ++
[
internal_state: nil,
playback: %Playback{},
children: %{},
pending_pids: MapSet.new(),
terminating?: false,
name: nil,
bin_options: nil,
pads: nil,
watcher: nil,
controlling_pid: nil,
linking_buffer: LinkingBuffer.new(),
clock_provider: %{clock: nil, provider: nil, choice: :auto},
synchronization: %{}
]
defimpl Playbackable, for: __MODULE__ do
use Playbackable.Default
def get_controlling_pid(%ThisModule{controlling_pid: pid}), do: pid
end
end