C# で記述された NAudio スタックを使用し、PCM 8kHZ およびサンプルあたり 16 ビットの排他モードでオーディオをキャプチャしようとしています。
次の関数では:
private void InitializeCaptureDevice()
{
if (initialized)
return;
long requestedDuration = REFTIMES_PER_MILLISEC * 100;
if (!audioClient.IsFormatSupported(AudioClientShareMode.Shared, WaveFormat) &&
(!audioClient.IsFormatSupported(AudioClientShareMode.Exclusive, WaveFormat)))
{
throw new ArgumentException("Unsupported Wave Format");
}
var streamFlags = GetAudioClientStreamFlags();
audioClient.Initialize(AudioClientShareMode.Shared,
streamFlags,
requestedDuration,
requestedDuration,
this.waveFormat,
Guid.Empty);
int bufferFrameCount = audioClient.BufferSize;
this.bytesPerFrame = this.waveFormat.Channels * this.waveFormat.BitsPerSample / 8;
this.recordBuffer = new byte[bufferFrameCount * bytesPerFrame];
Debug.WriteLine(string.Format("record buffer size = {0}", this.recordBuffer.Length));
initialized = true;
}
この関数を呼び出す前に、WaveFormat を (8000,1) に設定し、期間も 100 ミリ秒に設定しました。システムがバッファに 1600 バイトを割り当て、要求に応じて 100 ミリ秒の間隔が割り当てられると予想しました。
1. システムは audioClient.BufferSize を 4800 に割り当て、"this.recordBuffer" には 9600 バイトの配列を割り当てました (これは 100ms ではなく 600ms のバッファを意味します)。2. スレッドがスリープ状態になり、2400 サンプル (4800 バイト) を取得しますが、1600 バイトのフレームが期待どおりではありません。
そこに何が起こっているのか分かりますか?