//********************************************************************************************
/**
 * @file		utter.cpp
 * @brief		WAVデータの音量レベルをデータ化
	
		このファイルの詳細説明
 * 
 * @author		N.Takeda
 * @date		2011/06/13(月) 16:50:48
 */
//********************************************************************************************
#define	SW_MODULE_UTTER						///< この機能を切り離したい時はコメントアウト.


#ifdef	SW_MODULE_UTTER
#include	"wavvol.h"

//------------------------------------------------------------------
//		スクリプトコマンドクラス
//------------------------------------------------------------------
class UTTER
{
	BOOL		m_bInitialized;
	BOOL		m_bImplemented;
	BOOL		m_FullInit;
	
	void		Initialize();
	
	WAVEVOL		wavvol;
	
public:
	int			Func( LPCTSTR _sParamString );
	void		Quit( BOOL _bExit );
	
	UTTER();
	~UTTER();
	
};

/// アプリケーション起動時.
UTTER::UTTER()
{
	m_FullInit = FALSE;
	m_bInitialized = FALSE;
	m_bImplemented = FALSE;
}

/// アプリケーション終了時.
UTTER::~UTTER()
{

}


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

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

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







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

//------------------------------------------------------------------
//	変換フィルターサンプル　機能:無変換(ファイルコピー)
//			変換せず調査だけなら out に関する部分は不要
//------------------------------------------------------------------
int		UTTER::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );					///< パラメータ処理.
	
	LPCTSTR		pPath;
	int			iVolperFrame;
	TCHAR		sDrive[_MAX_DRIVE], sDir[_MAX_DIR], sName[_MAX_FNAME], sPath[_MAX_PATH];
	char		*pMem = NULL;
	int			iLen, iFrame, iKind, iRes, iPar;
	TCHAR		ks[][5] = {	TEXT("平均"), TEXT("最大"), TEXT("２値")	};
	
	
	pPath			= cParam.GetPath();						///< ターゲットファイル (GetFilePath(0)としても同じ).
	iVolperFrame	= cParam.GetIntOption( 'f', 30 );		///< システムの稼動フレーム数.
	iKind			= cParam.GetIntOption( 't', 2 );
	iPar			= cParam.GetIntOption( 'p', 30 );		///< ２値化パーセンテージ
	
	Initialize();
	
	if( 0 == iVolperFrame )	return FALSE;
	
	
	iFrame = 60 / iVolperFrame;
	
	iLen = wavvol.ConvWav2Vol( pPath, NULL, 0, iFrame, iPar, iKind );
	mem_alloc( char, pMem, iLen );
	iRes = wavvol.ConvWav2Vol( pPath, pMem, iLen, iFrame, iPar, iKind );
	
	
	FILE_split( pPath, sDrive, sDir, sName, NULL );
	FILE_merge( sPath, sDrive, sDir, sName, TEXT(".bin") );	///< 拡張子を".bin"に変える.
	
	if( iRes == -1 ){
		Message_printf( TEXT("%s は有効なwavではありません"), pPath );
	}else if( iRes == 0 ){
		Message_printf( TEXT("%s は変換されませんでした"), pPath );
	}else{
		/// Infoメッセージ出力(改行コードは\r\n).
		Message_printf( TEXT("%s -> %s %dfrm %s(%d%%)"), pPath, sPath, iVolperFrame, ks[iKind], iPar );
		
		/// ファイル出力(同名が存在する時はバックアップが作成される).
		file_targetwrite( sPath, (LPSTR)pMem, iLen );
	}
	
	/// メモリを開放.
	mem_del( pMem );
	
	return TRUE;
}


UTTER	*pC_utter = NULL;

#endif	// SW_MODULE_UTTER
