Inheritance: IDisposable
示例#1
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#2
0
        /// <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();
                }
            };
        }
示例#3
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
        /// <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);
        }
示例#4
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
        /// <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);
        }
示例#5
0
        /// <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);
        }
示例#6
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
        /// <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 + ")");
            }
        }
示例#7
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
        /// <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;
        }
示例#8
0
 /// <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);
 }
示例#9
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#10
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#11
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
 /// <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);
 }
示例#12
0
文件: WaveIO.cs 项目: ttsuki/ttsuki
        /// <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;
        }