/*
 *  Middleware Library
 *  Copyright (c) 1998 SEGA
 *  
 *		Middleware Play Sample
 *
 *  Module  : Sample Program
 *  File    : smp_ply.c
 *  Create  : 1998-06-29
 *  Modify  : 1998-07-29
 *  Version : 0.55
 *  Note    : 
 */

/***********************************************************************
 *      インクルードファイル
 ***********************************************************************/
#include <machine.h>
#include <shinobi.h>
#include <sg_mw.h>

/***********************************************************************
 *      定数マクロ
 ***********************************************************************/

/* デバッグ用に空宣言にする */
#define	STATIC

/*	データの読み込み	*/
void *load_file(char *fname, long *len)
{
	GDFS gdfs;
	long fsize, nsct;
	void *dat=NULL;

	if ( (gdfs=gdFsOpen(fname, NULL)) == NULL )
		for (;;);
	gdFsGetFileSize(gdfs, &fsize);
	nsct = (fsize+2047)/2048;
	if ( (dat=syMalloc(nsct*2048)) != NULL ) {
		gdFsRead(gdfs, nsct, dat);
	}
	gdFsClose(gdfs);
	if ( len != NULL )
		*len = fsize;

	return dat;
}

#include	<stdarg.h>

/*	メッセージ出力	*/
long njPrintf(long lx, long ly, char *fmt,...)
{
    va_list args;
    static char buf[256];
    long ret, pos;

	memset(buf, 0, sizeof(buf));
    va_start(args, fmt);
    ret = vsprintf(buf, fmt, args);
    va_end(args);
    pos = NJM_LOCATION(lx, ly);
	njPrintC(pos, buf);

    return ret;
}

/* サウンドドライバの転送・初期化 */
Void	SoundInit(Void *ptr)
{
	SDMEMBLK	memblk = NULL;

	/*	Initialize Sound library	 */
	sdLibInit(NULL, 0, 0);		/*	This api's argument is dummy now.  */

	/* 	Download and Initialize Sound driver.	 */
	/*	Create Memory block handle  */
	sdMemBlkCreate(&memblk);
	/*  Setting Memoby block handle  */
	sdMemBlkSetPrm(memblk, ptr, 0, SDD_MEMBLK_SYNC_FUNC, NULL);
	/*	Initialize Sound driver  */
	sdDrvInit(memblk);
	sdMemBlkDestroy(memblk);
}

/*	msec ==> Time	*/
void ms2time(long mstime, long *hh, long *mm, long *ss, long *ff)
{
	*hh = mstime / (60*60*1000);
	*mm = (mstime - *hh*60*60*1000) / (60*1000);
	*ss = (mstime - *hh*60*60*1000 - *mm*60*1000) / 1000;
	*ff = mstime % 1000;
}

/* 再生するファイル名 */
#define	SMD_PLAY_FNAME		"SAMPLE.SFD"

/* エラー発生回数 */
Sint32	errcnt;

/* エラー発生時に起動する関数 */
static void errFunc(void *obj, Sint32 ecode)
{
    /* エラーコードのチェック */
    if (ecode != MWD_PLY_ERR_OK) {
		errcnt++;
    }
}

/* ユーザのVSYNC割り込み登録関数 */
static void usrVsyncFunc(void)
{
    /* サウンドライブラリのサーバ */
    sdSysServer();
}

Sint32 disp_flag = 1;

/*	動画の再生	*/
void smp_play(char *fname)
{
    MWPLY		ply;
    MWS_PLY_CPRM_SFD	cprm;
    MWE_PLY_STAT	stat;
	const NJS_PERIPHERAL* per;

	/* ハンドルの生成 */
    cprm.ftype	= MWD_PLY_FTYPE_SFD;
    cprm.dtype	= MWD_PLY_DTYPE_AUTO;
	ply = mwPlyCreateSofdec(&cprm);
	if (ply == NULL)
		for (;;) ;
	mwPlyEntryErrFunc(errFunc, &ply);
	/* 再生開始 */
	mwPlyStartFname(ply, fname);
	while (1) {
		njWaitVSync();
		mwPlyStartFrame();
		per = njGetPeripheral(NJD_PORT_A0);
		if (per->press & NJD_DGT_TA) {
			if ( disp_flag == 1 )
				disp_flag = 0;
			else
				disp_flag = 1;
		}
		if (per->press & NJD_DGT_ST)
			break;
	    /* ハンドル状態の取得 */
	    stat = mwPlyGetStat(ply);
	    if (stat == MWE_PLY_STAT_PLAYEND)
			break;
		if ( disp_flag == 1 ) {
			long time, tunit, hh, mm, ss, ff, time_ms;
			float timef;

			mwPlyGetTime(ply, &time, &tunit);
			timef = (float)time/(float)tunit*1000;
			time_ms = (long)timef;
			ms2time(time_ms, &hh, &mm, &ss, &ff);
			ff = ff*30/1000;
			njPrintf(3, 3, "File: %s  Time:%02d:%02d:%02d.%02d",
												fname, hh, mm, ss, ff);
		}
		mwPlyExecServer();
	}
	mwPlyStop(ply);		/* 再生停止 */
	njWaitVSync();		/*	パッドの状態取得のため	*/
	mwPlyDestroy(ply);	/* ハンドル消去 */
}

void main(void)
{
	void *snddrv;

	/*	ミドルウェアのためのシステム初期化 (sbInitSystemの前に置く)　*/
	mwPlyPreInitSofdec();
    njSetBorderColor(0x00000000);
    sbInitSystem(NJD_RESOLUTION_640x480_NTSCI,NJD_FRAMEBUFFER_MODE_ARGB8888,1);
    njInitVertexBuffer(500000, 0, 500000, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_8888 );
	/*	ミドルウェアライブラリ初期化　*/
    mwPlyInitSofdec(NULL);

    njPrintSize(12);

	/*	サウンドライブラリの準備 */
	snddrv = load_file("manatee.drv", NULL);
	SoundInit(snddrv);
	njSetVSyncFunction(usrVsyncFunc);

	for (;;)
		smp_play("SAMPLE.SFD");
	/* ライブラリ終了処理 */
	mwPlyFinishSofdec();
	sbExitSystem();
}
