Media Control Interface(MCI)

鑽研了老半天,才發現MCI不能個別控制聲音大小
準備轉攻OpenAL,先來把簡單的使用方式筆記筆記…

Media Control Interface,一個強大的媒體控制介面
什麼CD啦~MIDI啦~AVI啦~DAT(Digital Audio Tape)啦~VCR啦~Vediodisk等等的
使用指令的方式也蠻特別的(至少我第一次看到XD)

  1. 引用
    需要include <mmsystem.h>
    連結 winmm.lib
  2. 下指令
    只有兩個介面可以選擇,mciSendString()與mciSendCommand()
    兩者指令都差不多,只差在於前者只能控制單一設備,後者可以控制數個設備
    以下都用後者為範例~
  3. 指令
    MCI Commands
    這就是MCI的指令大全,功能都和字面上的意思差不多,就不多說了
  4. 參數
    mciSendCommand
    參數1: 該設備的編號。
    參數2: 指令。
    參數3: 附屬指令。
    參數4: 該指令所需的資料結構的指標。

    參數2&3就是一堆Flags組合而成的,在該指令的說明檔裡面都有附帶附屬指令的明細
    參數4的指標,MCI Structures,這是MCI所有指令所需的資料結構
    其中每種結構都會擁有的變數「dwCallback」,用來告知該設備要對哪個視窗做出回應
    這就要提到附屬指令中,一種額外的Flag – 「The Wait, Notify, and Test Flags
    我目前還不明白Wait和Notify的差異@@…Test則是沒用過
    大致上的用法就是,在每次最後一個參數裡,設定回應的視窗,這三個Flag都會在執行完或者出問題的時候發出訊息

  5. 錯誤
    當然,有錯誤MCI也會回傳錯誤代碼
    mciGetErrorString,就是它啦!!
    參數1: 從
    mciSendString()與mciSendCommand()下指令所獲得的回傳碼
    參數2: 儲存錯誤訊息的字串緩衝區

    參數3: 該緩衝區的長度
  6. 簡單的範例
    就用大家最愛的mp3吧!
    首先創造一個Open所需的結構
    MCI_OPEN_PARMS mciOpen;
    創造一個儲存錯誤代碼的變數
    MCIERROR mciErr;
    準備一個緩衝區來存放錯誤訊息
    mciOpen.lpstrElementName = "songs\\王力宏 – 落葉歸根.mp3";
    開啟
    mciErr = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
    檢查一下有沒有開始成功
    if(mciErr)
    {
         mciGetErrorString(mciError, buf, 128);
         cout << "傳送 MCI_OPEN 指令時發生錯誤:" << buf << endl;
         return;
    }
    記錄一下這次開啟的設備代碼
    UINT DeviceID = mciOpen.wDeviceID ;
    創造一個Play所需的結構
    MCI_PLAY_PARMS mciPlay;
    給它我們的視窗代碼(hWnd)
    mciPlay.dwCallback = hWnd;
    播放
    mciErr = mciSendCommand(DeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);
    檢查一下有沒有撥放成功
    if(mciErr)
    {
        
    mciGetErrorString(mciErr, buf, 128);
         cout << "傳送 MCI_PLAY 指另發生錯誤" << buf << endl;
         return;
    }
    好了~播放完畢!
    註1:在開啟的部份,一般來說需要設定以什麼類型開啟,不過似乎會自動偵測,所以就省略了XD
    註2:在播放的部份,如果單純想播放到完畢,其實也不用設定視窗代碼,直接將第四個參數設為 NULL 即可。
  7. 重播
    放個背景音樂免不了重播的動作吧?
    在訊息回圈裡,通常會傳入四個參數 HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam
    我們只需要注意後面三個參數
    msg會傳入MCI所發出的訊息 「MCI Messages
    wParam 及 lParam,請參照該訊息個別的用途O_O,這裡介紹「MM_MCINOTIFY
    wParam – 提醒的結果
    lParam – 提醒視窗的設備代號

    LRESULT CALLBACK WndProc (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
         switch (iMsg)
         {
         case MM_MCINOTIFY:
              mciSendCommand(
    lParam, MCI_SEEK_TO_START, NULL, NULL);
              mciSendCommand(
    lParam, MCI_PLAY, MCI_NOTIFY, NULL);
         break;
         }
         retrun 0;
    }

    當然,每種指令都可以提醒視窗,至於如何去分辨,就看各位的方法嚕!

應該就先這樣了吧!
◎參考:
    如何播放大型 WAV 文件?
    VC中MCI播放mp3的例子
    游戏音乐与音效的播放
    VC中关于声音文件的操作
    利用MCI播放MIDI、WAVE
    MCI Command String总览
    Win 32的多媒体服务
    MSDN

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s