Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectSound Visual Basic チュートリアル」を参照すること。
このサンプル プログラムは汎用のウェーブ ファイル リーダーであり、サウンド データが特定のフォーマットであることを期待していない。この場合は、データのフォーマットが把握できるまで、セカンダリ サウンド バッファの作成を待たなければならない。
ファイルを開き、セカンダリ バッファを作成するステップは、SetupStreamBuffer 関数内にまとめられている。この関数は最初に、直前にサウンドが演奏されていた状態をクリーンアップするために必要なすべての作業を行う。
BOOL SetupStreamBuffer(LPSTR lpzFileName) { // 開いているすべてのファイルを閉じ、インターフェイスを解放する。 Close(); // Wavread.cpp の関数。 if (lpdsNotify != NULL) { lpdsNotify->Release(); lpdsNotify = NULL; } if (lpdsb != NULL) { lpdsb->Release(); lpdsb = NULL; }
この関数は次にウェーブ ファイルを開き、そのフォーマットを取得し、ファイル ポインタをサウンド データの先頭へ進める。この作業は Wavread.cpp 内の 2 つの関数を使って行う。
if (WaveOpenFile(lpzFileName, &hmmio, &pwfx, &mmckinfoParent) != 0) return FALSE; if (WaveStartDataRead(&hmmio, &mmckinfoData, &mmckinfoParent) != 0) return FALSE;
WaveOpenFile 関数は、このチュートリアルの先頭で宣言した 3 つのグローバル関数、つまりファイル ハンドル、WAVEFORMATEX 構造体へのポインタ、親チャンク (ファイル全体に関する情報) の MMCKINFO 構造体を初期化する。
次にファイル ハンドルとチャンク情報は WaveStartDataRead 関数に渡され、この関数は mmckinfoData 内のデータ チャンクに関する情報を返す。全データ バイトを保持するのにちょうどの大きさのスタティック バッファを作成したい場合は、この構造体が重要になる。しかしこのチュートリアルではストリーム バッファを作成するので、データ チャンクのサイズを把握する必要はない。