English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む
PROGRAMMER'S TUTORIAL

12.CD-ROMライブラリ


 本章では、CD−ROMライブラリを使ってCD−ROMにアクセスする方法について解説します。CD−ROMライブラリを使うことにより、CD−ROMからのデータやプログラムの読み込み、および音楽の再生を行うことができます。 またこの章では、CD−ROMライブラリの関数リファレンス一覧も載せています。


12-1.CD−ROMライブラリについて

 SGLでは、CD-ROMやバーチャルCDにアクセスするための関数を用意しています。 これらの関数を使用することによって、次の機能を実現することができます。

注 意
CD-ROMライブラリ関数は、別冊の“関数リファレンス”に載せずに、本章の後半に載せてあります。

 CD−ROMの焼き方については“データの受け渡しの第3章:CD−ROMの焼き方”を参照してください。


12-2. CD−ROMのアクセス

 CD−ROMからデータを読み込む流れは、以下のようになります。

図12-1 CD-ROMアクセスの流れ

 CD−ROMのアクセスには機械的な動作が伴うため、読み込み要求をおこなった瞬間にデータがメモリに読み込まれるわけではありません。また、CD−ROMからデータが読み込まれる速度は、CPUの速度と比較すると非常に低速です。 SGLでは、この待ち時間にCD−ROMアクセス以外のプログラムが実行できるよう、読み込みステータスを監視しながらCD−ROMをアクセスする方法を採用しています。

CD−ROMの論理構造

 CD−ROMは、セクタと呼ばれる単位から構成されています。セクタは一般には、2048バイト(FORM1)ですが、音楽データのように若干間違って読み込まれても問題とならないような場合で、どうしても転送容量を確保したいときには、 2324バイト(FORM2)とすることもできます。同一ファイル内のそれぞれのセクタには、チャンネル番号、サブモード、コーディング情報からなるサブヘッダと呼ばれる情報がついています。 セクタの構造を簡単に表すと以下のようになります。

図12-2 セクタの構造

 SGLでは、サブヘッダにしたがってデータを分類する機能をもっています。SGLでは、この情報を「キー」と呼びます。サブモードとコーディング情報は各ビット毎に意味があり、SGLでは指定したビットが1のセクタだけを選択して読み込みます。

ファイルの読み込み

 ファイルを読み込むには、関数“slCdOpen”、“slCdLoadFile”、“slCdGetStatus”を使用してください。

【CDHN slCdOpen(Sint8 *pathname, CDKEY key[]);】
 読み込むファイルを指定します。
“key”は読み込むセクタの種類です。複数の種類のセクタを指定することができます。セクタの種類をすべて指定したら最後のチャネル番号に“CDKEY_TERM”を指定します。
正しくファイルをオープンすることができたら、“NULL”以外のファイルハンドルを戻り値として返します。
ただし、オープンしているファイルのキーの総数が24以上になるとオープンに失敗します。 オープンしたファイルは、読み込み中断または、完了時に自動的にクローズ処理されます。

【Sint32 slCdLoadFile (CDHN cdhn, CDBUF buf []) ;】
 読み込み先の領域を指定します。
“buf”の順序は、関数“slCdOpen”での“key”の順序に対応します。

 CD-ROMのデータをワークRAMにコピーする場合には次のように指定します。
buf[ i ]. type = CDBUF_COPY;
buf[ i ]. trans.copy.addr = 読み込み領域のアドレス;
buf[ i ]. trans.copy.unit = 読み込み領域サイズの単位
(CDBUF_FORM1/CDBUF_FORM2/CDBUF_BYTE);
buf[ i ]. trans.copy.size = 読み込み領域のユニット数;

“addr”にNULL、sizeに0を設定すると読み込まれません。“unit”は、読み込み領域のサイズの単位をCD-ROMのセクタの種類にあわせてください。これによって効率的にデータを読むことができます。 実際の読み込み領域は、4バイト境界に“unit”דsize”の大きさで取ってください。

 データを加工しながら読み込む場合には、次のように関数を登録することができます。
