久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

MciSendCommand用法詳解

 魔音工作室 2012-09-04
注]下面是我編程時看資料(主要是MSDN)的隨手筆記,,不全,,隨著日后的學(xué)習(xí)再進(jìn)一步擴(kuò)充吧。只是為了日后查找方便,,可以很快回想起各種命令的用法,。俗話說好記性不如爛筆頭嘛:)
MciSendCommand 命令格式:

MCIERROR mciSendCommand(
         MCIDEVICEID IDDevice, //接受命令的設(shè)備ID,由 MCI_OPEN 命令wDeviceID變量返回
          UINT uMsg,            //MCI 命令
          DWORD fdwCommand,     //flags 列表區(qū),一般都與 DWORD dwParam 中的相關(guān)成員配合使用
         (DWORD)(相應(yīng)MCI命令的參數(shù)區(qū)類型) dwParam 
                        );
返回的值:
返回 0 表示成功,,否則為出錯代碼.

MCI 命令列表:

MCI_BREAK 設(shè)置中斷鍵,,缺省是”CTRL+BREAK"。
下面是MCI_BREAK 命令第四個參數(shù)dwParam的結(jié)構(gòu):(其它各命令用相同格式說明)
typedef struct { DWORD dwCallback; //低字指定一個窗口句柄,,與 MCI_NOTIFY 有關(guān) (處理命令完成后的相應(yīng)動作)
int nVirtKey; //鍵碼 (相關(guān)flag:MCI_BREAK_KEY )
HWND hwndBreak; //窗口句柄 (相關(guān)flag:MCI_BREAK_HWND )
} MCI_BREAK_PARMS;
flags:MCI_BREAK_OFF 關(guān)閉中斷鍵
MCI_CAPTURE 抓取當(dāng)前幀并存入指定文件,,僅用于數(shù)字視頻
typedef struct {
DWORD dwCallback;
LPSTR lpstrFileName; //存入指定文件的全路徑
RECT rc; //抓取的矩形區(qū)域
} MCI_DGV_CAPTURE_PARMS;
[注] typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
MCI_CLOSE 關(guān)閉設(shè)備 用于所有設(shè)備,沒有什么要特別說明的
typedef struct {
DWORD dwCallback;
} MCI_GENERIC_PARMS;
MCI_CONFIGURE 彈出配置對話框,,僅用于數(shù)字視頻(Digital-video)
MCI_COPY 拷貝數(shù)據(jù)至剪貼板 僅用于數(shù)字視頻
typedef struct {
DWORD dwCallback;
DWORD dwFrom; //復(fù)制起點
DWORD dwTo; //復(fù)制終點
RECT rc; //(相關(guān)flag:MCI_DGV_COPY_AT )
DWORD dwAudioStream;
DWORD dwVideoStream;
} MCI_DGV_COPY_PARMS;



MCI_FROM
MCI_TO
MCI_DGV_COPY_AT 不使用此flag,將復(fù)制完整幀
MCI_DGV_COPY_AUDIO_STREAM (缺省是這兩個STRAM都不指定)
MCI_DGV_COPY_VIDEO_STREAM (但如果你使用一般只用其中一個)
MCI_CUE 延時播放或錄音 用于Digital-video, VCR, 和 waveform-audio
MCI_CUT 刪除數(shù)據(jù) ,,并將數(shù)據(jù)復(fù)制到剪貼板 用于Digital-video
MCI_DELETE 將文件中的數(shù)據(jù)刪除 用于 Digital-video 和 waveform-audio
MCI_ESCAPE 直接向設(shè)備發(fā)送一個串 僅用于激光視頻
MCI_FREEZE 將顯示定格 Digital-video, video-overlay, and VCR devices
MCI_GETDEVCAPS 獲取設(shè)備信息 用于所有設(shè)備
typedef struct {
DWORD dwCallback;
DWORD dwReturn;
DWORD dwItem;
} MCI_GETDEVCAPS_PARMS;
MCI_INDEX 當(dāng)前屏幕顯示與否, 僅用于VCR設(shè)備
MCI_INFO 獲取設(shè)備字符串信息
typedef struct {
DWORD dwCallback;
LPSTR lpstrReturn; //根據(jù)相應(yīng)的flags返回信息串
DWORD dwRetSize; //返回信息串大?。╞ytes)
} MCI_INFO_PARMS;
MCI_INFO_PRODUCT 設(shè)備的硬件信息 用于所有設(shè)備

