Platform SDK: DirectX

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

[Visual Basic]

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

[C++]

このサンプル プログラムは汎用のウェーブ ファイル リーダーであり、サウンド データが特定のフォーマットであることを期待していない。この場合は、データのフォーマットが把握できるまで、セカンダリ サウンド バッファの作成を待たなければならない。

ファイルを開き、セカンダリ バッファを作成するステップは、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 内のデータ チャンクに関する情報を返す。全データ バイトを保持するのにちょうどの大きさのスタティック バッファを作成したい場合は、この構造体が重要になる。しかしこのチュートリアルではストリーム バッファを作成するので、データ チャンクのサイズを把握する必要はない。

次項 : ステップ 3 : セカンダリ サウンド バッファの作成