mciSendCommand

MCI(Media Control Interface,媒體控制接口)向Windows程式提供了在高層次上控制媒體設備接口的能力。程式不必關心具體設備,就可以對雷射唱機(CD)、視盤機、波形音頻設備、視頻播放設備和MIDI設備等媒體設備進行控制。

基本介紹

  • 中文名:mciSendCommand
  • 提供:高層次上控制媒體設備接口的能力
  • 控制:視頻播放設備等媒體設備
  • 命令訊息:UINT uMsg, 
mciSendCommand,MCI簡介,mciSendCommand詳細,

mciSendCommand

MCI的命令訊息接口,所有MCI命令訊息都是通過mciSendCommand函式傳送的,函式聲明為:
MCIERROR mciSendCommand(
MCIDEVICEID wIDDevice,  //設備的ID,在打開設備時不用該參數
UINT uMsg,  //命令訊息
DWORD  fdwCommand, //命令訊息的標誌
DWORD  dwParam  //指向包含命令訊息參數的結構
); //若成功則返回0,否則返回錯誤碼
使用時請添加:
#include <MMSystem.h>
#pragma comment(lib, "WINMM.LIB")

MCI簡介

對於程式設計師來說,可以把MCI理解為設備面板上的一排按鍵,通過選擇不同的按鍵(傳送不同的MCI命令)可以讓設備完成各種功能,而不必關心設備內部實現。
比如,對於play,視盤機和CD機有不同的反應(一個是播放視頻,一個播放音頻),而對用戶來說卻只需要按同一按鈕。
應用程式通過向MCI傳送命令來控制媒體設備。MCI命令接口分命令字元串和命令訊息兩種,兩者具有相同的功能。命令字元串具有使用簡單的特點,但是它的執行效率不如命令訊息。

mciSendCommand詳細