用于cdaudio的flags :
MCI_INFO_MEDIA_IDENTITY
MCI_INFO_MEDIA_UPC
產(chǎn)品通用代碼 (UPC) ,不一定使用于所有CD ,。
MCI_LIST 獲取輸入設(shè)備數(shù)量,,支持?jǐn)?shù)字視頻和VCR設(shè)備
MCI_LOAD 裝入一個文件 Digital-video and video-overlay
MCI_MARK 取消或做一個記號,供MCI_SEEK快速定位 VCR devices
MCI_MONITOR 為數(shù)字視頻指定報告設(shè)備
typedef struct {
DWORD dwCallback;
DWORD dwSource;
DWORD dwMethod;
} MCI_DGV_MONITOR_PARMS;
MCI_OPEN 打開設(shè)備 All devices (詳見后面的介紹)
typedef struct {
DWORD dwCallback;
MCIDEVICEID wDeviceID;
LPCSTR lpstrDeviceType;
LPCSTR lpstrElementName;
LPCSTR lpstrAlias;
} MCI_OPEN_PARMS;
MCI_PASTE 粘帖數(shù)據(jù) 僅用于數(shù)字視頻
MCI_PAUSE 暫停當(dāng)前動作
typedef struct {
DWORD dwCallback;
} MCI_GENERIC_PARMS;
MCI_PLAY 播放
MCI_PUT 設(shè)置源,、目的和邊框矩形 Digital-video and video-overlay
MCI_QUALITY 定義設(shè)備缺省質(zhì)量
typedef struct {
DWORD dwCallback;
DWORD dwItem;
LPSTR lpstrName;
DWORD lpstrAlgorithm;
DWORD dwHandle;
} MCI_DGV_QUALITY_PARMS;
MCI_RECORD 開始錄制 VCR and waveform-audio (詳見后面的介紹)
typedef struct {
DWORD dwCallback;
DWORD dwFrom;
DWORD dwTo;
} MCI_RECORD_PARMS;
MCI_RESERVE 為后面的記錄分配相對連續(xù)的硬盤空間 Digital-video
MCI_RESTORE 拷貝一個bmp文件至幀緩沖 Digital-video
typedef struct {
DWORD dwCallback;
DWORD lpstrFileName;
RECT rc;
} MCI_DGV_RESTORE_PARMS;
MCI_RESUME 使一個暫停設(shè)備重新啟動 Digital-video, VCR, and waveform-audio
MCI_SAVE 保存數(shù)據(jù) Video-overlay and waveform-audio (詳見后面的介紹)
MCI_SEEK 更改媒體位置 (詳見后面的介紹)
typedef struct {
DWORD dwCallback;
DWORD dwTo;
} MCI_SEEK_PARMS;
MCI_SET 設(shè)置設(shè)備信息 (詳見后面的介紹)
typedef struct {
DWORD dwCallback;
DWORD dwTimeFormat;
DWORD dwAudio;
} MCI_SET_PARMS;
MCI_SETAUDIO 設(shè)置視頻設(shè)備中的 audio 播放和捕捉的相關(guān)參數(shù) 用于Digital-video and VCR
MCI_SETTIMECODE 啟用或取消VCR設(shè)備的時間碼 用于 VCR
MCI_SETTUNER 設(shè)置VCR設(shè)備頻道
MCI_SETVIDEO 設(shè)置video參數(shù) 用于Digital-video and VCR
MCI_SIGNAL 在工作區(qū)上設(shè)置指定空間 用于Digital-video,,
typedef struct {
DWORD dwCallback;
DWORD dwPosition; //Position to be marked.
DWORD dwPeriod; //Interval of the position marks.
DWORD dwUserParm; //User value associated with signals.
} MCI_DGV_SIGNAL_PARMS;
MCI_STATUS 獲取設(shè)備當(dāng)前的相關(guān)狀態(tài)信息 用于All devices(詳見后面的介紹)
ttypedef struct {
DWORD dwCallback;
DWORD dwReturn;
DWORD dwItem;
DWORD dwTrack;
} MCI_STATUS_PARMS;
MCI_STEP 使播放設(shè)備跳幀 Digital-video, VCR, and CAV-format videodisc
MCI_STOP 停止播放和錄音 CD audio, digital-video, MIDI sequencer, videodisc, VCR, and waveform-audio
MCI_SYSINFO 返回MCI設(shè)備信息
typedef struct {
DWORD dwCallback;
LPSTR lpstrReturn;
DWORD dwRetSize;
DWORD dwNumber;
UINT wDeviceType;
} MCI_SYSINFO_PARMS;
MCI_UNDO 取消操作 如新近操作MCI_CUT, MCI_COPY, MCI_DELETE, or MCI_PASTE 等 用于Digital-video devices
MCI_UNFREEZE 讓使用MCI_UNFREEZE的視頻緩沖區(qū)恢復(fù)運動 Digital-video, VCR, and video-overlay
MCI_UPDATE 更新顯示區(qū)域 Digital-video devices
MCI_WHERE 獲取設(shè)備裁減矩形 Digital-video, and video-overlay devices
MCI_WINDOW 指定圖形設(shè)備窗口和窗口特性 用于 Digital-video, and video-overlay devices
For digital-video devices:
typedef struct {
DWORD dwCallback;
WORD hWnd;
WORD nCmdShow;
LPSTR lpstrText;
} MCI_DGV_WINDOW_PARMS;

其中比較常用的指令有MCI_OPEN、MCI_CLOSE,、MCI_PLAY,、MCI_STOP、MCI_PAUSE,、MCI_STATUS等等,。

--MciSendCommand 命令格式:
發(fā)送命令消息到指定的 MCI device.

MCIERROR mciSendCommand(
         MCIDEVICEID IDDevice, //接受命令的設(shè)備ID,由 MCI_OPEN 命令wDeviceID變量返回
          UINT uMsg,            //MCI 命令
          DWORD fdwCommand,     //flags 列表區(qū),一般都與 DWORD dwParam 中的相關(guān)成員配合使用
         (DWORD)(相應(yīng)MCI命令的參數(shù)區(qū)類型) dwParam 
                        );
返回的值:
返回 0 表示成功,,否則為出錯代碼.

參數(shù):

IDDevice
MCI device的標(biāo)識符,。
(此參數(shù)不被 MCI_OPEN 命令消息所使用,被置為null)
此參數(shù)IDDevice指定了設(shè)備標(biāo)識,,這個標(biāo)識會在程序員使用MCI_OPEN打開MCI設(shè)備時由系統(tǒng)提供,,保存在 MCI_OPEN_PARMS結(jié)構(gòu)的wDeviceID變量中。

uMsg
命令消息(Command message).
第二個參數(shù)指定將如何控制設(shè)備,,詳細(xì)請查閱上面“MCI指令”列表

