public WasapiProvider() { // Init Pipes this.recordingStream = new PipeStream(); this.LoopbackMp3Stream = new PipeStream(); this.LoopbackL16Stream = new PipeStream(); // Init Wave Processor thread Thread waveProcessorThread = new Thread(new ThreadStart(this.waveProcessor)) { Priority = ThreadPriority.Highest }; // Init Wasapi Capture this.loopbackWaveIn = new WasapiLoopbackCapture(); this.loopbackWaveIn.DataAvailable += new EventHandler <WaveInEventArgs>(this.loopbackWaveIn_DataAvailable); // Init Raw Wav (16bit) WaveStream rawWave16b = new Wave32To16Stream(new RawSourceWaveStream(this.recordingStream, NAudio.Wave.WaveFormat.CreateIeeeFloatWaveFormat(this.loopbackWaveIn.WaveFormat.SampleRate, this.loopbackWaveIn.WaveFormat.Channels))); // Convert Raw Wav to PCM with audio format in settings var audioFormat = AudioSettings.GetAudioFormat(); if (rawWave16b.WaveFormat.SampleRate == audioFormat.SampleRate && rawWave16b.WaveFormat.BitsPerSample == audioFormat.BitsPerSample && rawWave16b.WaveFormat.Channels == audioFormat.Channels) { // No conversion ! this.rawConvertedStream = null; this.pcmStream = WaveFormatConversionStream.CreatePcmStream(rawWave16b); } else { // Resampler this.rawConvertedStream = new WaveProviderToWaveStream(new MediaFoundationResampler(rawWave16b, audioFormat)); this.pcmStream = WaveFormatConversionStream.CreatePcmStream(rawConvertedStream); } // Init MP3 Encoder this.mp3Writer = new LameMP3FileWriter(this.LoopbackMp3Stream, pcmStream.WaveFormat, AudioSettings.GetMP3Bitrate()); // Start Recording this.loopbackWaveIn.StartRecording(); // Start Wave Processor thread waveProcessorThread.Start(); }
public WasapiProvider() { // Init Pipes this.recordingStream = new PipeStream(); this.LoopbackMp3Stream = new PipeStream(); this.LoopbackL16Stream = new PipeStream(); // Init Wave Processor thread Thread waveProcessorThread = new Thread(new ThreadStart(this.waveProcessor)) { Priority = ThreadPriority.Highest }; // Init capture audio device MMDevice captureDevice = null; var enumerator = new MMDeviceEnumerator(); string captureDeviceID = SWYH.Properties.Settings.Default.AudioDevice; if (captureDeviceID != "") { foreach (var wasapi in enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active)) { if (wasapi.ID == captureDeviceID) { captureDevice = wasapi; } } } if (captureDevice == null) { captureDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); } // Init Wasapi Capture if (captureDevice.DataFlow == DataFlow.Render) { this.loopbackWaveIn = new WasapiLoopbackCapture(captureDevice); } else { this.loopbackWaveIn = new WasapiCapture(captureDevice); } this.loopbackWaveIn.DataAvailable += new EventHandler <WaveInEventArgs>(this.loopbackWaveIn_DataAvailable); // Init Raw Wav (16bit) WaveStream rawWave16b = new Wave32To16Stream(new RawSourceWaveStream(this.recordingStream, NAudio.Wave.WaveFormat.CreateIeeeFloatWaveFormat(this.loopbackWaveIn.WaveFormat.SampleRate, this.loopbackWaveIn.WaveFormat.Channels))); // Convert Raw Wav to PCM with audio format in settings var audioFormat = AudioSettings.GetAudioFormat(); if (rawWave16b.WaveFormat.SampleRate == audioFormat.SampleRate && rawWave16b.WaveFormat.BitsPerSample == audioFormat.BitsPerSample && rawWave16b.WaveFormat.Channels == audioFormat.Channels) { // No conversion ! this.rawConvertedStream = null; this.pcmStream = WaveFormatConversionStream.CreatePcmStream(rawWave16b); } else { // Resampler this.rawConvertedStream = new WaveProviderToWaveStream(new MediaFoundationResampler(rawWave16b, audioFormat)); this.pcmStream = WaveFormatConversionStream.CreatePcmStream(rawConvertedStream); } // Init MP3 Encoder this.mp3Writer = new LameMP3FileWriter(this.LoopbackMp3Stream, pcmStream.WaveFormat, AudioSettings.GetMP3Bitrate()); // Start Recording this.loopbackWaveIn.StartRecording(); // Start Wave Processor thread waveProcessorThread.Start(); }