#include <stdio.h>

#include "Define_config.h"
#include "SamsungSolomonVoiceW.h"

#if(FLAG_SELECT_C_DSP == 1)
#include <stdlib.h>
#endif

#define DIAMONDVOICE_FRAME_TX			320 //	SAMSUNGDIAMONDVOICEWIDEBAND_TX, SAMSUNGDIAMONDVOICENARROWBAND_TX
#define TESTPATH "D:\\2_16_Bean\\Dump\\mcps_check\\"
int FrmCnt_main;

#if(FLAG_SELECT_C_DSP == 1)
FILE *fp_debug_ns_para, *fp_debug_ns_vec1, *fp_debug_ns_vec2, *fp_debug_aecoutpwr, *fp_debug_ns_vec3, *fp_debug_ns_vec4, *fp_debug_ns_vec5, *fp_debug_res_regression;
FILE *fp_debug_Pwr_RX_AECIN_dB_C, *fp_debug_ADF_C;
FILE *fp_debug_NS;
FILE *fp_debug_dump;
FILE *fp_WnlmsFilterCoeff;
FILE *fp_npvss_nlms;
FILE *fp_Wfnlms_new;
FILE *fp_inoutVAD;
FILE *fp_f0contour;
FILE *fp_dbg_Mixing;
//FILE *fp_dbg_Unfit;
FILE *fp_dbg_Wind;
FILE *fp_fft_out_inner;
FILE *fp_fft_out_outer;
FILE *fp_dbg_NoiseState;
FILE *fp_dbg_MixingState;
FILE *fp_dbg_Mixingdbg0;
FILE *fp_dbg_Mixingdbg1;
FILE *fp_dbg_Mixingdbg2;
FILE *fp_dbg_Mixingdbg3;
FILE *fp_dbg_MBDRC;
FILE *fp_deg_2micBF[N_fp_2micBF_debuffiles];

// solomonvoice_sub_module_point_tmp
FILE *fp_fx_SolomonVoice_ringbacktone_detection;

FILE *fp_f0_based_preNS_para;
FILE *fp_inner8kout;
#endif

// 1mic ECNS-------------------------------
SamsungSolomonVoiceParam DiamondVoice_DV_TX_Config = { 0, };
SamsungSolomonVoiceEngine_Handle_t SamsungDiamondVoiceEngine_vars_Tx = { 0, }; 

short Speech_buf_Tx_Inner[SAMSUNGDIAMONDVOICEWIDEBAND_TX];//   = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);
short Speech_buf_Tx_Outer_1[SAMSUNGDIAMONDVOICEWIDEBAND_TX];// = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);		
short Speech_buf_Tx_Outer_2[SAMSUNGDIAMONDVOICEWIDEBAND_TX];// = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);		
short Speech_buf_RX_Inner[SAMSUNGDIAMONDVOICEWIDEBAND_TX];//   = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);
short Speech_buf_RX_Outer[SAMSUNGDIAMONDVOICEWIDEBAND_TX];//   = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);
short Output_buf_TX[SAMSUNGDIAMONDVOICEWIDEBAND_TX];//   = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);

#if(FLAG_SELECT_C_DSP == 1)
/* dbg output */
short Output_buf_Inner_NB[SAMSUNGDIAMONDVOICEWIDEBAND_TX>>1];// = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);
short Output_buf_Outer[SAMSUNGDIAMONDVOICEWIDEBAND_TX];// = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);
short Output_buf_Inner_WB[SAMSUNGDIAMONDVOICEWIDEBAND_TX];// = (short *)malloc(sizeof(short)* SAMSUNGDIAMONDVOICEWIDEBAND_TX);
#endif