buf[ i ]. type = CDBUF_FUNC;
buf[ i ]. trans.func.func. = 関数ポインタ;
buf[ i ]. trans.func.obj = 関数の第一引数に渡す値;

登録関数は“ Sint32 (*func) (void *obj, Uint32 *addr, Sint32 adinc, Sint32 nsct)”です。
“obj ”には、“buf [ i ]. trans.func.obj”の値がそのまま入ります。
“addr”はデータのコピー元のアドレスです。
“adinc”は、“addr”から4バイト取り出したときの“addr”に対する加算値を、4バイト単位で示した値です。
“nsct”は読み込むことのできるセクタ数です。戻り値は実際に転送したセクタ数です。転送領域をすべて指定したら、最後の“buf[].type ”に“CDBUF_TERM”を指定してください。

【Sint32 slCdGetStatus (CDHN cdhn, Sint32 ndata[]); 】
 メインループなどで関数“slCdGetStatus”を定期的に呼び出し、読み込み状態を監視してください。
関数値が“CDSTAT_COMPLETED”になったら、読み込み完了です。
“ndata”には、読み込んだバイト数が、関数“slCdOpen ”の“key”に対応する順で格納されます。

 サンプルプログラム1に、ファイル読み込みのプログラム例を示します。

 このサンプルプログラムはCD−ROM上のファイルを読み込むための処理であり、CD−ROMからファイルを読み込む基本的なライブラリの使用例です。フロー12-1に沿って手順を説明します。

  1. グラフィック等のシステムの初期化を行います。

  2. CD−ROMのシステムの初期化を行います。

  3. ファイルのオープンを行います。
    ファイルオープンを行う関数のインプットパラメータにデータを分類するためのキー情報があるので、この情報を必要に応じて設定してください。

  4. ファイルオープン関数の戻り値のファイルハンドルと読み込み領域情報をパラメータとし、ファイルの読み込みを行います。

  5. グラフィックライブラリの実行(関数“slSynch()”)を行います。
    ファイルの読み込みで指定されたファイルは、実際にはこの時に少しずつ読み込まれます。

  6. ステータス情報を取得し、ファイルの読み込みが終了したかを確認します。
    ファイルの読み込みが終了していなければ、ステータスが読み込み終了になるまでループします。
    このループの中で、関数“slSynch()”を呼ぶようにします。

フロー12-1 サンプルプログラム1(ファイルの読み込み sample_cd1/main.c)

リスト12-1 サンプルプログラム1(ファイルの読み込み sample_cd1/main.c)
/*****************************************************************************
 *
 *	Copyright (c) 1994 SEGA
 *
 * File	  :main.c
 * Date   :1995-02-20
 * Version:0.00
 * Auther :
 ****************************************************************************/
#include	"sgl.h"
#include	"sgl_cd.h"

/****************************************************************************/
#define	MAX_FILE	128
#define READSECT         50
/****************************************************************************/
Sint32	dirwork[SLCD_WORK_SIZE(MAX_FILE)];
Sint32	readbuf[ READSECT * CDBUF_FORM1 / sizeof(Sint32)];
    
/****************************************************************************/
void	ss_main(void)
{
    Sint32	ndir;
    CDHN	cdhn;
    CDKEY	key[2];
    CDBUF	buf[2];
    Sint32	stat;
    Sint32	len[2];
    Sint32	ypos = 1;

    slInitSystem(TV_320x224, NULL, 1);		
    ndir = slCdInit(MAX_FILE, dirwork);	
    slPrint("slCdInit:", slLocate(1,ypos));
    slPrintFX(toFIXED(ndir), slLocate(11, ypos));
    ypos++;

    key[0].cn = key[0].sm = key[0].ci = CDKEY_NONE;
    key[1].cn = CDKEY_TERM;	
    cdhn = slCdOpen("S2100D0_.M", key);	
    slPrint("slCdOpen:", slLocate(1, ypos));
    slDispHex((Uint32)cdhn, slLocate(11, ypos));

    buf[0].type = CDBUF_COPY;	
    buf[0].trans.copy.addr = readbuf;	
    buf[0].trans.copy.unit = CDBUF_FORM1;
    buf[0].trans.copy.size = READSECT;	
    buf[1].type = CDBUF_TERM;
    slCdLoadFile(cdhn, buf);		
    ypos++;

    while (1) {
	slSynch();     			
	stat = slCdGetStatus(cdhn, len);
	slPrint("stat:", slLocate(1, ypos));
	slDispHex((Uint32)stat, slLocate(7, ypos));
	ypos++;
	if (ypos >= 27)		ypos = 1;
	if (stat == CDSTAT_COMPLETED)	break;
    }
    while (1) ;
}

