サウンドファイルを鳴らす時には、sndPlaySound()を使うと1行でサウンドファイルを読み込んで再生する事が出来ます。しかし、再生のたびにサウンドデータをファイルから読むと最初の再生やキャッシュから外れた時などにディスクアクセスが発生するので、一瞬止まってしまいます。幸い、sndPlaySound()は「メモリ上の」サウンドファイルイメージも再生できますから、今回はこのAPIでメモリ上に読み込んだサウンドファイルを再生してみる事にしましょう。
sndPlaySound()によるサウンド再生は、最初に小さいサウンドファイルをまとめてメモリに読み込んでおいて、プログラム中で効果音として利用する時などに便利です。
sndPlaySound()の使用法
サウンドを再生するsndPlaySound()の引数には、ポインタとフラグを渡します。ポインタには、ファイル名、またはサウンドイメージがあるバッファのアドレスを渡し、ファイル・メモリどちらから再生するか、また再生のオプションなどをフラグで指定するわけです。
例えば、以下のようにすると(プログラムと同じディレクトリにある)ディスク上のサウンドファイルsound.wavを再生する事が出来ます。
sndPlaySound("sound.wav",SND_ASYNC);
また、メモリ上のサウンドイメージを再生する時には、フラグにSND_MEMORYを追加して
sndPlaySound(lpSound,SND_ASYNC|SND_MEMORY);
とします。
以上の事から、サウンドファイルsound.wavをメモリに読み込んで再生する処理は以下のような感じになります。
LPVOID lpSound; HANDLE fh; DWORD dummy; fh=CreateFile("sound.wav",GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpSound=GlobalAlloc(GPTR,GetFileSize(fh,NULL)); /* バッファ確保 */ ReadFile(fh,lpSound,GetFileSize(fh,NULL),&dummy,NULL); /* 読み込み */ CloseHandle(fh); sndPlaySound(lpSound,SND_ASYNC|SND_MEMORY); /* メモリ上のサウンド再生 */
プログラム
サウンドファイル(WAVEファイル)をドロップするとそのファイルをメモリに読み込み、「再生」ボタンをクリックするとメモリ内のサウンドイメージを再生します。ビルドする時には、プロジェクトの設定でリンクにwinmm.libを追加してください。