Uint8 work[STM_WORK_SIZE(STMGRP_OPEN_MAX, STM_OPEN_MAX)]; /* 作業領域 */ Sint32 a_id, b_id, c_id; /* ファイル識別子 */ StmGrpHn abc_grp; /* ストリームグループハンドル */ StmHn a_stm, b_stm, c_stm; /* ストリームハンドル */ StmKey key; /* ストリームキー */ Uint8 a_buf[A_BUFSIZE * STM_UNIT_FORM1]; /* 転送領域A */ Uint8 b_buf[B_BUFSIZE * STM_UNIT_FORM2]; /* 転送領域B */ Uint8 c_buf[C_BUFSIZE * STM_UNIT_FORM1]; /* 転送領域C */GFS_Init(・・・); /* ファイルシステムの初期化 */ STM_Init(STMGRP_OPEN_MAX, STM_OPEN_MAX, work); /* ストリームシステムの初期化 */ a_id = GFS_NameToId(・・・); /* ファイル識別子の取得 */ ・ ・ ・ abc_grp = STM_OpenGrp(); /* ストリームグループのオープン */ /* ストリームキーの設定 */ STM_KEY_CN(&key) = STM_KEY_NONE; /* チャネル番号 */ STM_KEY_CIMSK(&key) = STM_KEY_CIVAL(&key) = STM_KEY_NONE; /* コーディング情報 */ /* ファイル識別子によるストリームのオープン */ STM_KEY_SMMSK(&key) = STM_KEY_SMVAL(&key) = STM_SM_VIDEO; /* ビデオストリーム */ a_stm = STM_OpenFid(abc_grp, a_id, &key, STM_LOOP_NOREAD); /* ストリームA */ STM_KEY_SMMSK(&key) = STM_KEY_SMVAL(&key) = STM_SM_AUDIO; /* オーディオストリーム */ b_stm = STM_OpenFid(abc_grp, b_id, &key, STM_LOOP_NOREAD); /* ストリームB */ STM_KEY_SMMSK(&key) = STM_KEY_SMVAL(&key) = STM_SM_DATA; /* データストリーム */ c_stm = STM_OpenFid(abc_grp, c_id, &key, STM_LOOP_NOREAD); /* ストリームC */
/* 転送領域の設定 */ STM_SetTrBuf(a_stm, a_buf, A_BUFSIZE, STM_UNIT_FORM1); STM_SetTrBuf(b_stm, b_buf, B_BUFSIZE, STM_UNIT_FORM2); STM_SetTrBuf(c_stm, c_buf, C_BUFSIZE, STM_UNIT_FORM1);
/* ストリームアクセス */ STM_SetExecGrp(abc_grp); /* 実行グループの設定 */ while (1) { if (STM_ExecServer() == STM_EXEC_COMPLETED) { break; /* ストリームアクセス終了 */ } user(); /* ユーザ処理 */ } STM_CloseGrp(abc_grp); /* ストリームグループのクローズ */
図5.1 セクタ単位の場合の転送処理
図5.2 セクタ単位でない場合の転送処理
Uint8 read_buf[READBUF_SIZE]; Sint32 decodeFunc(void *obj, StmHn stm, Sint32 nsct) { Sint32 i; Sint32 read_len; /* subFuncが転送したロングワード数 */ Sint32 nlongword; /* 転送ロングワード数 */ Uint32 *src; /* 転送元アドレス */ Sint32 dadr; /* 1ロングワード転送ごとのアドレス/変化分 */ Uint32 *buffer; /* 転送領域 */ /* セクタ数からワード数への変換(転送開始前に呼び出す) */ nlongword = STM_SctToWord(stm, nsct) / 2; src = STM_StartTrans(stm, &dadr); /* 転送開始 */ buffer = (Uint8 *)obj; /* objにはSTM_SetTrFuncの第3引数が渡る */ for (i = 0; i < nlongword; i += read_len) { /* 展開したバイト数を返す関数 */ buffer += subFunc(src, dadr, buffer, &read_len); src += read_len * dadr; } return (nsct); /* 転送したセクタ数を返す */ }
図5.3 転送関数を使用した時の動作
・ ・ /* ストリームを先読みする */ STM_SetExecGrp(NULL); /* ドライブをポーズ状態にする */ GFS_NwFread(………); while (1) { if (GFS_NwExecOne(gfs) == GFS_SVR_COMPLETED) /* ファイル読み込み */ break; STM_ExecTrans(stm); /* ストリームデータを転送する */ } STM_SetExecGrp(grp); /* ストリームの読み込みを再開 */