/// <summary> /// Write data to WaveOut. /// 音を出します。 /// </summary> /// <param name="buffer">音が入ったバッファ</param> private void Write(WaveBuffer buffer) { EnsureOpened(); Interlocked.Add(ref enqueuedBufferSize, buffer.BufferLength); Win32.waveOutPrepareHeader(deviceHandle, buffer.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Win32.waveOutWrite(deviceHandle, buffer.pHeader, Win32.WaveHeader.SizeOfWaveHeader); }
/// <summary> /// Open WaveOut. /// WaveOutを開きます。 /// </summary> /// <param name="deviceId">WaveOut.WaveMapperか、GetDeviceNames()のindex</param> /// <param name="samplesPerSec">44100 (Hz)</param> /// <param name="bitsPerSample">16 or 8</param> /// <param name="channels">2 or 1</param> public WaveOut(int deviceId, int samplesPerSec, int bitsPerSample, int channels) { Win32.WaveFormatEx wfx = new Win32.WaveFormatEx(samplesPerSec, bitsPerSample, channels); eventHandler = new MessageThread(); IntPtr ptr = new IntPtr(eventHandler.Win32ThreadID); int mmret = Win32.waveOutOpen(out deviceHandle, (uint)deviceId, ref wfx, ptr, IntPtr.Zero, Win32.CALLBACK_THREAD); if (mmret != Win32.MMSYSERR_NOERROR) { eventHandler.Dispose(); throw new Exception("デバイスが開けませんでした。(" + mmret + ")"); } eventHandler.MessageHandlers[Win32.MM_WOM_DONE] = delegate(Message m) { Win32.WaveHeader header = Win32.WaveHeader.FromIntPtr(m.LParam); WaveBuffer buf = WaveBuffer.FromWaveHeader(header); Win32.waveOutUnprepareHeader(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Interlocked.Add(ref enqueuedBufferSize, -buf.Data.Length); buf.Dispose(); if (OnDone != null) { OnDone(); } }; }
/// <summary> /// Write data to WaveOut. /// 音を出します。 /// </summary> /// <param name="src">音</param> /// <param name="length">バイト数</param> public void Write(IntPtr src, int length) { EnsureOpened(); WaveBuffer buf = new WaveBuffer(length); Marshal.Copy(src, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Write data to WaveOut. /// 音を出します。 /// </summary> /// <param name="waveform">音</param> /// <param name="offset">読み出す位置</param> /// <param name="count">読み出すバイト数</param> public void Write(byte[] waveform, int offset, int count) { EnsureOpened(); WaveBuffer buf = new WaveBuffer(count); Array.Copy(waveform, offset, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Write data to WaveOut. /// 音を出す /// </summary> /// <param name="waveform">音</param> public void Write(byte[] waveform) { EnsureOpened(); WaveBuffer buf = new WaveBuffer((uint)waveform.Length); Array.Copy(waveform, buf.Data, waveform.Length); Interlocked.Add(ref enqueuedBufferSize, waveform.Length); Win32.waveOutPrepareHeader(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Win32.waveOutWrite(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); }
/// <summary> /// Open WaveIn. /// WaveInを開きます。 /// </summary> /// <param name="deviceId">WaveIn.WaveMapper or index of GetDeviceNames(). WaveIn.WaveMapperか、GetDeviceNames()のindex</param> /// <param name="samplesPerSec">ex) 44100 (Hz)</param> /// <param name="bitsPerSample">16 or 8</param> /// <param name="channels">2 or 1</param> public WaveIn(int deviceId, int samplesPerSec, int bitsPerSample, int channels) { Win32.WaveFormatEx wfx = new Win32.WaveFormatEx(samplesPerSec, bitsPerSample, channels); eventHandler = new MessageThread(ThreadPriority.AboveNormal); eventHandler.MessageHandlers[Win32.MM_WIM_DATA] = delegate(Message m) { Win32.WaveHeader header = Win32.WaveHeader.FromIntPtr(m.LParam); WaveBuffer buf = WaveBuffer.FromWaveHeader(header); int bytesRecorded = (int)header.dwBytesRecorded; if (OnData != null && bytesRecorded != 0) { byte[] data = buf.Data; if (bytesRecorded != buf.Data.Length) { data = new byte[bytesRecorded]; Array.Copy(buf.Data, data, bytesRecorded); } OnData(data); } if (recording) { Win32.waveInAddBuffer(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); } else { Win32.waveInUnprepareHeader(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); buf.Dispose(); Interlocked.Decrement(ref enqueuedBufferCount); } }; int mmret = Win32.waveInOpen(out deviceHandle, (uint)deviceId, ref wfx, new IntPtr(eventHandler.Win32ThreadID), IntPtr.Zero, Win32.CALLBACK_THREAD); if (mmret != Win32.MMSYSERR_NOERROR) { eventHandler.Dispose(); throw new Exception("Error on waveInOpen. (ret=" + mmret + ")"); } }
/// <summary> /// Start recording. 録音開始 /// </summary> /// <param name="bufferSize"> ex) 16 : バッファ数</param> /// <param name="bufferSize"> ex) 65536 : バッファサイズ</param> public void Start(int bufferCount, int bufferSize) { EnsureOpened(); if (recording) { throw new InvalidOperationException("Started already."); } for (int i = 0; i < bufferCount; i++) { WaveBuffer buf = new WaveBuffer(bufferSize); Win32.waveInPrepareHeader(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Win32.waveInAddBuffer(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Interlocked.Add(ref enqueuedBufferCount, 1); } int mmret = Win32.waveInStart(deviceHandle); if (mmret != Win32.MMSYSERR_NOERROR) { throw new Exception("Error on waveInStart. (ret=" + mmret + ")"); } recording = true; }
/// <summary> /// Write data to WaveOut. /// 音を出す /// </summary> /// <param name="waveform">音</param> public void Write(byte[] waveform) { EnsureOpened(); WaveBuffer buf = new WaveBuffer((uint)waveform.Length); Array.Copy(waveform, buf.Data, waveform.Length); Interlocked.Add(ref enqueuedBufferSize, waveform.Length); Win32.waveOutPrepareHeader(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Win32.waveOutWrite(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); }
/// <summary> /// Write data to WaveOut. /// ����o���܂��B /// </summary> /// <param name="buffer">�����������o�b�t�@</param> private void Write(WaveBuffer buffer) { EnsureOpened(); Interlocked.Add(ref enqueuedBufferSize, buffer.BufferLength); Win32.waveOutPrepareHeader(deviceHandle, buffer.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Win32.waveOutWrite(deviceHandle, buffer.pHeader, Win32.WaveHeader.SizeOfWaveHeader); }
/// <summary> /// Write data to WaveOut. /// ����o���܂��B /// </summary> /// <param name="src">��</param> /// <param name="length">�o�C�g��</param> public void Write(IntPtr src, int length) { EnsureOpened(); WaveBuffer buf = new WaveBuffer(length); Marshal.Copy(src, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Write data to WaveOut. /// ����o���܂��B /// </summary> /// <param name="waveform">��</param> /// <param name="offset">�ǂݏo���ʒu</param> /// <param name="count">�ǂݏo���o�C�g��</param> public void Write(byte[] waveform, int offset, int count) { EnsureOpened(); WaveBuffer buf = new WaveBuffer(count); Array.Copy(waveform, offset, buf.Data, 0, buf.BufferLength); Write(buf); }
/// <summary> /// Start recording. �^���J�n /// </summary> /// <param name="bufferSize"> ex) 16 : �o�b�t�@��</param> /// <param name="bufferSize"> ex) 65536 : �o�b�t�@�T�C�Y</param> public void Start(int bufferCount, int bufferSize) { EnsureOpened(); if (recording) throw new InvalidOperationException("Started already."); for (int i = 0; i < bufferCount; i++) { WaveBuffer buf = new WaveBuffer(bufferSize); Win32.waveInPrepareHeader(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Win32.waveInAddBuffer(deviceHandle, buf.pHeader, Win32.WaveHeader.SizeOfWaveHeader); Interlocked.Add(ref enqueuedBufferCount, 1); } int mmret = Win32.waveInStart(deviceHandle); if (mmret != Win32.MMSYSERR_NOERROR) { throw new Exception("Error on waveInStart. (ret=" + mmret + ")"); } recording = true; }