カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

サウンドバッファ

プライマリーバッファとセカンダリーバッファそしてカーネルミキサー

ダイレクトサウンドで扱うバッファには、プライマリーバッファとセカンダリーバッファの2つがあります。

セカンダリーバッファとはアプリケーションで再生したいサウンドデータを格納するためのバッファです。複数の音を再生したいときは、音の数だけセカンダリーバッファを用意します。セカンダリーバッファの作成・運用などの管理はアプリケーション側で行わなければなりません。

プライマリーバッファはアプリケーションの出力データとなるサウンドデータが格納されるバッファです。一つないし複数のセカンダリーバッファの内容が自動的にミックスダウンされ、プライマリーバッファに格納されます。

プライマリーバッファはサウンドオブジェクトによって自動的に作成されシステムが運用します。そのためアプリケーション側で明示的に作成し、コントロールしようとしない限り意識する必要はありません。

さらにカーネルミキサーでは、MME(Win32API)経由で再生されたウェーブデータなどもミックスダウンされ、最終的に再生デバイスへ転送されます。カーネルミキサーは複数の入力を受け付けるため、複数のアプリケーションで再生デバイスを共有することが可能となります。

カーネルミキサーはアプリケーションからはアクセスできません。

以下に各バッファとウェーブデータの流れを示します。

セカンダリーバッファの作成

セカンダリーバッファはサウンドデータを格納するためのバッファです。セカンダリーバッファはCreateSoundBuffer()関数を用いて作成します。この関数で得られるものはバッファそのもののアドレスではなく、セカンダリーバッファ運用のためのインターフェースです。

セカンダリーバッファを管理運用するためにIDirectSoundBuffer8インターフェースが用意されています。このインターフェースを用いてサウンドデータの設定や再生・停止などの操作を行います。

DSBUFFERDESC構造体にセカンダリーバッファ作成に必要なパラメータを設定し、pcDSBufferDescパラメータに渡します。pUnkOuterはNULLでなければなりません。

HRESULT CreateSoundBuffer(
    LPCDSBUFFERDESC             pcDSBufferDesc,
    LPDIRECTSOUNDBUFFER*        ppDSBuffer,
    LPUNKNOWN                   pUnkOuter)

関数が成功すると、ppDSBufferにIDirectSoundBuffer8インターフェースへの参照が戻ります。

以下にDSBUFFERDESC構造体を示します。

typedef struct _DSBUFFERDESC
{
    DWORD           dwSize;
    DWORD           dwFlags;
    DWORD           dwBufferBytes;
    DWORD           dwReserved;
    LPWAVEFORMATEX  lpwfxFormat;
    GUID            guid3DAlgorithm;
} DSBUFFERDESC, *LPDSBUFFERDESC;

dwSize

構造体のサイズ「sizeof(DSBUFFERDESC)」を設定します。

dwFlags

必要に応じ以下のフラグをセットします。

フラグ 機能 コメント
DSBCAPS_GETCURRENTPOSITION2 再生位置を正確に取得する。 通常セットします。
DSBCAPS_CTRLPOSITIONNOTIFY 再生位置の通知機能を有効にする。 この機能に不具合が報告されています。
DSBCAPS_CTRL3D 3Dコントロールを可能にする。 パンと同時に指定できません。
DSBCAPS_CTRLFREQUENCY 再生速度を変更できる。 エフェクトと同時に指定できません。
DSBCAPS_CTRLPAN パンコントロールを可能にする。 3Dと同時に指定できません。
DSBCAPS_CTRLFX エフェクトを可能にする。 可変再生と同時に指定できません。
DSBCAPS_CTRLVOLUME ボリュームコントロールを可能にする。  
DSBCAPS_GLOBALFOCUS アプリケーションがフォーカスを失っても再生を続ける。  
DSBCAPS_STICKYFOCUS アプリケーションがフォーカスを失っても再生を続ける。  
DSBCAPS_STATIC 可能であればバッファをサウンドカード上のメモリに割り当てる。 サウンドカードへの割り当てに失敗すると、コンピュータのメモリに割り当てます。
DSBCAPS_LOCHARDWARE バッファをサウンドカード上のメモリに割り当てる。 サウンドカードへの割り当てに失敗すると、エラーを戻します。
DSBCAPS_LOCSOFTWARE バッファをコンピュータのメモリに割り当てる。 サウンドカードへの割り当てが可能でもコンピュータのメモリに割り当てます。
DSBCAPS_PRIMARYBUFFER プライマリーバッファを指定する。 セカンダリーバッファ作成時はセットしません。

注意点

dwBufferBytes

バッファサイズをセットします。単位はバイトです。

dwReserved

ゼロを設定します。

lpwfxFormat

WAVEFORMATEX構造体へのアドレスをセットします。構造体に再生したいウェーブ属性を設定しておきます。WAVEFORMATEXTENSIBLE構造体を指定することも可能です。多チャンネルサウンドの再生はセクション「多チャンネルサウンドの再生」で解説していますので参照して下さい。

guid3DAlgorithm

3D機能を使う場合、機能を示すGUIDを指定します。

GUID 機能 コメント
DS3DALG_DEFAULT デフォルトの3D機能を使う DSBCAPS_CTRL3Dを指定していない場合は必ずDS3DALG_DEFAULTを指定します。
DS3DALG_NO_VIRTUALIZATION 3D出力は左右にパンされる  
DS3DALG_HRTF_FULL 高度な3Dアルゴリズムが使用される より多くのCPUパワーを必要とします。
DS3DALG_HRTF_LIGHT 最適化された3Dアルゴリズムが使用される  

CreateSoundBuffer()関数は、DS_NO_VIRTUALIZATION「垂直方向の3Dアルゴリズムは支援されない」という趣旨のリターンコードを戻す場合があります。そのためリターンコードは成功したという意味の「DS_OK」と比較するのではなくSUCCEEDEDマクロやFAILEDマクロでチェックする必要があります。

以下にサンプルを示します。

IDirectSoundBuffer8*    m_pDSBuffer;
DSBUFFERDESC dsBufferDesc;
ZeroMemory(&dsBufferDesc, sizeof(DSBUFFERDESC));
dsBufferDesc.dwSize = sizeof(DSBUFFERDESC);
dsBufferDesc.dwBufferBytes   = m_dwDSBufferSize;    // バッファサイズ
dsBufferDesc.lpwfxFormat     = m_pWaveFormatEx;     // ウェーブフォーマット
dsBufferDesc.dwFlags         = DSBCAPS_GLOBALFOCUS|DSBCAPS_GETCURRENTPOSITION2;
dsBufferDesc.guid3DAlgorithm = DS3DALG_DEFAULT;

HRESULT hr = m_pDirectSound8->CreateSoundBuffer(&dsBufferDesc, &m_pDSBuffer, NULL);
if (FAILED(hr))     return hr;

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