Microsoft DirectX 8.0 (C++)

キャプチャ バッファの通知

読み込みカーソルがバッファ内のある位置または最後に達したときに、アプリケーションへの通知を発生させたいことがある。バッファ内での読み込みカーソルまでの部分は、安全にデータを読み込むことができる。IDirectSoundNotify8::SetNotificationPositions メソッドを使うと、イベントのシグナルを送信するポイントをバッファ内にいくつでも設定できる。

まず、IDirectSoundNotify8 インターフェイスへのポインタを取得する。「再生バッファの通知」で説明したとおり、キャプチャ バッファの QueryInterface メソッドを使ってこれを取得することができる。

次に、Win32 の CreateEvent 関数を使って、イベント オブジェクトを作成する。このイベントへのハンドルを DSBPOSITIONNOTIFY 構造体の hEventNotify メンバに書き込み、この構造体の dwOffset メンバで、バッファ内でイベントのシグナルを送信したい位置のオフセットを指定する。次にこの構造体のアドレスを、または複数の通知位置を設定したい場合は構造体の配列を、IDirectSoundNotify8::SetNotificationPositions メソッドに渡す。

次の例は、3 つの通知位置を設定する。1 つのイベントは読み込み位置がバッファ内の中央に達したとき、2 番目は最後の近くに達したとき、3 番目はキャプチャが停止したときに、それぞれシグナルを送信する。

#define cEvents  3
 
// 以下の変数は正しく初期化され、
// バッファの作成時に、バッファ記述に wfx が含まれていると
// 仮定している。
//   LPDIRECTSOUNDNOTIFY8 lpDsNotify;
//   WAVEFORMATEX          wfx;  
 
HANDLE             rghEvent[cEvents] = {0};
DSBPOSITIONNOTIFY  rgdsbpn[cEvents];
HRESULT            hr;
int                i;
 
// イベントを作成する。
for (i = 0; i < cEvents; ++i)
{
    rghEvent[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (NULL == rghEvent[i])
    {
        hr = GetLastError();
        goto Error;
    }
}
 
// 通知を記述する。 
 
rgdsbpn[0].dwOffset = (wfx.nAvgBytesPerSec/2) -1;
rgdsbpn[0].hEventNotify = rghEvent[0];
 
rgdsbpn[1].dwOffset = wfx.nAvgBytesPerSec - 1;
rgdsbpn[1].hEventNotify = rghEvent[1];
 
rgdsbpn[2].dwOffset = DSBPN_OFFSETSTOP;
rgdsbpn[2].hEventNotify = rghEvent[2];
 
// 通知を作成する。
 
hr = lpDsNotify->SetNotificationPositions(cEvents, rgdsbpn);