File tree Expand file tree Collapse file tree
main/java/dev/onvoid/webrtc/client
test/java/dev/onvoid/webrtc/client Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1919import static java .util .Objects .requireNonNull ;
2020
2121import java .util .ArrayList ;
22+ import java .util .LinkedHashSet ;
2223import java .util .List ;
24+ import java .util .Set ;
2325import java .util .concurrent .CompletableFuture ;
2426
2527import 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.
Original file line number Diff line number Diff 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 });
Original file line number Diff line number Diff 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 ();
You can’t perform that action at this time.
0 commit comments