Microsoft DirectX 8.0 (C++)

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

サウンド バッファを作成するには、IDirectSound8::CreateSoundBuffer メソッドを呼び出す。このメソッドは、IDirectSoundBuffer8 インターフェイスへのポインタを返す。アプリケーションはこのインターフェイスを使って、バッファを操作および演奏する。

次の例は、セカンダリ サウンド バッファを作成する方法を示している。

BOOL AppCreateBasicBuffer( 
        LPDIRECTSOUND8 lpDirectSound, 
        LPDIRECTSOUNDBUFFER *lplpDsb) 
{ 
    PCMWAVEFORMAT pcmwf; 
    DSBUFFERDESC dsbdesc; 
    HRESULT hr; 
 
    // ウェーブ フォーマット構造体を設定する。 
    memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT)); 
    pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM; 
    pcmwf.wf.nChannels = 2; 
    pcmwf.wf.nSamplesPerSec = 22050; 
    pcmwf.wf.nBlockAlign = 4; 
    pcmwf.wf.nAvgBytesPerSec = 
        pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign; 
    pcmwf.wBitsPerSample = 16; 
 
    // DSBUFFERDESC 構造体を設定する。 
 
    memset(&dsbdesc, 0, sizeof(DSBUFFERDESC)); 
    dsbdesc.dwSize = sizeof(DSBUFFERDESC); 
    dsbdesc.dwFlags = 
        DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY; 
 
    dsbdesc.dwBufferBytes = 3 * pcmwf.wf.nAvgBytesPerSec; 
    dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; 
 
    // バッファを作成する。 
 
    hr = lpDirectSound->CreateSoundBuffer(&dsbdesc, lplpDsb, NULL); 
    if SUCCEEDED(hr) 
    { 
        // IDirectSoundBuffer インターフェイスは *lplpDsb にある。 
        // QueryInterface を使って IDirectSoundBuffer8 を取得する。
        return TRUE; 
    } 
    else 
    { 
        // 失敗した場合。 
        *lplpDsb = NULL; 
        return FALSE; 
    } 
} 
 

この例では、3 秒間のストリーミング データを保持するのに十分な大きさのストリーム バッファを作成する。ストリーム バッファ以外のバッファは、サウンド全体を保持するのに十分な大きさで作成しなければならない。

DirectSound はハードウェア リソースを最初のバッファに割り当て、その利点を生かす。ハードウェア バッファはサウンド カード プロセッサでミキシングされるので、アプリケーション性能にほとんど影響を及ぼさない。

バッファの位置を DirectSound に決めさせずに自分で指定したい場合は、DSBUFFERDESC 構造体に DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグを設定する。DSBCAPS_LOCHARDWARE フラグを設定し、ハードウェア リソースが不足している場合、バッファの作成要求は失敗する。

DirectSound のボイス管理機能を利用するには、バッファの作成時に DSBCAPS_LOCDEFER フラグを指定する。このフラグは、バッファに対するリソースの割り当てを、バッファが再生されるまで遅延する。詳細については、「ダイナミック ボイス管理」を参照すること。

既存のバッファの位置を確認するには、IDirectSoundBuffer8::GetCaps メソッドを使い、DSBCAPS 構造体の dwFlags メンバをチェックして、DSBCAPS_LOCHARDWARE と DSBCAPS_LOCSOFTWARE のどちらのフラグになっているかを調べる。どちらかが必ず指定されている。

DSBCAPS_STATIC フラグを設定すると、可能な場合はバッファをオンボードのハードウェア メモリに作成すべきであることが DirectSound に通知される。ハードウェア バッファが利用できない場合でも、IDirectSound::CreateSoundBuffer メソッドは失敗しない。このフラグは、バッファ用にシステム メモリを使う最近のサウンド カードの多くには影響しない。ハードウェア スタティック バッファは、繰り返し再生される短いサウンドに対してだけ使うべきである。詳細については、「ISA および PCI カードでのボイス管理」を参照すること。

バッファ オブジェクトは、これを作成した DirectSound オブジェクトが所有する。DirectSound オブジェクトが解放されると、このオブジェクトが作成したすべてのバッファも解放され、参照できなくなる。