fdwCommand
Flags for the command message.
第三個參數(shù)為訪問標(biāo)識(flags)在后面有詳細(xì)說明,。

dwParam
第四個參數(shù)一般是一個數(shù)據(jù)結(jié)構(gòu),程序在使用mciSendCommand命令訪問MCI時需要的或者是返回的一些信息,。

返回的值:
返回 0 表示成功,,否則為出錯代碼.
mciSendCommand 返回的值是一個雙字,,其中低字中包含 出錯代碼。如果是出錯是由 可識別的設(shè)備 引起的,,那么在高字中返回該設(shè)備的 標(biāo)識符ID(the driver identifier),,否則高字中為零(0). 可以通過查看MCIERR Return Values 相關(guān)內(nèi)容判斷出錯原因。

* 使用 MCI_OPEN 得到當(dāng)前打開設(shè)備的ID(保存在 MCI_OPEN_PARMS結(jié)構(gòu)的wDeviceID變量中).

環(huán)境要求:
Windows NT: V3.1 以上.
Windows: Windows 95 以上.
Windows CE: 不支持.
頭文件包含: mmsystem.h.
函數(shù)庫: winmm.lib.
支持 Unicode(雙字節(jié)編碼)和 ANSI 編碼.

* 現(xiàn)在我們通過 MCI_OPEN 命令的使用來熟悉 mciSendCommand 命令,。

--MCI_OPEN

MCI_OPEN 命令可以被所有設(shè)備識別,。它可以用來初始化一個設(shè)備或者是一個文件。

命令格式:
MCIERROR mciSendCommand( MCIDEVICEID wDeviceID, 
                         MCI_OPEN, 
                         DWORD dwFlags, 
                         (DWORD) (LPMCI_OPEN_PARMS) lpOpen); 
『例』
////////////////////////////////////////////////////////////////////////
/*
* 函數(shù)名稱:MCI_Open
* 函數(shù)介紹:用mci命令打開文件
* 輸入?yún)?shù):CString strPath, 文件的路徑
* 輸出參數(shù):無
* 返回值 :mci命令的錯誤信息
*/
DWORD MCIMP3::MCIOpen(const CString &strPath)
{
  MCI_OPEN_PARMS mciOP;
  DWORD dwReturn;

  ASSERT(m_wID == NULL); // m_wID保存將打開設(shè)備的 ID
  //由mci判斷文件類型
  mciOP.lpstrDeviceType=NULL;
  mciOP.lpstrElementName=strPath;
  dwReturn=mciSendCommand( 
           NULL, //指定設(shè)備標(biāo)識,MCI_OPEN此處為NULL,
               //成功OPEN后,,標(biāo)識放入MCI_OPEN_PARMS結(jié)構(gòu)的wDeviceID變量中
            MCI_OPEN, 
           MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE,
          (DWORD)(LPVOID)&mciOP);

  if (dwReturn==0) //成功打開文件,,將對應(yīng)的設(shè)備ID 送m_wID 以供其他命令引用,
      m_wID=mciOP.wDeviceID;
  else
      m_wID=NULL;

return dwReturn;
}

上例說明:
---- MCI_OPEN_PARMS (對應(yīng)MCI_OPEN命令格式 中的第4個參數(shù))
在這個結(jié)構(gòu)中,,我們給相應(yīng)的成員變量賦值,,為使用 MCI_OPEN 做好準(zhǔn)備;
如:mciOP.lpstrDeviceType=NULL; //由mci判斷文件類型

當(dāng)我們給MCI_OPEN_PARMS 中某些成員賦值,,并同時在fdwCommand 參數(shù)區(qū)指定了相應(yīng)的 標(biāo)志(flags),,那么該 成員所賦值在此次mciSendCommand命令中生效。
例如上例:
fdwCommand 參數(shù) 對應(yīng)引用 MCI_OPEN_PARMS 的成員
MCI_OPEN_ELEMENT mciOP.lpstrElementName=strPath 待打開的文件

MCI_OPEN_PARMS 結(jié)構(gòu):
typedef struct {
        DWORD dwCallback; 
        MCIDEVICEID wDeviceID; 
        LPCSTR lpstrDeviceType; 
        LPCSTR lpstrElementName; 
        LPCSTR lpstrAlias; 
} MCI_OPEN_PARMS; 

[注] 對于一些擴(kuò)展的命令設(shè)置[我們可以通過程序中fdwCommand 參數(shù)區(qū)指定的相應(yīng)標(biāo)志(flags)明白它是來控制什么類型的設(shè)備,,從而做出正確的操作動作] 系統(tǒng)會用設(shè)備特殊的“數(shù)據(jù)結(jié)構(gòu)”來代替上面這個常用的結(jié)構(gòu),。

     例如:for waveform-audio devices: 
         typedef struct {
             DWORD dwCallback; 
             MCIDEVICEID wDeviceID; 
             LPCSTR lpstrDeviceType; 
             LPCSTR lpstrElementName; 
             LPCSTR lpstrAlias; 
             DWORD dwBufferSeconds; 
         } MCI_WAVE_OPEN_PARMS;

MCI_OPEN_PARMS 結(jié)構(gòu) 成員說明:

dwCallback
 低位字為 MCI_NOTIFY flag 指定一個窗口句柄.

wDeviceID
 為成功打開的文件返回 設(shè)備標(biāo)識符.
(上例:// MCI_OPEN 命令中的這個參數(shù)(第一個參數(shù))一定為NULL,成功OPEN后,,
標(biāo)識放入MCI_OPEN_PARMS結(jié)構(gòu)的wDeviceID變量mciOP.wDeviceID中)

