//==============================================================================================================================
//	WAVデータの音量レベルをデータ化しSCR組み込み
//
//
//==============================================================================================================================
#define	SW_MODULE_UTTER_SCR


#define		SCR_COM_PLAYVOICE		"playvoice"
#define		SCR_COM_VOICEVOL		"voicevol"
#define		REMSTR					";VOL"					//見つからないファイルに対して残す注釈記号



#include	"wavvol.h"

//------------------------------------------------------------------
//		スクリプトコマンドクラス
//------------------------------------------------------------------
class UTTER_SCR{
	
	BOOL		m_bInitialized;
	BOOL		m_bImplemented;
	BOOL		m_FullInit;
	BOOL		string_cmpcom(char *ptr,char *str);
	
	void		Initialize();
	
	int			frame,kind;
	WAVEVOL		wavvol;
	char		*volcom;
	
public:
	int			Func( CPARAMS cParams );
//	int			Func(char *path,char *wavwfiles,char *volperframe,char *param);
	int			wave_func(int idx,char *fname,char *wavwfiles);
	void		Quit( BOOL _bExit );
	
	UTTER_SCR();
	~UTTER_SCR();
	
};

//	アプリケーション起動時
UTTER_SCR::UTTER_SCR(){
		m_FullInit = FALSE;
		m_bInitialized = FALSE;
		m_bImplemented = FALSE;
		
		volcom=NULL;
}
//	アプリケーション終了時
UTTER_SCR::~UTTER_SCR(){
}


//==============================================================================================================================================
//	初期化と開放
//		1ファイルに1つの処理でコンプリートするような場合は修正する必要ありません
//		注釈となっている Message_printf を有効にして sample.swb を実行すると動きがよく分かると思います。
//==============================================================================================================================================

//------------------------------------------------------------------
//		スクリプトコマンドの初期化
//			(特に必要ないなら変更の必要なし)
//------------------------------------------------------------------
void	UTTER_SCR::Initialize(){
		
		if(m_bInitialized == TRUE)	return;
		m_bInitialized = TRUE;	//	初期済みフラグ
		
		if(m_FullInit == FALSE){
			m_FullInit = TRUE;
			//	全体を通して一度しか行わない初期化
			
			//Message_printf("全体の初期化");
			
			
		}
		
		//	初期化処理
		//	１つのバッチに同じスクリプトが２度指定されていたならここには２度来る
		//Message_printf("初期化");
		
		mem_alloc(char,volcom,1024*4);
		
}

//------------------------------------------------------------------
//		スクリプトコマンドの終了
//			(特に必要ないなら変更の必要なし)
//------------------------------------------------------------------
void	UTTER_SCR::Quit( BOOL _bExit )
{
		
		//	ここにはスクリプトを使っていなくても来るので注意
		
		if(m_bImplemented == FALSE)	return;		//	変換処理が実行されていないなら帰還
		m_bImplemented = FALSE;
		m_bInitialized = FALSE;
		
		//	終了処理
		//Message_printf("完了");
		
		if(et == 1){
			//	次のスクリプトは存在しない、完全な終了
			//	１つのバッチに同じスクリプトに別パラメータを渡しての処理で
			//	逐一結果を出さず、全体で統合して結果を出したい場合などはここで
			
			//Message_printf("終了");
			
		}
		
		mem_del(volcom);
		
}







//==============================================================================================================================================
//	変換処理部分
//==============================================================================================================================================

#define	UTTER_SCR_OUTAREA		2	//	変換後の容量は仮に元の倍取っている　内容によって変更して下さい
#define	UTTER_SCR_RANGE				//	このdefineを有効にすると範囲限定機能が有効になる

