首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 5.0 MCI 多媒體控制播放 MIDI/WAV/CD 完整指南

     編輯:VC 教學

MCI (Media Control Interface) 核心

統一多媒體控制介面,函數 mciSendCommand (結構體參數) 與 mciSendString (字串指令)。本文採 mciSendCommand。需連結 winmm.lib,包含 mmsystem.h。

一、MIDI 順序播放

關鍵命令與結構體

命令結構體關鍵欄位
MCI_OPENMCI_OPEN_PARMSlpstrDeviceType=MCI_DEVTYPE_SEQUENCER, lpstrElementName=檔案路徑
MCI_PLAYMCI_PLAY_PARMSdwFrom=起始毫秒
MCI_PAUSEMCI_GENERIC_PARMS-
MCI_STOP--
MCI_SEEKMCI_SEEK_PARMSdwTo=目標毫秒, 標誌 MCI_TO | MCI_SEEK_TO_START/END
MCI_STATUSMCI_STATUS_PARMSdwItem: MCI_STATUS_LENGTH/MODE/POSITION/TIME_FORMAT/DIVTYPE/TEMPO
MCI_SETMCI_SET_PARMSdwTimeFormat=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

二、WAV 波形音訊

同 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)。

三、CD 音樂光碟

裝置類型 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);

限制與進階

  • MCI 同一時間**僅能播放一個**裝置/檔案。
  • 需同時播放多音效 (遊戲) 請改用 DirectSound (支援 8+ 同時聲道)。
  • 錯誤處理:mciSendCommand 回傳非 0 為錯誤碼,用 mciGetErrorString 取得文字說明。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved