Mobile:NEWS 2003年12月19日 01:39 PM 更新

BREW プログラミング入門(9)
音を出してみよう(3/3)


前のページ

今回のサンプルアプリ

 今回のサンプルアプリでは、前述の三通りの方法でMIDIファイルを再生しています。

 アプレット構造体は次のようになります。

// アプレット構造体
typedef struct _PlayMedia {
    AEEApplet     a;      // 最初のメンバは必ずAEEAppletにすること
    IMedia*       media;  // IMedia 派生インタフェース
    AEEMediaData  mdata;  // メディア データ
} PlayMedia;

 IMediaインタフェースを使うためには、ソースコードにAEEMediaFormats.hをインクルードする必要がありますので、忘れないでください。

方法1の実装

 IMediaUtilを使用して再生するコードを以下に示します。

//
//  IMediaUtil インタフェースを使用して、
//  MIDI ファイルを再生します。
//
static void PlayMedia_PlaySound1(PlayMedia* app)
{
    IShell* shell   = app->a.m_pIShell;
    IMediaUtil* mutil = NULL;
    const char* filename = "test.mid";

    ISHELL_CreateInstance(shell, AEECLSID_MEDIAUTIL, (void**) &mutil);
    if (mutil != NULL) {
        app->mdata.clsData  = MMD_FILE_NAME;
        app->mdata.pData    = STRDUP(filename);
        app->mdata.dwSize   = 0;

        IMEDIAUTIL_CreateMedia(mutil, &app->mdata, &app->media);
    }
    IMEDIAUTIL_Release(mutil);

    if (app->media != NULL) {
        IMEDIA_Play(app->media);
    }
}

※IMediaUtil インタフェースは BREW 2.1 ではじめて導入されたインタフェースです。このインタフェースは「BREW APIリファレンス」では解説されていません。BREW SDK 2.1 日本語版の「BREW 2.1 新インタフェースリファレンス」のほうに解説があります。

 IMedieUtil インタフェースを使用するには、まず始めにISHELL_CreateInstance()でオブジェクトを取得する必要があります。取得しましたら、IMEDIAUTIL_CreateMedia() にファイル名を渡すだけでそのファイルを再生するための IMedia 派生インタフェースを作成して返してくれます。非常に簡単ですね。

 今回のサンプルでは MIDIファイルを指定していますが、IMediaUtil を使用する場合は、端末がサポートしているメディア形式であれば、どのようなファイルを指定しても構いません。

 IMediaUtil はファイルのメディア形式を自動的に判別して、その形式を再生するのにふさわしいIMedia派生インタフェースを作成してくれます。

 IMediaUtil を使い終わったら解放することを忘れないでください。それから、IMedia 派生インタフェースを作成した後でIMEDIA_Play() を呼び出さないと、実際に音声が流れないので注意しましょう。

※IMediaUtil はファイルの拡張子によって形式を判別する、と「BREW APIリファレンス」に記述があります。したがって、ファイルの拡張子は適切なものをつけてください。

方法2の実装

 メディアのデータ形式が分かっている場合、IMedia 派生インタフェースを明示的に作成して、メディア データをセットアップすることもできます。下記のコードでは、ファイル名を指定してMIDIデータをセットアップしています。

//
//  IMediaMIDI インタフェースを作成して、
//  MIDI ファイルを再生します。
//
static void PlayMedia_PlaySound2(PlayMedia* app)
{
    IShell* shell   = app->a.m_pIShell;
    const char* filename = "test.mid";

    // IMediaMIDI インタフェースを取得して、再生データをセットする。
    ISHELL_CreateInstance(shell, AEECLSID_MEDIAMIDI, (void**) &app->media);
    if (app->media != NULL) {
        app->mdata.clsData  = MMD_FILE_NAME;
        app->mdata.pData    = STRDUP(filename);
        app->mdata.dwSize   = 0;

        IMEDIA_SetMediaData(app->media, &app->mdata);
        IMEDIA_Play(app->media);
    }
}

方法3の実装

 メディア データは、必ずしもファイルで提供する必要はありません。下記のコードでは、メモリ上のメディア データを再生しています。

