English
PROGRAMMER'S GUIDE分岐再生ライブラリ
戻る進む
分岐再生ライブラリ

5.基本的なプログラム


5.1 シナリオ処理

 分岐再生のシナリオ例を図5.1に示します。

図5.1 分岐再生のシナリオ例

BSTM1.MPGの再生中にAボタンが押される→BSTM1.MPGの再生後、BSTM2.MPGを再生します。
BSTM1.MPGの再生中にBボタンが押される→BSTM1.MPGの再生後、BSTM3.MPGを再生します。

 このシナリオを設定するプログラム例を以下に示します。



#define BSTM_MAX    3   /* 分岐ストリームの総数

                            (BSTM1.MPG, BSTM2.MPG, BSTM3.MPG)  */

#define BRANCH_MAX  2   /* 分岐の総数(図5.1の矢印の数) */

#define KEY_MAX     2   /* ストリームキーの種類の総数 */

#define A_BTN       0   /* Aボタンの分岐番号 */

#define B_BTN       1   /* Bボタンの分岐番号 */

#define BR_NUM      2   /* ストリーム当たりの分岐数 */

#define BSTM1_ID    0   /* BSTM1.MPGの分岐ストリーム識別子 */

#define BSTM2_ID    1   /* BSTM2.MPGの分岐ストリーム識別子 */

#define BSTM3_ID    2   /* BSTM3.MPGの分岐ストリーム識別子 */



/* 分岐再生ライブラリの作業領域 */

Sint32 work_bpl[BPL_WORK_SIZE(BSTM_MAX, BRANCH_MAX, KEY_MAX)/sizeof(Sint32)];



void    setScenario(void)

{

    StmKey  key[KEY_MAX];   /* ストリームキーを設定するための領域 */

    Sint32  brtbl[BR_NUM];  /* 分岐先を設定するための領域 */

    Sint32  fid;            /* ファイル識別子 */



    /* 分岐再生の初期化 */

    BPL_Init(BSTM_MAX, BRANCH_MAX, KEY_MAX, work_bpl);



    /* 分岐ストリーム情報の設定 */

    STM_KEY_CN(key + 0) = STM_KEY_CIMSK(key + 0) = STM_KEY_NONE;

    STM_KEY_CN(key + 1) = STM_KEY_CIMSK(key + 1) = STM_KEY_NONE;

    STM_KEY_SMMSK(key + 0) = STM_KEY_SMVAL(key + 0) = STM_SM_VIDEO;

    STM_KEY_SMMSK(key + 1) = STM_KEY_SMVAL(key + 1) = STM_SM_AUDIO;

    fid = GFS_NameToId("BSTM1.MPG");

    BPL_SetStmInfo(BSTM1_ID, fid, KEY_MAX, key);

    fid = GFS_NameToId("BSTM2.MPG");

    BPL_SetStmInfo(BSTM2_ID, fid, KEY_MAX, key);

    fid = GFS_NameToId("BSTM3.MPG");

    BPL_SetStmInfo(BSTM3_ID, fid, KEY_MAX, key);



    /* 分岐先情報の設定 */

    brtbl[A_BTN] = BSTM2_ID;    /* Aボタンが押されたらBSTM2.MPGに分岐する */

    brtbl[B_BTN] = BSTM3_ID;    /* Bボタンが押されたらBSTM3.MPGに分岐する */

    BPL_SetBranchInfo(BSTM1_ID, BR_NUM, brtbl); /* BSTM1.MPGの分岐先の設定 */

}


5.2 分岐再生処理

 分岐再生のプログラム例を以下に示します。(シナリオは5.1を参照してください)


Sint32   work_gfs[GFS_WORK_SIZE(BSTM_MAX*KEY_MAX)/sizeof(Sint32)];

Sint32   work_stm[STM_WORK_SIZE(GRP_MAX, BSTM_MAX*KEY_MAX)/sizeof(Sint32)];

Sint32   brno;                      /* 分岐番号 */

StmHn    stmtbl[KEY_MAX];           /* ストリームハンドルのテーブル */

Sint32   bpl_stat;                  /* 分岐再生状態 */

Sint32   decode_stat;               /* デコーダの動作状態 */

DecodeHn dc_hn = NULL;              /* デコーダのハンドル */

Bool     chgsw = OFF;               /* 分岐実行スイッチ */

Bool     endflag = FALSE;

Sint32   ret;



/* 各ライブラリの初期化 */

GFS_Init(・・・);                      /* ファイルシステムの初期化 */

STM_Init(・・・);                      /* ストリームシステムの初期化 */

initDecoder();                      /* デコーダの初期化 */

setScenario();                      /* シナリオの設定(5.1を参照) */



/* 分岐再生 */

BPL_SetStart(BSTM1_ID);             /* 再生開始ストリームの指定 */

BPL_GetCurStm(KEY_MAX, stmtbl);     /* 最初の分岐ストリームの取得 */

dc_hn = createDecodeHn(stmtbl);     /* デコーダのハンドルの作成 */

while (endflag == FALSE) {

    bpl_stat = BPL_ExecServer(chgsw);       /* 分岐再生サーバの実行 */

    chgsw = OFF;

    STM_ExecServer();                       /* ストリームサーバの実行 */

    decode_stat = execDecoder(dc_hn);       /* デコーダのサーバ関数の実行 */



    switch (bpl_stat) {

    case BPL_SVR_COMPLETED:                 /* 分岐再生終了状態 */

        endflag = TRUE;

        break;

    case BPL_SVR_WAITSEL:                   /* 分岐先選択待ち状態 */

        /* パッド入力の取得 (0:Aボタン, 1:Bボタン, 負の場合:入力がない */

        brno = getPadEvent();

        if (brno >= 0) {

            BPL_SelectBranch(brno);         /* 分岐先の選択 */

        }

        break;

    case BPL_SVR_SELECT:                    /* 分岐先決定状態 */

    case BPL_SVR_NOBRN:                     /* 分岐先なし状態 */

        if (decode_stat != COMPLETED) {     /* デコード完了のチェック */

            break;

        }

        chgsw = ON;                            /* 分岐実行スイッチON */

        ret = BPL_GetNextStm(KEY_MAX, stmtbl); /* 分岐先のストリームの取得 */

        if (ret >= 0) {                        /* 分岐先がある場合 */

            destroyDecodeHn(dc_hn);           /* デコーダのハンドルの消去 */

            dc_hn = createDecodeHn(stmtbl);    /* デコーダのハンドルの作成 */

        }

        break;

    }

}

destroyDecodeHn(dc_hn);            /* デコーダのハンドルの消去 */


 ストリームのオープン/クローズは、分岐再生ライブラリがストリームシステムを使用して自動的に行います。デコーダについては、各ライブラリのマニュアルを参照してください。


戻る進む
PROGRAMMER'S GUIDE分岐再生ライブラリ
Copyright SEGA ENTERPRISES, LTD., 1997