MCI的命令訊息接口提供了C語言接口,它速度更快,並且更能符合C/C++程式設計師的需要。
所有MCI命令訊息都是通過mciSendCommand函式傳送的,函式聲明為:
MCIERROR mciSendCommand(
MCIDEVICEID wIDDevice,  //設備的ID,在打開設備時不用該參數
UINT uMsg,  //命令訊息
DWORD  fdwCommand, //命令訊息的標誌
DWORD  dwParam  //指向包含命令訊息參數的結構
); //若成功則返回0,否則返回錯誤碼
變數wDeviceID用來保存設備的ID,系統用ID來標識不同的設備,以保證命令發給正確的對象。
void CTttView::OnMyMenu()
{
MCI_OPEN_PARMS mciOpen;
UINT wDeviceID;
mciOpen.lpstrDeviceType = "avivideo";
mciOpen.lpstrElementName = "myfolder\\clock.avi";
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
wDeviceID=mciOpen.wDeviceID;
MCI_PLAY_PARMS mciPlay;
mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)&mciPlay);
);
---- MCI可以通過mciSendCommand()和mciSendString()來完成,本文僅使用mciSendCommand()函式。
---- 原型:DWORD mciSendCommand(UINT wDeviceID,UINT wMessage,DWORD dwParam1,DWORD dwParam2);
參數: wDeviceID:接受訊息的設備ID
wMessage:MCI命令訊息
dwParam1:命令的標誌位
dwParam2:所使用參數塊的指針
---- 返值:調用成功,返回零;否則,返回雙字中的低字存放有錯誤信息。
二MIDI的播放控制
---- 1. 打開設備
MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrDeviceType =
(LPCSTR) MCI_DEVTYPE_SEQUENCER;//MIDI類型
OpenParms.lpstrElementName = (LPCSTR) Filename;
OpenParms.wDeviceID = 0;
mciSendCommand (NULL, MCI_OPEN,
MCI_WAIT | MCI_OPEN_TYPE |
MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &OpenParms)
---- MCI設備ID指明打開了哪個設備,當傳送了MCI_OPEN命令時,這個值在參數塊中返回——應被保存備用。
---- 2. 關閉設備
mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
---- 3. 播放
MCI_PLAY_PARMS PlayParms;
PlayParms.dwFrom = 0;
// 指定從什麼地方(時間)播放
mciSendCommand (m_wDeviceID, MCI_PLAY,
MCI_FROM, (DWORD)(LPVOID)
&PlayParms));
---- 4. 暫停
MCI_PLAY_PARMS PlayParms;
mciSendCommand (m_wDeviceID, MCI_PAUSE, 0,
(DWORD)(LPVOID) &PlayParms);
---- 5. 停止
mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
---- 6. 跳躍
* 跳轉到任意地方
MCI_SEEK_PARMS SeekParms;
SeekParms.dwTo = (nMinute * 60 + nSecond) * 1000;
//跳轉的目標時間,時間單位為毫秒
mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO
| MCI_WAIT,(DWORD)(LPVOID)
&SeekParms);
* 跳到檔案頭
mciSendCommand (m_wDeviceID, MCI_SEEK,
MCI_SEEK_TO_START, NULL);
* 跳到檔案尾
mciSendCommand (m_wDeviceID, MCI_SEEK,
MCI_SEEK_TO_END, NULL);
---- 7. 查詢當前信息
MCI_STATUS_PARMS StatusParms;
StatusParms.dwItem = MCI_SEQ_STATUS_DIVTYPE;
mciSendCommand (m_wDeviceID, MCI_STATUS,
MCI_WAIT | MCI_STATUS_ITEM,
(DWORD)(LPVOID) &StatusParms);
返回信息存放於StatusParms.dwReturn中。
MCI_STATUS標誌
MCI_STATUS_LENGTH 獲得檔案長度
MCI_STATUS_MODE 獲得檔案播放的當前狀態
MCI_STATUS_POSITION 獲得檔案播放的當前位置
MCI_STATUS_TIME_FORMAT 獲得當前的時間格式
MCI_SEQ_STATUS_DIVTYPE 判斷檔案是PPQN類型還是SMPTE類型
MCI_SEQ_STATUS_TEMPO 獲得當前播放速度,PQRN類型,
此值為節拍/分,SMPTE類型,此值為禎/秒
---- 8. 設定時間格式及播放速度
MCI_SET_PARMS SetParms;
SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
//設定時間單位為毫秒
mciSendCommand (m_wDeviceID,
MCI_SET, MCI_SET_TIME_FORMAT,
(DWORD)(LPVOID) &SetParms);
MCI_SEQ_SET_TEMPO 設定播放速度,
PQRN類型,此值為節拍/分,
SMPTE類型,此值為禎/秒
第二部分 WAV檔案的播放
---- 一、原理
---- MicroSoft API提供了三種不同的方法來實現WAV的播放:
PlaySound()函式。它可以通過單行編碼來播放Wave格式的聲音。此函式有兩個限制:必須將聲音數據完整地載入物理記憶體;數據格式必須被所配置的某一音頻驅動器支 持。根據經驗,PlaySound()適用於100K以下的檔案。
MCI(The Media Control Interface),與上一章播放MIDI檔案相似,可以播放100K 以上的檔案。
低級Wave音頻設備。用這些設備可以運行完全控制Wave數據的套用檔案。
---- 二、 WAV檔案播放控制
---- 因為同樣使用MCI,與上一章相同,只列出不同的部分。
---- 1. 打開設備
---- 將MIDI的MCI_DEVTYPE_SEQUENCER 改為"waveaudio"
---- 2. 錄音
MCI_RECORD_PARMS RecordParms;
mciSendCommand (m_wDeviceID, MCI_RECORD,
NULL, (DWORD)(LPVOID)
&RecordParms);
---- 3. 保存錄音
MCI_SAVE_PARMS SaveParms;
SaveParms.lpfilename = (LPCSTR) Filename;
mciSendCommand (m_wDeviceID, MCI_SAVE,
MCI_SAVE_FILE | MCI_WAIT,
(DWORD)(LPVOID) &SaveParms);
第三部分 CD的播放
---- CD的獨特優勢在於,它由作曲家設計,並由音樂廠家生產。不同的計算機播放MIDI 檔案時,聲音效果也不一樣,但是CD的聲音效果總是相同的。高品質的音頻對計算機用 戶產生的效果會使你感到吃驚。 我們依然採用MCI播放CD,大部分的播放控制與前兩部分相同,只列出不同的部分
---- 1. 開光碟機門
mciSendCommand (m_wDeviceID, MCI_SET,
MCI_SET_DOOR_OPEN, NULL);
---- 2. 關光碟機門
mciSendCommand (m_wDeviceID, MCI_SET,
MCI_SET_DOOR_CLOSED, NULL);
---- 3. 打開設備
將MIDI的MCI_DEVTYPE_SEQUENCER 改為MCI_DEVTYPE_CD_AUDIO
---- 4. 播放
---- 指定播放起點必須經過MCI_MAKE_TMSF(Track,Minute,Second,Frame)轉化
---- 5. 查詢當前信息
MCI_STATUS_CURRENT_TRACK 得到當前曲目
MCI_STATUS_LENGTH 得到CD或指定曲目長度
MCI_STATUS_MODE 得到驅動器的當前狀態
MCI_STATUS_NUMBER_OF_TRACKS 得到CD曲目的數目
MCI_STATUS_POSITION 得到當前格式下的位置
MCI_STATUS_READY 檢查設備是否就緒
MCI_STATUS_TIME_FORMAT 得到當前時間格式
MCI_STATUS_MEDIA_divSENT 檢查以確認CD是否在驅動器內
MCI_CDA_STATUS_TYPE_TRACK 檢查已確認某曲目是否為音頻曲目
---- 注意:
使用MCI_STATUS_LENGTH參數查詢CD 及曲目長度,返回值通過調用MCI_MSF_MINUTE(),MCI_MSF_SECOND()轉換為分、秒。
MCI_STATUS_POSITION參數返回值調用MCI_TMSF_TRACK(), MCI_TMSF_MINUTE(), MCI_TMSF_SECOND(),MCI_TMSF_FRAME才能得到當前的位置的道、分、秒、幀。
---- 6. 跳躍
---- 跳轉的目標必須經過MCI_MAKE_TMSF(Track,Minute,Second,Frame)轉化最好將上述三種格式分開建類,或做成動態連線庫。在 Project-- >Setting-- >Link-- >Object/library modules中加入winmm.lib,源程式中包含。
---- MCI調用簡單,功能強大,可以滿足日常多媒體編程的基本需要。但是,MCI一次只能播放一個檔案,使用DirectSound技術可以實現八個以上WAV檔案的同時播放。

相關詞條

熱門詞條

聯絡我們