2013年7月8日月曜日

WaveIF

Waveの録音再生を簡単に出来ないかとさがしたら、みつかったのがこの
WaveIF。んで、C#の資料が少なかったのでメモ書き。
録音するときは
axWaveIn_OnDoneイベントでデータを保存する。

        private void rec(){
            axWaveIn.Open();
            for (short i = 0; i < axWaveIn.NumBuffers; i++)
            {
                axWaveIn.AddBuffer(i);
            }
            axWaveIn.Start();
        }
        private void axWaveIn_OnDone(object sender, AxWaveInterfaceLib._DWaveInEvents_OnDoneEvent e)
        {
            short BufferIndex = e.bufferIndex;
            long BytesRecorded = e.bytesRecorded;

            //' データが録音されていれば、
            if (BytesRecorded > 0)
            {
                // 録音されたデータを取得します。
                // .Netでは、GetDataが使えないのでこの取り方
                int bufferNum = axWaveIn.GetBufferAddress(e.bufferIndex);
                wifGetDataAny(recBuffer, bufferNum, e.bytesRecorded);

                if (Information.UBound(recBuffer) > BytesRecorded - 1)
                {
                    Array.Resize<byte>(ref recBuffer, (int)BytesRecorded - 1);
                }
                // テンポラリ、モニタ保存
                FileStream fs = null;
                fs = null;
                fs = new System.IO.FileStream(writeFile, System.IO.FileMode.Append);
                // データ保存
                fs.Write(recBuffer, 0, recBuffer.Count());
                fs.Close();
            }
            if (!e.bStopped)
            {
                axWaveIn.AddBuffer(BufferIndex);
            }
        }
と、こんな感じで録音できる。以外と時間がかかった。

次に、再生のソース。
イベント時に再生用のバッファを追加するのを忘れずに。
        private void rec(){
          axWaveOut.Open();
          axWaveOut.Pause();
          for (int bufCnti = 0; bufCnti < axWaveOut.NumBuffers; bufCnti++)
          {
                SizeToPlay = axWaveOut.BufferSize;

                Array.Resize(ref buffer2, SizeToPlay);
                buffer2 = playData.Take(SizeToPlay).ToArray();
                playData = playData.Skip(SizeToPlay).ToArray();

                axWaveOut.SetData(buffer2, (short)bufCnti);
                axWaveOut.AddBuffer((short)bufCnti, SizeToPlay);
           }
            axWaveOut.Restart();
       }
       private void axWaveOut_OnDone(object sender, AxWaveInterfaceLib._DWaveOutEvents_OnDoneEvent e){
                axWaveOut.SetData(buffer2, e.bufferIndex);
                axWaveOut.AddBuffer(e.bufferIndex, SizeToPlay);
       }
と、すごくざっくりしてるけどこんな感じで再生、録音できました。

0 件のコメント:

コメントを投稿