/// <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;
        }
Ejemplo n.º 8
0
 private static extern MMSYSERR waveInOpen(out IntPtr phwi, int uDeviceID, ref WaveFormatEx lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
Ejemplo n.º 9
0
 /// <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;
 }