ファイルの分割読み込み

 動画等のように大量のデータを分割して読み込むには、関数“slCdResetBuf”を使用してください。

【Bool slCdResetBuf (CDHN cdhn, CDKEY *key);】
 ファイルハンドルの“key”に対応するデータの読み込み先を、関数“slCdLoadFile”で指定された領域の先頭に戻します。
関数“slCdGetStatus”によって読み込み領域の有効データ数を取得し、読み込み領域がいっぱいになったらデータを加工し、関数“slCdResetBuf”を呼び出します。

 サンプルプログラム2に、データを分割して読み込むプログラム例を示します。

このサンプルプログラムはCD−ROM上のファイルを分割して読み込むための処理であり、CD−ROMからファイルを読み込む基本的なライブラリの使用例です。フロー12-2に沿って手順を説明します。

  1. グラフィック等のシステムの初期化を行います。

  2. CD−ROMのシステムの初期化を行います。

  3. ファイルのオープンを行います。
    ファイルオープンを行う関数のインプットパラメータにデータを分類するためのキー情報があるので、この情報を必要に応じて設定してください。

  4. ファイルオープン関数の戻り値のファイルハンドルと読み込み領域情報をパラメータとし、ファイルの読み込みを行います。

  5. グラフィックライブラリの実行(関数“slSynch()”)を行います。
    ファイルの読み込みで指定されたファイルは、実際にはこの時少しずつ読み込まれます。

  6. ステータス情報を取得し、ファイルの読み込みが終了したかを確認します。
    また同時に、読み込み領域がいっぱいになっているかどうかを確認します。いっぱいになっていたら、必要に応じてデータを処理してから、読み込み領域をリセットします。
    ファイルの読み込みが終了していなければ、ステータスが読み込み終了になるまでループします。
    このループの中で、関数“slSynch()”を呼ぶようにします。

フロー12-2 サンプルプログラム2(ファイルの分割読み込み sample_cd2/main.c)

リスト12-2 サンプルプログラム2(ファイルの分割読み込み sample_cd2/main.c)
/*****************************************************************************
 *
 *	Copyright (c) 1994 SEGA
 *
 * File	  :main.c
 * Date   :1995-02-20
 * Version:0.00
 * Auther :
 ****************************************************************************/
#include "sgl.h"
#include "sgl_cd.h"

/****************************************************************************/
#define MAX_OPEN	128	
#define FNAME		"S2100D0_.M"
#define slsize		2	

/****************************************************************************/
Sint32 lib_work[SLCD_WORK_SIZE(MAX_OPEN)];
Sint32	readbuf[ (CDBUF_FORM1 * slsize) / sizeof(Sint32) ];

/****************************************************************************/
void ss_main(void)
{
    Sint32	ndir ;			
    Sint32	ypos = 1 ;	
    Sint32	ret ;		
    Sint32	ndata[2] ;	
    CDHN	cdhn ;		
    CDKEY      	key[2] ;
    CDBUF	buf[2] ;

    slInitSystem(TV_320x224, NULL, 1) ;	
    ndir = slCdInit(MAX_OPEN, lib_work);
    slPrint("slCdInit:", slLocate(1,ypos));
    slPrintFX(toFIXED(ndir), slLocate(11, ypos));
    ypos++;

    key[0].cn = key[0].sm = key[0].ci = CDKEY_NONE ;
    key[1].cn = CDKEY_TERM ;	
    cdhn = slCdOpen(FNAME, key);	
    slPrint("slCdOpen:", slLocate(1, ypos));
    slDispHex((Uint32)cdhn, slLocate(11, ypos));

    buf[0].type = CDBUF_COPY ;
    buf[0].trans.copy.addr = readbuf ;
    buf[0].trans.copy.unit = CDBUF_FORM1 ;
    buf[0].trans.copy.size = slsize ;	
    buf[1].type = CDBUF_TERM ;
    ypos++;

    slCdLoadFile(cdhn, buf);	 
    while( 1 ){

	slSynch();			
	ret = slCdGetStatus( cdhn, ndata ) ;
	slPrint("stat:", slLocate(1, ypos));
	slDispHex( (Uint32)ret, slLocate(7, ypos));
	ypos++;
	if (ypos >= 27)		ypos = 3 ;
	if ( ret == CDSTAT_COMPLETED )	break;
	if ( ndata[0] == CDBUF_FORM1 * slsize ){
		slCdResetBuf(cdhn, &(key[0]));
	} 
   }
    while( 1 ) ;          
}

