defmodule Membrane.Element do @moduledoc """ Module containing types and functions for operating on elements. For behaviours for elements check `Membrane.Source`, `Membrane.Filter`, `Membrane.Endpoint` and `Membrane.Sink`. ## Behaviours Element-specific behaviours are specified in modules: - `Membrane.Element.WithOutputPads` - behaviour common to sources, filters and endpoints - `Membrane.Element.WithInputPads` - behaviour common to sinks, filters and endpoints - Base modules (`Membrane.Source`, `Membrane.Filter`, `Membrane.Endpoint`, `Membrane.Sink`) - behaviours specific to each element type. ## Callbacks Modules listed above provide specifications of callbacks that define elements lifecycle. All of these callbacks have names with the `handle_` prefix. They are used to define reaction to certain events that happen during runtime, and indicate what actions framework should undertake as a result, besides executing element-specific code. For actions that can be returned by each callback, see `Membrane.Element.Action` module. """ @typedoc """ Defines options that can be received in `c:Membrane.Element.Base.handle_init/2` callback. """ @type options :: struct | nil @typedoc """ Type that defines an element name by which it is identified. """ @type name :: tuple() | atom() @typedoc """ Defines possible element types: - source, producing buffers - filter, processing buffers - endpoint, producing and consuming buffers - sink, consuming buffers """ @type type :: :source | :filter | :endpoint | :sink @typedoc """ Type of user-managed state of element. """ @type state :: any() @doc """ Checks whether module is an element. """ @spec element?(module) :: boolean def element?(module) do module |> Bunch.Module.check_behaviour(:membrane_element?) end defguard is_element_name?(arg) when is_atom(arg) or is_tuple(arg) end