#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include <math.h>
#include "otohime.h"
#include "otolib.h"

/* fade int & out */
int	fadeDialogId = -1 ;
int	fadeOkBtnId = -1 ;
int	fadePlayBtnId = -1 ;
int	fadeUndoBtnId = -1 ;
int	fadeInfBtnId = -1 ;
int	fadeCanBtnId = -1 ;
int	fadeMesId[32] = -1 ;
int	fadeSubDialogId = -1 ;
int	fadeNumId[4] = -1 ;

/* write head */
int	headDialogId = -1 ;
int	headSubDialogId = -1 ;
int	headNumId[6] = -1 ;
int	headMesId[13] = -1 ;
int	headOkBtnId = -1 ;
int	headPlayBtnId = -1 ;
int	headUndoBtnId = -1 ;
int	headCanBtnId = -1 ;
int	headInfBtnId = -1 ;


/* FADE IN & OUT */

int	sndEffectFade()
{
	MMI_SendMessage( fadeDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( fadeDialogId, MM_SHOW, 0 ) ;	/* 全体を見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( fadeDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( fadeDialogId, MM_DETACH, 0 ) ;

	return NOERR ;
}

/*	initDataIOTFAD:fadeOkBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	fadeOkchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	SNDHEAD *head ;
	int f, len ;
	int var, min, max, delta, ptColumn ;
	int i, num[4], start ;

	setMsgColor( fadeMesId[0], EXE_COLOR ) ;

	unDo() ;

	head = (SNDHEAD *)sndBuf1 ;
	f = ( head->freq ) * 1000 / 0x62 ;				/* freq */
	f = ( f + 50 )/100 * 100 ;		/* 10の位を四捨五入 */
	len = head->length ;
	for( i=0 ; i<4 ; i++ )
	{
		MMI_SendMessage( fadeNumId[i], MM_GETNUMBOX, 5,
							&var, &min, &max, &delta, &ptColumn ) ;
		num[i] = var * f / 100 ;
	}
	start = 32 ;
	for( i=0 ; i<num[0] ; i++ )
	{
		if( (start+i) >= (len+32) )
			break ;
		sndBuf1[ start + i ] = 0x80 ;
	}
	start = start + i ;
	for( i=0 ; i<num[1] ; i++ )
	{
		if( (start+i) >= (len+32) )
			break ;
		sndBuf1[ start + i ] = sndDataMul( sndBuf1[ start + i ], i, num[1] );
	}

	start = 32 + len - 1 ;
	for( i=0 ; i<num[3] ; i++ )
	{
		if( (start-i) < 32 )
			break ;
		sndBuf1[start-i] = 0x80 ;
	}
	start = start - i ;
	for( i=0 ; i<num[2] ; i++ )
	{
		if( (start-i) < 32 )
			break ;
		sndBuf1[ start-i ] = sndDataMul( sndBuf1[ start-i ], i, num[2] );
	}

	setMsgColor( fadeMesId[0], MOJI_COLOR ) ;

	return NOERR ;
}

/* xをSNDデータと見なし,それを r/m倍したSNDデータの値を返す */

sndDataMul( x, r, m )
int x, r, m ;
{
	x &= 0xff ;
	if( x >= 128 )
		x = 128 - x ;

	x = x * r / m ;

	if( x <= 0 )
	{
		x = 128 - x ;
		if( x > 254 )
			x = 254 ;
	}
	else if( x > 127 )
		x = 127 ;

	return x ;
}

/*	initDataIOTFAD:fadePlayBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	fadePlay(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( fadeMesId[1], EXE_COLOR ) ;

	sndPlay() ;

	setMsgColor( fadeMesId[1], MOJI_COLOR ) ;

	return NOERR ;
}

/*	initDataIOTFAD:fadeUndoBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	fadeUndo(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( fadeMesId[2], EXE_COLOR ) ;

	unDo() ;

	setMsgColor( fadeMesId[2], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTFAD:fadeInfBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	fadeInf(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ダイアログを使えないようにする */
	MTL_setAtrObj( fadeDialogId, MS_DSPONLYL40 ) ;

	sndInf() ;

	/* ダイアログを使えるように戻す */
	MTL_resetAtrObj( fadeDialogId, (~MS_DSPONLYL40) ) ;

	return NOERR ;
}

/*	initDataIOTFAD:fadeCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	fadeCanchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}


/* WRITE HEAD */

int	sndEffectHead()
{
	readSndHead() ;

	MMI_SendMessage( headDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( headDialogId, MM_SHOW, 0 ) ;	/* 全体を見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( headDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( headDialogId, MM_DETACH, 0 ) ;

	return NOERR ;
}

int readSndHead()
{
	SNDHEAD *head ;
	int var, min, max, delta, ptColumn ;
	int i, num[6] ;

	head = (SNDHEAD *)sndBuf1 ;
	num[0] = head->length ;
	num[1] = head->looppoint ;
	num[2] = head->looplength ;
	num[3] = head->freq ;
	num[4] = head->adjust ;
	num[5] = head->note ;

	for( i=0 ; i<6 ; i++ )
	{
		MMI_SendMessage( headNumId[i], MM_GETNUMBOX, 5,
							&var, &min, &max, &delta, &ptColumn ) ;
		MMI_SendMessage( headNumId[i], MM_SETNUMBOX, 5, /* 変更 */
							num[i], min, max, delta, ptColumn ) ;
	}

	return NOERR ;
}

/*	initDataIOTHED:headOkBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	headOkchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	SNDHEAD *head, *head2 ;
	int var, min, max, delta, ptColumn ;
	int i, num[6] ;

	setMsgColor( headMesId[0], EXE_COLOR ) ;

	head = (SNDHEAD *)sndBuf1 ;
	for( i=0 ; i<6 ; i++ )
	{
		MMI_SendMessage( headNumId[i], MM_GETNUMBOX, 5,
							&var, &min, &max, &delta, &ptColumn ) ;
		num[i] = var ;
	}
	head->length 		= num[0] ;
	head->looppoint		= num[1] ;
	head->looplength	= num[2] ;
	head->freq			= num[3] ;
	head->adjust		= num[4] ;
	head->note			= num[5] ;

	head2 = (SNDHEAD *)sndBuf2 ;	/* 延びた部分を0x80で埋め尽くす */
	if( (head->length) > (head2->length) )
	{
		int s, e ;
		s = head2->length + 32 ;
		e = head->length  + 32 ;
		if( e > sndBufSize )
			e = sndBufSize ;
		for( i=s ; i<e ; i++ )
		{
			sndBuf1[i] = 0x80 ;
		}
	}

	setMsgColor( headMesId[0], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTHED:headPlayBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	headPlay(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( headMesId[1], EXE_COLOR ) ;

	sndPlay() ;

	setMsgColor( headMesId[1], MOJI_COLOR ) ;

	return NOERR ;
}

/*	initDataIOTHED:headUndoBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	headUndo(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( headMesId[2], EXE_COLOR ) ;

	unDo() ;

	setMsgColor( headMesId[2], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTHED:headCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	headCanchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	initDataIOTHED:headInfBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	headInf(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ダイアログを使えないようにする */
	MTL_setAtrObj( headDialogId, MS_DSPONLYL40 ) ;

	sndInf() ;

	/* ダイアログを使えるように戻す */
	MTL_resetAtrObj( headDialogId, (~MS_DSPONLYL40) ) ;

	return NOERR ;
}