lpstrDeviceType
 設(shè)備類型的名字或常量標(biāo)識. (設(shè)備名可以從注冊表或者 SYSTEM.INI 文件中獲得)

MCI的設(shè)備類型有:

設(shè)備描述

描述字符串

說明
MCI_ALL_DEVICE_ID   所有設(shè)備
MCI_DEVTYPE_ANIMATION Animation 動畫設(shè)備
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音頻
MCI_DEVTYPE_DAT Dat 數(shù)字音頻
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 數(shù)字視頻
MCI_DEVTYPE_OTHER Other 未定義設(shè)備
MCI_DEVTYPE_OVERLAY Overlay 重疊視頻
MCI_DEVTYPE_SCANNER Scanner 掃描儀
MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
MCI_DEVTYPE_VCR Vcr 合式錄像機(jī)
MCI_DEVTYPE_VIDEODISC Videodisc 激光視盤
MCI_DEVTYPE_WAVEFORM_AUDIO Waveaudio Wave 音頻

對于未在上面定義的MCI設(shè)備,,用戶可查看system.ini文件中[mci]部分,例如:
[mci]
cdaudio=mcicda.drv
sequencer=mciseq.drv
waveaudio=mciwave.drv
avivideo=mciavi.drv
videodisc=mcipionr.drv
vcr=mcivisca.drv
ActiveMovie=mciqtz.drv
QTWVideo=mciqtw.drv
MPEGVideo=C:/PROGRA~1/XING/XINGMP~1/xmdrv95.dll

其中最后兩句分別指明了Apple的QuickTime設(shè)備,,設(shè)備名為"QTWVidio",、MPEG影像設(shè)備,設(shè)備名為"MPEGVideo",。

在MCI編程中,,既可以將設(shè)備描述當(dāng)設(shè)備名,也可以將描述字符串當(dāng)設(shè)備名,,一個極端偷懶的辦法是程序員不要在程序中指定設(shè)備名,,Windows將自動根據(jù)文件擴(kuò)展名識別設(shè)備類型。(如上例:mciOP.lpstrDeviceType=NULL)



lpstrElementName
 設(shè)備元素 (通常是打開的文件全路徑).

lpstrAlias
 可選別名.

--The Wait, Notify 兩個通用的 fdwCommand 參數(shù)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/mci_3353.asp

在多數(shù)的 MCI 命令中都會有fdwCommand 參數(shù)區(qū)(如上例MCI_OPEN命令,,第三個參數(shù):” MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE”),,而且對于不同的命令有不同的falgs 。但有這樣兩個falg參數(shù),,對于所有mciSendCommand命令都適用:
(The "wait" (MCI_WAIT) and "notify" (MCI_NOTIFY) flags)

――The Wait Flag

MCI 命令在執(zhí)行時一般會立即返回執(zhí)行結(jié)果,,即使有些命令執(zhí)行要花上幾分鐘才能完成。
你可以使用 "wait" (MCI_WAIT) flag 來指定設(shè)備等待,直到請求命令完成再返回到應(yīng)用程序控制,。

比如:下面使用mciSendString來發(fā)送一個 play 命令,,執(zhí)行play直到 palyback 完成后才返回應(yīng)用程序。
mciSendString("play mydevice from 0 to 100 wait",
lpszReturnString, lstrlen(lpszReturnString), NULL);
注:用戶可以使用 a break key 來終止 wait ,,缺省的break key是: CTRL+BREAK. 你也可以使用MCI_BREAK 命令重新定義這個功能鍵 (MCI_BREAK 使用 MCI_BREAK_PARMS 結(jié)構(gòu))

在我們的例子中也使用到了這個參數(shù),,目的是為了在沒有完成OPEN(可能正在打開文件)操作的過程中不會將控制權(quán)交由應(yīng)用程序,避免“人為”的干擾,;實際上這個時間一般持續(xù)的相當(dāng)短暫,,以至于你根本無法察覺的到(除非你的設(shè)備或文件有問題?),。

――The Notify Flag

The "notify" (MCI_NOTIFY) flag 指示設(shè)備完成一次操作后 (郵寄)post 一個 MM_MCINOTIFY 信息,。 我們可以在MM_MCINOTIFY 的處理函數(shù)來做一些相應(yīng)的處理工作: 是否completed successfully, failed, or was superseded or aborted 等等。


――The Test Flag
The "test" (MCI_TEST) flag 測試設(shè)備此時是否能執(zhí)行命令. 如果可以執(zhí)行,,設(shè)備返回一個 無錯 信息,。

MCI_TEST flag 支持 digital-video and VCR devices 所有命令,但在 open (MCI_OPEN) and close (MCI_CLOSE)中不能使用.


--MCI_OPEN fdwCommand 參數(shù)區(qū) 中可用的flags

對應(yīng)與不同的設(shè)備有如下分類:

* MCI_OPEN 通用的flags 參數(shù)表(所有設(shè)備均可用):

MCI_OPEN_ALIAS
對應(yīng) MCI_OPEN_PARMS結(jié)構(gòu)中的 LPCSTR lpstrAlias 成員變量,,為打開的設(shè)備起個別名,。
MCI_OPEN_SHAREABLE
將設(shè)備或文件以共享的方式打開。

MCI_OPEN_TYPE
對應(yīng) MCI_OPEN_PARMS結(jié)構(gòu)中的 LPCSTR lpstrDeviceType 成員變量,,設(shè)備類型的名字或常量標(biāo)識. (設(shè)備名可以從注冊表或者 SYSTEM.INI 文件中獲得)

