c语言mcisendstring函数,mciSendString用法
使用MCI API,源文件中需要包含頭文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入庫 Winmm.lib。 VS2008在源文件加上#include "mmsystem.h" #pragma comment(lib,"winmm.lib")
1、MCI簡介
MCI(Media Control Interface,媒體控制接口)向Windows程序提供了在高層次上控制媒體設備接口的能力。程序不必關心具體設備,就可以對激光唱機(CD)、視盤機、波形音頻設備、視頻播放設備和MIDI設備等媒體設備進行控制。
對于程序員來說,可以把MCI理解為設備面板上的一排按鍵,通過選擇不同的按鍵(發送不同的MCI命令)可以讓設備完成各種功能,而不必關心設備內部實現。
比如,對于play,視盤機和CD機有不同的反應(一個是播放視頻,一個播放音頻),而對用戶來說卻只需要按同一按鈕。
應用程序通過向MCI發送命令來控制媒體設備。MCI命令接口分命令字符串和命令消息兩種,兩者具有相同的功能。命令字符串具有使用簡單的特點,但是它的執行效率不如命令消息。
所有的MCI命令字符串都是通過多媒體API函數mciSendString傳遞給MCI的,該函數的聲明為:
MCIERROR mciSendString(
LPCTSTR lpszCommand, //MCI命令字符串
LPTSTR lpszReturnString, //存放反饋信息的緩沖區
UINT cchReturn, //緩沖區的長度
HANDLE hwndCallback //回調窗口的句柄,一般為NULL
); //若成功則返回0,否則返回錯誤碼。
該函數返回的錯誤碼可以用mciGetErrorString函數進行分析,該函數的聲明為:
BOOL mciGetErrorString(
DWORD fdwError, //函數mciSendString返回的錯誤碼
LPTSTR lpszErrorText, //接收描述錯誤的字符串的緩沖區
UINT cchErrorText //緩沖區的長度
);
下面是使用mciSendString函數的一個簡單例子:
char buf[50];
MCIERROR mciError;
mciError=mciSendString("open cdaudio",buf,strlen(buf),NULL);
if(mciError)
{
mciGetErrorString(mciError,buf,strlen(buf));
AfxMessageBox(buf);
return;
}
open cdaudio命令打開CD播放器,如果出錯(如驅動器內沒有CD)則返回錯誤碼,此時可以用mciGetErrorString函數取得錯誤信息字符串。
2、MCI設備
open是MCI打開設備的命令,cdaudio是MCI設備名。MCI的設備類型如下:
animation 動畫設備
cdaudio CD播放器
dat 數字音頻磁帶機
digitalvideo 某一窗口中的數字視頻(不基于GDI)
other 未定義的MCI設備
overlay 重疊設備(窗口中的模擬視頻)
scanner 圖象掃描儀
sequencer MIDI序列器
videodisc 視盤機
waveaudio 播放數字波形文件的音頻設備
設備名是在注冊表或SYSTEM.INI的[mci]部分定義的,典型的[mci]段如下:
[mci]
cdaudio=mcicda.drv
sequencer=mciseq.drv
waveaudio=mciwave.drv
avivideo=mciavi.drv
videodisc=mcipionr.drv
等號的左邊是設備名,右邊是對應的MCI驅動程序。當安裝了新的MCI驅動程序時,系統要用不同的設備名來區分。
3、MCI命令
使用MCI設備一般包括打開、使用和關閉三個過程,常用的MCI命令有:
open 打開設備
close 關閉設備
play 開始設備播放
stop 停止設備的播放或記錄
record 開始記錄
save 保存設備內容
pause 暫停設備的播放或記錄
resume 恢復暫停播放或記錄的設備
seek 改變媒體的當前位置
capacility 查詢設備能力
info 查詢設備的信息
status 查詢設備狀態信息
MCI的大部分命令可以控制不同的媒體設備,但其中record和save命令并不是所有MCI設備都可以使用。
MCI命令的使用是很隨意的,只要先打開,最后關閉,中間可以隨意調用各種命令。
(1) open 打開設備
MCI設備使用前必須先打開,當然,使用后也必須要關閉,以免影響他人的使用。
open device_name type device_type alias device_alias
device_name 要使用的設備名,通常是文件名。
type device_type 設備類型,例如waveaudio或sequencer,可省略。
alias device_alias 設備別名,指定后可在其他命令中代替設備名。
(2) play 開始設備播放
MCI設備打開后即可以播放,可使用設備名或別名。
play device_alias from pos1 to pos2 wait repeat
若省略from則從當前磁道開始播放,若省略to則播放到結束。
若指明wait則等到播放完畢命令才返回。
若指明repeat則會不停的重復播放。
若同時指明wait和repeat則命令不會返回,本線程產生堵塞,通常會引起程序失去響應。
(3) 播放CD
void CTttView::OnOpenCD()
{
mciSendString("open cdaudio",NULL,0,NULL);
mciSendString("play cdaudio",NULL,0,NULL);
);
void CTttView::OnStopCD()
{
mciSendString("stop cdaudio",NULL,0,NULL);
mciSendString("close cdaudio",NULL,0,NULL);
);
還可以:
pause cdaudio 暫停播放。
resume cdaudio 繼續被暫停的播放。
seek cdaudio to 移動到指定磁道。
set cdaudio door open/closed 彈出或縮進CD盤。
(4) 播放多媒體文件
void CTttView::OnMyMenu()
{
mciSendString("open myfolder\\tada.wav alias aa",NULL,0,NULL);
或 mciSendString("open myfolder\\flourish.mid alias aa",NULL,0,NULL);
或 mciSendString("open myfolder\\clock.avi alias aa",NULL,0,NULL);
mciSendString("play aa wait",NULL,0,NULL);
mciSendString("close aa",NULL,0,m_hWnd);
);
(5) 錄制聲音
void CTttView::OnStartRecord()
{
mciSendString("open new type waveaudio alias aa",NULL,0,NULL);
mciSendString("record aa",NULL,0,NULL);
);
void CTttView::OnStopRecord()
{
mciSendString("save aa c:\\aaa.wav wait",NULL,0,NULL);
mciSendString("close aa",NULL,0,NULL);
);
4、MCI命令消息
到目前為止,我們使用的都是MCI命令字符串。可以發現,命令字符串具有簡單易學的優點,但這種接口與C/C++的風格相去甚遠,如果程序要查詢和設置大量數據,那么用字符串的形式將很不方便。
MCI的命令消息接口提供了C語言接口,它速度更快,并且更能符合C/C++程序員的需要。
所有MCI命令消息都是通過mciSendCommand函數發送的,函數聲明為:
MCIERROR mciSendCommand(
MCIDEVICEID wIDDevice, //設備的ID,在打開設備時不用該參數
UINT uMsg, //命令消息
DWORD fdwCommand, //命令消息的標志
DWORD dwParam //指向包含命令消息參數的結構
); //若成功則返回0,否則返回錯誤碼
命令消息uMsg與命令字符串是對應的,例如,open與MCI_OPEN完成的是一樣的功能。
變量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);
);
可以看出,用命令消息比用命令字符串要復雜的多,但它的執行效率高。
總結
以上是生活随笔為你收集整理的c语言mcisendstring函数,mciSendString用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试管婴儿手术包成功么
- 下一篇: c语言1e3和1e3,自考“高级语言程序