Platform SDK: DirectX

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

[C++]

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

最初に IDirectSoundNotify インターフェイスへのポインタを取得しなければならない。「再生バッファの通知」で説明したとおり、キャプチャ バッファの QueryInterface メソッドを使ってこの取得が行える。

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

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

#define cEvents  3
 
/* この例では、次の各変数が既に正しく初期化されていて、
   バッファを作成する際にそれらの変数の wfx がバッファ記述に
   含められたことを想定する。
 
   LPDIRECTSOUNDNOTIFY  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);
 
[Visual Basic]

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

バッファに通知イベントを設定するには、バッファのコードを保持するフォームに DirectXEvent オブジェクトを最初に実装しなければならない。次に、DirectX7.CreateEvent メソッドを呼び出してイベント ハンドルを作成し、そのイベント ハンドルを DSBPOSITIONNOTIFY 型の hEventNotify メンバに渡す。そして DSBPOSITIONNOTIFY 型を DirectSoundCaptureBuffer.SetNotificationPositions メソッドに渡す。

再生位置がバッファの通知位置に達すると、DirectXEvent.DXCallback が呼び出される。