MCI_OPEN_TYPE_ID
和 MCI_OPEN_TYPE flag 一起使用后,,我們可以在 MCI_OPEN_PARMS結(jié)構(gòu)中的 lpstrDeviceType 成員變量的低字中得到一個標(biāo)準(zhǔn)的MCI 設(shè)備的類型ID,同時在高字中指出該設(shè)備ID 此時在系統(tǒng)里的順序索引號。

MCI_OPEN為compound devices提供的flags 控制參數(shù):

MCI_OPEN_ELEMENT
對應(yīng) MCI_OPEN_PARMS結(jié)構(gòu)中的 LPCSTR lpstrElementName 成員變量,,設(shè)備元素 (通常是打開的文件全路徑).

MCI_OPEN_ELEMENT_ID
和 MCI_OPEN_ELEMENT flag 一起使用后,我們可以將 MCI_OPEN_PARMS結(jié)構(gòu)中的 lpstrElementName 成員變量看成是一個doubleword value,,表示一個內(nèi)部的設(shè)備,。

* MCI_OPEN為digitalvideo (數(shù)字視頻)提供的flags 控制參數(shù):

MCI_DGV_OPEN_NOSTATIC

MCI_DGV_OPEN_PARENT

MCI_DGV_OPEN_WS

MCI_DGV_OPEN_16BIT

MCI_DGV_OPEN_32BIT
the lpOpen parameter points to an MCI_DGV_OPEN_PARMS structure:

   typedef struct {
           DWORD dwCallback; 
           UINT wDeviceID; 
           LPSTR lpstrDeviceType; 
           LPSTR lpstrElementName; 
           LPSTR lpstrAlias; 
           DWORD dwStyle; 
           HWND hWndParent; 
   } MCI_DGV_OPEN_PARMS;



* 下面的flags 控制參數(shù)用于 the overlay device type(重疊視頻):

MCI_OVLY_OPEN_PARENT

MCI_OVLY_OPEN_WS
the lpOpen parameter points to an MCI_OVLY_OPEN_PARMS structure:

    typedef struct {
      DWORD dwCallback; 
      MCIDEVICEID wDeviceID; 
      LPCSTR lpstrDeviceType; 
      LPCSTR lpstrElementName; 
      LPCSTR lpstrAlias; 
      DWORD dwStyle; 
      DWORD hWndParent; 
    } MCI_OVLY_OPEN_PARMS;

* 下面的flags 控制參數(shù)用于the waveaudio device type:
(音頻設(shè)備MCI_DEVTYPE_WAVEFORM_AUDIO)

MCI_WAVE_OPEN_BUFFER
對應(yīng) MCI_WAVE_OPEN_PARMS (替代了MCI_OPEN_PARMS)結(jié)構(gòu)中的 DWORD dwBufferSeconds 成員變量,用來設(shè)置讀寫音頻的數(shù)據(jù)緩沖長度,。

  for waveform-audio devices: 
    typedef struct {
             DWORD dwCallback; 
             MCIDEVICEID wDeviceID; 
             LPCSTR lpstrDeviceType; 
             LPCSTR lpstrElementName; 
             LPCSTR lpstrAlias; 
             DWORD dwBufferSeconds; //數(shù)據(jù)緩沖的長度
     } MCI_WAVE_OPEN_PARMS;

小結(jié):

1. 通過對 MCI_OPEN 細(xì)致分析,,我們基本了解了如何利用MciSendCommand 命令來正確的控制MCI 設(shè)備了;下面我們所要掌握的就是各個 MCI 命令的格式及相關(guān)參數(shù)的使用了,。
2. 在這些MCI 命令的使用中,,我的經(jīng)驗是主要是要掌握每個命令“參數(shù)表”的數(shù)據(jù)結(jié)構(gòu)(如:MCI_OPEN 的 MCI_OPEN_PARMS 結(jié)構(gòu)中各成員的含義)及 fdwCommand 參數(shù)區(qū)(如上例MCI_OPEN命令,第三個參數(shù):” MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE”)中各標(biāo)志(falgs)的正確含義,。
3. 在學(xué)習(xí)的過程中,,最好的在線老師就是微軟提供的MSDN.說明的非常詳盡,如果你覺得還是不夠的話,,那么你不妨直接到微軟MSDN 的網(wǎng)站上去看看吧,。

有了上面的知識基礎(chǔ),相信再理解以后的 MCI 命令不會有什么大問題的。

--MCI_OPEN 使用2 :為錄音打開一個空文件(wav文件)

BOOL CWaveAudio::Record (void)
{
   Close ();//為成功打開設(shè)備,,錄制前關(guān)閉一次設(shè)備

   MCI_OPEN_PARMS OpenParms;
   OpenParms.lpstrDeviceType = "waveaudio";
   OpenParms.lpstrElementName = "";
   if (::mciSendCommand (NULL, 
                         MCI_OPEN, 
                         MCI_OPEN_ELEMENT | MCI_OPEN_TYPE 
                         | MCI_WAIT, 
                         (DWORD)(LPVOID) &OpenParms))
       return FALSE; //打開設(shè)備失敗
   m_wDeviceID = OpenParms.wDeviceID;//打開設(shè)備成功,,保存設(shè)備ID

   MCI_RECORD_PARMS RecordParms;
   if (mciSendCommand (m_wDeviceID, 
                       MCI_RECORD, 
                       NULL, 
                       (DWORD)(LPVOID) &RecordParms))
       return FALSE;

   //開始錄音,設(shè)置程序相應(yīng)標(biāo)志
   m_bRecording = TRUE;
   m_bOpened = TRUE;
   return TRUE;
}

--MCI_SAVE

