/// <summary> /// Closes the session. /// </summary> /// <param name="reason">Reason for the closure.</param> public override void Close(string reason) { if (!_isClosed) { _isClosed = true; base.OnRtpPacketReceived -= RtpPacketReceived; _waveOutEvent?.Stop(); if (_waveInEvent != null) { _waveInEvent.DataAvailable -= LocalAudioSampleAvailable; _waveInEvent.StopRecording(); } _audioStreamTimer?.Dispose(); if (_testPatternVideoSource != null) { _testPatternVideoSource.SampleReady -= LocalVideoSampleAvailable; _testPatternVideoSource.Stop(); _testPatternVideoSource.Dispose(); } // The VPX encoder is a memory hog. _vpxDecoder.Dispose(); _imgConverter.Dispose(); _vpxEncoder?.Dispose(); _imgEncConverter?.Dispose(); base.Close(reason); } }
/// <summary> /// Sets or updates the sources of the audio and/or video streams. /// </summary> /// <param name="audioOptions">Optional. If audio is being switched the new source options. /// Set to null to leave the audio source unchanged.</param> /// <param name="videoOptions">Optional. If video is being switched the new source options. /// Set to null to leave the video source unchanged.</param> public async Task SetSources(AudioOptions audioOptions, VideoOptions videoOptions) { if (audioOptions == null) { // Do nothing, audio source not being changed. } else if (audioOptions.AudioSource == AudioSourcesEnum.None) { // Audio source no longer required. _waveInEvent?.StopRecording(); if (_audioStreamTimer != null) { _audioStreamTimer?.Dispose(); // Give any currently executing audio sampling time to complete. await Task.Delay(AUDIO_SAMPLE_PERIOD_MILLISECONDS * 2).ConfigureAwait(false); } _audioStreamReader.Close(); _audioOpts = audioOptions; } else { SetAudioSource(audioOptions); _audioOpts = audioOptions; StartAudio(); } if (videoOptions == null) { // Do nothing, video source not being changed. } else if (videoOptions.VideoSource == VideoSourcesEnum.None) { // Video source no longer required. _testPatternVideoSource?.Stop(); _videoOpts = videoOptions; } else { await SetVideoSource(videoOptions).ConfigureAwait(false); _videoOpts = videoOptions; StartVideo(); } }
/// <summary> /// Sets or updates the sources of the audio and/or video streams. /// </summary> /// <param name="audioOptions">Optional. If audio is being switched the new source options. /// Set to null to leave the audio source unchanged.</param> /// <param name="videoOptions">Optional. If video is being switched the new source options. /// Set to null to leave the video source unchanged.</param> /// <param name="disableExternalAudioSource">If true then no attempt will be made to use an external audio /// source, e.g. microphone.</param> public async Task SetSources(AudioOptions audioOptions, VideoOptions videoOptions, bool disableExternalAudioSource = false) { _disableExternalAudioSource = disableExternalAudioSource; // Check whether the underlying media session has changed which dictates whether // an audio or video source needs to be removed. if (!HasAudio) { // Overrule any application supplied options as the session does not currently support audio. audioOptions = new AudioOptions { AudioSource = AudioSourcesEnum.None }; } if (!HasVideo) { // Overrule any application supplied options as the session does not currently support video. videoOptions = new VideoOptions { VideoSource = VideoSourcesEnum.None }; } if (audioOptions == null) { // Do nothing, audio source not being changed. } else if (audioOptions.AudioSource == AudioSourcesEnum.None) { // Audio source no longer required. _waveInEvent?.StopRecording(); if (_audioStreamTimer != null) { _audioStreamTimer?.Dispose(); // Give any currently executing audio sampling time to complete. await Task.Delay(AUDIO_SAMPLE_PERIOD_MILLISECONDS * 2).ConfigureAwait(false); } _audioStreamReader?.Close(); _audioOpts = audioOptions; } else { _sendingAudioFormat = base.GetSendingFormat(SDPMediaTypesEnum.audio); SetAudioSource(audioOptions, _sendingAudioFormat); _audioOpts = audioOptions; StartAudio(); } if (videoOptions == null) { // Do nothing, video source not being changed. } else if (videoOptions.VideoSource == VideoSourcesEnum.None) { // Video source no longer required. _testPatternVideoSource?.Stop(); if (_videoOpts.BitmapSource != null) { _videoOpts.BitmapSource.OnBitmap -= LocalBitmapAvailable; } _videoOpts = videoOptions; } else { await SetVideoSource(videoOptions).ConfigureAwait(false); _videoOpts = videoOptions; StartVideo(); } }