//
//  ファイルから独自に MIDI データを読み取り、
//  IMediaMIDI インタフェースを使用して再生します。
//
static void PlayMedia_PlaySound3(PlayMedia* app)
{
    IShell* shell   = app->a.m_pIShell;
    IFileMgr* filemgr;
    IFile* file;
    uint32 filesize;
    const char* filename = "test.mid";
    FileInfo fileinfo;

    // ファイルを開く
    ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, &filemgr);
    file = IFILEMGR_OpenFile(filemgr, filename, _OFM_READ);
    if (file == NULL) {

        IFILEMGR_Release(filemgr);
        return;
    }
    // ファイル サイズを取得する
    IFILEMGR_GetInfo(filemgr, filename, &fileinfo);
    filesize = fileinfo.dwSize;
    

    // バッファを確保する
    app->mdata.pData = (byte*) MALLOC(filesize);

    // データをバッファに読み取る
    IFILE_Read(file, app->mdata.pData, filesize);

    // ファイルの解放
    IFILE_Release(file);
    IFILEMGR_Release(filemgr);

    // メディア データを準備する
    app->mdata.clsData = MMD_BUFFER;
    app->mdata.dwSize = filesize;
    

    // IMediaMIDI インタフェースを作成して、再生する。
    ISHELL_CreateInstance(shell, AEECLSID_MEDIAMIDI, &app->media);
    if (app->media != NULL) {
        IMEDIA_SetMediaData(app->media, &app->mdata);
        IMEDIA_Play(app->media);
    }
}

メディア再生の後始末

 上記のようなコードでメディア データを再生しますと、アプリ終了時にはIMedia派生インタフェースを解放する必要がありますし、メディア データとして提供したファイル名やバッファも解放する必要があります。今回のサンプル アプリでは、アプリ終了時に次のように解放しています。

//
//  アプリ終了イベント
//
static boolean PlayMedia_OnAppStop(PlayMedia* app)
{
    // IMedia 派生インタフェースの解放
    if (app->media != NULL) {
        IMEDIA_Release(app->media);
    }

    // メディア データの解放
    if (app->mdata.pData != NULL) {
        FREE(app->mdata.pData);            
    }

    return TRUE;
}

※今回の記事のソースコードは、ソフィア・クレイドル のサイトからダウンロードできます。

著者紹介
倉谷智尋:ソフィア・クレイドル研究開発部チーフサイエンティスト。ソフィア・クレイドルは、2002年2月京都市にて、無限の可能性を秘めたソフトウェア職人たちが楽しく集い、自ずと自己実現が達成される場になることを目指して創業。在籍スタッフの平均年齢は20代前半と若いが、その大半がプログラミング歴10年以上とそのプロフェッショナリティは極めて濃い集団である。

 これまでにBREW用アプリケーションフレームワークケータイJavaプログラム圧縮技術ケータイJavaブラウザ技術、ケータイメッセンジャー技術などを総合的に研究開発し、「高品質な共通プラットフォーム」の実現を目指してきた。

ご感想、ご質問はこちら(zdnet-contact@s-cradle.com)まで。



関連記事
▼ BREW プログラミング入門(8):ファイルを操作してみよう
第6回、第7回と描画に関する話題を詳しく解説してきました。描画については一通り解説しましたので、今回は第6回でも少しだけ取り上げたファイルシステムについて解説したいと思います。

▼ BREW プログラミング入門(7):さらに描画のおはなし
前回はリソースファイルの作成方法と、リソースからビットマップを取得して画面に表示する方法を解説しました。今回はもう少し描画関係の話をしたいと思います。

▼ BREW プログラミング入門(6):ビットマップを描画してみよう
前回はイベント処理について解説しました。今回はファイルやリソースに関する事柄とビットマップやイメージの描画について解説します。

▼ BREW プログラミング入門(5):イベント処理って何だ?
前回は文字列の扱い方について解説しました。今回はBREWのイベント処理について学びます。

▼ BREW プログラミング入門(4):BREW の文字列について知ろう
前回は画面描画のAPI、インタフェースやアプレット構造体についての理解を深めました。今回は文字列の扱い方について解説します。

▼ BREW プログラミング入門(3):画面に描画をしてみよう
前回の連載では、HelloWorldアプレットを作成することで、BREWアプリケーションのおおまかな構造について学びました。今回は画面描画のAPIについて詳しく説明するとともに、インタフェースやアプレット構造体についての理解を深めます。

▼ BREW プログラミング入門(2):“HelloWorld”プログラムを作ろう
前回の連載では、BREW SDK 2.1をインストールするところまで解説しました。今回は実際にソースコードを書き、BREWエミュレータで動かしてみましょう。画面に "Hello World" と表示する簡単なBREWアプリを作成します。

▼ BREW プログラミング入門(1):BREW SDKをインストールしよう
本連載は、BREWに興味がありプログラミングを始めてみたいけれど、どこから手をつけてよいか分からない方々を対象に、ステップ・バイ・ステップでBREWプログラミングを行う方法を解説していきます

▼ Qualcomm、携帯電話向けプラットフォーム「BREW」発表──au端末に搭載
▼ “携帯電話のOS”を目指すBREW──国内でも1号機
▼ BREWとは何か?──Javaとの違い
▼ 連載バックナンバー

[倉谷智尋, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 3/3 | 最初のページ



モバイルショップ

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!