Win32プログラミング講座 〜 Step30. MCIコマンドで音楽ファイルを再生する 〜


今回はMCIコマンドを使って、WAVE、MIDI、MP3等の音楽ファイルを再生することができる簡易プレーヤーを作ってみます。

MCIコマンドって何?

"Multimedia Control Interface" のことです。ようは、音楽ファイルをオープンしたり、再生、停止したりする、サウンド関連のコマンドのことです。
mciSendCommand関数を使用すれば、MCI_OPEN、MCI_PLAY、MCI_STOPなどのMCIコマンドを送ることができます。

mciSendCommand ( _
       mciId As Long, _        'MCIデバイスのID
       uMsg As Long, _         'コマンド(MCI_OPEN、MCI_PLAY、MCI_STOPなど…)
       dwParam1 As Long, _     'パラメータ1(コマンドにより異なります)
 ByRef dwParam2 As Any _       'パラメータ2(コマンドにより異なります)
       ) As Long

作り方

ノーマルウィンドウベースのプロジェクトを新規作成します(プロジェクト名を "SoundTest" とします)。プロジェクト オプションで、「マルチメディアAPIを使用する」にチェックを入れておいて下さい。


MainWndは左のようなコントロール配置にしておきましょう。



コーディング

MainWnd.sbpに以下のようなコードを入力していきます。

' ----------------------------------------------------------------------------
'  イベント プロシージャ
' ----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' メモ - 以下の領域を、変数、構造体、定数、関数を宣言するための、
'        グローバル領域として利用することができます。
' ----------------------------------ここから----------------------------------

Dim mop As MCI_OPEN_PARMS

' ----------------------------------ここまで----------------------------------

↑MainWnd.sbpの先頭部分には、MCIデバイスのオープン情報のための構造体を用意します。


Sub MainWnd_Destroy()
    SoundTest_DestroyObjects()
    PostQuitMessage(0)
End Sub

↑Destroyイベントに変更はありません。


Sub MainWnd_OpenButton_Click()
    Dim ofn As OPENFILENAME
    Dim buffer[MAX_PATH-1] As Byte

    'ファイル名を取得
    ofn.lStructSize=76
    ofn.hwndOwner=hMainWnd
    ofn.lpstrFilter=Ex"音楽 ファイル(*.wav;*.mid;*.mp3)\0*.wav;*.mid;*.mp3\0すべてのファイル(*.*)\0*\0\0"
    ofn.nFilterIndex=1
    ofn.nMaxFile=MAX_PATH
    ofn.lpstrFile=buffer
    GetOpenFileName(ofn)

    'テキストボックスにパスを設定する
    SetWindowText(GetDlgItem(hMainWnd,Static_Path),ofn.lpstrFile)
End Sub

↑OPENボタンがクリックされたときに呼び出されるイベントです。GetOpenFileName関数でファイル名を取得し、テキストボックス(Static_Path)にファイルパスを表示します。


Sub MainWnd_PlayButton_Click()
    Dim bErr As Long
    Dim mpp As MCI_PLAY_PARMS
    Dim buffer[MAX_PATH-1] As Byte

    '再生中の場合は停止させる
    If mop.wDeviceID Then MainWnd_StopButton_Click()

    'サウンド ファイルのパスを設定します。
    mop.lpstrElementName=buffer
    GetWindowText(GetDlgItem(hMainWnd,Static_Path),mop.lpstrElementName,260)

    'メッセージ通知のためのウィンドウを指定
    mop.dwCallback=hMainWnd

    'MCIデバイスをオープン
    bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
    If bErr Then
        MessageBox(hMainWnd,"デバイスのオープンに失敗","error",MB_OK)
        Exit Sub
    End If

    '再生
    mpp.dwCallback=hMainWnd
    bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp)
    If bErr Then
        MessageBox(hMainWnd,"デバイスの再生に失敗","error",MB_OK)
        Exit Sub
    End If
End Sub

↑PLAYボタンがクリックされたときに呼び出されるイベントです。MCI_OPENコマンドでMCIデバイスを開き、MCI_PLAYコマンドでデバイスを再生します。


Sub MainWnd_StopButton_Click()
    Dim bErr As Long
    Dim dwCallback As DWord

    '停止
    bErr=mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
    If bErr Then
        MessageBox(hMainWnd,"デバイスの停止に失敗","error",MB_OK)
        Exit Sub
    End If

    'デバイスを閉じる
    mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)

    mop.wDeviceID=0
End Sub

↑STOPボタンがクリックされたときに呼び出されるイベントです。MCI_STOPコマンドでデバイスを停止させ、MCI_CLOSEコマンドでデバイスをクローズしています。


Sub MainWnd_MciNotify(flags As Long, DevID As Long)
    Dim dwCallback As DWord

    If flags=MCI_NOTIFY_SUCCESSFUL Then
        'デバイスを閉じる
        mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback)

        mop.wDeviceID=0
        MessageBox(hMainWnd,"再生終了","Sound test",MB_OK)
    End If
End Sub

↑MciNotifyは、再生が終了した場合などにMCIコマンドから送られるイベントです。RADツールの「イベント処理」ダイアログのMMSYSタブで表示されています。
再生が正常に終了した場合(flagsパラメータに MCI_NOTIFY_SUCCESSFUL フラグがセットされていたとき)はMCI_CLOSEコマンドを送り、MCIデバイスをクローズします。DevID変数とmop.wDeviceID変数には同じ値がセットされています。


これで作業は終了です。コンパイル&実行をして、音楽ファイルが再生できているかどうかチェックしておきましょう。

前へ戻る - 次へ進む
トップへ戻る


©2005 Discoversoft