Packages
membrane_core
0.2.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/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.Element
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
}
@type internal_state_t :: map | struct
@type child_t :: {Element.name_t(), pid}
@type children_t :: %{Element.name_t() => pid}
defstruct internal_state: nil,
module: nil,
children: %{},
playback: %Playback{},
pending_pids: MapSet.new(),
terminating?: false
@spec add_child(t, Element.name_t(), pid) :: Type.stateful_try_t(t)
def add_child(%__MODULE__{children: children} = state, child, pid) do
if not Map.has_key?(children, child) do
{:ok, %__MODULE__{state | children: children |> Map.put(child, pid)}}
else
{{:error, {:duplicate_child, child}}, state}
end
end
@spec get_child_pid(t, Element.name_t()) :: Type.try_t(pid)
def get_child_pid(%__MODULE__{children: children}, child) do
with {:ok, pid} <- children[child] |> Bunch.error_if_nil({:unknown_child, child}),
do: {:ok, pid}
end
@spec pop_child(t, Element.name_t()) :: Type.stateful_try_t(pid, 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