MCI_SAVE 命令保存當(dāng)前文件,。在保存文件操作之前,,設(shè)備可以修改當(dāng)前打開的文件,但不會影響到原來保存在磁盤上的原文件,。
Video-overlay(覆蓋視頻) 和 waveform-audio 設(shè)備可以正確識別該命令,。

[例]
BOOL CWaveAudio::Save (CString Filename)
{
	if (!m_bRecording)
		return FALSE;

	Stop ();
	MCI_SAVE_PARMS SaveParms;
	SaveParms.lpfilename = (LPCSTR) Filename;
	if (mciSendCommand (m_wDeviceID, 
                            MCI_SAVE, 
                            MCI_SAVE_FILE | MCI_WAIT, 
                            (DWORD)(LPVOID) &SaveParms))
		return FALSE;

	m_bRecording = FALSE;
	Load (Filename);
	return TRUE;
}
MCIERROR mciSendCommand(
  MCIDEVICEID wDeviceID, 
  MCI_SAVE, 
  DWORD dwFlags, 
  (DWORD) (LPMCI_SAVE_PARMS ) lpSave
);
lpSave:
typedef struct {
     DWORD_PTR dwCallback; 
     LPCSTR lpfilename; 
} MCI_SAVE_PARMS;

dwFlags:

 MCI_SAVE_FILE  應(yīng)用于所有設(shè)備。lpSave結(jié)構(gòu)中 lpfilename 成員指出存盤目標(biāo)文件名,。

--MCI_PLAY

不用多說它是用來做什么的,。
CD audio, digital-video, MIDI sequencer, videodisc, VCR, waveform-audio devices 均可識別該命令.

『例』
////////////////////////////////////////////////////////////////////////
/*
* 函數(shù)名稱:MCIPlay
* 函數(shù)介紹:用mci命令播放已打開(當(dāng)前)的MP3文件
* 輸入?yún)?shù):無
* 輸出參數(shù):無
* 返回值 :mci命令的錯誤信息
*/
DWORD MCIMP3::MCIPlay()
{
MCI_PLAY_PARMS mciPP;

//mciPP.dwCallback=(DWORD)GetSafeHwnd();
return mciSendCommand(m_wID, MCI_PLAY, MCI_NOTIFY,
(DWORD)(LPVOID)&mciPP);
}
格式:
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, 
                        MCI_PLAY, 
                        DWORD dwFlags, 
                        (DWORD) (LPMCI_PLAY_PARMS ) lpPlay);

參數(shù):

wDeviceID
接受播放的MCI設(shè)備的ID,在MCI_OPEN 成功執(zhí)行后得到該設(shè)備的ID.

dwFlags
MCI_NOTIFY, MCI_WAIT, digital-video 和 VCR 設(shè)備還可用 MCI_TEST.

lpPlay

MCI_PLAY_PARMS 結(jié)構(gòu)的地址. (擴(kuò)展的命令中可能用設(shè)備指定的結(jié)構(gòu)所代替) 

typedef struct {
        DWORD dwCallback; 
        DWORD dwFrom; 
        DWORD dwTo; 
} MCI_PLAY_PARMS;

LPMCI_PLAY_PARMS 成員:

dwCallback
低位字為 MCI_NOTIFY flag 指定一個窗口句柄.

dwFrom 播放起始點.

dwTo 播放結(jié)束點.

備注:

如果使用了成員函數(shù),,必須設(shè)置相應(yīng)的fdwCommand 參數(shù)區(qū)的標(biāo)志(flags).
兩個常用的flags是:
MCI_FROM :讓MCI_PLAY 使用上面結(jié)構(gòu)中dwFrom ,。
可以使用 MCI_SET 命令的MCI_SET_TIME_FORMAT flag設(shè)定時間格式。
缺省播放會從當(dāng)前位置開始,。
MCI_TO : 用法和MCI_FROM 相同,,播放結(jié)束于dwTo 。
缺省停止位置是 媒體結(jié)束,。
當(dāng)然還有對視頻等設(shè)備起作用的flags ,這里不再詳述,。

返回:

0 表示成功。

--MCI_RECORD

  從當(dāng)前位置開始或在一個指定區(qū)段中錄音,。Video-overlay(覆蓋視頻) 和 waveform-audio 設(shè)備可以正確識別該命令,。

[例]見MCI_OPEN 使用2 :為錄音打開一個空文件(wav文件)
MCIERROR mciSendCommand(
         MCIDEVICEID wDeviceID, 
         MCI_RECORD, 
         DWORD dwFlags, 
         (DWORD) (LPMCI_RECORD_PARMS) lpRecord
);

lpRecord:

typedef struct {
        DWORD_PTR dwCallback; 
        DWORD dwFrom; 
        DWORD dwTo; 
} MCI_RECORD_PARMS;

 dwFrom ,dwTo   區(qū)段起止位置(必須和dwFlags中的MCI_FROM、MCI_TO 配合使用)

dwFlags:

 MCI_FROM |MCI_TO  
   使lpRecord中的 dwFrom ,dwTo 起作用,。如果沒有使用這兩個flags,MCI_RECORD 缺省的起始錄音位置是當(dāng)前位置,;缺省的結(jié)束位置:你啥時候羅嗦完就算結(jié)束了:)
   使用的時間(或幀)長度格式由MCI_SET命令的MCI_SET_TIME_FORMAT 標(biāo)志(flag)來設(shè)定。

 MCI_RECORD_INSERT
   最新的錄音會被插入或粘貼到當(dāng)前的wave文件中,。這是MCI_RECORD命令缺省設(shè)置,,但有些設(shè)備可能不支持此flag.

