バッファーでのエフェクトの設定
DSBUFFERDESC 構造体に DSBCAPS_CTRLFX フラグを設定して作成したセカンダリ バッファーにはいくつでもエフェクトを設定できます。バッファーは停止およびロックされないようにする必要があります。DirectX 9.0 以降、エフェクトがハードウェアで高速化されることはありません。エフェクトをハードウェア バッファーに設定することは可能ですが、これを行ってもメリットはありません。
極めて小さいバッファーでは、エフェクトがスムーズに動作しないことがあります。DirectSound では、150 ミリ秒未満のデータを保持するエフェクト可能なバッファーに作成は許可されていません。この値は、DSBSIZE_FX_MIN として定義されます。
次の関数例では、バッファーにエコーを設定して、その結果を開発環境の出力ウィンドウに表示します。
HRESULT SetEcho(LPDIRECTSOUNDBUFFER8 pDSBuffer)
{
HRESULT hr;
DWORD dwResults[1]; // One element for each effect.
// Describe the effect.
DSEFFECTDESC dsEffect;
memset(&dsEffect, 0, sizeof(DSEFFECTDESC));
dsEffect.dwSize = sizeof(DSEFFECTDESC);
dsEffect.dwFlags = 0;
dsEffect.guidDSFXClass = GUID_DSFX_STANDARD_ECHO;
// Set the effect
if (SUCCEEDED(hr = pDSBuffer->SetFX(1, &dsEffect, dwResults)))
{
switch (dwResults[0])
{
case DSFXR_LOCHARDWARE:
OutputDebugString("Effect was placed in hardware.");
break;
case DSFXR_LOCSOFTWARE:
OutputDebugString("Effect was placed in software.");
break;
case DSFXR_UNALLOCATED:
OutputDebugString("Effect is not yet allocated to hardware or software.");
break;
}
}
return hr;
}