Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
import static java.util.Objects.requireNonNull;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;

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

// Guarded by this.

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

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

Expand Down Expand Up @@ -177,6 +180,10 @@ synchronized void unregister(SenderImpl sender) {
senders.remove(sender);
}

synchronized List<SenderImpl> registeredSenders() {
return new ArrayList<>(senders);
}

/**
* @return true while the native track may be used, which callers check
* under this object's lock.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ public CompletableFuture<Void> replaceTrack(LocalTrack replacement) {
if (next != null && !next.register(this)) {
throw new IllegalStateException("The track " + next.id() + " is closed");
}
if (next == track) {
// Already sent, and registered only once.
return;
}

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

if (previous != null && previous != next) {
if (previous != null) {
previous.unregister(this);
}
});
Expand Down
19 changes: 19 additions & 0 deletions webrtc/src/test/java/dev/onvoid/webrtc/client/MediaTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,25 @@ void closedTrackLeavesEveryPeer() throws Exception {
assertEquals(other, one.track());
}

@Test
void sameTrackRegisteredOnce() throws Exception {
Peer[] peers = pair();
LocalTrackImpl voice = (LocalTrackImpl) rtc.media().customAudio("voice");
Sender sender = peers[0].addTrack(voice);

for (int i = 0; i < 3; i++) {
await(sender.replaceTrack(voice));
}

assertEquals(voice, sender.track());
assertEquals(Collections.singletonList(sender), voice.registeredSenders());

await(sender.remove());

// A removed sender, and its peer, are not kept by the track.
assertTrue(voice.registeredSenders().isEmpty());
}

@Test
void senderConfigured() throws Exception {
Peer[] peers = pair();
Expand Down
Loading