Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectSound Visual Basic チュートリアル」を参照すること。
このチュートリアルでは、以下の定義とグローバル変数を必要とする。
#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()