Packages
membrane_core
0.3.2
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/element/callback_context.ex
defmodule Membrane.Element.CallbackContext do
@moduledoc """
Parent module for all contexts passed to callbacks.
The idea of context is to provide access to commonly used information without
holding it in elements state. Context differs depending on callback.
"""
alias Membrane.Element.Pad
alias Membrane.Core
alias Core.Element.State
use Bunch
@macrocallback from_state(State.t(), keyword()) :: Macro.t()
defmacro __using__(fields) do
quote do
default_fields_names = [:pads, :playback_state]
fields_names = unquote(fields |> Keyword.keys())
@type t :: %__MODULE__{
unquote_splicing(fields),
pads: %{Pad.ref_t() => Pad.Data.t()},
playback_state: Membrane.Element.playback_state_t()
}
@behaviour unquote(__MODULE__)
@enforce_keys Module.get_attribute(__MODULE__, :enforce_keys)
~> (&1 || fields_names)
|> Bunch.listify()
~> (&1 ++ default_fields_names)
defstruct fields_names ++ default_fields_names
@impl true
defmacro from_state(state, args \\ []) do
quote do
%unquote(__MODULE__){
unquote_splicing(args),
playback_state: unquote(state).playback.state,
pads: unquote(state).pads.data
}
end
end
defoverridable unquote(__MODULE__)
end
end
end