先読み機能について

 CD-ROMからデータを読み込む際には、CDドライブの機械的な動作が伴うため読み込みを開始した次の瞬間に、実際にデータが読み込まれるわけではありません。この待ち時間を最小限にする機能が先読み機能です。 セガサターンは、CD-ROMから読み込んだデータを一時的に蓄える領域をもっています。この領域をCDバッファと呼びます。次に読み込むファイルが決定したらCDバッファにデータを読み込み始め、データが必要になったらメモリに転送します。

図12-3 CDバッファ

 すでに説明した関数“slCdLoadFile”の読み込み領域のアドレスをNULLに、読み込み領域のサイズを0に設定し、関数“slCdGetStatus”の戻り値が“ CDSTAT_WAIT”になったら先読みは完了です。この後、関数“slCdLoadFile”で読み込み領域のアドレスとサイズ を設定すると、すぐに転送が始まります。CDバッファへの先読みが完了する前に、読み込み領域のアドレスとサイズを設定することもできます。

【 Sint32 slCdLoadFile (CDHN cdhn, CDBUF buf[]);】
 CDバッファに、先読みするために次のように指定します。
buf[ i ]. type = CDBUF_COPY;
buf[ i ]. trans.copy.addr = NULL;
buf[ i ]. trans.copy.unit = CDBUF_FORM1;
buf[ i ]. trans.copy.size = 0;

 転送領域をすべて指定したら、最後の“type”に“CDBUF_TERM ”を指定してください。

 サンプルプログラム3に、先読みのプログラム例を示します。

 このサンプルプログラムはCD−ROM上のファイルを読み込むための処理であり、CD−ROMからファイルの先読みを行うライブラリ処理の基本的な使用例です。フロー12-3に沿って手順を説明します。

  1. グラフィック等のシステムの初期化を行います。

  2. CD−ROMのシステムの初期化を行います。

  3. ファイルのオープンを行います。
    ファイルオープンを行う関数のインプットパラメータにデータを分類するためのキー情報があるので、この情報を必要に応じて設定してください。

  4. ファイルオープン関数の戻り値のファイルハンドルと読み込み領域情報をパラメータとし、ファイルの読み込みを行います。
    この時の読み込み領域情報の読み込み先領域アドレスにNULLを、サイズに0を設定し、ファイルの先読みを行います。

  5. グラフィックライブラリの実行(関数“slSynch()”)を行います。

  6. ステータス情報を取得し、転送待ち状態かどうかを確認します。
    転送待ち状態ならば、ループを終了します。
    このループの中で関数“slSynch()”を呼ぶようにします。

  7. 再度ファイルの読み込みを行います。
    この時、読み込み領域情報の読み込み先領域アドレスにアドレスを設定し、ファイルの読み込みを行います。

  8. グラフィックライブラリの実行(関数“slSynch()”)を行います。
    ファイルの読み込みで指定されたファイルは、実際にはこの時読み込まれます。

  9. ステータス情報を取得し、ファイルの読み込みが終了したかを確認します。
    ファイルの読み込みが終了していなければ、ステータスが読み込み終了になるまでループします。
    このループの中で、関数“slSynch()”を呼ぶようにします。

フロー12-3 サンプルプログラム3(先読み sample_cd3/main.c)

