/*	
 *	main.c
 *
 *	sndtst - シンプルサウンドテスト
 *	Copyright (C) 2002 Naoyuki Sawa
 *
 *	* Sun Jul 21 18:23:00 JST 2002 Naoyuki Sawa
 *	- 1st リリース。
 */
#include <piece.h>
#include <thread.h>
#include <simple.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/****************************************************************************
 *	変数
 ****************************************************************************/

#define ROWS		11	/* 画面上の行数 */
#define BLOCKSIZE	4096	/* フラッシュメモリのセクタサイズ */

/* 起動時にPPDファイル名を探し、ここに格納します。 */
#define N_FNAMES	96	/* 最大いくつまで探すか？                             */
				/* PFFSのディレクトリエントリが96なので、96あれば確実 */
char fnames[N_FNAMES][MAXFILENAME + 1]; /* ファイル名リスト */
int n_fnames;			/* 実際に見つかった数 */

int joy, joy_old;		/* パッド状態取得用               */
int sel, sel_old;		/* 選択中のファイルインデクス     */
int scrl;			/* 一番上の行のファイルインデクス */
unsigned char* data;		/* PPDファイル読み込みバッファ    */

/****************************************************************************
 *	関数宣言
 ****************************************************************************/

void simple_error(char *format, ...);

/****************************************************************************
 *	smain
 ****************************************************************************/

void
smain()
{
	int retval, len, i;
	FILEINFO fi;
	FILEACC fa;

	/* PPDファイルを探します。 */
	thread_lock();
	pceFileFindOpen(&fi);
	while(n_fnames < N_FNAMES && pceFileFindNext(&fi)) {
		len = strlen(fi.filename);
		if(len < 4) continue;
		if(strcmp(&fi.filename[len - 4], ".ppd") != 0) continue;
		strcpy(fnames[n_fnames++], fi.filename);
	}
	pceFileFindClose(&fi);
	thread_unlock();
	if(n_fnames == 0) {
		simple_error("PPDファイルがありません\n");
		thread_return();
	}

	sel = -1; /* 初回更新のため */
	for(;;) {
		/* パッド状態取得。 */
		joy_old = joy;
		joy = pad() & 0xff;
		joy = joy | ((joy ^ joy_old) & joy) << 8;
		if(joy & TRG_SELECT) break; /* SELECTボタンで終了 */

		/* ファイル選択。 */
		sel_old = sel;
		if(joy & TRG_UP) sel--;
		if(joy & TRG_DN) sel++;
		if(joy & TRG_LF) sel -= 10;
		if(joy & TRG_RI) sel += 10;
		if(sel < 0           ) sel = 0           ;
		if(sel > n_fnames - 1) sel = n_fnames - 1;
		if(sel != sel_old) {
			/* スクロール調整。 */
			if(sel            < scrl) scrl = sel           ;
			if(sel - ROWS + 1 > scrl) scrl = sel - ROWS + 1;
			/* ファイル名表示。 */
			cls();
			for(i = 0; i < ROWS; i++) {
				if(scrl + i > n_fnames - 1) break;
				if(scrl + i == sel) {
					locate(0, i);
					printstr(">");
				}
				locate(2, i);
				printstr(fnames[scrl + i]);
			}
		}

		/* 再生。 */
		if(joy & TRG_A) {
			/* ppdload()では20KBまでのPPDファイルしか再生できないので、
			 * 自分でロードしてppdplay()を使って再生します。
			 */
			thread_lock();
			/* ファイルを開きます。 */
			retval = pceFileOpen(&fa, fnames[sel], FOMD_RD);
			if(retval != 0) {
				simple_error("%sが開けません\n", fnames[sel]);
				thread_return();
			}
			/* 旧いバッファを開放します。 */
			if(data != NULL) pceHeapFree(data);
			/* 新しいバッファを確保します。 */
			data = (unsigned char*)pceHeapAlloc(fa.fsize);
			if(data == NULL) {
				simple_error("メモリ不足です\n");
				thread_return();
			}
			/* ファイルを読み込みます。 */
			for(i = 0; i < fa.fsize; i += BLOCKSIZE) {
				retval = pceFileReadSct(&fa, data + i, i / BLOCKSIZE, BLOCKSIZE);
				if(retval == 0) {
					simple_error("読み込み失敗です\n");
					thread_return();
				}
			}
			thread_unlock();
			/* 再生開始。 */
			ppdplay(data);
		}
	}
}
