optek_src.c 6.96 KB
#include "c_def.h"
#include "debug.h"
#include "oem.h"

#if 1
#include "mem_reloc.h"

#include "app_main.h"
#include "app_dac.h"
#include "app_sdram.h"

#include "optek_hifi2.h"

#include "audio_com.h"
#include "audio_dec.h"

#include "flash_boot.h"


extern BOOL uiDacMute;

#define SRC_WIRELESS_SIZE


void optek_src_init (void)
{

}


#if 0//def DOLBY_AC3_DEC

#ifdef DD_AC3_DEC_16BIT_OUT
//U32 optek_src_buf[512*6]; //small out buf, MP3_DEC_FRAME_SIZE = 1152
//U32 optek_src_buf[DOLBY_AC3_OUT_SAMPLE_PER_CH*6/2]; //for Dolby 6 channels out, MP3_DEC_FRAME_SIZE = 1152
U32 optek_src_buf[DOLBY_AC3_OUT_SAMPLE_PER_CH*4/2]; //for Dolby 2 channels out, MP3_DEC_FRAME_SIZE = 1152
//U32 optek_src_buf[DOLBY_AC3_OUT_SAMPLE_PER_CH*2/2]; //for Dolby 2 channels out, MP3_DEC_FRAME_SIZE = 1152
#else
//U32 optek_src_buf[DOLBY_AC3_OUT_SAMPLE_PER_CH*6]; //for Dolby 6 channels out, MP3_DEC_FRAME_SIZE = 1152
U32 optek_src_buf[DOLBY_AC3_OUT_SAMPLE_PER_CH*4]; //for Dolby 2 channels out, MP3_DEC_FRAME_SIZE = 1152
//U32 optek_src_buf[DOLBY_AC3_OUT_SAMPLE_PER_CH*2]; //for Dolby 2 channels out, MP3_DEC_FRAME_SIZE = 1152
#endif

#else
U32 optek_src_buf[MP3_DEC_FRAME_SIZE/2]; //small out buf, MP3_DEC_FRAME_SIZE = 1152
//U32 optek_src_buf[MP3_DEC_FRAME_SIZE*2]; //small out buf, MP3_DEC_FRAME_SIZE = 1152
//U32 optek_src_buf[1];
#endif

U16 app_cmd_get_dec_freq(void);

