Platform SDK: DirectX

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

[C++]

サウンド バッファを作成するには、アプリケーションが DSBUFFERDESC 構造体への書き込みを行い、そのアドレスを IDirectSound::CreateSoundBuffer メソッドに渡す。このメソッドは DirectSoundBuffer オブジェクトを作成し、IDirectSoundBuffer インターフェイスへのポインタを返す。アプリケーションはこのインターフェイスをバッファの操作と再生に使用する。

次の例は、基本的なセカンダリ サウンド バッファを作成する方法を示す。

BOOL AppCreateBasicBuffer( 
        LPDIRECTSOUND 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; 
 
    // 3 秒のバッファ。
    dsbdesc.dwBufferBytes = 3 * pcmwf.wf.nAvgBytesPerSec; 
    dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; 
    // バッファを作成する。
    hr = lpDirectSound->lpVtbl->CreateSoundBuffer(lpDirectSound, 
        &dsbdesc, lplpDsb, NULL); 
    if SUCCEEDED(hr) 
    { 
        // 有効なインターフェイスは *lplpDsb 内にある。
        return TRUE; 
    } 
    else 
    { 
        // 失敗。
        *lplpDsb = NULL; 
        return FALSE; 
    } 
} 
 

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

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

DirectSound のボイス管理機能を利用したい場合は、バッファの作成時に DSBCAPS_LOCDEFER フラグを指定する。このフラグは、バッファに対するリソースの割り当てを、バッファが再生されるまで遅延する。

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

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

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

[Visual Basic]

サウンド バッファを作成するには、DirectSound.CreateSoundBufferDirectSound.CreateSoundBufferFromFile、または DirectSound.CreateSoundBufferFromResource メソッドを呼び出す。このメソッドは、バッファの操作と再生に使われる DirectSoundBuffer オブジェクトを作成して返す。

DirectSound.CreateSoundBufferFromFileDirectSound.CreateSoundBufferFromResource は、サウンドがそれほど長くない場合に使うのに適したメソッドである。DirectSound は、サウンド全体を保持するのに十分なバッファを作成し、ファイルやリソースからのデータをそのバッファに書き込む。DirectSound.CreateSoundBuffer はストリーム バッファに適しているが、開発者がウェーブ ファイルやリソースを解析し、バッファに対するデータのストリーミング処理を行わなければならない。

CreateSoundBuffer は、DirectSound3Dlistener オブジェクトを取得できるプライマリ バッファの作成にも使われる。詳細については、「DirectSound3DListener オブジェクトの取得」を参照すること。

次の例は、基本的なセカンダリ サウンド バッファを作成する方法を示す。

Dim m_dx As New DirectX7
Dim m_ds As DirectSound
 
Private Sub Form_Load()
  Set m_ds = m_dx.DirectSoundCreate("")
  CreateSoundBuffer
End Sub 
 
Public Sub CreateSoundBuffer()
  Dim m_dsb As DirectSoundBuffer
  Dim buffdesc As DSBUFFERDESC
  Dim format As WAVEFORMATEX
 
  ' ウェーブ フォーマットを指定する。
 
  format.nFormatTag = WAVE_FORMAT_PCM
  format.nChannels = 2
  format.lSamplesPerSec = 22050
  format.nBitsPerSample = 16
  format.nBlockAlign = (format.nChannels * format.nBitsPerSample) / 8
  format.lAvgBytesPerSec = format.lSamplesPerSec * format.nBlockAlign
  format.nSize = 0

  ' 作成するサウンド バッファを記述する。
 
  buffdesc.lBufferBytes = format.lAvgBytesPerSec
  buffdesc.lFlags = DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME _
          Or DSBCAPS_CTRLFREQUENCY
 
  ' バッファを作成する。
 
  Set m_dsb = m_ds.CreateSoundBuffer(buffdesc, format)
End Sub

DSBUFFERDESC 型は、フォーマット、サイズ、能力など、希望のバッファの特性を記述する。アプリケーションは必要な能力を指定しなければならない。さもないと、それらの能力は利用できない。たとえば、アプリケーションが DSBCAPS_CTRLFREQUENCY フラグを指定せずにバッファを作成すると、DirectSoundBuffer.SetFrequency に対するすべての呼び出しは失敗する。

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

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

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

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