### 2-3　ミドルウェアの使用方法

####

2-3-1　ミドルウェアライブラリの初期化

ミドルウェアライブラリの初期化は、各コーデックに対応した初期化関数を呼び出さなければなりません。

＜Sofdecの場合＞

>     mwPlyPreInitSofdec();
>     sbInitSystem(NJD_RESOLUTION_640x480_NTSCI, NJD_FRAMEBUFFER_MODE_ARGB8888, 1);
>     mwPlyInitSofdec(NULL);

＜WAVの場合＞

>     sbInitSystem(NJD_RESOLUTION_640x480_NTSCI, NJD_FRAMEBUFFER_MODE_ARGB8888, 1);
>     mwPlyInitWav(MWD_PLY_MN_EXEC_VSYNC);

####

2-3-2　ミドルウェアライブラリの使用方法

ミドルウェアライブラリの内部状態の更新は、メイン処理用サーバ関数（mwPlyExecServer）をnjWaitVSync関数を呼び出す前に実行します。また、ゲームフレームの開始をミドルウェアライブラリに通知するために、njWaitVSync関数の直後にmwPlyStartFrame関数を呼び出さなければなりません。

>     whlie (1){
>     　  njWaitVSync();
>     　  mwStartFrame();        /*ゲームフレームの開始の通知    */
>     　      ：
>     　  （ゲームの処理）
>     　      ：
>     　  mwExecServer();        /*デコード処理など              */
>     }

####

2-3-3　ミドルウェア再生ハンドル

各コーデックによって圧縮された音声や動画データは、ミドルウェア再生ハンドルを用いて再生します。まず、各コーデック用のミドルウェア再生ハンドルを生成します。このハンドルの生成には、使用するコーデックに対応したAPIを用います。

>     MWPLY plysfd,plywav;

>     plysfd = mwPlyCreateSofdec(&cprm); /*Sofdecデータ再生用ミドルウェア再生ハンドル */
>     plywav = mwPlyCreateWav(&cprm);    /*WAVEデータ再生用ミドルウェア再生ハンドル   */

ハンドルの生成には、異なるAPIを使用しますが、再生指示には同じAPIを使用することができます。

>     mwPlyStartFname(plysfd, "SAMPLE.SFD");  /* Sofdecデータの再生                   */
>     mwPlyStartFname(plywav, "SAMPLE.WAV");  /* WAVEデータの再生                     */

mwPlyStart関数とmwPlyStop関数により、動画や音声の再生開始と再生停止を制御します。

####

2-3-4　ミドルウェア再生ハンドルの動作状態

ミドルウェア再生ハンドルの動作状態を下記に示します。生成した直後は、STOP状態となります。再生開始後、状態は、PREP ->PLAYING ->PLAYEND と遷移します。

表2 ハンドルの状態

状態 | 説明
STOP | 再生が停止している状態
PREP | 再生の準備をしている状態
PLAYING | 再生中の状態
PLAYEND | 再生が終了した状態
ERROR | エラーが発生した状態

状態遷移図を以下に示します。

図8 状態遷移図

####

2-3-5　MPEG Sofdecの再生

以下に、MPEG Sofdecを再生するサンプルプログラムを示します。

＜サンプルプログラム＞

>     /* アプリケーションメイン関数 */
>     void main(void)
>     {
>     　  MWPLY              ply;                /* ミドルウェア再生ハンドル        */
>     　  MWE_PLY_STAT       stat;               /* ハンドルの状態                  */
>     　  MWS_PLY_CPRM_SFD   cprm;               /* ハンドル生成のパラメータ構造体  */
>     　  mwPlyPreInitSofdec();                  /* 割り込みスタックなどの設定      */
>     　  sbInitSystem(NJD_RESOLUTION_640x480_NTSCI,NJD_FRAMEBUFFER_MODE_ARGB8888,1);
>     　  /*
>     　   *  画面やサウンドの初期化
>     　   */
>     　  mwPlyInitSofdec(NULL);                 /* ライブラリの初期化              */
>     　  cprm.ftype  = MWD_PLY_FTYPE_SFD;
>     　  cprm.dtype  = MWD_PLY_DTYPE_AUTO;
>     　  cprm.work   = syMalloc(MWD_SFD_SIZE_WORK);
>     　  cprm.wksize = MWD_SFD_SIZE_WORK;
>     　  ply = mwPlyCreateSofdec(&cprm);         /* ハンドルの生成                 */
>     　  mwPlyStartFname(ply, SAMPLE.SFD");      /* 再生開始                       */
>     　  for (;;) {
>     　      njWaitVSync();                      /* V-Sync待ち                     */
>     　      mwPlyStartFrame();                  /* ゲームフレーム開始の通知       */
>     　      stat = mwPlyGetStat(ply);           /* ハンドルの状態の取得           */
>     　      if ( stat == MWE_PLY_STAT_PLAYEND ) {
>     　          break;
>     　      }
>     　      mwPlyExecServer();                  /* ミドルウェアライブラリの実行   */
>     　  }
>     　  mwPlyStop(ply);                         /* 再生停止                       */
>     　  mwPlyDestroy(ply);                      /* ハンドルの消去                 */
>     　  syFree(cprm.work);
>     　  mwPlyFinishSofdec();                    /* ライブラリの初期化             */
>     }

####

2-3-6　Waveファイルの再生

以下に、Waveファイルを再生するサンプルプログラムを示します。

＜サンプルプログラム＞

>     /* アプリケーションメイン関数 */
>     void main(void)
>     {
>     　  MWPLY             ply;                  /* ミドルウェア再生ハンドル       */
>     　  MWE_PLY_STAT      stat;                 /* ハンドルの状態                 */
>     　  MWS_PLY_CPRM_WAV  cprm;                 /* ハンドル生成のパラメータ構造体 */
>     　  /*
>     　   * 画面やサウンドの初期化
>     　   */
>     　  mwPlyInitWav(MWD_PLY_MN_EXEC_VSYNC);    /* ライブラリの初期化             */
>     　  cprm.sjbuf = syMalloc(MWD_PLY_ALLOC_SJBUF(48));
>     　  cprm.size  = MWD_PLY_ALLOC_SJBUF(48);
>     　  ply = mwPlyCreateWav(&cprm);            /* ハンドルの生成                 */
>     　  mwPlyStartFname(ply, "SAMPLE.WAV");     /* 再生開始                       */
>     　  for (;;) {
>     　      njWaitVSync();                      /* V-Sync待ち                     */
>     　      mwPlyStartFrame();                  /* ゲームフレーム開始の通知       */
>     　      stat = mwPlyGetStat(ply);           /* ハンドルの状態の取得           */
>     　      if ( stat == MWE_PLY_STAT_PLAYEND ) {
>     　          break;
>     　      }
>     　      mwPlyExecServer();                  /* ミドルウェアライブラリの実行   */
>     　  }
>     　  mwPlyStop(ply);                         /* 再生開始                       */
>     　  mwPlyDestroy(ply);                      /* ハンドルの消去                 */
>     　  syFree(cprm.sjbuf);
>     　  mwPlyFinishWav();                       /* ライブラリの初期化             */
>     }

[←] | [INDEX] | [→]