何よりも大きな壁と成り得るのは、音声についての知識が必要になる点であると思われます。このデータはサンプリングレートやビット数など複雑な概念が絡んで作成されています。windowsとは全く別の話題であり、高度な専門知識が要求されます。WAVEを再生するとは、こうした波形データを再生することを意味しています。ときとして音声に関する深い知識が要求されることがあります。APIであるwaveOut関数を呼び出すことになります。波形データを加工してWAVEを再生したい場合は、waveOut関数を呼び出すことになります。そのデコードされた波形データをwaveOut関数で再生することになります。waveOut関数を呼び出すには、まずwaveOutOpenでWAVEデバイスをオープンすることになります。);phwoは、WAVEデバイスのハンドルを受け取る変数のアドレスを指定します。uDeviceIDは、オープンしたいWAVEデバイスのIDを指定します。WAVE_MAPPERを指定した場合は、デフォルトのデバイスがオープンされます。pwfxは、WAVEデータのフォーマットを格納したWAVEFORMATEX構造体のアドレスを指定します。dwCallbackは、コールバック機能を実装するためのハンドルを指定します。WAVEデータの再生が終了した場合にメッセージを受信することができます。コールバック機能を利用しない場合は、0を指定します。dwCallbackInstanceは、dwCallbackにwaveOutProc型コールバック関数を指定した場合に意味を持ちます。それ以外の場合は、0を指定します。fdwOpenは、WAVEデバイスにオープンに関する定数を指定します。CALLBACK_THREADを指定した場合はdwCallbackにスレッドハンドルを指定することができます。WAVEデバイスをオープンしたら、次にWAVEデータを準備することになります。ここで言う準備とは、WAVEデータを物理メモリに常駐させるための作業です。した現象をWAVEの再生中に発生させないようにすることが目的です。WAVEデータを準備するには、waveOutPrepareHeaderを呼び出します。);hwoは、WAVEデバイスのハンドルを指定します。pwhは、WAVEデータなどを含むWAVEHDR構造体のアドレスを指定します。cbwhは、pwhのサイズを指定します。WAVEHDR構造体は、次のように定義されています。lpDataは、WAVEデータを指定します。これは、バッファと呼ばれることもあります。dwBufferLengthは、lpDataのサイズを指定します。dwBytesRecordedは、録音したデータのバイト数が格納されます。WAVEを再生する場合は、このメンバは使用しません。dwUserは、アプリケーション固有の値を指定します。マルチバッファリング時におけるバッファのインデックスを指定することができます。dwFlagsは、WAVEデータの現在の状態を表す定数がwaveOut関数によって指定されます。dwLoopsを初期化する場合は、アプリケーションがWHDR_BEGINLOOPとWHDR_ENDLOOPを指定します。dwLoopsは、ループ再生をする回数を指定します。0を指定した場合は、自動でループ再生が行われることはありません。lpNextは、予約されているためNULLで問題ありません。reservedは、予約されているため0で問題ありません。WAVEデータを準備したら、waveOutWriteでWAVEデータをデバイスに送ることができます。これによって、WAVEデータが再生されることになります。);hwoは、WAVEデバイスのハンドルを指定します。pwhは、WAVEHDR構造体のアドレスを指定します。cbwhは、pwhのサイズを指定します。再生しているWAVEを停止したい場合は、waveOutResetを呼び出します。);hwoは、WAVEデバイスのハンドルを指定します。事前にwaveOutUnprepareHeaderを呼び出しておく必要があります。);hwoは、WAVEデバイスのハンドルを指定します。pwhは、WAVEHDR構造体のアドレスを指定します。cbwhは、pwhのサイズを指定します。waveOutCloseでWAVEデバイスを閉じることができます。);hwoは、WAVEデバイスのハンドルを指定します。今回のプログラムは、waveOut関数を使用してWAVEを再生します。TEXT("WAVEデバイスのオープンに失敗しました。TEXT("ファイルのオープンに失敗しました。TEXT("WAVEファイルではありません。TEXT("PCMデータではありません。TRUE;}WAVEを再生するためには、WAVEフォーマットとWAVEデータが必要になります。ReadWaveFileという自作関数で取得するようにしています。第3引数でWAVEデータ、第4引数でWAVEデータのサイズとなります。この関数の内部実装については、マルチメディア入力の章にて説明しています。これによりデバイスのオープンに成功することになります。第6引数にCALLBACK_NULLを指定し、第4引数と第5引数に0を指定します。waveOutWriteを呼び出すまでの処理は次のようになっています。sizeof(WAVEHDR));WAVEHDR構造体であるwhにWAVEデータとそのサイズを指定します。dwFlagsについては0に初期化しておきます。その後にwaveOutWriteでWAVEを再生します。waveOutPrepareHeaderを呼び出さずに、waveOutWriteを呼び出した場合は失敗することになります。WAVEデバイスを閉じる処理などは、次のようになっています。再生されているWAVEを事前にwaveOutResetで停止させておく必要があります。なければ、waveOutUnprepareHeaderやwaveOutCloseは失敗することになります。waveOutResetは何も行わずに成功を示す値を返します。不要になった場合は明示的に開放することになります。