リスト12-3 サンプルプログラム3(先読み sample_cd3/main.c)
/*****************************************************************************
 *	Copyright (c) 1994 SEGA
 *
 * File	  :main.c
 * Date   :1995-02-20
 * Version:0.00
 * Auther :
 *
 ****************************************************************************/
#include "sgl.h"
#include "sgl_cd.h"

/****************************************************************************/
#define MAX_OPEN	128	
#define FNAME		"S2100D0_.M"
#define slsize		2

/****************************************************************************/
Sint32 lib_work[SLCD_WORK_SIZE(MAX_OPEN)];	
Sint32	readbuf[ (CDBUF_FORM1 * slsize) / sizeof(Sint32)] ;
	
/****************************************************************************/
void ss_main(void)
{
    Sint32	ndir ;		
    Sint32	ypos = 1 ;	
    Sint32	ret ;		
    Sint32	ndata[2] ;	
    CDHN	cdhn ;			
    CDKEY      	key[2] ;	
    CDBUF	buf[2] ;		

    slInitSystem(TV_320x224, NULL, 1) ;		
    ndir = slCdInit(MAX_OPEN, lib_work);
    slPrint("slCdInit:", slLocate(1,ypos));
    slPrintFX(toFIXED(ndir), slLocate(11, ypos));
    ypos++;
 					
    key[0].cn = key[0].sm = key[0].ci = CDKEY_NONE ;
    key[1].cn = CDKEY_TERM ;	
    cdhn = slCdOpen(FNAME, key);	
    slPrint("slCdOpen:", slLocate(1, ypos));
    slDispHex((Uint32)cdhn, slLocate(11, ypos));

    buf[0].type = CDBUF_COPY ;	
    buf[0].trans.copy.addr = NULL ;
    buf[0].trans.copy.unit = CDBUF_FORM1 ;
    buf[0].trans.copy.size = 0;	
    buf[1].type = CDBUF_TERM ;	
    slCdLoadFile( cdhn, buf );
    ypos++;

    while( 1 ){
	slSynch();			
	ret = slCdGetStatus( cdhn, NULL ) ;	
	slPrint("stat1:", slLocate(1, ypos));
	slDispHex( (Uint32)ret, slLocate(7, ypos));
	ypos++;
	if (ypos >= 27)		ypos = 3;
	if ( ret == CDSTAT_WAIT ) {	
		buf[0].trans.copy.addr = readbuf ; 
    		buf[0].trans.copy.size = slsize; 
		break ;
	}
    }

    slCdLoadFile( cdhn, buf );	

    while( 1 ){

	slSynch();				
	ret = slCdGetStatus( cdhn, ndata ) ;
	slPrint("stat2:", slLocate(1, ypos));
	slDispHex( ret, slLocate(7, ypos));
	ypos++;
	slPrint("ndata:", slLocate(1, ypos));
	slDispHex( ndata[0], slLocate(7, ypos));
	ypos++;
	if (ypos >= 27)		ypos = 3 ;
 	if ( ret == CDSTAT_COMPLETED )	break;
	if ( ndata[0] == CDBUF_FORM1 * slsize ){
		slCdLoadFile(cdhn, buf);
	}
    }
    while( 1 ) ;          
}

CDDAファイルの再生

 CDDAファイルを再生するには、サウンドの初期化を行い、関数“slCdOpen”、“slCdLoadFile”、“slCdGetStatus”を使用してください。

【Sint32 slCdLoadFile (CDHN cdhn, CDBUF buf[]);】
 CDDAファイルを再生するために、次のように指定します。

buf[ 0 ]. type = CDBUF_COPY;
buf[ 0 ]. trans.copy.addr = NULL;
buf[ 0 ]. trans.copy.unit = CDBUF_FORM1;
buf[ 0 ]. trans.copy.size = 0;
buf[ 1 ]. type = CDBUF_TERM;

 サンプルプログラム4に、CDDAファイル再生のプログラム例を示します。

 このサンプルプログラムはCD−ROM上のCDDAファイルを読み込むための処理であり、CD−ROM上のCDDAファイルを再生する基本的なライブラリの使用例です。
