public void StopEncoding() { if (_clientAudioMixer != null) { _effectsOutputBuffer = null; _volumeSampleProvider = null; _clientAudioMixer.RemoveAllMixerInputs(); _clientAudioMixer = null; } _clientsBufferedAudio.Clear(); if (_waveIn != null) { _waveIn.StopRecording(); _waveIn.Dispose(); _waveIn = null; } if (_waveOut != null) { _waveOut.Stop(); _waveOut.Dispose(); _waveOut = null; } if (_micWaveOut != null) { _micWaveOut.Stop(); _micWaveOut.Dispose(); _micWaveOut = null; } if (_encoder != null) { _encoder.Dispose(); _encoder = null; } if (_decoder != null) { _decoder.Dispose(); _decoder = null; } if (_tcpVoiceHandler != null) { _tcpVoiceHandler.RequestStop(); _tcpVoiceHandler = null; } _stop = true; SpeakerMax = 0; MicMax = 0; MessageHub.Instance.ClearSubscriptions(); }
public void StopEncoding() { lock (lockObj) { _textToSpeech?.Dispose(); _textToSpeech = null; _wasapiCapture?.StopRecording(); _wasapiCapture?.Dispose(); _wasapiCapture = null; _resampler?.Dispose(true); _resampler = null; _waveOut?.Stop(); _waveOut?.Dispose(); _waveOut = null; _micWaveOut?.Stop(); _micWaveOut?.Dispose(); _micWaveOut = null; _volumeSampleProvider = null; _clientAudioMixer?.RemoveAllMixerInputs(); _clientAudioMixer = null; _clientsBufferedAudio.Clear(); _encoder?.Dispose(); _encoder = null; if (_udpVoiceHandler != null) { _udpVoiceHandler.RequestStop(); _udpVoiceHandler = null; } _speex?.Dispose(); _speex = null; SpeakerMax = -100; MicMax = -100; _effectsOutputBuffer = null; foreach (var guid in _subs) { MessageHub.Instance.UnSubscribe(guid); } _subs.Clear(); } }
public void StopEncoding() { lock (lockObj) { _wasapiCapture?.StopRecording(); _wasapiCapture?.Dispose(); _wasapiCapture = null; _resampler?.Dispose(true); _resampler = null; //Debug Wav // _afterFileWriter?.Close(); // _afterFileWriter?.Dispose(); // _beforeWaveFile?.Close(); // _beforeWaveFile?.Dispose(); _waveOut?.Stop(); _waveOut?.Dispose(); _waveOut = null; _micWaveOut?.Stop(); _micWaveOut?.Dispose(); _micWaveOut = null; _volumeSampleProvider = null; _clientAudioMixer?.RemoveAllMixerInputs(); _clientAudioMixer = null; _clientsBufferedAudio.Clear(); _encoder?.Dispose(); _encoder = null; if (_udpVoiceHandler != null) { _udpVoiceHandler.RequestStop(); _udpVoiceHandler = null; } _speex?.Dispose(); _speex = null; SpeakerMax = -100; MicMax = -100; _effectsOutputBuffer = null; MessageHub.Instance.ClearSubscriptions(); } }
public void StopEncoding() { lock (lockObj) { _waveIn?.StopRecording(); _waveIn?.Dispose(); _waveIn = null; _waveOut?.Stop(); _waveOut?.Dispose(); _waveOut = null; _micWaveOut?.Stop(); _micWaveOut?.Dispose(); _micWaveOut = null; _volumeSampleProvider = null; _clientAudioMixer?.RemoveAllMixerInputs(); _clientAudioMixer = null; _clientsBufferedAudio.Clear(); _encoder?.Dispose(); _encoder = null; _decoder?.Dispose(); _decoder = null; if (_udpVoiceHandler != null) { _udpVoiceHandler.RequestStop(); _udpVoiceHandler = null; } _speex?.Dispose(); _speex = null; SpeakerMax = -100; MicMax = -100; _effectsOutputBuffer = null; MessageHub.Instance.ClearSubscriptions(); } }
public void StartEncoding(int mic, MMDevice speakers, string guid, InputDeviceManager inputManager, IPAddress ipAddress, int port, MMDevice micOutput, VOIPConnectCallback voipConnectCallback) { _stop = false; try { _micInputQueue.Clear(); InitMixers(); InitAudioBuffers(); //Audio manager should start / stop and cleanup based on connection successfull and disconnect //Should use listeners to synchronise all the state _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 40); //add final volume boost to all mixed audio _volumeSampleProvider = new VolumeSampleProviderWithPeak(_clientAudioMixer, (peak => SpeakerMax = (float)VolumeConversionHelper.ConvertFloatToDB(peak))); _volumeSampleProvider.Volume = SpeakerBoost; if (speakers.AudioClient.MixFormat.Channels == 1) { if (_volumeSampleProvider.WaveFormat.Channels == 2) { _waveOut.Init(_volumeSampleProvider.ToMono()); } else { //already mono _waveOut.Init(_volumeSampleProvider); } } else { if (_volumeSampleProvider.WaveFormat.Channels == 1) { _waveOut.Init(_volumeSampleProvider.ToStereo()); } else { //already stereo _waveOut.Init(_volumeSampleProvider); } } _waveOut.Play(); //opus _encoder = OpusEncoder.Create(INPUT_SAMPLE_RATE, 1, Application.Voip); _encoder.ForwardErrorCorrection = false; _decoder = OpusDecoder.Create(INPUT_SAMPLE_RATE, 1); _decoder.ForwardErrorCorrection = false; //speex _speex = new Preprocessor(AudioManager.SEGMENT_FRAMES, AudioManager.INPUT_SAMPLE_RATE); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message); ShowOutputError("Problem Initialising Audio Output!"); Environment.Exit(1); } if (micOutput != null) // && micOutput !=speakers { //TODO handle case when they're the same? try { _micWaveOut = new WasapiOut(micOutput, AudioClientShareMode.Shared, true, 40); _micWaveOutBuffer = new BufferedWaveProvider(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1)); _micWaveOutBuffer.ReadFully = true; _micWaveOutBuffer.DiscardOnBufferOverflow = true; var sampleProvider = _micWaveOutBuffer.ToSampleProvider(); if (micOutput.AudioClient.MixFormat.Channels == 1) { if (sampleProvider.WaveFormat.Channels == 2) { _micWaveOut.Init(sampleProvider.ToMono()); } else { //already mono _micWaveOut.Init(sampleProvider); } } else { if (sampleProvider.WaveFormat.Channels == 1) { _micWaveOut.Init(sampleProvider.ToStereo()); } else { //already stereo _micWaveOut.Init(sampleProvider); } } _micWaveOut.Play(); } catch (Exception ex) { Logger.Error(ex, "Error starting mic audio Output - Quitting! " + ex.Message); ShowOutputError("Problem Initialising Mic Audio Output!"); Environment.Exit(1); } } if (mic != -1) { try { _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback()) { BufferMilliseconds = INPUT_AUDIO_LENGTH_MS, DeviceNumber = mic, }; _waveIn.NumberOfBuffers = 2; _waveIn.DataAvailable += _waveIn_DataAvailable; _waveIn.WaveFormat = new WaveFormat(INPUT_SAMPLE_RATE, 16, 1); _tcpVoiceHandler = new TCPVoiceHandler(_clientsList, guid, ipAddress, port, _decoder, this, inputManager, voipConnectCallback); var voiceSenderThread = new Thread(_tcpVoiceHandler.Listen); voiceSenderThread.Start(); _waveIn.StartRecording(); MessageHub.Instance.Subscribe <SRClient>(RemoveClientBuffer); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message); ShowInputError("Problem initialising Audio Input!"); Environment.Exit(1); } } }
public void StartEncoding(string guid, InputDeviceManager inputManager, IPAddress ipAddress, int port) { MMDevice speakers = null; if (_audioOutputSingleton.SelectedAudioOutput.Value == null) { speakers = WasapiOut.GetDefaultAudioEndpoint(); } else { speakers = (MMDevice)_audioOutputSingleton.SelectedAudioOutput.Value; } MMDevice micOutput = null; if (_audioOutputSingleton.SelectedMicAudioOutput.Value != null) { micOutput = (MMDevice)_audioOutputSingleton.SelectedMicAudioOutput.Value; } try { _micInputQueue.Clear(); InitMixers(); InitAudioBuffers(); //Audio manager should start / stop and cleanup based on connection successfull and disconnect //Should use listeners to synchronise all the state _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 40, windowsN); //add final volume boost to all mixed audio _volumeSampleProvider = new VolumeSampleProviderWithPeak(_clientAudioMixer, (peak => SpeakerMax = (float)VolumeConversionHelper.ConvertFloatToDB(peak))); _volumeSampleProvider.Volume = SpeakerBoost; if (speakers.AudioClient.MixFormat.Channels == 1) { if (_volumeSampleProvider.WaveFormat.Channels == 2) { _waveOut.Init(_volumeSampleProvider.ToMono()); } else { //already mono _waveOut.Init(_volumeSampleProvider); } } else { if (_volumeSampleProvider.WaveFormat.Channels == 1) { _waveOut.Init(_volumeSampleProvider.ToStereo()); } else { //already stereo _waveOut.Init(_volumeSampleProvider); } } _waveOut.Play(); //opus _encoder = OpusEncoder.Create(INPUT_SAMPLE_RATE, 1, Application.Voip); _encoder.ForwardErrorCorrection = false; //speex _speex = new Preprocessor(AudioManager.SEGMENT_FRAMES, AudioManager.INPUT_SAMPLE_RATE); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message); ShowOutputError("Problem Initialising Audio Output!"); Environment.Exit(1); } InitMicPassthrough(micOutput); InitMicCapture(guid, ipAddress, port, inputManager); InitTextToSpeech(); }
public void StartEncoding(string guid, InputDeviceManager inputManager, IPAddress ipAddress, int port) { MMDevice speakers = null; if (_audioOutputSingleton.SelectedAudioOutput.Value == null) { speakers = WasapiOut.GetDefaultAudioEndpoint(); } else { speakers = (MMDevice)_audioOutputSingleton.SelectedAudioOutput.Value; } MMDevice micOutput = null; if (_audioOutputSingleton.SelectedMicAudioOutput.Value != null) { micOutput = (MMDevice)_audioOutputSingleton.SelectedMicAudioOutput.Value; } try { _micInputQueue.Clear(); InitMixers(); InitAudioBuffers(); //Audio manager should start / stop and cleanup based on connection successfull and disconnect //Should use listeners to synchronise all the state _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 40, windowsN); //add final volume boost to all mixed audio _volumeSampleProvider = new VolumeSampleProviderWithPeak(_clientAudioMixer, (peak => SpeakerMax = (float)VolumeConversionHelper.ConvertFloatToDB(peak))); _volumeSampleProvider.Volume = SpeakerBoost; if (speakers.AudioClient.MixFormat.Channels == 1) { if (_volumeSampleProvider.WaveFormat.Channels == 2) { _waveOut.Init(_volumeSampleProvider.ToMono()); } else { //already mono _waveOut.Init(_volumeSampleProvider); } } else { if (_volumeSampleProvider.WaveFormat.Channels == 1) { _waveOut.Init(_volumeSampleProvider.ToStereo()); } else { //already stereo _waveOut.Init(_volumeSampleProvider); } } _waveOut.Play(); //opus _encoder = OpusEncoder.Create(INPUT_SAMPLE_RATE, 1, Application.Voip); _encoder.ForwardErrorCorrection = false; //speex _speex = new Preprocessor(AudioManager.SEGMENT_FRAMES, AudioManager.INPUT_SAMPLE_RATE); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message); ShowOutputError("Problem Initialising Audio Output!"); Environment.Exit(1); } if (micOutput != null) // && micOutput !=speakers { //TODO handle case when they're the same? try { _micWaveOut = new WasapiOut(micOutput, AudioClientShareMode.Shared, true, 40, windowsN); _micWaveOutBuffer = new BufferedWaveProvider(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1)); _micWaveOutBuffer.ReadFully = true; _micWaveOutBuffer.DiscardOnBufferOverflow = true; var sampleProvider = _micWaveOutBuffer.ToSampleProvider(); if (micOutput.AudioClient.MixFormat.Channels == 1) { if (sampleProvider.WaveFormat.Channels == 2) { _micWaveOut.Init(new RadioFilter(sampleProvider.ToMono())); } else { //already mono _micWaveOut.Init(new RadioFilter(sampleProvider)); } } else { if (sampleProvider.WaveFormat.Channels == 1) { _micWaveOut.Init(new RadioFilter(sampleProvider.ToStereo())); } else { //already stereo _micWaveOut.Init(new RadioFilter(sampleProvider)); } } _micWaveOut.Play(); } catch (Exception ex) { Logger.Error(ex, "Error starting mic audio Output - Quitting! " + ex.Message); ShowOutputError("Problem Initialising Mic Audio Output!"); Environment.Exit(1); } } if (_audioInputSingleton.MicrophoneAvailable) { try { var device = (MMDevice)_audioInputSingleton.SelectedAudioInput.Value; if (device == null) { device = WasapiCapture.GetDefaultCaptureDevice(); } device.AudioEndpointVolume.Mute = false; _wasapiCapture = new WasapiCapture(device, true); _wasapiCapture.ShareMode = AudioClientShareMode.Shared; _wasapiCapture.DataAvailable += WasapiCaptureOnDataAvailable; _wasapiCapture.RecordingStopped += WasapiCaptureOnRecordingStopped; _udpVoiceHandler = new UdpVoiceHandler(guid, ipAddress, port, this, inputManager); var voiceSenderThread = new Thread(_udpVoiceHandler.Listen); voiceSenderThread.Start(); _wasapiCapture.StartRecording(); MessageHub.Instance.Subscribe <SRClient>(RemoveClientBuffer); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message); ShowInputError("Problem initialising Audio Input!"); Environment.Exit(1); } } else { //no mic.... _udpVoiceHandler = new UdpVoiceHandler(guid, ipAddress, port, this, inputManager); MessageHub.Instance.Subscribe <SRClient>(RemoveClientBuffer); var voiceSenderThread = new Thread(_udpVoiceHandler.Listen); voiceSenderThread.Start(); } }
public void StartEncoding(int mic, MMDevice speakers, string guid, InputDeviceManager inputManager, IPAddress ipAddress, int port) { _stop = false; try { _micInputQueue.Clear(); InitMixers(); InitAudioBuffers(); //Audio manager should start / stop and cleanup based on connection successfull and disconnect //Should use listeners to synchronise all the state _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 30); //add final volume boost to all mixed audio _volumeSampleProvider = new VolumeSampleProviderWithPeak(_clientAudioMixer, (peak => SpeakerMax = peak)); _volumeSampleProvider.Volume = SpeakerBoost; _waveOut.Init(_volumeSampleProvider); _waveOut.Play(); //opus _encoder = OpusEncoder.Create(INPUT_SAMPLE_RATE, 1, Application.Voip); _encoder.ForwardErrorCorrection = false; _decoder = OpusDecoder.Create(INPUT_SAMPLE_RATE, 1); _decoder.ForwardErrorCorrection = false; } catch (Exception ex) { Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message); MessageBox.Show($"Problem Initialising Audio Output! Try a different Output device and please post your client log on the forums", "Audio Output Error", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } try { _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback()) { BufferMilliseconds = INPUT_AUDIO_LENGTH_MS, DeviceNumber = mic }; _waveIn.NumberOfBuffers = 2; _waveIn.DataAvailable += _waveIn_DataAvailable; _waveIn.WaveFormat = new WaveFormat(INPUT_SAMPLE_RATE, 16, 1); _udpVoiceHandler = new UdpVoiceHandler(_clientsList, guid, ipAddress, port, _decoder, this, inputManager); var voiceSenderThread = new Thread(_udpVoiceHandler.Listen); voiceSenderThread.Start(); _waveIn.StartRecording(); MessageHub.Instance.Subscribe <SRClient>(RemoveClientBuffer); } catch (Exception ex) { Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message); MessageBox.Show($"Problem Initialising Audio Input! Try a different Input device and please post your client log on the forums", "Audio Input Error", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } }