PlaySound関数によるWAVEデータ再生

概要:WAVEファイルをメモリに読み込んでから再生させる

ゲームでの利用を想定しているのであれば、直ぐに鳴ってくれないと困る音もあります。
ファイルから直接再生させたのでは間に合わないかもしれません。
従って、一般的にはメモリに読み込んでから再生させます。

■WAVEファイルをメモリに読み込む

ファイルからメモリに読み込む方法は……わかりますよね?
関数の詳細はリファレンスを参照して下さい。

ここではいつ読み込むかが重要です。
再生させる度にメモリに読み込んでいたのでは、メモリに読み込む意味がありません。
再生処理が実行されるより前にメモリに読み込まれていなければならないのです。
従って、プログラム起動直後などに一度だけメモリに読み込み、不要になるまで保持します。

HANDLE fh;
DWORD dwFileSize,dwReadSize;
static LPCSTR lpSound;

case WM_CREATE:
    fh=CreateFile(FILENAME,GENERIC_READ,0,NULL,
        OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(fh==INVALID_HANDLE_VALUE){
        MessageBox(NULL,"ファイルが開けません",FILENAME,MB_OK);
        return -1;    //WM_CREATE が -1 を返すとウィンドウ破棄
    }
    dwFileSize=GetFileSize(fh,NULL);
    lpSound=(LPCSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwFileSize);
    ReadFile(fh,(LPVOID)lpSound,dwFileSize,&dwReadSize,NULL);
    CloseHandle(fh);
    return 0;

■WAVEデータの再生&停止

再生フラグに SND_MEMORY を指定します。
この時、第一引数は「メモリ内のサウンドイメージへのポインタ」を意味する事になります。

case WM_LBUTTONDOWN:    //再生
    PlaySound(lpSound,NULL,SND_MEMORY | SND_ASYNC | SND_LOOP);
    return 0;
case WM_RBUTTONDOWN:    //停止
    PlaySound(NULL,NULL,0);
    return 0;

■メモリ解放

不要になったらサウンドのメモリを解放しましょう。
ただし、サウンド再生中はメモリを使用しているので、解放するべきではありません。
従って、演奏停止させてからメモリを解放するべきだと考えられます。

case WM_DESTROY:
    PlaySound(NULL,NULL,0);
    HeapFree(GetProcessHeap(),0,(LPVOID)lpSound);
    PostQuitMessage(0);
    return 0;

★☆ ソースファイル表示 ☆★

サウンドの再生方法は、処理時間が重要かどうかを考え、
ファイルから直接再生させるか、メモリに読み込んでから再生させるか、
を選択して下さい。


戻る / ホーム