MCIを使用したWAV,MIDI,CDの再生 1.WAVの再生 MCI_WAVE_OPEN_PARMS mciOpen; MCI_PLAY_PARMS mciPlay; mciPlay.dwCallback=NULL; MCI_GENERIC_PARMS mciGeneric; CHAR FileName[_MAX_PATH]; //再生させるファイル名 MCIDEVICEID SoundId; //MCIデバイスを開く mciOpen.dwCallback=0L; mciOpen.wDeviceID=0; mciOpen.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_WAVEFORM_AUDIO; mciOpen.lpstrElementName=FileName; mciOpen.lpstrAlias=NULL; mciOpen.dwBufferSeconds=4; if(mciSendCommand(0,MCI_OPEN,MCI_NOTIFY|MCI_WAVE_OPEN_BUFFER|MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)(LPMCI_WAVE_OPEN_PARMS)&mciOpen)!=0) { return FALSE; } SoundId=mciOpen.wDeviceID; //演奏開始 if(mciSendCommand(SoundId,MCI_PLAY,MCI_NOTIFY,(DWORD)&mciPlay)!=0) { mciSendCommand(SoundId,MCI_STOP,MCI_WAIT,(DWORD)&mciGeneric); mciSendCommand(SoundId,MCI_CLOSE,MCI_WAIT,(DWORD)&mciGeneric); return FALSE; } return TRUE; とします。 停止させる場合には //演奏停止 mciSendCommand(SoundId,MCI_STOP,MCI_WAIT,(DWORD)&mciGeneric); //MCIデバイスを閉じる mciSendCommand(SoundId,MCI_CLOSE,MCI_WAIT,(DWORD)&mciGeneric); を実行してください。 停止しているかどうかを見るのは MCI_STATUS_PARMS mciStatus; mciStatus.dwCallback=NULL; mciStatus.dwItem=MCI_STATUS_MODE; mciSendCommand(SoundId,MCI_STATUS,MCI_STATUS_ITEM|MCI_WAIT,(DWORD)&mciStatus); if(mciStatus.dwReturn==MCI_MODE_STOP) return TRUE; で見れます。 MCI_STATUS_PARMSのdwReturnの値によって、音楽の演奏がどういった状態であるかということがわかります。 2.MIDIの再生 MCI_OPEN_PARMS mciOpen; MCI_PLAY_PARMS mciPlay; mciPlay.dwCallback=NULL; MCI_GENERIC_PARMS mciGeneric; CHAR FileName[_MAX_PATH]; //再生させるファイル名 MCIDEVICEID SoundId; //MCIデバイスを開く mciOpen.dwCallback=0L; mciOpen.wDeviceID=0; mciOpen.lpstrDeviceType=(LPSTR) MCI_DEVTYPE_SEQUENCER; mciOpen.lpstrElementName=FileName; mciOpen.lpstrAlias=NULL; if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)(LPMCI_WAVE_OPEN_PARMS)&mciOpen)!=0) { return FALSE; } SoundId=mciOpen.wDeviceID; //演奏開始 if(mciSendCommand(SoundId,MCI_PLAY,MCI_NOTIFY,(DWORD)&mciPlay)!=0) { mciSendCommand(SoundId,MCI_STOP,MCI_WAIT,(DWORD)&mciGeneric); mciSendCommand(SoundId,MCI_CLOSE,MCI_WAIT,(DWORD)&mciGeneric); return FALSE; } 停止させる場合、および終了しているかどうかはWAVの場合とまったく同じです。 3.CDの再生の仕方 ここではDドライブにAudio CDが入っているとみなして説明します。 //MCIデバイスを開く MCI_OPEN_PARMS mciOpen; MCI_GENERIC_PARMS mciGeneric; MCI_STATUS_PARMS mciStatus; CHAR DriveName[10]="D:" mciOpen.dwCallback=0L; mciOpen.wDeviceID=0; mciOpen.lpstrDeviceType=(LPSTR) MCI_DEVTYPE_CD_AUDIO; mciOpen.lpstrElementName=DriveName; mciOpen.lpstrAlias=NULL; if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)(LPMCI_OPEN_PARMS)&mciOpen)!=0) { return FALSE; } //演奏時のデータ形式をセットする MCI_SET_PARMS mciSet; mciSet.dwTimeFormat = MCI_FORMAT_TMSF; if (mciSendCommand(mciOpen.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)&mciSet)) { mciSendCommand(CdId, MCI_CLOSE, 0, NULL); return FALSE; } mciPlay.dwCallback=NULL; //CDのトラック数を確保する mciStatus.dwItem = MCI_STATUS_NUMBER_OF_TRACKS; if(mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM|MCI_WAIT, (DWORD)(LPVOID)&mciStatus)!=0) { mciStatus.dwReturn=0; return FALSE; } INT SumTrackData=mciStatus.dwReturn; //CDのトラックの長さを確保する //ここでは仮に5曲目を演奏することについて考えます(PlayNumber=5としてます) INT PlayNumber=5; mciStatus.dwItem = MCI_STATUS_LENGTH; mciStatus.dwTrack = PlayNumber; if(mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_TRACK|MCI_STATUS_ITEM|MCI_WAIT, (DWORD)(LPVOID)&mciStatus)!=0) { mciSendCommand(mciOpen.wDeviceID,MCI_CLOSE,MCI_WAIT,(DWORD)(LPMCI_GENERIC_PARMS)&mciGeneric); return FALSE; } DWORD TrackLongData; TrackLongData=mciStatus.dwReturn; //演奏位置を指定して演奏開始 mciPlay.dwFrom=MCI_MAKE_TMSF(PlayNumber,0,0,0); mciPlay.dwTo=MCI_MAKE_TMSF(PlayNumber,MCI_MSF_MINUTE(TrackLongData), MCI_MSF_SECOND(TrackLongData),MCI_MSF_FRAME(TrackLongData)); if(mciSendCommand(CdId,MCI_PLAY,MCI_NOTIFY|MCI_FROM|MCI_TO,(DWORD)&mciPlay)!=0) { mciSendCommand(mciOpen.wDeviceID,MCI_CLOSE,MCI_WAIT,(DWORD)(LPMCI_GENERIC_PARMS)&mciGeneric); return FALSE; } 演奏時のデータ形式をセットしないと、トラックの長さを確保せずに演奏ができるはずです。 その分自由度が減りますが、 停止させたり、状態を見るのはWAVのようにすると可能です。 基本的には同じような動作ばかりなので迷うことはないと思います。