音を出してみよう - 1 / 3 -
前回はファイルシステムについて解説しました。今回は BREW で音を出す方法を解説します。
BREW で再生できるメディアデータ
BREW 2.1 では、次のような形式のメディア データ (オーディオ、サウンド、動画などのデータ) を再生できます。
- MP3 形式
- MIDI 形式
- QCP 形式 (Qualcomm Pure Voice 形式)
- PMD 形式 (WebAudio 形式)
- MMF 形式 (SMAF 形式)
- MPEG4 形式
- Phrase 形式
- AAC 形式
しかし、実際にこれらのデータ形式を再生できるかどうかは携帯電話端末の機種に依存しますので、注意してください。端末がサポートしていないデータ形式は、再生することはできません。
音を出すためのインタフェース
BREW で音を出すためには、 IMedia インタフェースを使用します。 IMedia インタフェースは、 MP3 や MIDI などのさまざまなメディア データを再生するためのインタフェースです。
しかし、 IMedia インタフェースは、それ自体では各種データ形式の再生機能をもちません。具体的に各種データ形式の再生機能をもつのは、 IMediaMP3, IMediaMIDI などの、 "IMedia 派生インタフェース" と呼ばれるインタフェースです。
派生インタフェース
"派生インタフェース" について説明しましょう。あるインタフェース IFoo と IFooBar があって、 IFoo のすべてのインタフェース関数を IFooBar が持ち合わせているとき、 IFooBar は IFoo の派生インタフェースであるといいます。
※正確には、同じ関数をもつだけでだけでなく、同じ関数の並び順をもつ必要があるのですが、今回はあまり深くは立ち入らないことにします。
この説明では抽象的すぎるので、もう少し具体例をあげましょう。これまで BREW のインタフェースがいくつか出てきましたね。 IShell, IDisplay, IGraphics, IFile などなど。これらのインタフェースは、必ず AddRef(), Release() というインタフェース関数をもつことも学びました。
ここで「BREW API リファレンス」を開いて、 IBase インタフェースという項目を調べてみてください。このインタフェースは、 IBASE_AddRef(), IBASE_Release() という 2 つだけの関数をもつのが分かります。
つまり、これまで説明してきた BREW のインタフェースは、「IBase インタフェースの派生インタフェースである」といえるのです。
※IBase インタフェースは何に使うの?と疑問をもった方がおられるでしょう。あんまり深く考えないでください。 IBase は何の役にも立ちません。これは審美的な理由で存在する飾りのようなものです。 BREW プログラミングに熟達すれば、利用方法が見つかるかも知れませんが……
IMediaMP3 の例
例えば、MP3 の音声ファイルを再生するためのインタフェースである IMediaMP3 は、 IMedia インタフェースとまったく同じ関数をもちます。「BREW API リファレンス」で、 IMediaMP3 インタフェースを調べてみますと、次のように記述があります。
このインタフェースは MP3 形式の再生を処理します。
この形式のインタフェースに関連付けられた関数はありません。
これは、 IMediaMP3 インタフェースがインタフェース関数をまったくもたないという意味ではありません(もしそうだとしたら、そんなインタフェースに何の価値があるんだ?)。 IMediaMP3 は IMedia と同じインタフェース関数をもちますが、それに加えて新たな関数はもたない、という意味です。
ですから、 IMediaMP3 インタフェースでは、次のようなコードを書くことができます。 IMEDIA_GetVolume() は、 IMedia インタフェースの関数であり、 IMediaMP3 インタフェースの関数ではありませんが、 IMediaMP3 は IMedia の派生インタフェースですので、このような記述をすることができます。
IMedia* media; IMediaMP3* mp3; uint16 volume; ISHELL_CreateInstance(shell, AEECLAID_MEDIAMP3, &mp3); IMEDIA_GetVolume(mp3, &volume); media = (IMedia*) mp3; // IMediaMP3 を IMedia にキャストしてもよい。 IMEDIA_Release((IMedia*) mp3); IBASE_Release((IBase*) mp3); // ちなみにこんなコードを書いても OK