/// <summary> /// Create a new file based on the given filename and start recording to it. /// Filename must include its full path. /// </summary> /// <param name="fileName">The name of a file to be created. Include its full path</param> /// <param name="codec">The codec to record in</param> /// <param name="bitRate">The bitrate of the file</param> /// <param name="channels">The channels to record</param> public void StartCapture(string fileName, AvailableCodecs codec, int bitRate, Channels channels) { if (!ReadyToRecord()) { throw new NullReferenceException("There is no SoundInSource configured for the recorder."); } fileName = $"{fileName}.{codec.ToString().ToLower()}"; WaveFormat waveSource; switch (channels) { case Channels.Mono: waveSource = _soundInSource.ToMono().WaveFormat; break; case Channels.Stereo: waveSource = _soundInSource.ToStereo().WaveFormat; break; default: throw new ArgumentException("The selected channel option could not be found."); } switch (codec) { case AvailableCodecs.MP3: _writer = MediaFoundationEncoder.CreateMP3Encoder(waveSource, fileName, bitRate); break; case AvailableCodecs.AAC: _writer = MediaFoundationEncoder.CreateAACEncoder(waveSource, fileName, bitRate); break; case AvailableCodecs.WMA: _writer = MediaFoundationEncoder.CreateWMAEncoder(waveSource, fileName, bitRate); break; case AvailableCodecs.WAV: _writer = new WaveWriter(fileName, waveSource); break; default: throw new ArgumentException("The specified codec was not found."); } byte[] buffer = new byte[waveSource.BytesPerSecond]; _soundInSource.DataAvailable += (s, e) => { int read = _waveStream.Read(buffer, 0, buffer.Length); _writer.Write(buffer, 0, read); }; // Start recording _soundInSource.SoundIn.Start(); _state = RecordingState.Recording; }