MCI_RECORD_OVERWRITE
最新錄音將覆蓋現(xiàn)存打開的文件。MCIWAVE.DRV 設(shè)備返回MCIERR_UNSUPPORTED_FUNCTION 響應(yīng)這個flag.

 支持 digitalvideo 設(shè)備的flags 這里不做介紹,。

--MCI_SET

  設(shè)置設(shè)備信息(設(shè)置時間格式及播放速度等 ),。CD audio, digital-video, MIDI sequencer, VCR, videodisc, video-overlay, 和 waveform-audio 設(shè)備可正確識別該命令。

[例]設(shè)置時間格式及播放速度 
MCI_SET_PARMS SetParms;
SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS; //設(shè)置時間單位為毫秒
mciSendCommand (m_wDeviceID, 
                MCI_SET, 
                MCI_SET_TIME_FORMAT, 
                (DWORD)(LPVOID) &SetParms),;

MCI_SEQ_SET_TEMPO 設(shè)置播放速度,,
PQRN類型,此值為節(jié)拍/分,,
SMPTE類型,,此值為禎/秒
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, 
                        MCI_SET, 
                        DWORD dwFlags, 
                        (DWORD) (LPMCI_SET_PARMS) lpSet);

lpSet:

typedef struct {
        DWORD dwCallback; 
        DWORD dwTimeFormat; 
        DWORD dwAudio; 
} MCI_SET_PARMS;

dwTimeFormat  設(shè)置時間格式?。ㄏ嚓P(guān)flag: MCI_SET_TIME_FORMAT )
 時間格式常量:
 MCI_FORMAT_BYTES                比特 (使用 脈沖編碼調(diào)制[PCM]格式的waveaudio 類型文件)   
 MCI_FORMAT_MILLISECONDS         設(shè)置時間單位為毫秒 
 MCI_FORMAT_MSF                  (分/秒/幀)Minute/second/frame 
 MCI_FORMAT_SAMPLES              采樣 Samples 
  MCI_FORMAT_SMPTE_24             SMPTE(電影與電視工程師學(xué)會[美]), 24 幀 
  MCI_FORMAT_SMPTE_25             SMPTE, 25 幀
  MCI_FORMAT_SMPTE_30             SMPTE, 30 幀
  MCI_FORMAT_SMPTE_30DROP         SMPTE, 30 frame drop 
 MCI_FORMAT_TMSF                 Track/minute/second/frame 
 MCI_SEQ_FORMAT_SONGPTR          MIDI song pointer

dwAudio 
 音頻輸出聲道編號. (相關(guān)flag: MCI_SET_AUDIO )

備注:
 MCI_SET_PARMS 成員賦值 要必須要使用相應(yīng)的 dwFlags.

對于 waveform-audio 設(shè)備, lpSet 指針將指向 MCI_WAVE_SET_PARMS 結(jié)構(gòu):

typedef struct {
        DWORD dwCallback; 
        DWORD dwTimeFormat; 
        DWORD dwAudio; 
        UINT wInput; 
        UINT wOutput; 
        WORD wFormatTag; 
        WORD wReserved2; 
        WORD nChannels; 
        WORD wReserved3; 
        DWORD nSamplesPerSec; 
        DWORD nAvgBytesPerSec; 
        WORD nBlockAlign; 
        WORD wReserved4; 
        WORD wBitsPerSample; 
        WORD wReserved5; 
} MCI_WAVE_SET_PARMS;

下面waveform-audio的屬性要在錄音(錄制)前設(shè)定好,錄音開始后將不能再被改變:
MCI_WAVE_SET_AVGBYTESPERSEC 
MCI_WAVE_SET_BITSPERSAMPLE 
MCI_WAVE_SET_BLOCKALIGN 
MCI_WAVE_SET_CHANNELS 
MCI_WAVE_SET_FORMATTAG 
MCI_WAVE_SET_SAMPLESPERSEC 

dwFlags:

  對所有設(shè)備作用的flags:

 MCI_SET_AUDIO  
    使 dwAudio 成員起作用,。該flag必須配合MCI_SET_ON 或 MCI_SET_OFF使用,。
    決定音頻輸出聲道編號的flags有:
        MCI_SET_AUDIO_ALL     所有聲道 
        MCI_SET_AUDIO_LEFT     左聲道 
        MCI_SET_AUDIO_RIGHT      右聲道

 MCI_SET_DOOR_CLOSED  關(guān)閉設(shè)備面版(一般用在CD設(shè)備)
 MCI_SET_DOOR_OPEN 
 MCI_SET_OFF  關(guān)閉指定 video or audio channel.
 MCI_SET_ON   
 MCI_SET_TIME_FORMAT  
  MCI_FORMAT_BYTES   by the waveaudio device type. 
  MCI_FORMAT_FRAMES  by the digitalvideo, vcr, and videodisc device types. 
  MCI_FORMAT_HMS  格式:時/分/秒 by the vcr and videodisc device types. 
  MCI_FORMAT_MILLISECONDS   by all device types. 
  MCI_FORMAT_MSF  by the cdaudio and vcr device types. 
  MCI_FORMAT_SAMPLES  轉(zhuǎn)換時間格式為 samples,by the waveaudio device type. 
  MCI_FORMAT_SMPTE_24, MCI_FORMAT_SMPTE_25, and MCI_FORMAT_SMPTE_30 
                      by the sequencer and vcr device types. 
  MCI_FORMAT_SMPTE_30DROP     by the sequencer and vcr device types. 
  MCI_FORMAT_TMSF          by the cdaudio and vcr device types. 
 MCI_SET_VIDEO  
  與MCI_SET_ON or MCI_SET_OFF合用,,設(shè)置視頻信號(video signal)開關(guān)狀態(tài). 
   設(shè)備無視頻功能返回 MCIERR_UNSUPPORTED_FUNCTION. 

