/// <summary> /// Creates a new basic RTP session that captures and renders audio to/from the default system devices. /// </summary> /// <param name="audioEncoder">A 3rd party audio encoder that can be used to encode and decode /// specific audio codecs.</param> /// <param name="externalSource">Optional. An external source to use in combination with the source /// provided by this end point. The application will need to signal which source is active.</param> /// <param name="disableSource">Set to true to disable the use of the audio source functionality, i.e. /// don't capture input from the microphone.</param> /// <param name="disableSink">Set to true to disable the use of the audio sink functionality, i.e. /// don't playback audio to the speaker.</param> public WindowsAudioEndPoint(IAudioEncoder audioEncoder, int audioOutDeviceIndex = AUDIO_OUTPUTDEVICE_INDEX, int audioInDeviceIndex = AUDIO_INPUTDEVICE_INDEX, bool disableSource = false, bool disableSink = false) { logger = SIPSorcery.LogFactory.CreateLogger <WindowsAudioEndPoint>(); _audioEncoder = audioEncoder; _disableSource = disableSource; _disableSink = disableSink; if (!_disableSink) { try { // Playback device. _waveOutEvent = new WaveOutEvent(); _waveOutEvent.DeviceNumber = audioOutDeviceIndex; _waveProvider = new BufferedWaveProvider(_waveFormat); _waveProvider.DiscardOnBufferOverflow = true; _waveOutEvent.Init(_waveProvider); } catch (Exception excp) { logger.LogWarning(0, excp, "WindowsAudioEndPoint failed to initialise playback device."); OnAudioSinkError?.Invoke($"WindowsAudioEndPoint failed to initialise playback device. {excp.Message}"); } } if (!_disableSource) { if (WaveInEvent.DeviceCount > 0) { if (WaveInEvent.DeviceCount > audioInDeviceIndex) { _waveInEvent = new WaveInEvent(); _waveInEvent.BufferMilliseconds = AUDIO_SAMPLE_PERIOD_MILLISECONDS; _waveInEvent.NumberOfBuffers = INPUT_BUFFERS; _waveInEvent.DeviceNumber = audioInDeviceIndex; _waveInEvent.WaveFormat = _waveFormat; _waveInEvent.DataAvailable += LocalAudioSampleAvailable; } else { OnAudioSourceError?.Invoke($"The requested audio input device index {audioInDeviceIndex} exceeds the maximum index of {WaveInEvent.DeviceCount - 1}."); } } else { OnAudioSourceError?.Invoke("No audio capture devices are available."); } } }
private void InitPlaybackDevice(int audioOutDeviceIndex, int audioSinkSampleRate) { try { _waveOutEvent?.Stop(); _waveSinkFormat = new WaveFormat( audioSinkSampleRate, DEVICE_BITS_PER_SAMPLE, DEVICE_CHANNELS); // Playback device. _waveOutEvent = new WaveOutEvent(); _waveOutEvent.DeviceNumber = audioOutDeviceIndex; _waveProvider = new BufferedWaveProvider(_waveSinkFormat); _waveProvider.DiscardOnBufferOverflow = true; _waveOutEvent.Init(_waveProvider); } catch (Exception excp) { logger.LogWarning(0, excp, "WindowsAudioEndPoint failed to initialise playback device."); OnAudioSinkError?.Invoke($"WindowsAudioEndPoint failed to initialise playback device. {excp.Message}"); } }