//------------------------------------------------------------------
//	変換フィルターサンプル　機能:無変換(ファイルコピー)
//			変換せず調査だけなら out に関する部分は不要
//------------------------------------------------------------------
int		UTTER_SCR::Func( CPARAMS cParams ){
		xstring		sPath;
		xstring		sWavwFiles;
		xstring		sVolperFrame;
		xstring		sParam;
		TCHAR		temp[_MAX_PATH];
		TCHAR		*mem=NULL;
		TCHAR		*out=NULL;
		int			ii, jj, k, idx, len;
		
		sPath        = cParams.GetPath();		///< ターゲットファイル (GetFilePath(0)としても同じ).
		sWavwFiles   = cParams.GetFilePath(1);
		sVolperFrame = cParams.GetString(2);
		sParam       = cParams.GetString(3);
		
		
		Initialize();
		
		frame = 60 / STRING_atoi( sVolperFrame.c_str() );
		kind = STRING_atoi( sParam.c_str() );
		
		
		len = MEM_TextRead(&mem, sPath.c_str() );
		if(len == 0){
			//	エラーメッセージの表示　処理はMessage_printfと同じ、こちらを使用すると自動終了しなくなります
			Message_error( TEXT("file not found:%s"), sPath.c_str() );
			return FALSE;		//	ファイルがない
		}
		
		m_bImplemented = TRUE;	//	実行済みフラグ
		
		//	変換後のデータバッファを確保
		mem_alloc( TCHAR, out, len*UTTER_SCR_OUTAREA );
		
		
		ii = 0;
		#ifdef	UTTER_SCR_RANGE
		cRange.Init(mem,len);						//範囲限定機能を有効にするにはこの初期化と
		while(cRange.Is(mem,ii,len))	ii++;		//　初回スキップ、下の[スキップ判定]が必要。スキップが必要な間trueが返りループしている
		#endif
		
		jj = 0;
		while(ii < len){
			#ifdef	UTTER_SCR_RANGE
			while(cRange.Is(mem,ii,len))	ii++;	//	スキップ判定
			#endif
			
			if(string_cmpcom(mem+ii,SCR_COM_VOICEVOL) == 1 || string_cmpcom(mem+ii,REMSTR) == 1){
				while(*(mem+ii) != '\n' && ii < len)	ii++;
				if(*(mem+ii) == '\n')	ii++;
				continue;
			}
			
			if(string_cmpcom(mem+ii,SCR_COM_PLAYVOICE) == 1){
				ii = ii;
				ii += sizeof(SCR_COM_PLAYVOICE);
				if(*(mem+ii)== '(')	ii++;
				idx = 0;
				do{
					while(*(mem+ii)==' ' || *(mem+ii)=='\t' || *(mem+ii)=='\r' || *(mem+ii)=='\n' || *(mem+ii)==',')	ii++;
					k = 0;
					while(*(mem+ii)!=' ' && *(mem+ii)!='\t'  && *(mem+ii)!='\r'  && *(mem+ii)!='\n' && *(mem+ii)!=',' && *(mem+ii)!=')')
						temp[k++] = *(mem+ii++);
					temp[k] = 0;
					
					if(wave_func(idx++,temp,sWavwFiles.c_str() ) == 1){
						STRING_cpy( out+jj, volcom );
						jj += STRING_len(volcom);
					}
				}while(*(mem+ii)!=')');
				
				
			}
			
			//	変換処理 このサンプルではただコピーしているだけ
			*(out+jj++) = *(mem+ii++);
			
			
		}
		*(out+jj) = 0;
		
		//	Infoメッセージ出力(改行コードは\r\n)
		Message_printf( TEXT("file:%s %s"), sPath.c_str(), sWavwFiles.c_str() );
		
		
		//	ファイル出力(同名が存在する時はバックアップが作成される)
		file_textwrite( sPath.c_str(), out );
		
		
		//	メモリを開放
		mem_del(mem);
		mem_del(out);
		
		return TRUE;
}


//		
BOOL	UTTER_SCR::string_cmpcom(char *ptr,char *str){
		int		ii, len;
		char	a, b;
		
		
		len = STRING_len(str);
		for(ii=0 ; ii<len ; ii++){
			a = *(ptr+ii);
			b = *(str+ii);
			if(a >= 'a' && a <= 'z')	a -= ('a'-'A');
			if(b >= 'a' && b <= 'z')	b -= ('a'-'A');
			if(a != b)	return 0;
			
		}
		
		return 1;
}


//		
int		UTTER_SCR::wave_func(int idx,char *fname,char *wavwfiles){
		TCHAR	drive[_MAX_DRIVE], dir[_MAX_DIR], path[_MAX_PATH], temp[3];
		u_char	*mem = NULL;
		int		ii, len, res;
		
		
		#if	0	//	１つ目の引数を除外する例
			if(idx == 0)	return 0;
		#endif
		
		
		#if	1	//	有効にすると数値のみは除外
			len = 0;
			for(ii=0 ; ii<STRING_len(fname) ; ii++){
				if(*(fname+ii) < '0' || *(fname+ii) > '9')	len = 1;
			}
			if(len==0)	return 0;
		#endif
		
		
		//**********************************************************************
		//	ファイル名に変換するために必要な処理がある場合はここで fname を加工
		//**********************************************************************
		
		
		FILE_split( wavwfiles, drive, dir, NULL, NULL );
		FILE_merge( path, drive, dir, fname, TEXT(".wav") );	//ここでは分解した物をそのまま連結、拡張子等を変えたい時はここで
		
		res = wavvol.ConvWav2Vol( path, &mem, &len, frame, 30, kind );
		if(res <= 0){
			#if	1	//	こちらを有効にすると見つからないファイル名を注釈に残す
				wsprintf( volcom, TEXT("%s	%s は見つかりません\r\n"), REMSTR, fname );
				return 1;
			#else
				return 0;
			#endif
		}
		
		wsprintf( volcom, TEXT("%s(\""), SCR_COM_VOICEVOL );
		for(ii=0 ; ii<len ; ii++){
			wsprintf( temp, TEXT("%02X"), *(mem+ii) );
			STRING_cat( volcom, temp );
		}
		STRING_cat( volcom, TEXT("\")\r\n") );
		
		mem_del(mem);
		
		return 1;
}


UTTER_SCR	*pC_utter_scr = NULL;
