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