Packages
membrane_core
0.5.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/callback_context.ex
defmodule Membrane.CallbackContext do
@moduledoc """
Parent module for all contexts passed to callbacks.
The idea of context is to provide access to commonly used information without
forcing user to hold it in state. Context differs depending on callback.
"""
alias Membrane.Pad
alias Membrane.Core
alias Core.Element
alias Core.Bin
use Bunch
@macrocallback from_state(Element.State.t() | Bin.State.t(), keyword()) :: Macro.t()
defmacro __using__(fields) do
quote do
default_fields_names = [:pads, :playback_state, :clock, :parent_clock]
fields_names = unquote(fields |> Keyword.keys())
@type t :: %__MODULE__{
unquote_splicing(fields),
pads: %{Pad.ref_t() => Pad.Data.t()},
playback_state: Membrane.PlaybackState.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
state = unquote(state)
%unquote(__MODULE__){
unquote_splicing(args),
playback_state: state.playback.state,
pads: state.pads.data,
clock: state.synchronization.clock,
parent_clock: state.synchronization.parent_clock
}
end
end
defoverridable unquote(__MODULE__)
end
end
end