Windowsコード集 上のページ

#0003 CDプレイヤー

MCIを使ってCDを演奏させる方法です。

CD-DAオープン(MCI_OPEN)
MCI_OPEN_PARMS parms;
parms.lpstrDeviceType = "cdaudio";      // デバイス名
mciSendCommand(0,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE,(DWORD)&parms);
コマンド終了後 parms.wDeviceID には、デバイスIDが格納されます。
(以降の mciSendCommand の第1パラメータとなる)
時刻形式設定(MCI_SET)
MCI_SET_PARMS set;
set.dwTimeFormat = MCI_FORMAT_TMSF;
mciSendCommand(device,MCI_SET,MCI_WAIT|MCI_SET_TIME_FORMAT,(DWORD)&set);
MCI_OPEN成功後、このコマンドで時刻形式を "トラック,分,秒,フレーム" にします。
こうしておく事で、MCI_PLAYでの演奏位置指定の単位を指定します。
演奏トラック数取得(MCI_STATUS)
MCI_STATUS_PARMS parms;
parms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
mciSendCommand(device,MCI_STATUS,MCI_STATUS_ITEM|MCI_WAIT,(DWORD)&parms);
このコマンドにより、parms.dwReturn に演奏トラック数が格納されます。
演奏開始(MCI_PLAY)
MCI_PLAY_PARMS parms;
parms.dwCallback = (DWORD)hwnd;  // メッセージ受け取るウィンドゥハンドル(ループ演奏時に必要)
parms.dwFrom = MCI_MAKE_TMSF(1,    0,0,0);  // 演奏開始位置(1トラック目先頭)
parms.dwTo   = MCI_MAKE_TMSF(1 + 1,0,0,0);  // 演奏終了位置(2トラック目先頭)
mciSendCommand(device,MCI_PLAY,MCI_FROM|MCI_TO|MCI_NOTIFY,(DWORD)&parms);
ループ演奏を実現する方法は、MIDI演奏の場合と同じです。

dwFrom,dwToの指定ですが、MCI_MAKE_TMSFを使うことによりトラック番号で行います。 ただし最終トラックの場合は、dwToの値は無効にする必要があります。
具体的には、以下の下線部のようにフラグをMCI_FROM|MCI_NOTIFYのみにします。
こうする事で、トラックの最後までを演奏するように指定できます。
mciSendCommand(device,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)&parms);
演奏停止(MCI_STOP)
MCI_GENERIC_PARMS parms;
mciSendCommand(device,MCI_STOP,MCI_WAIT,(DWORD)&parms);
CD-DAクローズ(MCI_CLOSE)
MCI_GENERIC_PARMS parms;
mciSendCommand(device,MCI_CLOSE,MCI_WAIT,(DWORD)&parms);
MCI_CLOSEしただけでは、CDの演奏は停止しません。
アプリケーションの終了時には、MCI_STOPも合わせてコマンド送信しておくようにすると良いです。


上のページ