//U8 optek_src_output(U16 *buf, U32 byte_len) __INTERNAL_RAM_TEXT;
U8 optek_src_output(U16 *buf, U32 byte_len)
{
	asm("break 1,1");
#if 0	
	u16 slice, slice_len,i,k;
	u16 o_len;
	U32 *ptr;
	U32 val;
	U8 src;
	static int counter = 0;
	U8 *pU8Buf = buf;
	U8 *pU8OutBuf = optek_src_buf;


	if (sizeof(optek_src_buf) < 512)
	{
		DBG_Printf("optek src buf underflow\n\r");
		return FALSE;
	}

	if (app_main_data.playing_stream_chans == 1)
	{
		//mono to stereo
		for(i=0; i<byte_len/2; i++)
		{
			buf[byte_len - 2*i -1] = buf[byte_len/2 - i - 1];
			buf[byte_len - 2*i -2] = buf[byte_len/2 - i - 1];
		}

		byte_len *= 2;
	}


	//MP3 a frame:2304 bytes
	//WMA a freame:4096 bytes
	switch (app_main_data.playing_stream_sample_rate)
	{
	case 192000:
	case 96000:
	case 48000:
	case 44100:
	case 32000:
#if 1//def DOLBY_AC3_DEC
		if (byte_len >= 8192)
		{
			slice = 4;
			slice_len = byte_len/4;
		}
		else if (decode_type == DECODE_DD_AC3)
		{
			//DOLBY_AC3_OUT_SAMPLE_PER_CH:256 samples
			slice = 1;
			slice_len = byte_len/1;
			//slice = 2;
			//slice_len = byte_len/2;
		}
		else if (byte_len >= ((256*3)*4))
		{
			if (0)//( (decode_type == DECODE_MP3) )
			{
				slice = 4;
				slice_len = byte_len/4;
			}
			else
			{
				slice = 2;
				slice_len = byte_len/2;
			}
		}
		else if (byte_len >= ((256*2)*4))
		{
			slice = 1;
			slice_len = byte_len/1;
		}
	#ifdef OPTEK_DSRC_ENABLE
		//it is defined by SPDIF_D2AS_N
		else if (byte_len >= (1152))
		{
			slice = 2;
			slice_len = byte_len/2;
		}
	#endif
		else
		{
		#if 1
			slice = 1;
			slice_len = byte_len;
		#else
			slice = 2;
			slice_len = byte_len/2;

		#endif
		}
#else
		if (len == 8192)
		{
			slice = 4;
			slice_len = len/4;
		}
		else if (len >= 2048)
		{
			slice = 2;
			slice_len = len/2;
		}
		else
		{
			slice = 1;
			slice_len = len;
		}
#endif

		src = 0x01;
		break;

	case 24000:
	case 22050:
	case 16000:	
		if (byte_len == 8192)
		{
			slice = 8;
			slice_len = byte_len/8;
		}
		else
		{
			slice = 4;
			slice_len = byte_len/4;
		}
		src = 0x02;
		break;
		
	case 12000:
	case 11025:
	case 8000:
		if (byte_len == 8192)
		{
			slice = 16;
			slice_len = byte_len/16;
		}
		else
		{
			slice = 8;
			slice_len = byte_len/8;
		}
		src = 0x04;
		break;
		
	default:
		DBG_Assert(FALSE);
		//break;
		return FALSE;
	}


#if 0//ndef BOOT_FROM_FLASH
	if ( (counter == 0) )
	{
		counter = 1;

#ifndef BOOT_FROM_FLASH
		//DBG_Printf("dec byte len:%d\n\r", byte_len);
		DBG_Printf("dec byte slice_len:%d, len:%d\n\r", slice_len, byte_len);
#endif
	}
	else
	{
		if ( (app_main_data.playing_stream_sample_rate == 192000) ||
			 (app_main_data.playing_stream_sample_rate == 176400) ||
			 (app_main_data.playing_stream_sample_rate == 128000) ) 
		{
			if ( (counter++ >= (256*4)) )
			{
				counter = 0;
			}
		}	
		else if ( (app_main_data.playing_stream_sample_rate == 96000) ||
			      (app_main_data.playing_stream_sample_rate == 88200) ||
			      (app_main_data.playing_stream_sample_rate == 64000) ) 
		{
			if ( (counter++ >= (256*2)) )
			{
				counter = 0;
			}
		}
		else
		{
			if ( (counter++ >= (256*1)) )
			{
				counter = 0;
			}
		}
	}
#endif //BOOT_FROM_FLASH


	ptr = buf;
	
	for (i=0; i<slice; i++)
	{
		switch (src)
		{
		case 1:
			//if ( (app_main_data.audio_src_24bit) && (app_main_data.audio_out_24bit) )
			if ( ((decode_type == DECODE_WAV)) && (app_main_data.audio_out_24bit) )
			{
				//memset(optek_src_buf, 0, sizeof(optek_src_buf));
				//for (k=0; k<(slice_len/3); k++)
				for (i=0,k=0; i<(slice_len/(3*2)); i++)
				{
					pU8OutBuf[k++] = 0;
					pU8OutBuf[k++] = *pU8Buf++;
					pU8OutBuf[k++] = *pU8Buf++;
					pU8OutBuf[k++] = *pU8Buf++;
					
					pU8OutBuf[k++] = 0;
					pU8OutBuf[k++] = *pU8Buf++;
					pU8OutBuf[k++] = *pU8Buf++;
					pU8OutBuf[k++] = *pU8Buf++;
				}

				//o_len = slice_len/2;
				//o_len = o_len*4;
				//o_len = slice_len*2;
				o_len = k;
			}
			else
			{
				CFasm_memcpy(optek_src_buf, ptr, slice_len);
				ptr += (slice_len/4);
				o_len = slice_len;
			}
			break;
			
		case 2:
			for (k=0;k<slice_len/4;k++)
			{
				val = *ptr++;
				
				optek_src_buf[2*k] = val; 
				optek_src_buf[2*k+1] = val; 
			}

			o_len = slice_len*2;
			
			/*need 0.25 low pass filter*/
			//bqriir_16bit_stereo_process(fHandle,optek_src_buf,optek_src_buf,o_len/2);
			break;

		case 4:
			for (k=0;k<slice_len/4;k++)
			{
				val = *ptr++;

				optek_src_buf[4*k] = val; 
				optek_src_buf[4*k+1] = val; 
				optek_src_buf[4*k+2] = val; 
				optek_src_buf[4*k+3] = val; 

			}
			
			o_len = slice_len*4;
			/*need 0.125 low pass filter*/
			//bqriir_16bit_stereo_process(fHandle,optek_src_buf,optek_src_buf,o_len/2);
			break;

		default:
			DBG_Assert(FALSE);
			break;
		}


	#if 1//def DOLBY_AC3_DEC
		if (app_main_data.audio_out_24bit)
		{
			dec_direct_out_24bit(optek_src_buf, o_len);
		}
		else
	#endif
		{
		#ifdef OPTEK_DSRC_ENABLE
			extern void *optek_d2as1;

			U32 dlen;
			U8 *pSrcBuf;
		
		#if 1
			if ( (app_main_data.stream_out_sample_rate != app_main_data.stream_in_sample_rate)
				&& d2as_need_flag)
		#else
			if ( (app_main_data.stream_out_sample_rate != app_main_data.stream_in_sample_rate) )
		#endif
 			{
				pSrcBuf = (U8 *)&optek_src_buf[0];
				
				dlen = optek_dsrc_stereo_16b (optek_d2as1, pSrcBuf, pSrcBuf, o_len/(4)); //samples
				dlen = dlen*4;
				dec_direct_out(pSrcBuf, dlen);

				//DBG_Printf ("dlen:%d\n\r", dlen);
			}
			else
	#endif //OPTEK_DSRC_ENABLE
			{

				dec_direct_out(optek_src_buf, o_len);
			}
		}

		if (app_dec_request_codec_exit() == TRUE)
		{
			return FALSE;
		}
	}
	
	while (uiDacMute)
	{
		memset(optek_src_buf, 0, 1152*2);
		dec_direct_out(optek_src_buf, 1152*2);

		if (app_dec_request_codec_exit() == TRUE)
		{
			return FALSE;
		}			
	}

	return TRUE;
#endif	
}

#endif