/*--------------------------------------------------------------------------*/
/* PCMを再生する：Version 2 */
/*--------------------------------------------------------------------------*/

#include <stdio.h>
#include <audio.h>
#include "defines.h"
#include "aig.h"

/*--------------------------------------------------------------------------*/

int pcmplay2(unchar *fname,int f,int s,int point,int size)
/* fname=再生PCMファイル名 */
/* f=サンプリング周波数 , 0=3.9 , 1=5.2 , 2=7.8 , 3=10.4 , 4=15.6KHz */
/* s=出力モード , 0=カット , 1=左 , 2=右 , 3=左右両方 */
{
FILE *fp;
int fsize;
unchar *buff;
	/* 周波数、出力モードチェック */
	if (s<0 || s>3) s=3;
	if (f<0 || f>4) f=4;
	
	/* PCMファイルオープン */
	fp=fopen(fname,"rb");
	if (fp==NULL) return(1); /* PCMファイルが見つからない */
	
	/* ファイル長さチェック */
	fsize=filelength(fileno(fp));
	if (fsize==0) {
		fclose(fp);
		return(2); /* ファイル内容が無い */
	}
	
	/* pointまでスキップ */
	if (point>=fsize) {
		fclose(fp);
		return(3); /* ファイルサイズ以上である */
	}
	if (point<=0) point=0; /* 先頭から */
	else fseek(fp,point,SEEK_SET);
	
	/* サイズチェック */
	if (size<=0) size=fsize;
	if (point+size>=fsize) size=fsize-point;
	
	/* バッファー確保 */
	buff=newmalloc(size);
	if (buff==NULL) { /* いっぺんに読み込めるワークエリアがとれない時 */
		#define PSIZE	1024	/* １度に読むサイズ */
		unchar buff2[PSIZE];
		int si;
		/* 少しずつ読み込んで再生する */
		do {
			si=(PSIZE<=size? PSIZE:size);
			fread(buff2,si,1,fp);
			a_play(buff,si,f,s,si);
			size-=si;
		} while (size>0);
	} else { /* 一気にバッファーに読み込む */
		fread(buff,size,1,fp);
		
		/* 再生 */
		a_play(buff,size,f,s,size);
		free(buff);
	}
	fclose(fp);
	return(0);
}

/*--------------------------------------------------------------------------*/