フロー12-4に沿って手順を説明します。

  1. グラフィック等のシステムの初期化を行います。

  2. サウンドの初期化を行います。

  3. CD−ROMのシステムの初期化を行います。

  4. ファイルのオープンを行います。
    ファイルオープンを行う関数のインプットパラメータにデータを分類するためのキー情報がありますが、この情報は不要のため、ここでは選択しない設定にしてください。

  5. CDDAファイルの再生を行います。
    ファイルオープン関数の戻り値のファイルハンドルと読み込み領域情報をパラメータとしCDDAファイルの再生を行います。

  6. グラフィックライブラリの実行(関数“slSynch()”)を行います。

  7. ステータス情報を取得し、CDDAファイルの再生が終了したかを確認します。
    再生が終了したならば、ループを終了します。
    このループの中で関数“slSynch()”を呼ぶようにします。

フロー12-4 サンプルプログラム4(CDDAファイルの再生 sample_cd4/main.c)

リスト12-4 サンプルプログラム4(CDDAファイルの再生 sample_cd4/main.c)
/*****************************************************************************
 *
 *	Copyright (c) 1994 SEGA
 *
 * File	  :main.c
 * Date   :1995-02-20
 * Version:0.00
 * Auther :
 *
 ****************************************************************************/
#include	"sgl.h"
#include	"sgl_cd.h"
#include	"sddrvs.dat"

/****************************************************************************/
#define	WIN_ORG_X	0		
#define	WIN_ORG_Y	0		
#define	WIN_SIZE_X	320		
#define	WIN_SIZE_Y	240	
#define	MAX_FILE	128
Sint32	dirwork[SLCD_WORK_SIZE(MAX_FILE)];

Uint8	sdmap[] = {
	0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x80, 0x00,
	0x10, 0x01, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00,
	0x11, 0x01, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00,
	0x20, 0x01, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00,
	0x21, 0x01, 0x68, 0x00, 0x00, 0x00, 0x06, 0x00,
	0x22, 0x01, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00,
	0x23, 0x01, 0x78, 0x00, 0x00, 0x00, 0x06, 0x00,
	0x24, 0x01, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00,
	0x01, 0x01, 0x86, 0x00, 0x00, 0x04, 0x00, 0x00,
	0x30, 0x05, 0xA0, 0x00, 0x00, 0x02, 0x00, 0x00,
	0xFF, 0xFF
    };
    
/****************************************************************************/

void	ss_main(void)
{
    Sint32	ndir;
    CDHN	cdhn;
    CDBUF	buf[2];
    CDKEY	key[2];
    Sint32	stat;

    slInitSystem(TV_320x224, NULL, 1);
    slInitSound(sddrvstsk, sizeof(sddrvstsk), sdmap, sizeof(sdmap));
    slCDDAOn(127, 127, 0, 0);
    ndir = slCdInit(MAX_FILE, dirwork);

    key[0].cn = CDKEY_NONE;
    key[0].sm = CDKEY_NONE;
    key[0].ci = CDKEY_NONE;
    key[1].cn = CDKEY_TERM;
    cdhn = slCdOpen("cdda1", key);

    buf[0].type = CDBUF_COPY;
    buf[0].trans.copy.addr = NULL;
    buf[0].trans.copy.unit = CDBUF_FORM1;
    buf[0].trans.copy.size = 0;
    buf[1].type = CDBUF_TERM;
    slCdLoadFile(cdhn, buf);

    while (1) {
	slSynch();
	stat = slCdGetStatus(cdhn, NULL);
	if (stat == CDSTAT_COMPLETED)	break;
    }
    while (1)
	;
}

その他の一般的な事項

 ●リードエラーについて
 読み込み中にリードエラーが発生した場合、まずCDブロックがハード的にリカバリします。それでもリカバリできない場合は、ライブラリが一定回数リカバリ処理を行います。最終的にリカバリできないときは、ステータス取得関数は読み込みを中断し、 リードエラーのエラーコードを返します。

 ●パス名について
 ディレクトリの指定は、¥または/とします。また、ディレクトリ名・ファイル名は、大文字・小文字とも使用可能です。

 ●CD-ROMライブラリの高度な使い方
 SGLでは、ファイルシステムライブラリ、ストリームシステムライブラリの関数を使用することができます。CinepakやMPEGを使用する場合など、これらの関数を使用してください。詳しくは、各ライブラリのマニュアルを参照してください。
