Skip to content

Commit ffbb8d9

Browse files
authored
fix: register a sender once when replaceTrack is given its current track (#425)
1 parent ba8ff13 commit ffbb8d9

3 files changed

Lines changed: 32 additions & 2 deletions

File tree

‎webrtc/src/main/java/dev/onvoid/webrtc/client/LocalTrackImpl.java‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import static java.util.Objects.requireNonNull;
2020

2121
import java.util.ArrayList;
22+
import java.util.LinkedHashSet;
2223
import java.util.List;
24+
import java.util.Set;
2325
import java.util.concurrent.CompletableFuture;
2426

2527
import dev.onvoid.webrtc.media.MediaStreamTrack;
@@ -54,7 +56,8 @@ abstract class LocalTrackImpl implements LocalTrack {
5456

5557
// Guarded by this.
5658

57-
private final List<SenderImpl> senders = new ArrayList<>();
59+
/** A sender registers once, however often it is given this track. */
60+
private final Set<SenderImpl> senders = new LinkedHashSet<>();
5861

5962
private final List<Runnable> endedHandlers = new ArrayList<>();
6063

@@ -177,6 +180,10 @@ synchronized void unregister(SenderImpl sender) {
177180
senders.remove(sender);
178181
}
179182

183+
synchronized List<SenderImpl> registeredSenders() {
184+
return new ArrayList<>(senders);
185+
}
186+
180187
/**
181188
* @return true while the native track may be used, which callers check
182189
* under this object's lock.

‎webrtc/src/main/java/dev/onvoid/webrtc/client/SenderImpl.java‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ public CompletableFuture<Void> replaceTrack(LocalTrack replacement) {
113113
if (next != null && !next.register(this)) {
114114
throw new IllegalStateException("The track " + next.id() + " is closed");
115115
}
116+
if (next == track) {
117+
// Already sent, and registered only once.
118+
return;
119+
}
116120

117121
try {
118122
sender.replaceTrack(next == null ? null : next.nativeTrack());
@@ -127,7 +131,7 @@ public CompletableFuture<Void> replaceTrack(LocalTrack replacement) {
127131
LocalTrackImpl previous = track;
128132
track = next;
129133

130-
if (previous != null && previous != next) {
134+
if (previous != null) {
131135
previous.unregister(this);
132136
}
133137
});

‎webrtc/src/test/java/dev/onvoid/webrtc/client/MediaTests.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,25 @@ void closedTrackLeavesEveryPeer() throws Exception {
219219
assertEquals(other, one.track());
220220
}
221221

222+
@Test
223+
void sameTrackRegisteredOnce() throws Exception {
224+
Peer[] peers = pair();
225+
LocalTrackImpl voice = (LocalTrackImpl) rtc.media().customAudio("voice");
226+
Sender sender = peers[0].addTrack(voice);
227+
228+
for (int i = 0; i < 3; i++) {
229+
await(sender.replaceTrack(voice));
230+
}
231+
232+
assertEquals(voice, sender.track());
233+
assertEquals(Collections.singletonList(sender), voice.registeredSenders());
234+
235+
await(sender.remove());
236+
237+
// A removed sender, and its peer, are not kept by the track.
238+
assertTrue(voice.registeredSenders().isEmpty());
239+
}
240+
222241
@Test
223242
void senderConfigured() throws Exception {
224243
Peer[] peers = pair();

0 commit comments

Comments
 (0)