Packages
membrane_core
0.4.3
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/pipeline/state.ex
defmodule Membrane.Pipeline.State do
@moduledoc false
# Structure representing state of a pipeline. It is a part of the private API.
# It does not represent state of pipelines you construct, it's a state used
# internally in Membrane.
alias Membrane.Core.{Playback, Playbackable}
alias Membrane.{Clock, Element, Sync}
alias Bunch.Type
use Bunch
@derive Playbackable
@type t :: %__MODULE__{
internal_state: internal_state_t | nil,
playback: Playback.t(),
module: module,
children: children_t,
pending_pids: MapSet.t(pid),
terminating?: boolean,
clock_provider: %{
clock: Clock.t() | nil,
provider: Element.name_t() | nil,
choice: :auto | :manual
},
clock_proxy: Clock.t()
}
@type internal_state_t :: map | struct
@type child_data_t :: %{pid: pid, clock: Clock.t(), sync: Sync.t()}
@type children_t :: %{Element.name_t() => child_data_t}
@enforce_keys [:module, :clock_proxy]
defstruct @enforce_keys ++
[
internal_state: nil,
children: %{},
playback: %Playback{},
pending_pids: MapSet.new(),
terminating?: false,
clock_provider: %{clock: nil, provider: nil, choice: :auto}
]
@spec add_child(t, Element.name_t(), pid) :: Type.stateful_try_t(t)
def add_child(%__MODULE__{children: children} = state, child, pid) do
if Map.has_key?(children, child) do
{{:error, {:duplicate_child, child}}, state}
else
{:ok, %__MODULE__{state | children: children |> Map.put(child, pid)}}
end
end
@spec get_child_data(t, Element.name_t()) :: Type.try_t(child_data_t)
def get_child_data(%__MODULE__{children: children}, child) do
children[child] |> Bunch.error_if_nil({:unknown_child, child})
end
@spec pop_child(t, Element.name_t()) :: Type.stateful_try_t(child_data_t, t)
def pop_child(%__MODULE__{children: children} = state, child) do
{pid, children} = children |> Map.pop(child)
with {:ok, pid} <- pid |> Bunch.error_if_nil({:unknown_child, child}) do
state = %__MODULE__{state | children: children}
{{:ok, pid}, state}
end
end
@spec get_children_names(t) :: [Element.name_t()]
def get_children_names(%__MODULE__{children: children}) do
children |> Map.keys()
end
@spec get_children(t) :: children_t
def get_children(%__MODULE__{children: children}) do
children
end
end