#include <clip.h>

unsigned char vbuff[DISP_X * DISP_Y];

#define GSM_FNAME	"sample.gsm"
FILEACC fa;
int ofs;
gsm g;
gsm_frame f;
gsm_signal s[160];
#define N 4
#define U 2
PCEWAVEINFO wi[N];
short smpl[N][2 * 160 * U];
int blk = 0;
int qqq;

void aaa();
void endproc(PCEWAVEINFO* pwi);

int
main()
{
	int retval;

	/* 一般的な初期化。 */
	pceLCDDispStart();
	pceAppSetProcPeriod(50);
	pceLCDSetBuffer(vbuff);

	/* GSMファイルを開く。 */
	retval = pceFileOpen(&fa, GSM_FNAME, FOMD_RD);
	if(retval != 0) die(GSM_FNAME "が開けません");

	/* GSMストリーム作成。 */
	g = gsm_create();
	if(g == NULL) DIE();

	/* 再生開始。 */
	blk = 0;
	aaa();
	if(++blk == N) blk = 0;
	for(;;) {
		aaa();
		if(++blk == N) blk = 0;
		while(!qqq) {
//			yield();
			if(pcePadGetDirect()) goto QQQ;
		}
		qqq = 0;
	}
QQQ:

	/* 再生終了。 */
	pceWaveStop(0);

	/* GSMストリーム削除。 */
	gsm_destroy(g);

	/* GSMファイルを閉じる。 */
	pceFileClose(&fa);

	return 0;
}

void
aaa()
{
	int retval, u, v;
	gsm_signal *ss, *sd, aa;
	PCEWAVEINFO* pwi;

	pwi = &wi[blk];

	/* ヘッダ初期化。 */
	memset(pwi, 0, sizeof(PCEWAVEINFO));
	pwi->type = PW_TYPE_16BITPCM | PW_TYPE_CONT;
	pwi->pData = &smpl[blk][0];
	pwi->len = 2 * 160 * U;
	pwi->pfEndProc = endproc;

	/* データ読み込み。 */
	sd = (gsm_signal*)pwi->pData;
	for(u = 0; u < U; u++) {
		retval = file_read(&fa, f, ofs, sizeof f);
		if(retval < sizeof f) break;
		ofs += retval;
		retval = gsm_decode(g, f, s);
		if(retval != 0) DIE();
		ss = s;
		for(v = 0; v < 160; v++) {
			aa = *ss++;
			*sd++ = aa;
			*sd++ = aa;
		}
	}

	/* 再生。 */
	pceWaveDataOut(0, pwi);
}

void
endproc(PCEWAVEINFO* pwi)
{
	qqq = 1;
}
