@impl true
def handle_pad_added(Pad.ref(:output, {_track_id, _rid}) = pad, _ctx, state) do
structure = [
child(:synthesizer_source, %SynthesizerElement{
room_id: state.room_id
})
|> child(:decoder, Membrane.MP3.MAD.Decoder)
|> child(:converter, %Membrane.FFmpeg.SWResample.Converter{
input_stream_format: %Membrane.RawAudio{
channels: 1,
sample_format: :s24le,
sample_rate: 44_100
},
output_stream_format: %Membrane.RawAudio{
channels: 1,
sample_format: :s16le,
sample_rate: 48_000
}
})
|> child(:encoder, %Membrane.Opus.Encoder{
input_stream_format: %Membrane.RawAudio{
channels: 1,
sample_rate: 48_000,
sample_format: :s16le
}
})
|> child(:parser, %Membrane.Opus.Parser{})
|> child(:payloader, %Membrane.RTP.PayloaderBin{
payloader: Membrane.RTP.PayloadFormat.get(state.track.encoding).payloader,
ssrc: state.ssrc,
payload_type: state.payload_type,
clock_rate: state.track.clock_rate
})
|> via_in(Pad.ref(:input, {state.track.id, :high}))
|> child(:track_sender, %TrackSender{track: state.track, variant_bitrates: %{high: 48_000}},
get_if_exists: true
)
|> via_out(pad)
|> bin_output(pad)
]
{[spec: structure], state}
end
@impl true
def handle_pad_added(Pad.ref(:output, {_track_id, _rid}) = pad, _ctx, state) do
structure = [
child(:synthesizer_source, %SynthesizerElement{
room_id: state.room_id
})
|> child(:decoder, Membrane.MP3.MAD.Decoder)
|> child(:converter, %Membrane.FFmpeg.SWResample.Converter{
input_stream_format: %Membrane.RawAudio{
channels: 1,
sample_format: :s24le,
sample_rate: 44_100
},
output_stream_format: %Membrane.RawAudio{
channels: 1,
sample_format: :s16le,
sample_rate: 48_000
}
})
|> child(:encoder, %Membrane.Opus.Encoder{
input_stream_format: %Membrane.RawAudio{
channels: 1,
sample_rate: 48_000,
sample_format: :s16le
}
})
|> child(:parser, %Membrane.Opus.Parser{})
|> child(:payloader, %Membrane.RTP.PayloaderBin{
payloader: Membrane.RTP.PayloadFormat.get(state.track.encoding).payloader,
ssrc: state.ssrc,
payload_type: state.payload_type,
clock_rate: state.track.clock_rate
})
|> via_in(Pad.ref(:input, {state.track.id, :high}))
|> child(:track_sender, %TrackSender{track: state.track, variant_bitrates: %{high: 48_000}},
get_if_exists: true
)
|> via_out(pad)
|> bin_output(pad)
]
{[spec: structure], state}
end