MCIERROR mciSendCommand(
MCIDEVICEID IDDevice,
UINT uMsg,
DWORD fdwCommand,
DWORD_PTR dwParam
);
IDDevice | コマンドを送信するMCIデバイスの識別子を指定します。アプリケーションは、最初にメディアデバイスを開いてこの識別子を取得する必要があります。 |
uMsg | MCIデバイスに送信するコマンドを表す定数を指定します。 |
fdwCommand | コマンドの追加情報となるフラグ |
dwParam | コマンドの情報を格納した構造体へのポインタ |
MCI_OPENコマンド
static MCI_OPEN_PARMS mop;
(略)
case WM_CREATE:
mop.dwCallback = ( DWORD )hWnd;
mop.lpstrDeviceType = ( LPCSTR )MCI_DEVTYPE_WAVEFORM_AUDIO;
mop.lpstrElementName = "test.wav";
iErr = mciSendCommand( 0, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
( DWORD )&mop );
if ( iErr ) {
mciGetErrorString( iErr, strErr, sizeof( strErr ) );
MessageBox( hWnd, strErr, NULL, MB_OK | MB_ICONERROR );
return -1;
}
break;
文字列でデバイスの種類を指定する場合は、フラグに
MCI_OPEN_TYPEを組み合わさなければなりません。
定数を使ってデバイスの種類を指定する場合は、MCI_OPEN_TYPEに加えて
MCI_OPEN_TYPE_IDフラグを組み合わせます。
基本的には、文字列よりも定数の方がオーバーヘッドが少なく高速な動作を期待することができます。
MCI_OPEN_ELEMENTは所定の構造体のlpstrElementNameメンバに、ファイル名が格納されている事を表します。
MCI_PLAYコマンド
case WM_LBUTTONDOWN:
mciSendCommand( mop.wDeviceID, MCI_PLAY, 0, 0 );
break;
正しくMCIデバイスをオープンすることができれば、
MCI_PLAYコマンドをデバイスに送信する事で、コンテンツを再生する事ができます。
MCI_PLAYコマンドもデバイスの種類でさまざまなフラグや構造体を指定する事ができますが、特殊な再生方法を望まない限りは必要無いでしょう。
MCI_STOP、MCI_PAUSE、MCI_SEEKコマンド
case WM_RBUTTONDOWN:
PlaySound( NULL, NULL, SND_PURGE );
mciSendCommand( mop.wDeviceID, MCI_STOP, 0, 0 );
mciSendCommand( mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
break;
再生を一時停止するには
MCI_PAUSE、
停止するには
MCI_STOPコマンドを送信します。
これらのコマンドは独自のフラグや構造体を持ちません。
MCI_PAUSE、MCI_STOPの意味は対象デバイスによって異なります。
コンテンツの再生位置は
MCI_SEEKコマンドで変更する事ができます。
フラグに
MCI_SEEK_TO_STARTを指定すればコンテンツの先頭に移動します。
フラグと専用の構造体を指定すれば任意の位置も指定できます。
※WAVEの再生で試してみると、PlaySound関数では再生後、先頭に自動で巻き戻されるようですが
MCIコマンドでは再生後巻き戻らない(もしくは再生しっぱなし)のようで、
MCI_SEEKで再生位置を設定し直す必要があるようです。
MCI_CLOSEコマンド
case WM_DESTROY:
mciSendCommand( mop.wDeviceID, MCI_CLOSE, 0, 0 );
PostQuitMessage(0);
break;
MCIデバイスの利用が終了し、デバイスが不要になれば解放しなければなりません。
デバイスを解放するには
MCI_CLOSEコマンドを送信して下さい。
MCI_CLOSEコマンドは独自のフラグや構造体を持ちません。
MCI_NOTIFYフラグ
MCI_NOTIFYフラグを使用すると、
デバイスはアクションを完了すると親ウィンドウに
MM_MCINOTIFYメッセージをポストします。
このメッセージは、コマンドが処理を終了した時に送られてきます。
MCI_PLAYコマンドにMCI_NOTIFYフラグを指定すれば、
MCIはトラックの再生が終了すると親ウィンドウに
MM_MCINOTIFYコマンドをポストするので、
このタイミングで再びトラックの先頭から再生するようにすれば
ループ再生ができます。
static MCI_OPEN_PARMS mop;
static MCI_PLAY_PARMS mpp;
(略)
case WM_CREATE:
(デバイスのオープンの記述。上記参照)
mpp.dwCallback = ( DWORD )hWnd;
mpp.dwFrom = 0; // 演奏開始位置の設定、0ならば曲の先頭からになる
case WM_LBUTTONDOWN:
mciSendCommand( mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, ( DWORD )&mpp );
break;
case WM_RBUTTONDOWN:
mciSendCommand( mop.wDeviceID, MCI_STOP, 0, 0 );
//mciSendCommand( mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
break;
case MM_MCINOTIFY:
if ( wParam == MCI_NOTIFY_SUCCESSFUL )
mciSendCommand( mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, ( DWORD )&mpp );
break;
(略)
※最初から再生開始位置を指定して再生してやれば
MCI_SEEKコマンドを使う必要も無さそうです。