次の方法で共有


静的バッファーへの格納と再生

自己完結したサウンド全体を含むセカンダリ バッファーは、静的バッファーと呼ばれます。各種サウンドに同じバッファーを再利用することはできますが、通常、データは静的バッファーに一度だけ書き込まれます。

静的バッファーは、ストリーミング バッファーと同じように作成および管理されます。唯一の違いは、静的バッファーの使用方法です。静的バッファーはデータが格納されてから再生されますが、ストリーミング バッファーは再生されながらデータが継続的に更新されます。

    静的バッファーは、必ずしもバッファーの記述に DSBCAPS_STATIC フラグを設定することで作成されるバッファーとは限りません。このフラグは、サウンド カードへのメモリー割り当てを要求します。これは現代のハードウェアのほとんどで有効ではありません。静的バッファーはシステム メモリー内に配置でき、DSBCAPS_LOCHARDWARE と DSBCAPS_LOCSOFTWARE のいずれかのフラグを設定して作成できます。

静的バッファーへのデータ読み込みは、次の 3 つの手順で行います。

  1. IDirectSoundBuffer8::Lock を使用してバッファー全体をロックします。書き込みを開始するバッファー内にオフセットを指定し (通常は 0)、そのポイントのメモリー アドレスを取得します。
  2. 標準のメモリーコピー ルーチンを使用して返されたアドレスにオーディオ データを書き込みます。
  3. 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 への呼び出しは、そのバッファーが確実に最初から開始されるようにするものです。