Current section

Files

Jump to
membrane_core lib membrane core component.ex
Raw

lib/membrane/core/component.ex

defmodule Membrane.Core.Component do
@moduledoc false
@type state ::
Membrane.Core.Pipeline.State.t()
| Membrane.Core.Bin.State.t()
| Membrane.Core.Element.State.t()
@type callback_context_optional_fields ::
Membrane.Core.Element.CallbackContext.optional_fields()
| Membrane.Core.Bin.CallbackContext.optional_fields()
| Membrane.Core.Pipeline.CallbackContext.optional_fields()
@type callback_context ::
Membrane.Element.CallbackContext.t()
| Membrane.Bin.CallbackContext.t()
| Membrane.Pipeline.CallbackContext.t()
@spec action_handler(state) :: module
[Pipeline, Bin, Element]
|> Enum.map(fn component ->
def action_handler(%unquote(Module.concat([Membrane.Core, component, State])){}),
do: unquote(Module.concat([Membrane.Core, component, ActionHandler]))
end)
@spec context_from_state(state(), callback_context_optional_fields()) ::
callback_context()
def context_from_state(state, args \\ []) do
callback_context_module =
case state do
%Membrane.Core.Element.State{} -> Membrane.Core.Element.CallbackContext
%Membrane.Core.Bin.State{} -> Membrane.Core.Bin.CallbackContext
%Membrane.Core.Pipeline.State{} -> Membrane.Core.Pipeline.CallbackContext
end
callback_context_module.from_state(state, args)
end
@spec pipeline?(state) :: boolean()
def pipeline?(%Membrane.Core.Pipeline.State{}), do: true
def pipeline?(_state), do: false
@spec element?(state) :: boolean()
def element?(%Membrane.Core.Element.State{}), do: true
def element?(_state), do: false
@spec bin?(state) :: boolean()
def bin?(%Membrane.Core.Bin.State{}), do: true
def bin?(_state), do: false
@spec child?(state) :: boolean()
def child?(state), do: element?(state) or bin?(state)
@spec parent?(state) :: boolean()
def parent?(state), do: pipeline?(state) or bin?(state)
end