internal void UpdateReceiver() { if (_receiver != null) { var transceiver = Transceiver; Debug.Assert(transceiver != null); bool wasReceiving = _isReceiverPaired; bool hasRemoteTrack = (transceiver.RemoteTrack != null); // Note the extra "hasRemoteTrack" check, which ensures that when the remote track was // just removed by OnUnpaired(RemoteTrack) from the TrackRemoved event then it is not // immediately re-added by mistake. if (hasRemoteTrack && !wasReceiving) { // Transceiver started receiving, and user actually wants to receive _peer.InvokeOnAppThread(() => _receiver.OnPaired(transceiver.RemoteTrack)); _isReceiverPaired = true; } else if (!hasRemoteTrack && wasReceiving) { // Transceiver stopped receiving (user intent does not matter here) _peer.InvokeOnAppThread(() => _receiver.OnUnpaired(transceiver.RemoteTrack)); _isReceiverPaired = false; } } }
internal void UpdateReceiverPairingIfNeeded() { Debug.Assert(Transceiver != null); // Callbacks must be called on the main Unity app thread. _peer.EnsureIsMainAppThread(); var newRemoteTrack = Transceiver.RemoteTrack; if (_receiver != null) { bool wasReceiving = _remoteTrack != null; bool isReceiving = newRemoteTrack != null; if (isReceiving && !wasReceiving) { // Transceiver started receiving, and user actually wants to receive _receiver.OnPaired(newRemoteTrack); } else if (!isReceiving && wasReceiving) { // Transceiver stopped receiving (user intent does not matter here) _receiver.OnUnpaired(_remoteTrack); } } _remoteTrack = newRemoteTrack; }