Packages
membrane_core
0.12.4
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/sink.ex
defmodule Membrane.Sink do
@moduledoc """
Module defining behaviour for sinks - elements consuming data.
Behaviours for sinks are specified, besides this place, in modules
`Membrane.Element.Base`,
and `Membrane.Element.WithInputPads`.
Sink elements can define only input pads. Job of a usual sink is to receive some
data on such pad and consume it (write to a soundcard, send through TCP etc.).
If the pad has the flow control set to `:manual`, then element is also responsible
for requesting demands when it is able and willing to consume data (for more details,
see `t:Membrane.Element.Action.demand/0`). Sinks, like all elements, can of course
have multiple pads if needed to provide more complex solutions.
"""
alias Membrane.Core.DocsHelper
@doc """
Brings all the stuff necessary to implement a sink element.
Options:
- `:bring_pad?` - if true (default) requires and aliases `Membrane.Pad`
"""
defmacro __using__(options) do
Module.put_attribute(__CALLER__.module, :__membrane_element_type__, :sink)
quote location: :keep do
use Membrane.Element.Base, unquote(options)
use Membrane.Element.WithInputPads
@doc false
@spec membrane_element_type() :: Membrane.Element.type()
def membrane_element_type, do: :sink
@impl true
def handle_buffer(pad, buffer, ctx, state) do
apply(__MODULE__, :handle_write, [pad, buffer, ctx, state])
end
@impl true
def handle_buffers_batch(pad, buffers, ctx, state) do
apply(__MODULE__, :handle_write_list, [pad, buffers, ctx, state])
end
@impl true
def handle_write_list(pad, buffers, ctx, state) do
args_list = buffers |> Enum.map(&[pad, &1])
{[split: {:handle_buffer, args_list}], state}
end
defoverridable handle_buffer: 4,
handle_buffers_batch: 4,
handle_write_list: 4
end
end
DocsHelper.add_callbacks_list_to_moduledoc(
__MODULE__,
[Membrane.Element.Base, Membrane.Element.WithInputPads]
)
end