関数“slCdInit”を呼び出していれば、ファイルシステム及びストリームシステムを初期化する必要はありません。
SGLでファイルを読み込み中にファイルシステム、ストリームシステムを使用するときは、関数“slCdPause”を呼出し、ステータスが“CDSTAT_PAUSE”となることを確認するか、または関数“slCdAbort”を呼び出してください。
ファイルシステム、ストリームシステムによる読み込みを終了し、SGLに復帰する場合にも読み込みを停止させる必要があります。

図12-4 CD-ROMライブラリの内部構造


12-3. CDライブラリ関数


CDHN ファイルハンドル
解説
 ファイルを読み込むためのファイルハンドルです。

CDKEY セクタデータを分類するためのキー

構造
typedef	struct {
    Sint16 cn;
    Sint16 sm;
    Sint16 ci;
}CDKEY;

メンバー
cn  
チャネル番号
sm  
サブモード
ci  
コーディング情報

解説
サブヘッダを使用してセクタデータを分類するためのキーを指定します。

備考
選択しない場合、CDKEY_NONEを指定します。
終端のcnには、CDKEY_TERMを設定します。

CDBUF 読み込み領域情報

構造
typedef  struct {
         void    *addr;
         Sint32  unit;
         Sint32  size;
         } TRANS_COPY;

typedef  struct {
         Sint32  (*func) (void *obj, Uint32 *addr,
                          Sint32  adinc,  Sint32 nsct);
         void    *obj;
         } TRANS_FUNC;

typedef  struct {
       Sint32  type;
         union {
                 TRANS_COPY  copy;
                 TRANS_FUNC  fucn;
         } trans;
} CDBUF;

メンバー
type  CDBUF_COPY     ワークRAMへのコピー
      CDBUF_FUNC     転送関数
      CDBUF_TERM     終端

-------------------------------------------------------
type = CDBUF_COPYの場合 : copy
-------------------------------------------------------
addr                 読み込み領域のアドレス(読み込まない場合NULL )
unit  CDBUF_FORM1    読み込み領域のサイズは2048byte単位
      CDBUF_FORM2    読み込み領域のサイズは2324byte単位
      CDBUF_BYTE     読み込み領域のサイズはバイト単位
size                 読み込み領域のユニット数(読み込まない場合0)

-------------------------------------------------------
type = CDBUF_FUNC の場合 : func
-------------------------------------------------------
func                転送関数
obj                 オブジェクト

解説
読み込み領域または、転送関数を設定します。

備考
読み込み領域は、4byte 境界である必要があります。

Sint32 slCdInit (Sint32 nfile, void *work) 初期化

パラメータ
nfile
1ディレクトリ中の最大ファイル数
work 
作業領域

機能
CDを使用するための初期設定を行います。

戻り値
ルートディレクトリのファイル数(負の場合、エラーコード)

備考
領域のサイズは、SLCD_WORK_SIZE(nfile)で求めます。
nfile 各ディレクトリ内の最大ファイル数
作業領域は、4byte 境界である必要があります。

Sint32 slCdChgDir (Sint8 *pathname) ディレクトリ移動

パラメータ
pathname
パス名(相対パス/絶対パス指定可能)

機能
ディレクトリを移動します。

戻り値
ディレクトリのファイル数(負の場合、エラーコード)

CDHN slCdOpen (Sint8 *pathname, CDKEY key[]) ファイルオープン

パラメータ
pathname  
パス名(相対パス/絶対パス指定可能)
key       
ストリームデータを分類するためのキー情報

機能
ファイルをオープンします。

戻り値
ファイルハンドル(オープンできない場合はNULL)

備考
読み込み中断または、完了時に自動的にクローズ処理されます。

Sint32 slCdLoadFile (CDHN cdhn,CDBUF buf[]) ファイルの読み込み

