Microsoft DirectX 8.0 (C++)

再生バッファの通知

オーディオをストリーミングする場合、再生カーソルがバッファ内のあるポイントに到達したときや、再生が停止したときに、アプリケーションへの通知を発生させたいことがある。IDirectSoundNotify8::SetNotificationPositions メソッドを使うと、イベントのシグナルを送信するポイントをバッファ内にいくつでも設定できる。ただし、バッファの再生中はイベント ポイントの設定を行うことはできない。

最初に IDirectSoundNotify8 インターフェイスへのポインタを取得しなければならない。この取得は、バッファ オブジェクトの QueryInterface メソッドを使って行う。次に C++ による例を示す。lpDsbSecondaryIDirectSoundBuffer8 インターフェイス ポインタである。

LPDIRECTSOUNDNOTIFY8 lpDsNotify; 
 
HRESULT hr = lpDsbSecondary->QueryInterface(IID_IDirectSoundNotify8, 
                                            (LPVOID *)&lpDsNotify); 
if SUCCEEDED(hr) 
{ 
    // 続行して lpDsNotify->SetNotificationPositions を使う。 
} 
 

IDirectSoundNotify8 インターフェイスは、ポインタを取得したバッファ オブジェクトに関連付けられている。インターフェイスのメソッドは自動的にこのバッファに適用される。

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

次の例は、1 つの通知位置を設定する。ループしない条件でバッファの終了位置に到達したか、アプリケーションが IDirectSoundBuffer8::Stop メソッドを呼び出したか、どちらかの理由で再生が停止したときに、イベントのシグナルが送信される。

DSBPOSITIONNOTIFY PositionNotify;
 
PositionNotify.Offset = DSBPN_OFFSETSTOP;
PositionNotify.hEventNotify = hMyEvent;
// hMyEvent は CreateEvent() によって返されるハンドルである。
 
lpDsNotify->SetNotificationPositions(1, &PositionNotify);
 

ボイス管理を利用している場合は、通知位置に到達する前にバッファを終了できる。DSBPOSITIONNOTIFY の「注意」を参照すること。