音を出してみよう - 2 / 3 -
IMediaQCP の例
別の例として、 QCP 形式の音声ファイルを再生するためのインタフェースである IMediaQCP を「BREW API リファレンス」で調べてみましょう。次のような記述がありますね。
このインタフェースは QCP (PureVoice) 形式の再生と記録を処理します。
通常は、このインタフェースの API を直接使用する必要はなく、代わりに IMedia API を使用してください。
このインタフェースの API は、そのインタフェースに特有の操作が必要な場合にのみ使用します。
このインタフェースには以下の関数が含まれます。
IMEDIAQCP_SetFormat() IMEDIAQCP_GetFormat()
これは、 IMediaQCP インタフェースでは、 IMedia インタフェースが提供するインタフェース関数を使用できますが、それに加えて、 IMEDIAQCP_SetFormat() と IMEDIAQCP_GetFormat() という二つの関数も使用できる、という説明です。
このように、「IMedia から派生したインタフェース」は、 IMedia と同じインタフェース関数をもち、それに加えて独自の関数をもつことができます。
インタフェースの階層構造
インタフェースの派生関係は、すべての BREW インタフェースの間に存在し、 1 つの階層構造を形成しています。 BREW インタフェースの階層構造については、「BREW API リファレンスの」の左のメニューから「BREW SDK AEE 階層チャート」を選択しますと、見ることができます。
なぜこのようなややこしい構造になっているのでしょうか。 MP3 を再生するためのインタフェースも、 MIDI を再生するためのインタフェースも、同じインタフェースとして扱えると便利だからです。
MP3 も MIDI も音声データであるということは同じで、ただデータ形式が違うというだけですので、 BREW 開発者から見れば、再生するための関数は同じであってほしいものです。
このように、どんなデータ形式の音声ファイルでも統一的にプログラミングできるようにするために、 IMedia インタフェースという "抽象的なインタフェース" を定義しています。
このようなインタフェースの階層構造は C++ のようなオブジェクト指向言語と高い親和性をもちますので、 C 言語での BREW プログラミングに慣れましたら、 C++ 言語についても学習されるとよいでしょう。
※インタフェースの派生は、 C++ や Java のクラスの派生と同じものです。 BREW のインタフェース関数は、 C++ や Java の仮想関数にあたります。
※IMedia のように、それ自体機能をもたず、派生インタフェースで具体的な機能をもたせることを前提としたインタフェースのことを「抽象インタフェース」と呼ぶことがあります。
音声再生の方法
音声再生の方法にはいくつかありますが、最も簡単な方法として、今回は三通りの方法を解説します。
方法 1 : IMediaUtil を使用して再生
BREW 2.1 には、簡単にメディアデータを再生するための IMediaUtil というインタフェースが用意されています。
このインタフェースは、再生対象のメディアデータが何であるかを自動的に判別し、対応する IMedia 派生インタフェースを作成して返してくれます。
IMediaUtil を使う場合の再生手順は次のようになります。
- ISHELL_CreateInstance() で IMediaUtil インタフェースを取得する。
- IMediaUtil_CreateMedia() を呼び出して IMedia 派生インタフェースを作成する。
- IMedia_Play() で再生する。
方法 2 : IMedia派生インタフェースを作成してファイルを再生
こちらの方法は、メディア形式に応じたインタフェーイスを作成した上で、そのインタフェーイスが再生可能なメディア ファイルを読み取らせることで、再生を行います。
- ISHELL_CreateInstance() で IMedia 派生インタフェースを作成する。
- IMedia_SetMediaData() で、メディアデータのファイル名をセットアップする。
- IMedia_Play() で再生する。
方法 3 : IMedia 派生インタフェースを作成し、メディアデータを格納したバッファを再生
IMedia の再生データとして任意のバッファを指定できます。この方法ですと、メディアデータを必ずしも通常のメディアファイル (MP3 ファイル、 MIDI ファイルなど)として格納しておく必要はありませんので、データソースの自由度が高くなります。
- IFileMgr, IFile を使用して、ファイルからメディアデータを読み取り、バッファに格納する。
- ISHELL_CreateInstance() で IMedia 派生インタフェースを作成する。
- IMedia_SetMediaData() で、メディアデータを格納したバッファをセットアップする。
- IMedia_Play() で再生する。