Skip to content

Commit af84743

Browse files
committed
Emit track_ended event
1 parent 5f74cfe commit af84743

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

lib/ex_webrtc/peer_connection.ex

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,8 @@ defmodule ExWebRTC.PeerConnection do
441441
if tr.stopping do
442442
{:reply, :ok, state}
443443
else
444-
tr = RTPTransceiver.stop_sending_and_receiving(tr)
444+
on_track_ended = on_track_ended(state.owner, tr.receiver.track.id)
445+
tr = RTPTransceiver.stop_sending_and_receiving(tr, on_track_ended)
445446
transceivers = List.replace_at(state.transceivers, idx, tr)
446447
state = %{state | transceivers: transceivers}
447448
state = update_negotiation_needed(state)
@@ -1026,7 +1027,11 @@ defmodule ExWebRTC.PeerConnection do
10261027

10271028
tr = process_remote_track(tr, direction, owner)
10281029
tr = if sdp_type == :answer, do: %RTPTransceiver{tr | current_direction: direction}, else: tr
1029-
tr = if SDPUtils.is_rejected(mline), do: RTPTransceiver.stop(tr), else: tr
1030+
1031+
tr =
1032+
if SDPUtils.is_rejected(mline),
1033+
do: RTPTransceiver.stop(tr, on_track_ended(owner, tr.receiver.track.id)),
1034+
else: tr
10301035

10311036
case idx do
10321037
nil ->
@@ -1210,5 +1215,7 @@ defmodule ExWebRTC.PeerConnection do
12101215
if ssrc in ssrcs, do: do_generate_ssrc(ssrcs, max_attempts - 1), else: ssrc
12111216
end
12121217

1218+
defp on_track_ended(owner, track_id), do: fn -> notify(owner, {:track_ended, track_id}) end
1219+
12131220
defp notify(pid, msg), do: send(pid, {:ex_webrtc, self(), msg})
12141221
end

lib/ex_webrtc/rtp_transceiver.ex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,22 @@ defmodule ExWebRTC.RTPTransceiver do
162162
%__MODULE__{transceiver | mid: mid, sender: sender}
163163
end
164164

165-
@spec stop(t()) :: t()
166-
def stop(transceiver) do
167-
tr = if transceiver.stopping, do: transceiver, else: stop_sending_and_receiving(transceiver)
165+
@spec stop(t(), (-> term())) :: t()
166+
def stop(transceiver, on_track_ended) do
167+
tr =
168+
if transceiver.stopping,
169+
do: transceiver,
170+
else: stop_sending_and_receiving(transceiver, on_track_ended)
171+
168172
# should we reset stopping or leave it as true?
169173
%__MODULE__{tr | stopped: true, stopping: false, current_direction: nil}
170174
end
171175

172-
@spec stop_sending_and_receiving(t()) :: t()
173-
def stop_sending_and_receiving(transceiver) do
176+
@spec stop_sending_and_receiving(t(), (-> term())) :: t()
177+
def stop_sending_and_receiving(transceiver, on_track_ended) do
174178
# TODO send RTCP BYE for each RTP stream
175179
# TODO stop receiving media
180+
on_track_ended.()
176181
%__MODULE__{transceiver | direction: :inactive, stopping: true}
177182
end
178183

test/ex_webrtc/peer_connection_test.exs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,6 @@ defmodule ExWebRTC.PeerConnectionTest do
446446
describe "stop_transceiver/2" do
447447
test "before the first offer" do
448448
{:ok, pc1} = PeerConnection.start_link()
449-
{:ok, _pc2} = PeerConnection.start_link()
450449
{:ok, tr} = PeerConnection.add_transceiver(pc1, :audio)
451450
:ok = PeerConnection.stop_transceiver(pc1, tr.id)
452451
{:ok, offer} = PeerConnection.create_offer(pc1)
@@ -465,6 +464,10 @@ defmodule ExWebRTC.PeerConnectionTest do
465464

466465
:ok = PeerConnection.stop_transceiver(pc1, tr.id)
467466

467+
assert_receive {:ex_webrtc, ^pc1, :negotiation_needed}
468+
assert_receive {:ex_webrtc, ^pc1, {:track_ended, track_id}}
469+
assert tr.receiver.track.id == track_id
470+
468471
assert [
469472
%RTPTransceiver{
470473
current_direction: :sendonly,
@@ -474,8 +477,6 @@ defmodule ExWebRTC.PeerConnectionTest do
474477
}
475478
] = PeerConnection.get_transceivers(pc1)
476479

477-
assert_receive {:ex_webrtc, ^pc1, :negotiation_needed}
478-
479480
{:ok, offer} = PeerConnection.create_offer(pc1)
480481
:ok = PeerConnection.set_local_description(pc1, offer)
481482

@@ -493,6 +494,8 @@ defmodule ExWebRTC.PeerConnectionTest do
493494
# immediately after setting remote description
494495
:ok = PeerConnection.set_remote_description(pc2, offer)
495496

497+
assert_receive {:ex_webrtc, ^pc2, {:track_ended, _track_id}}
498+
496499
assert [
497500
%RTPTransceiver{
498501
current_direction: nil,

0 commit comments

Comments
 (0)