/// <summary> /// Copies header to a stream. /// </summary> /// <param name="waveData">Wav data stream.</param> /// <param name="format">WAVEFORMATEX wav format.</param> /// <returns>Stream.</returns> private static Stream _CreateStream(Stream waveData, WaveFormatEx format) { MemoryStream stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(stream); writer.Write(System.Text.Encoding.ASCII.GetBytes("RIFF".ToCharArray())); writer.Write((Int32)(waveData.Length + 36)); //File length minus first 8 bytes of RIFF description writer.Write(System.Text.Encoding.ASCII.GetBytes("WAVEfmt ".ToCharArray())); writer.Write((Int32)16); //length of following chunk: 16 writer.Write((Int16)format.wFormatTag); writer.Write((Int16)format.nChannels); writer.Write((Int32)format.nSamplesPerSec); writer.Write((Int32)format.nAvgBytesPerSec); writer.Write((Int16)format.nBlockAlign); writer.Write((Int16)format.wBitsPerSample); writer.Write(System.Text.Encoding.ASCII.GetBytes("data".ToCharArray())); writer.Write((Int32)waveData.Length); waveData.Seek(0, SeekOrigin.Begin); byte[] b = new byte[waveData.Length]; waveData.Read(b, 0, (int)waveData.Length); writer.Write(b); writer.Seek(0, SeekOrigin.Begin); return(stream); }
/// <summary> /// Creates a WAVEFORMATEX structure. /// </summary> /// <param name="rate">Bit rate.</param> /// <param name="isEightBits">Is 8bits per sample, or 16th.</param> /// <param name="channels">Number of channels.</param> /// <returns>Created wave format object.</returns> private WaveFormatEx _CreateWaveFormat(uint rate, bool isEightBits, ushort channels) { WaveFormatEx wfx = new WaveFormatEx(); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = channels; wfx.nSamplesPerSec = rate; ushort bits = isEightBits ? (ushort)8 : (ushort)16; wfx.wBitsPerSample = bits; wfx.nBlockAlign = (ushort)(channels * (bits / 8)); wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize = 0; return(wfx); }
private static extern MMSYSERR waveInOpen(out IntPtr phwi, int uDeviceID, ref WaveFormatEx lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
/// <summary>Initialze class and set defaults.</summary> /// <param name="device">Current device id.</param> /// <param name="doneProc">data callback</param> /// <param name="format">WAVEFORMATEX format description</param> public WaveInRecorder(int device, BufferDoneEventHandler doneProc, WaveFormatEx format) { _device = device; _eDoneProc = doneProc; _waveFormat = format; }
/// <summary> /// Loads recorder. /// </summary> /// <param name="settings">Audio settings.</param> /// <param name="equalizer">Equalizer.</param> private void _RecorderLoad(AudioSettings settings) { try { if (_isRecorderLoaded) _RecorderUnLoad(); // Prepare destination stream. if (_streamMemory != null) _streamMemory.Dispose(); _streamMemory = new MemoryStream(); // Create wave format and load recorder. _waveFormat = _CreateWaveFormat((uint)settings.SamplesPerSecond, settings.isEightBitSample, settings.Channels); _recorder = new WaveInRecorder(settings.AudioInputDevice, new BufferDoneEventHandler(_RecordData), _waveFormat); _isRecorderLoaded = true; } catch (Exception) { throw new Exception(Properties.Resources.DeviceNotFoundError); } }
/// <summary> /// Creates a WAVEFORMATEX structure. /// </summary> /// <param name="rate">Bit rate.</param> /// <param name="isEightBits">Is 8bits per sample, or 16th.</param> /// <param name="channels">Number of channels.</param> /// <returns>Created wave format object.</returns> private WaveFormatEx _CreateWaveFormat(uint rate, bool isEightBits, ushort channels) { WaveFormatEx wfx = new WaveFormatEx(); wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = channels; wfx.nSamplesPerSec = rate; ushort bits = isEightBits ? (ushort)8 : (ushort)16; wfx.wBitsPerSample = bits; wfx.nBlockAlign = (ushort)(channels * (bits / 8)); wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize = 0; return wfx; }
/// <summary> /// Copies header to a stream. /// </summary> /// <param name="waveData">Wav data stream.</param> /// <param name="format">WAVEFORMATEX wav format.</param> /// <returns>Stream.</returns> private static Stream _CreateStream(Stream waveData, WaveFormatEx format) { MemoryStream stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(stream); writer.Write(System.Text.Encoding.ASCII.GetBytes("RIFF".ToCharArray())); writer.Write((Int32)(waveData.Length + 36)); //File length minus first 8 bytes of RIFF description writer.Write(System.Text.Encoding.ASCII.GetBytes("WAVEfmt ".ToCharArray())); writer.Write((Int32)16); //length of following chunk: 16 writer.Write((Int16)format.wFormatTag); writer.Write((Int16)format.nChannels); writer.Write((Int32)format.nSamplesPerSec); writer.Write((Int32)format.nAvgBytesPerSec); writer.Write((Int16)format.nBlockAlign); writer.Write((Int16)format.wBitsPerSample); writer.Write(System.Text.Encoding.ASCII.GetBytes("data".ToCharArray())); writer.Write((Int32)waveData.Length); waveData.Seek(0, SeekOrigin.Begin); byte[] b = new byte[waveData.Length]; waveData.Read(b, 0, (int)waveData.Length); writer.Write(b); writer.Seek(0, SeekOrigin.Begin); return stream; }