パラメータ
cdhn  
ファイルハンドル
buf   
読み込み領域情報(オープン時のキーに対応)

機能
再生を開始し、CD からデータを読み込みます。

戻り値
エラーコード

備考
読み込み領域にNULLを、ユニット数に0を指定した場合は、先読みを実行します。
読み込み領域が指定された場合は、CPUDMAを使用して転送します。

Sint32 slCdTrans (CDHN cdhn, CDBUF buf[], Sint32 ndata[]) ストリームの転送

パラメータ
cdhn   
ファイルハンドル
buf    
読み込み領域情報
ndata  
転送領域の有効データ数(不要の場合NULL)

機能
ファイル読み込み一時停止中などにデータ転送だけを行います。

戻り値
エラーコード

備考
“slCdLoadFile()”で転送領域にNULL を指定したキーにだけ転送することができます。
本関数は、転送終了まで終了しません。

Bool slCdResetBuf (CDHN cdhn, CDKEY *key) 転送領域のリセット

パラメータ
cdhn  
ファイルハンドル
key   
データを分類するためのキー情報

機能
転送先のポインタを初期化します。

戻り値
TRUE    
正常終了
FLASE   
オープンされていないキーが指定された。

Sint32 slCdAbort (CDHN cdhn) 読み込み中断

パラメータ
cdhn  
ファイルハンドル

機能
ファイルの読み込みを中断する

戻り値
エラーコード

Sint32 slCdPause (CDHN cdhn) 読み込み一時停止

パラメータ
cdhn   
ファイルハンドル

機能
ファイルの読み込みを一時停止します。

戻り値
エラーコード

Sint32 slCdGetStatus (CDHN cdhn, Sint32 ndata[]) ステータス取得

パラメータ
cdhn   
ファイルハンドル
ただし、以下の定数を指定することによってCDブロックの状態を取得することができます。                              
CDREQ_FREECD  
ブロックの空きセクタ数取得
CDREQ_FAD     
現在のピックアップの位置
CDREQ_DRVCD   
ドライブ状態
ndata   
ファイルハンドルが指定されている場合、転送領域の有効データ数
(不要の場合NULL )

機能
発行したリクエストに対するステータスを取得します。

戻り値
ファイルハンドルを指定した場合のステータス(負の場合、エラーコード)
CDSTAT_PAUSE     
読み込み停止中
CDSTAT_DOING     
読み込み中
CDSTAT_WAIT      
転送待ち状態
CDSTAT_COMPLETED 
読み込み完了
  CDREQ_FREEを指定した場合  
CDブロックの空きセクタ数
  CDREQ_FADを指定した場合   
ピックアップの位置
  CDREQ_DRVを指定した場合   
CDドライブ状態
CDDRV-BUSY       
状態遷移中
CDDRV_PAUSE      
ポーズ中
CDDRV_STDBY      
スタンバイ
CDDRV_PLAY       
CD 再生中
CDDRV_SEEK       
シーク中
CDDRV_SCAN       
スキャン再生中
CDDRV_OPEN       
トレイが開いている
CDDRV_NODISC     
ディスクがない
CDDRV_RETRY      
リードリトライ処理中
CDDRV_ERROR      
リードエラー発生
CDDRV_FATAL      
致命的エラー発生


エラーコード

表12-1 エラーコード
定数名意味定数値
CDERR_OK正常終了(0)
CDERR_RDERRリードエラ−(-1)
CDERR_NODISCディスクがセットされていない(-2)
CDERR_CDROMディスクがCR-ROMでない(-3)
CDERR_IPARA初期化パラメータ不正(-4)
CDERR_DIRディレクトリ以外へ移動(-6)
CDERR_NEXISTファイルが存在しない(-9)
CDERR_NUMバイト数などが負(-14)
CDERR_PUINUSEピックアップ動作中(-20)
CDERR_ALIGN作業領域が4byte境界にない(-21)
CDERR_TMOUTタイムアウト(-22)
CDERR_OPENトレイオープン(-23)
CDERR_FATALCDドライブが<FATAL>(-25)
CDERR_BUSY状態遷移中(-50)


戻る進む
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997