PROGRAMMER'S GUIDEBranch playback library
BackForward
Branch playback library

5. Basic program


5.1 Scenario processing

Figure 5.1 shows an example of a branch playback scenario.

Figure 5.1 Example of branch playback scenario

A button is pressed during playback of BSTM1.MPG → After playing BSTM1.MPG, BSTM2.MPG is played.
The B button is pressed during BSTM1.MPG playback → After BSTM1.MPG is played, BSTM3.MPG is played.

The following is an example program that sets this scenario.



#define BSTM_MAX 3 / * Total number of branch streams (BSTM1.MPG, BSTM2.MPG, BSTM3.MPG) * /

#define BRANCH_MAX 2 / * Total number of branches (number of arrows in Fig. 5.1) * /

#define KEY_MAX 2 / * Total number of stream key types * /

#define A_BTN 0 / * A button branch number * /

#define B_BTN 1 / * B button branch number * /

#define BR_NUM 2 / * Number of branches per stream * /

#define BSTM1_ID 0 / * BSTM1.MPG branch stream identifier * /

#define BSTM2_ID 1 / * BSTM2.MPG branch stream identifier * /

#define BSTM3_ID 2 / * BSTM3.MPG branch stream identifier * /



/ * Branch playback library work area * /

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



void setScenario (void)

{

    StmKey key [KEY_MAX]; / * Area for setting stream key * /

    Sint32 brtbl [BR_NUM]; / * Area for setting the branch destination * /

    Sint32 fid; / * File identifier * /



    / * Initialization of branch playback * /

    BPL_Init (BSTM_MAX, BRANCH_MAX, KEY_MAX, work_bpl);



    / * Branch stream information setting * /

    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);



    / * Setting branch destination information * /

    brtbl [A_BTN] = BSTM2_ID; / * Branch to BSTM2.MPG when A button is pressed * /

    brtbl [B_BTN] = BSTM3_ID; / * Branch to BSTM3.MPG when the B button is pressed * /

    BPL_SetBranchInfo (BSTM1_ID, BR_NUM, brtbl); / * BSTM1.MPG branch destination setting * /

}


5.2 Branch playback processing

An example of a branch playback program is shown below. ( See 5.1 for the scenario)


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; / * branch number * /

StmHn stmtbl [KEY_MAX]; / * Stream handle table * /

Sint32 bpl_stat; / * Branch playback state * /

Sint32 decode_stat; / * Decoder operating status * /

DecodeHn dc_hn = NULL; / * Decoder handle * /

Bool chgsw = OFF; / * Branch execution switch * /

Bool endflag = FALSE;

Sint32 ret;



/ * Initialization of each library * /

GFS_Init (...); / * File system initialization * /

STM_Init (...); / * Stream system initialization * /

initDecoder (); / * Decoder initialization * /

setScenario (); / * Scenario settings (see 5.1) * /



/ * Branch playback * /

BPL_SetStart (BSTM1_ID); / * Specify playback start stream * /

BPL_GetCurStm (KEY_MAX, stmtbl); / * Get first branch stream * /

dc_hn = createDecodeHn (stmtbl); / * Create decoder handle * /

while (endflag == FALSE) {

    bpl_stat = BPL_ExecServer (chgsw); / * Run branch playback server * /

    chgsw = OFF;

    STM_ExecServer (); / * Run stream server * /

    decode_stat = execDecoder (dc_hn); / * Execution of decoder server function * /



    switch (bpl_stat) {

    case BPL_SVR_COMPLETED: / * Branch playback end state * /

        endflag = TRUE;

        break;

    case BPL_SVR_WAITSEL: / * Waiting for branch destination selection * /

        / * Get pad input (0: A button, 1: B button, negative: no input * /

        brno = getPadEvent ();

        if (brno> = 0) {

            BPL_SelectBranch (brno); / * Select branch destination * /

        }

        break;

    case BPL_SVR_SELECT: / * Branch destination decision state * /

    case BPL_SVR_NOBRN: / * No branch destination * /

        if (decode_stat! = COMPLETED) {/ * Check decoding completion * /

            break;

        }

        chgsw = ON; / * Branch execution switch ON * /

        ret = BPL_GetNextStm (KEY_MAX, stmtbl); / * Get the branch destination stream * /

        if (ret> = 0) {/ * If there is a branch destination * /

            destroyDecodeHn (dc_hn); / * Erase the handle of the decoder * /

            dc_hn = createDecodeHn (stmtbl); / * Create decoder handle * /

        }

        break;

    }

}

destroyDecodeHn (dc_hn); / * Erase the handle of the decoder * /


Streams are opened / closed automatically by the branch playback library using the stream system. For the decoder, refer to the manual of each library.


BackForward
PROGRAMMER'S GUIDEBranch playback library
Copyright SEGA ENTERPRISES, LTD., 1997