int main(int argc, char *argv[])
{
	// 1mic ECNS-------------------------------
	short i;
//	int tmp_InPara, Outer_tmp_InPara;

	FILE *ifp1, *ifp2, *ifp3, *ifp4, *ofp1;
#if(FLAG_SELECT_C_DSP == 1)
	//FILE *ofp2, *ofp3, *ofp4;

	// solomonvoice_sub_module_point_tmp
	fp_fx_SolomonVoice_ringbacktone_detection = fopen(".\\debug\\fp_fx_SolomonVoice_ringbacktone_detection.txt", "w");

	
	// 1mic ECNS-------------------------------
	fp_Wfnlms_new = fopen(".\\debug\\Wfnlms_new.txt", "w");

	fp_debug_ns_para = fopen(".\\debug\\debug_ns_para.txt", "w");
	fp_debug_ns_vec1 = fopen(".\\debug\\debug_ns_vec1.txt", "w");
	fp_debug_ns_vec2 = fopen(".\\debug\\debug_ns_vec2.txt", "w");
	fp_debug_aecoutpwr = fopen(".\\debug\\debug_ns_vec2.txt", "w");
	fp_debug_ns_vec3 = fopen(".\\debug\\debug_ns_vec3.txt", "w");
	fp_debug_ns_vec4 = fopen(".\\debug\\debug_ns_vec4.txt", "w");
	fp_debug_ns_vec5 = fopen(".\\debug\\debug_ns_vec5.txt", "w");
	fp_WnlmsFilterCoeff = fopen(".\\debug\\WnlmsFilterCoeff.txt", "w");
	fp_npvss_nlms = fopen(".\\debug\\npvss_nlms.txt", "w");

	fp_debug_res_regression = fopen(".\\debug\\debug_res_regression.txt", "w");

	fp_debug_Pwr_RX_AECIN_dB_C = fopen(".\\debug\\Pwr_RX_AECIN_dB_C.txt", "w");
	fp_debug_ADF_C = fopen(".\\debug\\ADF_C.txt", "w");	
	fp_debug_NS = fopen(".\\debug\\NS.txt", "w");
	fp_debug_dump = fopen(".\\debug\\dump.txt", "w");

	fp_f0contour = fopen(".\\debug\\f0contour.txt", "w");
	fp_inoutVAD = fopen("inoutVAD.txt", "w");
	fp_f0_based_preNS_para = fopen("fp_f0_based_preNS_para.txt", "w");

	fp_inner8kout = fopen("outinner.pcm", "wb");

	//Mixing
	fp_dbg_MixingState = fopen(".\\debug\\_MixingState.pcm", "wb");
	fp_dbg_Mixingdbg0 = fopen(".\\debug\\_Mixing_veryLowLevel.pcm", "wb");
	fp_dbg_Mixingdbg1 = fopen(".\\debug\\_Mixing_LowLevel.pcm", "wb");
	fp_dbg_Mixingdbg2 = fopen(".\\debug\\_Mixing_highLevel.pcm", "wb");
	fp_dbg_Mixingdbg3 = fopen(".\\debug\\_Mixing_windLevel.pcm", "wb");
	fp_fft_out_inner = fopen("_pf_fft_1.bin", "wb");
	fp_fft_out_outer = fopen("_pf_fft_2.bin", "wb");
	fp_dbg_Mixing = fopen(".\\debug\\_A_dbg_Mixing.txt", "wb");
	fp_dbg_Wind = fopen(".\\debug\\_A_dbg_Wind.txt", "w");

    fp_deg_2micBF[0] = fopen(".\\debug\\_A_dbg_BF00.txt", "wb");
	fp_deg_2micBF[1] = fopen(".\\debug\\_A_dbg_BF01.txt", "wb");
	fp_deg_2micBF[2] = fopen(".\\debug\\_A_dbg_BF02.txt", "wb");
	fp_deg_2micBF[3] = fopen(".\\debug\\_A_dbg_BF03.txt", "wb");
	fp_deg_2micBF[4] = fopen(".\\debug\\_A_dbg_BF04.txt", "wb");
	fp_deg_2micBF[5] = fopen(".\\debug\\_A_dbg_BF05.txt", "wb");
	fp_deg_2micBF[6] = fopen(".\\debug\\_A_dbg_BF06.txt", "wb");
	fp_deg_2micBF[7] = fopen(".\\debug\\_A_dbg_BF07.txt", "wb");
	fp_deg_2micBF[8] = fopen(".\\debug\\_A_dbg_BF08.txt", "wb");
	fp_deg_2micBF[9] = fopen(".\\debug\\_A_dbg_BF09.txt", "wb");
#endif

	if ((ifp1 = fopen(TESTPATH"D_third.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "inear input file error..\n"));

	if ((ifp2 = fopen(TESTPATH"D_main.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "outer_main input file error..\n"));

	if ((ifp3 = fopen(TESTPATH"D_sub.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "outer_sub input file error..\n"));

	if ((ifp4 = fopen(TESTPATH"D_rx.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "RX input file error..\n"));

#if(FLAG_SELECT_C_DSP == 1)
	if ((ofp1 = fopen(TESTPATH"popcorn_out_VC.pcm", "wb")) == (FILE *)NULL)
		exit(fprintf(stderr, "output file error..\n"));
#else
	if ((ofp1 = fopen(TESTPATH"popcorn_out_hifi.pcm", "wb")) == (FILE *)NULL)
		exit(fprintf(stderr, "output file error..\n"));
#endif


/*
	if ((ifp1 = fopen(TESTPATH"Inner.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "TX input file error..\n"));

	if ((ifp2 = fopen(TESTPATH"Outer.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "Outer input file error..\n"));

	if ((ifp3 = fopen(TESTPATH"Rx_test.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "RX input file error..\n"));

	if ((ifp4 = fopen(TESTPATH"Rx_test.pcm", "rb")) == (FILE *)NULL)
		exit(fprintf(stderr, "RX input file error..\n"));
#if(FLAG_SELECT_C_DSP == 1)
	if ((ofp1 = fopen(TESTPATH"output_VC_m.pcm", "wb")) == (FILE *)NULL)
		exit(fprintf(stderr, "output file error..\n"));
#else
	if ((ofp1 = fopen(TESTPATH"output_HIFI_m.pcm", "wb")) == (FILE *)NULL)
		exit(fprintf(stderr, "output file error..\n"));

#endif
*/
	
	SamsungSolomonVoiceWEngineInit(&SamsungDiamondVoiceEngine_vars_Tx);

	SamsungSolomonVoiceWParamSetting(&DiamondVoice_DV_TX_Config, DIAMONDVOICE_FRAME_TX);

	SamsungSolomonVoiceWEngineConfig(&SamsungDiamondVoiceEngine_vars_Tx, &DiamondVoice_DV_TX_Config);

	FrmCnt_main = 0;
	while ((fread(Speech_buf_Tx_Inner, sizeof(short), DIAMONDVOICE_FRAME_TX, ifp1) == (unsigned)DIAMONDVOICE_FRAME_TX)
		&& (fread(Speech_buf_Tx_Outer_1, sizeof(short), DIAMONDVOICE_FRAME_TX, ifp2) == (unsigned)DIAMONDVOICE_FRAME_TX)
		&& (fread(Speech_buf_Tx_Outer_2, sizeof(short), DIAMONDVOICE_FRAME_TX, ifp3) == (unsigned)DIAMONDVOICE_FRAME_TX)
		&& (fread(Speech_buf_RX_Inner, sizeof(short), DIAMONDVOICE_FRAME_TX, ifp4) == (unsigned)DIAMONDVOICE_FRAME_TX))
	{

		FrmCnt_main++;
		if(FrmCnt_main == 101)
		{
			//break;
		}
		//if(FrmCnt_main>500)
		//{

		for (i = 0; i < SAMSUNGDIAMONDVOICEWIDEBAND_TX; i++)
			Speech_buf_RX_Outer[i] = Speech_buf_RX_Inner[i];

#if(FLAG_SELECT_C_DSP == 1)
		SamsungSolomonVoiceWEngineExe(&SamsungDiamondVoiceEngine_vars_Tx, &DiamondVoice_DV_TX_Config, 
			Speech_buf_Tx_Inner, Speech_buf_Tx_Outer_1, Speech_buf_Tx_Outer_2, Speech_buf_RX_Inner, Speech_buf_RX_Outer, Output_buf_TX,
			Output_buf_Inner_NB, Output_buf_Inner_WB, Output_buf_Outer);
#else
		SamsungSolomonVoiceWEngineExe(&SamsungDiamondVoiceEngine_vars_Tx, &DiamondVoice_DV_TX_Config,
			Speech_buf_Tx_Inner, Speech_buf_Tx_Outer_1, Speech_buf_Tx_Outer_2, Speech_buf_RX_Inner, Speech_buf_RX_Outer, Output_buf_TX);
#endif
		
		fwrite(Output_buf_TX, sizeof(short), DIAMONDVOICE_FRAME_TX, ofp1);
		//fwrite(Speech_buf_Tx_Acc, sizeof(short), DIAMONDVOICE_FRAME_TX, ofp2);
		//}
/*
		for(i=0; i<DIAMONDVOICE_FRAME_TX; i++)
		{
			printf("Output_buf_TX[%d]=%d\n",i,Output_buf_TX[i]);
		}
*/


		printf("%d\n", FrmCnt_main);

	}
	printf("\n\n\n");

	fclose(ifp1);
	fclose(ifp2);
	fclose(ifp3);
	fclose(ifp4);
	fclose(ofp1);

#if(FLAG_SELECT_C_DSP == 1)
	fclose(fp_Wfnlms_new);
	fclose(fp_debug_ns_para);
	fclose(fp_debug_ns_vec1);
	fclose(fp_debug_ns_vec2);
	fclose(fp_debug_aecoutpwr);
	fclose(fp_debug_ns_vec3);
	fclose(fp_debug_ns_vec4);
	fclose(fp_debug_ns_vec5);
	fclose(fp_WnlmsFilterCoeff);
	fclose(fp_npvss_nlms);

	fclose(fp_debug_res_regression);

	fclose(fp_debug_Pwr_RX_AECIN_dB_C);
	fclose(fp_debug_ADF_C);
	fclose(fp_debug_NS);
	fclose(fp_debug_dump);

	fclose(fp_f0contour);
	fclose(fp_inoutVAD);

	fclose(fp_f0_based_preNS_para);

	 //solomonvoice_sub_module_point_tmp
	fclose(fp_fx_SolomonVoice_ringbacktone_detection);

	fclose(fp_dbg_Wind);
	//fclose(fp_dbg_Wind_Imsc);
	fclose(fp_dbg_Mixing);
	//fclose(fp_dbg_Unfit);
	//fclose(fp_dbg_Unfitpcm);
	//fclose(fp_dbg_NoiseState);
	//fclose(fp_dbg_MixingState);
	//fclose(fp_dbg_Mixingdbg0);
	//fclose(fp_dbg_Mixingdbg1);
	//fclose(fp_dbg_Mixingdbg2);
	//fclose(fp_dbg_Mixingdbg3);
	//fclose(fp_dbg_MBDRC);
	//fclose(fp_fft_out_inner);
	//fclose(fp_fft_out_outer);
	//fclose(fp_inner8kout);
	/*
	for (i = 0; i < N_fp_2micBF_debuffiles; i++)
	{
		fclose(fp_deg_2micBF[i]);
	}
	*/
#endif

	return 0;
}

