Platform SDK: DirectX

ステップ 1 : DirectSound の設定

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectSound Visual Basic チュートリアル」を参照すること。

[C++]

このチュートリアルでは、以下の定義とグローバル変数を必要とする。

#define NUMEVENTS 2
 
LPDIRECTSOUND               lpds;
DSBUFFERDESC                dsbdesc;
LPDIRECTSOUNDBUFFER         lpdsb;
LPDIRECTSOUNDBUFFER         lpdsbPrimary;
LPDIRECTSOUNDNOTIFY         lpdsNotify;
WAVEFORMATEX                *pwfx;
HMMIO                       hmmio;
MMCKINFO                    mmckinfoData, mmckinfoParent;
DSBPOSITIONNOTIFY           rgdsbpn[NUMEVENTS];
HANDLE                      rghEvent[NUMEVENTS];
 

最初のステップは、DirectSound オブジェクトを作成し、協調レベルを確立し、プライマリ バッファのフォーマットを設定することである。これらはいずれも、次のコードで示す InitDSound 関数内で行われる。

この関数はパラメータとしてメイン ウィンドウ ハンドルとサウンド デバイスの GUID へのポインタの 2 つを取る。ほとんどの場合、2 番目のパラメータに NULL を渡し、デフォルトのデバイスを使うよう指示するが、デバイス列挙により GUID の取得もできる。

BOOL InitDSound(HWND hwnd, GUID *pguid)
{
   // DirectSound を作成する。
 
    if FAILED(DirectSoundCreate(pguid, &lpds, NULL)) 
        return FALSE;
 
    // 協調レベルを設定する。
 
    if FAILED(IDirectSound_SetCooperativeLevel(
            lpds, hwnd, DSSCL_PRIORITY))
        return FALSE;
 

ここではプライマリ バッファのフォーマットを設定できるよう、プライマリ協調レベルを設定した。デフォルトのフォーマットに変更を加えない場合、入力のフォーマットにかかわりなく、出力は 8 ビット、22 kHz フォーマットになる。プライマリ バッファをこれより上のフォーマットに設定しても、問題はない。セカンダリ バッファがこれより下のフォーマットだったとしても、DirectSound がサンプルの変換を自動的に行うからである。IDirectSoundBuffer::SetFormat の呼び出しが失敗した場合も、問題はない点に注意すること。ハードウェアはこの上位フォーマットをサポートしないからである。DirectSound は単純に、利用できる中で最も近いフォーマットに設定する。

プライマリ バッファのフォーマットを設定するには、最初にグローバルな DSBUFFERDESC 構造体でそのフォーマットを記述し、次にその記述を IDirectSound::CreateSoundBuffer メソッドに渡す。

    // プライマリ バッファを取得する。
 
    ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
    dsbdesc.dwSize = sizeof(DSBUFFERDESC);
    dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
    if FAILED(lpds->CreateSoundBuffer(&dsbdesc, &lpdsbPrimary, NULL))
        return FALSE;
 

プライマリ バッファ オブジェクトを取得した後で、希望のウェーブ フォーマットを記述し、その記述を IDirectSoundBuffer::SetFormat メソッドに渡す。

    // プライマリ バッファのフォーマットを設定する。
 
    WAVEFORMATEX wfx;
    memset(&wfx, 0, sizeof(WAVEFORMATEX)); 
    wfx.wFormatTag = WAVE_FORMAT_PCM; 
    wfx.nChannels = 2; 
    wfx.nSamplesPerSec = 44100; 
    wfx.wBitsPerSample = 16; 
    wfx.nBlockAlign = wfx.wBitsPerSample / 8 * wfx.nChannels;
    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
 
    hr = lpdsbPrimary->SetFormat(&wfx); 
 
    return TRUE;
}  // InitDSound()
 

次項 : ステップ 2 : ウェーブ ファイルを開く