--MCI_STATUS

查詢設(shè)備當(dāng)前的相關(guān)狀態(tài)信息,。所有設(shè)備都能爭取識別該命令。返回的信息內(nèi)容在 lpStatus 結(jié)構(gòu)dwReturn成員變量中,。

[例]
MCI_STATUS_PARMS mciSP;

mciSP.dwItem=MCI_STATUS_MODE;
DWORD dwReturn=mciSendCommand(m_wID, 
                              MCI_STATUS, 
                              MCI_STATUS_ITEM,
                              (DWORD)(LPVOID)&mciSP);
if (dwReturn==(DWORD)0)
   if ( mciSP.dwReturn==MCI_MODE_OPEN ||
        mciSP.dwReturn==MCI_MODE_PLAY ||
        mciSP.dwReturn==MCI_MODE_PAUSE ||
        mciSP.dwReturn==MCI_MODE_STOP ||
        mciSP.dwReturn==MCI_MODE_SEEK
      ) return true;
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, 
                        MCI_STATUS, 
                        DWORD dwFlags, 
                        (DWORD) (LPMCI_STATUS_PARMS) lpStatus);

lpStatus:

typedef struct {
                DWORD dwCallback; 
                DWORD dwReturn; 
                DWORD dwItem; 
                DWORD dwTrack; 
               } MCI_STATUS_PARMS;

dwReturn  返回的信息內(nèi)容
      如:   MCI_MODE_OPEN
           MCI_MODE_PLAY
           MCI_MODE_PAUSE
           MCI_MODE_STOP
           MCI_MODE_SEEK
 
dwItem  請求查詢的內(nèi)容
 
dwTrack 軌道的長度或數(shù)目 

備注:
 MCI_STATUS_ITEM flag 要和 dwItem 合用

備注:

MCI_STATUS_ITEM 用此flag來說明我們使用lpStatus結(jié)構(gòu)的dwItem成員來指定 查詢項目(status item )

下面的查詢項目(status item)將由lpStatus 結(jié)構(gòu) 中的 dwReturn 成員變量返回:

MCI_STATUS_CURRENT_TRACK 當(dāng)前的軌道數(shù)到 dwReturn(MCI 使用連續(xù)軌道號)

MCI_STATUS_LENGTH 返回當(dāng)前媒體(文件)的總長到 dwReturn

MCI_STATUS_MODE 返回設(shè)備當(dāng)前的工作模式到 dwReturn,,常量如下:
MCI_MODE_NOT_READY
MCI_MODE_PAUSE
MCI_MODE_PLAY
MCI_MODE_STOP
MCI_MODE_OPEN
MCI_MODE_RECORD
MCI_MODE_SEEK

MCI_STATUS_POSITION 獲得文件播放的當(dāng)前位置
MCI_STATUS_TIME_FORMAT 獲得當(dāng)前的時間格式
MCI_SEQ_STATUS_DIVTYPE 判斷文件是PPQN類型還是SMPTE類型
MCI_SEQ_STATUS_TEMPO 獲得當(dāng)前播放速度:PQRN類型,此值為節(jié)拍/分,;SMPTE類型,,此值為禎/秒

MCI_STATUS命令所涉及到的 狀態(tài)信息 實在太多,用到什么就去看看 MSDN 吧,。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/mmcmd_9ycz.asp

--MCI_SEEK

改變當(dāng)前播放位置跳到指定位置,。在執(zhí)行SEEK時,視頻和音頻的輸出被禁止,。SEEK完成后設(shè)備會處于停止?fàn)顟B(tài),。CD audio, digital-video, MIDI sequencer, VCR, videodisc, 和 waveform-audio 設(shè)備可正確識別該命令。

[例]
DWORD MCIaudio::MCISeekTo(DWORD dwTo)
{
 DWORD dwReturn;

 if (dwTo>0 && dwTo<m_dwLength)
 {    MCI_SEEK_PARMS mciSP;
      mciSP.dwTo=dwTo*1000;
      dwReturn = mciSendCommand(m_wID, 
                                MCI_SEEK, 
                                MCI_WAIT|MCI_NOTIFY|MCI_TO,
                                (DWORD)(LPVOID)&mciSP);
 }else if (dwTo>=m_dwLength)
              dwReturn = MCISeekToEnd();
       else
              dwReturn = MCISeekToStart();
 return dwReturn;
}
命令格式:
MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, 
                        MCI_SEEK, 
                        DWORD dwFlags, 
                        (DWORD) (LPMCI_SEEK_PARMS) lpSeek);

lpSeek:

typedef struct {
                DWORD dwCallback; 
                DWORD dwTo; 
               } MCI_SEEK_PARMS;

dwTo   跳轉(zhuǎn)的位置  (相應(yīng)的flag: MCI_TO)

dwFlags:

MCI_SEEK對所有設(shè)備都支持的flags:

MCI_SEEK_TO_END 跳到文件尾

MCI_SEEK_TO_START 跳到文件頭

MCI_TO 指定使用 lpSeek結(jié)構(gòu)中的 dwTo 成員變量來說明跳轉(zhuǎn)的位置,。MCI_TO不能和 MCI_SEEK_TO_END 或 MCI_SEEK_TO_START一起使用,。

使用于 vcr設(shè)備類型的flags:(VCR設(shè)備的lpSeek指向 MCI_VCR_SEEK_PARMS 結(jié)構(gòu) )
MCI_VCR_SEEK_AT
MCI_VCR_SEEK_MARK
MCI_VCR_SEEK_REVERSE
MCI_VCR_SEEK_MARK

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多