@@ -126,6 +126,18 @@ static private void resultError(String method, String error, Result result) {
126
126
}
127
127
128
128
void dispose () {
129
+ for (final MediaStream mediaStream : localStreams .values ()) {
130
+ streamDispose (mediaStream );
131
+ mediaStream .dispose ();
132
+ }
133
+ localStreams .clear ();
134
+ for (final MediaStreamTrack track : localTracks .values ()) {
135
+ track .dispose ();
136
+ }
137
+ localTracks .clear ();
138
+ for (final PeerConnectionObserver connection : mPeerConnectionObservers .values ()) {
139
+ peerConnectionDispose (connection );
140
+ }
129
141
mPeerConnectionObservers .clear ();
130
142
}
131
143
@@ -959,7 +971,7 @@ private RTCConfiguration parseRTCConfiguration(ConstraintsMap map) {
959
971
}
960
972
// cryptoOptions
961
973
if (map .hasKey ("cryptoOptions" )
962
- && map .getType ("cryptoOptions" ) == ObjectType .Map ) {
974
+ && map .getType ("cryptoOptions" ) == ObjectType .Map ) {
963
975
final ConstraintsMap cryptoOptions = map .getMap ("cryptoOptions" );
964
976
conf .cryptoOptions = CryptoOptions .builder ()
965
977
.setEnableGcmCryptoSuites (cryptoOptions .hasKey ("enableGcmCryptoSuites" ) && cryptoOptions .getBoolean ("enableGcmCryptoSuites" ))
@@ -1142,7 +1154,7 @@ public void getSources(Result result) {
1142
1154
array .pushMap (audio );
1143
1155
} else {
1144
1156
android .media .AudioManager audioManager = ((android .media .AudioManager ) context
1145
- .getSystemService (Context .AUDIO_SERVICE ));
1157
+ .getSystemService (Context .AUDIO_SERVICE ));
1146
1158
final AudioDeviceInfo [] devices = audioManager .getDevices (android .media .AudioManager .GET_DEVICES_INPUTS );
1147
1159
for (int i = 0 ; i < devices .length ; i ++) {
1148
1160
AudioDeviceInfo device = devices [i ];
@@ -1547,38 +1559,54 @@ public void peerConnectionClose(final String id) {
1547
1559
1548
1560
public void peerConnectionDispose (final String id ) {
1549
1561
PeerConnectionObserver pco = mPeerConnectionObservers .get (id );
1550
- if (pco == null || pco .getPeerConnection () == null ) {
1551
- Log .d (TAG , "peerConnectionDispose() peerConnection is null" );
1562
+ if (pco != null ) {
1563
+ if (peerConnectionDispose (pco )) {
1564
+
1565
+ mPeerConnectionObservers .remove (id );
1566
+ }
1552
1567
} else {
1553
- pco .dispose ();
1554
- mPeerConnectionObservers .remove (id );
1568
+ Log .d (TAG , "peerConnectionDispose() peerConnectionObserver is null" );
1555
1569
}
1556
1570
if (mPeerConnectionObservers .size () == 0 ) {
1557
1571
audioSwitchManager .stop ();
1558
1572
}
1559
1573
}
1560
1574
1575
+ public boolean peerConnectionDispose (final PeerConnectionObserver pco ) {
1576
+ if (pco .getPeerConnection () == null ) {
1577
+ Log .d (TAG , "peerConnectionDispose() peerConnection is null" );
1578
+ } else {
1579
+ pco .dispose ();
1580
+ return true ;
1581
+ }
1582
+ return false ;
1583
+ }
1584
+
1561
1585
public void streamDispose (final String streamId ) {
1562
1586
MediaStream stream = localStreams .get (streamId );
1563
1587
if (stream != null ) {
1564
- List <VideoTrack > videoTracks = stream .videoTracks ;
1565
- for (VideoTrack track : videoTracks ) {
1566
- localTracks .remove (track .id ());
1567
- getUserMediaImpl .removeVideoCapturer (track .id ());
1568
- stream .removeTrack (track );
1569
- }
1570
- List <AudioTrack > audioTracks = stream .audioTracks ;
1571
- for (AudioTrack track : audioTracks ) {
1572
- localTracks .remove (track .id ());
1573
- stream .removeTrack (track );
1574
- }
1588
+ streamDispose (stream );
1575
1589
localStreams .remove (streamId );
1576
1590
removeStreamForRendererById (streamId );
1577
1591
} else {
1578
1592
Log .d (TAG , "streamDispose() mediaStream is null" );
1579
1593
}
1580
1594
}
1581
1595
1596
+ public void streamDispose (final MediaStream stream ) {
1597
+ List <VideoTrack > videoTracks = stream .videoTracks ;
1598
+ for (VideoTrack track : videoTracks ) {
1599
+ localTracks .remove (track .id ());
1600
+ getUserMediaImpl .removeVideoCapturer (track .id ());
1601
+ stream .removeTrack (track );
1602
+ }
1603
+ List <AudioTrack > audioTracks = stream .audioTracks ;
1604
+ for (AudioTrack track : audioTracks ) {
1605
+ localTracks .remove (track .id ());
1606
+ stream .removeTrack (track );
1607
+ }
1608
+ }
1609
+
1582
1610
private void removeStreamForRendererById (String streamId ) {
1583
1611
for (int i = 0 ; i < renders .size (); i ++) {
1584
1612
FlutterRTCVideoRenderer renderer = renders .valueAt (i );
@@ -1772,7 +1800,7 @@ public void rtpSenderSetTrack(String peerConnectionId, String rtpSenderId, Strin
1772
1800
PeerConnectionObserver pco = mPeerConnectionObservers .get (peerConnectionId );
1773
1801
if (pco == null || pco .getPeerConnection () == null ) {
1774
1802
resultError ("rtpSenderSetTrack" , "peerConnection is null" , result );
1775
- } else {
1803
+ } else {
1776
1804
MediaStreamTrack track = null ;
1777
1805
if (trackId .length () > 0 ) {
1778
1806
track = localTracks .get (trackId );
@@ -1842,4 +1870,4 @@ void requestPermissions(
1842
1870
activity ,
1843
1871
permissions .toArray (new String [permissions .size ()]), callback );
1844
1872
}
1845
- }
1873
+ }
0 commit comments