統一多媒體控制介面,函數 mciSendCommand (結構體參數) 與 mciSendString (字串指令)。本文採 mciSendCommand。需連結 winmm.lib,包含 mmsystem.h。
| 命令 | 結構體 | 關鍵欄位 |
|---|---|---|
| MCI_OPEN | MCI_OPEN_PARMS | lpstrDeviceType=MCI_DEVTYPE_SEQUENCER, lpstrElementName=檔案路徑 |
| MCI_PLAY | MCI_PLAY_PARMS | dwFrom=起始毫秒 |
| MCI_PAUSE | MCI_GENERIC_PARMS | - |
| MCI_STOP | - | - |
| MCI_SEEK | MCI_SEEK_PARMS | dwTo=目標毫秒, 標誌 MCI_TO | MCI_SEEK_TO_START/END |
| MCI_STATUS | MCI_STATUS_PARMS | dwItem: MCI_STATUS_LENGTH/MODE/POSITION/TIME_FORMAT/DIVTYPE/TEMPO |
| MCI_SET | MCI_SET_PARMS | dwTimeFormat=MCI_FORMAT_MILLISECONDS, MCI_SEQ_SET_TEMPO |
| MCI_CLOSE | - | - |
MCI_OPEN_PARMS op = {0};
op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;
op.lpstrElementName = _T("music.mid");
mciSendCommand(0, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&op);
UINT wDeviceID = op.wDeviceID; // 保存裝置 ID
同 MCI 流程,差異在 MCI_OPEN:
op.lpstrDeviceType = _T("waveaudio"); // 而非 SEQUENCER
額外支援 錄音:
MCI_RECORD_PARMS rp = {0};
mciSendCommand(wDeviceID, MCI_RECORD, 0, (DWORD)&rp); // 開始錄音
MCI_SAVE_PARMS sp = {0}; sp.lpfilename = _T("rec.wav");
mciSendCommand(wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)&sp); // 存檔
小檔案 (<100KB) 可用 PlaySound 簡單播放:PlaySound(_T("click.wav"), NULL, SND_FILENAME | SND_ASYNC)。
裝置類型 MCI_DEVTYPE_CD_AUDIO。時間格式為 **TMSF** (Track/Minute/Second/Frame),轉換巨集:
DWORD tmsf = MCI_MAKE_TMSF(track, min, sec, frame);
// 光碟機彈出/關閉
mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
// 播放指定軌道
MCI_PLAY_PARMS pp = {0}; pp.dwFrom = MCI_MAKE_TMSF(2,0,0,0); // 第 2 軌
mciSendCommand(wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)&pp);
// 狀態查詢 (需轉換回傳值)
MCI_STATUS_PARMS sp = {0}; sp.dwItem = MCI_STATUS_CURRENT_TRACK;
mciSendCommand(wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&sp);
int track = sp.dwReturn; // 當前軌道
// 位置查詢
sp.dwItem = MCI_STATUS_POSITION;
mciSendCommand(wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&sp);
DWORD tmsf = sp.dwReturn;
int tr = MCI_TMSF_TRACK(tmsf), mn = MCI_TMSF_MINUTE(tmsf), sc = MCI_TMSF_SECOND(tmsf), fr = MCI_TMSF_FRAME(tmsf);
mciSendCommand 回傳非 0 為錯誤碼,用 mciGetErrorString 取得文字說明。