静的バッファーへの格納と再生
自己完結したサウンド全体を含むセカンダリ バッファーは、静的バッファーと呼ばれます。各種サウンドに同じバッファーを再利用することはできますが、通常、データは静的バッファーに一度だけ書き込まれます。
静的バッファーは、ストリーミング バッファーと同じように作成および管理されます。唯一の違いは、静的バッファーの使用方法です。静的バッファーはデータが格納されてから再生されますが、ストリーミング バッファーは再生されながらデータが継続的に更新されます。
注 静的バッファーは、必ずしもバッファーの記述に DSBCAPS_STATIC フラグを設定することで作成されるバッファーとは限りません。このフラグは、サウンド カードへのメモリー割り当てを要求します。これは現代のハードウェアのほとんどで有効ではありません。静的バッファーはシステム メモリー内に配置でき、DSBCAPS_LOCHARDWARE と DSBCAPS_LOCSOFTWARE のいずれかのフラグを設定して作成できます。
静的バッファーへのデータ読み込みは、次の 3 つの手順で行います。
- IDirectSoundBuffer8::Lock を使用してバッファー全体をロックします。書き込みを開始するバッファー内にオフセットを指定し (通常は 0)、そのポイントのメモリー アドレスを取得します。
- 標準のメモリーコピー ルーチンを使用して返されたアドレスにオーディオ データを書き込みます。
- IDirectSoundBuffer8::Unlock を使用してバッファーのロックを解除します。
これらの手順を次の例に示します。この例では、lpdsbStatic は IDirectSoundBuffer8 インターフェイス ポインターであり、pbData はデータ ソースのアドレスです。
LPVOID lpvWrite;
DWORD dwLength;
if (DS_OK == lpdsbStatic->Lock(
0, // Offset at which to start lock.
0, // Size of lock; ignored because of flag.
&lpvWrite, // Gets address of first part of lock.
&dwLength, // Gets size of first part of lock.
NULL, // Address of wraparound not needed.
NULL, // Size of wraparound not needed.
DSBLOCK_ENTIREBUFFER)) // Flag.
{
memcpy(lpvWrite, pbData, dwLength);
lpdsbStatic->Unlock(
lpvWrite, // Address of lock start.
dwLength, // Size of lock.
NULL, // No wraparound portion.
0); // No wraparound size.
}
else
(
ErrorHandler(); // Add error-handling here.
}
バッファーを再生するには、以下の例のように IDirectSoundBuffer8::Play を呼び出します。
lpdsbStatic->SetCurrentPosition(0);
HRESULT hr = lpdsbStatic->Play(
0, // Unused.
0, // Priority for voice management.
0); // Flags.
if (FAILED(hr))
(
ErrorHandler(); // Add error-handling here.
}
この例では、DSBPLAY_LOOPING フラグが設定されていないため、バッファーは最後まで達すると、自動的に停止します。また、IDirectSoundBuffer8::Stop を使用することで、途中で停止することもできます。バッファーを途中で停止すると、再生カーソルの位置は停止した位置に残ります。そのため、この例で指定されている IDirectSoundBuffer8::SetCurrentPosition への呼び出しは、そのバッファーが確実に最初から開始されるようにするものです。