Current section

Files

Jump to
membrane_rtc_engine lib membrane_rtc_engine endpoint.ex
Raw

lib/membrane_rtc_engine/endpoint.ex

defmodule Membrane.RTC.Engine.Endpoint do
@moduledoc false
use Bunch.Access
alias Membrane.RTC.Engine.Track
@type id() :: any()
@type t :: %__MODULE__{
id: id(),
inbound_tracks: %{Track.id() => Track.t()}
}
defstruct id: nil, inbound_tracks: %{}
@spec new(id :: id(), inbound_tracks :: [Track.t()]) :: t()
def new(id, inbound_tracks) do
inbound_tracks = Map.new(inbound_tracks, &{&1.id, &1})
%__MODULE__{id: id, inbound_tracks: inbound_tracks}
end
@spec get_audio_tracks(endpoint :: t()) :: [Track.t()]
def get_audio_tracks(endpoint),
do: Map.values(endpoint.inbound_tracks) |> Enum.filter(&(&1.type == :audio))
@spec get_video_tracks(endpoint :: t()) :: [Track.t()]
def get_video_tracks(endpoint),
do: Map.values(endpoint.inbound_tracks) |> Enum.filter(&(&1.type == :video))
@spec get_track_by_id(endpoint :: t(), id :: Track.id()) :: Track.t() | nil
def get_track_by_id(endpoint, id), do: endpoint.inbound_tracks[id]
@spec get_tracks(endpoint :: t()) :: [Track.t()]
def get_tracks(endpoint), do: Map.values(endpoint.inbound_tracks)
@spec update_track_metadata(endpoint :: t(), track_id :: Track.id(), metadata :: any()) :: t()
def update_track_metadata(endpoint, track_id, metadata),
do:
update_in(endpoint, [:inbound_tracks, track_id, :metadata], fn _old_metadata -> metadata end)
@spec get_active_track_metadata(endpoint :: t()) :: %{Track.id() => any}
def get_active_track_metadata(%__MODULE__{} = endpoint),
do:
endpoint.inbound_tracks
|> Map.values()
|> Enum.filter(& &1.active?)
|> Map.new(&{&1.id, &1.metadata})
def get_active_track_metadata(_endpoint), do: %{}
@spec update_track_encoding(endpoint :: t(), track_id :: Track.id(), encoding :: atom) :: t()
def update_track_encoding(endpoint, track_id, value),
do: update_in(endpoint.inbound_tracks[track_id], &%Track{&1 | encoding: value})
end