・音楽再生の方法
Audio、Visualなどのマルチメディア関係はあんまり興味もないですし、 もちろん詳しくもないですが、音楽の再生くらいはできるようにしたかったので、 ちょっと調べたら真っ先にPlaySoundというAPIがあることを知りました。 使い方も割と簡単です。ところがWAVE形式しかサポートしてないんですね。 買ってきたCDで気に入ったものはPCに溜め込んでいますが、WAVE形式では保存してないです。 全部MP3形式です。ファイルサイズのことを考えたらほとんどの方がそうだと思います。 曲の再生ということだけ考えたらこれはほとんど使えないです。
それでもうちょっと調べたらMCI系のAPIがあることが分かったのですが、
WAVEやMP3などいろいろな形式に対応している代わりに使い方が少なくとも私にとっては
とっても難しかったです。しかも、MSDNではこのAPIに使う構造体のドキュメントも
英語しか見当たらなくてさらに凹みました。
(MSDNで日本語の解説があれば教えてください)
MCI系APIで音楽を再生するのはmciSendCommand
とmciSendStringの2つのAPIがあります。
前者は音楽の再生や停止などの命令をする場合、必要なパラメータを構造体などに設定して、
Mmsystem.hで定義されている定数を指定して引数に与えることで実行します。
後者は 前者の定数や構造体の設定部分を文字列に置き換えて引数に渡すのですが、命令を
文字列を生成することで実行するので野暮ったく感じます。ということで以後は
mciSendCommandでの音楽再生方法を書いていきます。
・mciSendCommandの使い方
このAPIの定義はMmsystem.hで次のようになっています。
WINMMAPI MCIERROR WINAPI mciSendCommandA( IN MCIDEVICEID mciId, IN UINT uMsg, IN DWORD_PTR dwParam1, IN DWORD_PTR dwParam2);
<第二引数 uMSG>
音楽を再生するにはファイル(デバイス)をOpen、再生(Play)して、途中で一時停止(Pause)、 一時停止解除(Resume)や停止(Stop)の場合があり、最後にファイルを閉じる(Close)ことになります。 これらの命令はmciSendCommandの第二引数で指定します。
<第四引数 dwParam2>
第二引数で指定したコマンドを実行する際にパラメータが
必要になることがあるのですが、これは構造体へのポインタとして第四引数に指定します。
例えば最初に第二引数でMCI_OPENを指定して音楽ファイルの初期化を行いますが、
どの音楽ファイルを初期化するかは、MCI_OPEN_PARMS構造体のlstrElementNameメンバに
ファイル名を指定してOpenします。(下表参照)
<第三引数 dwParam1>
第二引数に指定するコマンドの追加のフラグです。
例えばMCI_PLAYを第二引数に指定する場合、第四引数にはMCI_PLAY_PARMS構造体を
指定しますが、この構造体のdwFromメンバとdwToメンバに値を設定してmciSendCommand
を実行すると2つの値の区間を演奏します。ところが、dwFromとdwToメンバに値を設定した
だけでは効果がないです。この2つのメンバが設定されているよということをmciSendCommand
に知らせなければなりませんが、そこでこの引数にMCI_FROMとMCI_TOを論理和で設定
してやることで構造体にdwFromとdwToメンバが設定されているよということを教えています。
以下が第二引数に指定できる主な定数、 対応する第四引数の構造体名、第三引数に設定できる主なフラグの一部と構造体のメンバの一覧です。
主な第二引数 | 第四引数 | 主な第三引数の定数 | 第四引数の構造体のメンバ | |
MCI_OPEN | MCI_OPEN_PARMS | MCI_OPEN_TYPE | DWORD_PTR dwCallback | A |
MCIDEVICEID wDeviceID | B | |||
MCI_OPEN_TYPE_ID | ||||
LPCSTR lpstrDeviceType | C | |||
LPCSTR lpstrElementName | D | |||
MCI_OPEN_ELEMENT | ||||
LPCSTR lpstrAlias | E | |||
MCI_PLAY | MCI_PLAY_PARMS | MCI_FROM | DWORD_PTR dwCallback | A |
DWORD dwFrom | F | |||
MCI_TO | ||||
DWORD dwTo | G | |||
MCI_PAUSE | MCI_GENERIC_PARMS | DWORD_PTR dwCallback | A | |
MCI_RESUME | MCI_GENERIC_PARMS | 同上 | A | |
MCI_STOP | MCI_GENERIC_PARMS | 同上 | A | |
MCI_SEEK | MCI_SEEK_PARMS | MCI_SEEK_TO_END | DWORD dwCallback | A |
MCI_SEEK_TO_START | ||||
DWORD dwTo | G | |||
MCI_TO | ||||
MCI_SET | MCI_SET_PARMS | MCI_SET_TIME_FORMAT | DWORD_PTR dwCallback | A |
DWORD dwTimeFormat | H | |||
DWORD dwAudio | I | |||
MCI_STATUS | MCI_STATUS_PARMS | MCI_STATUS_ITEM | DWORD_PTR dwCallback | A |
DWORD dwReturn | J | |||
MCI_TRACK | DWORD dwItem | K | ||
DWORD dwTrack | L |
<第一引数 wDeviceID>
演奏(Play)などのコマンドを実行する対象のデバイスIDです。 これはMCI_OPENでmciSendCommandを実行すると MCI_OPEN_PARMS.wDeviceIDに返ってくる値を以降の操作で指定します。
<各構造体メンバ>
このメンバに設定する定数 | 返される状態の説明 |
MCI_STATUS_LENGTH | 音楽ファイルの全体の長さ |
MCI_STATUS_MODE | 現在の演奏状態(Play,Pauseなど) |
MCI_STATUS_POSITION | 現在の演奏位置(単位はMCI_SETで設定) |
MCI_STATUS_TIME_FORMAT | 位置や長さなどの単位 |
このAPIはちょっと使い方がややこしくて、音楽の再生に関係する内の
基本的な部分を書いただけなので詳しく知りたい方はMSDNをお調べください。
長々と書きましたが文章だけでは使い方がいまいちよく分からないと思いますので、
実際にごく簡単な音楽プレーヤをVC++ 2005で作成して使い方を書きます。