⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiolibrary.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
			paddrorg++;
			//printf("%d paddrorg:0x%x \n", i, paddrorg);
			paddrorg++;
			//printf("%d paddrorg:0x%x \n", i, paddrorg);
		}
	}
	
	*destsizeByte = (unsigned int)((unsigned char* )paddr - (unsigned char* )pstartaddr);	
	printf("Expanding from 2ch size:0x%x (%d byte) @0x%x to %d ch size: 0x%x (%d byte) @0x%x is finished\n",
								orgsizeByte, orgsizeByte, orgaddr, 		destTotch, *destsizeByte, *destsizeByte, destaddr);
	return 1;
	
}


//masking certain channels of pcm fifo format data
//
//output 
//		- bool : succuss or fail
//		- pcm data at destaddr will be masked.
//
//input 
//		- destaddr : starting address of destination where pcm fifo format data is located.
//		- datasizeByte : size(byte) of orginal pcm data
//		- bit : bit per channels of original pcm data
//		- Totalch : total channels of original pcm data
//		- maskingch
//			[5][4][3][2][1][0]
//			 r  l  r  l  r  l
//	channel	 6  5  4  3  2  1
//			0:no masking
//			1:maksing - block channel so it doesn't make sound out
bool PCM_DATA_masking(unsigned int destaddr, unsigned int datasizeByte, int bit, int Totalch, int maskingch)
{
	unsigned char* 	pstartaddr=(unsigned char *)destaddr;
	unsigned int* paddr=(unsigned int*)destaddr;
	unsigned int wsize = datasizeByte/4;
	unsigned int	destdatasizebyte;
	unsigned int i;
	
	//assert
	if(destaddr == 0) return 0;
	if(maskingch<0 || maskingch>0x3f) return 0;
	
	
	if(bit == 16 || bit == 8)
	{
		int masking12=0xffffffff;//1ch(l) low 16bit, 2ch(r) high 16bit
		int masking34=0xffffffff;
		int masking56=0xffffffff;


		if(maskingch & 0x1) {
			masking12 = masking12 & 0xffff0000;	
			printf("ch 1(Front left) blocked\n");
		}
		if(maskingch & 0x2) {
			masking12 = masking12 & 0x0000ffff;
			printf("ch 2(Front right) blocked\n");			
		}
		if(maskingch & 0x4) {
			masking34 = masking34 & 0xffff0000;
			printf("ch 3(Center left) blocked\n");			
		}
		if(maskingch & 0x8) {
			masking34 = masking34 & 0x0000ffff;
			printf("ch 4(Center right) blocked\n");			
		}
		if(maskingch & 0x10) {
			masking56 = masking56 & 0xffff0000;
			printf("ch 5(Rear left) blocked\n");						
		}
		if(maskingch & 0x20) {
			masking56 = masking56 & 0x0000ffff;
			printf("ch 6(Rear right) blocked\n");
		}
		printf("masking12 : %x \n",masking12);
		printf("masking34 : %x \n",masking34);
		printf("masking56 : %x \n",masking56);
	
		switch(Totalch)
		{
		case 2:
			for(i=0; i<wsize; i++)
			{
				*paddr = *paddr & masking12;
				paddr++;			
			}
		break;
		
		case 4:
			for(i=0; i<wsize; i+=2)
			{
				*paddr = *paddr & masking12;
				paddr++;			
				*paddr = *paddr & masking34;
				paddr++;						
			}
		break;

		case 6:
			for(i=0; i<wsize; i+=3)
			{
				*paddr = *paddr & masking12;
				paddr++;			
				*paddr = *paddr & masking34;
				paddr++;			
				*paddr = *paddr & masking56;
				paddr++;				
			}
		break;		
		}
	}
	else
	if(bit == 24)
	{
		int masking120=0xffffffff;//1ch(l) low 16bit, 2ch(r) high 16bit
		int masking121=0xffffffff;//1ch(l) low 16bit, 2ch(r) high 16bit
		int masking340=0xffffffff;
		int masking341=0xffffffff;
		int masking560=0xffffffff;
		int masking561=0xffffffff;


		if(maskingch & 0x1) {
			masking120 = 0xff000000;	
			printf("ch 1(Front left) blocked\n");
		}
		if(maskingch & 0x2) {
			masking121 = 0xff000000;
			printf("ch 2(Front right) blocked\n");			
		}
		if(maskingch & 0x4) {
			masking340 = 0xff000000;
			printf("ch 3(Center left) blocked\n");			
		}
		if(maskingch & 0x8) {
			masking341 = 0xff000000;
			printf("ch 4(Center right) blocked\n");			
		}
		if(maskingch & 0x10) {
			masking560 = 0xff000000;
			printf("ch 5(Rear left) blocked\n");						
		}
		if(maskingch & 0x20) {
			masking561 = 0xff000000;
			printf("ch 6(Rear right) blocked\n");
		}
		printf("masking12L : %x \n",masking120);
		printf("masking12R : %x \n",masking121);
		printf("masking34L : %x \n",masking340);
		printf("masking34R : %x \n",masking341);
		printf("masking56L : %x \n",masking560);
		printf("masking56R : %x \n",masking561);
	
		switch(Totalch)
		{
		case 2:
			for(i=0; i<wsize; i+=2)
			{
				*paddr = *paddr & masking120;
				paddr++;
				*paddr = *paddr & masking121;
				paddr++;
			}
		break;
		
		case 4:
			for(i=0; i<wsize; i+=4)
			{
				*paddr = *paddr & masking120;
				paddr++;			
				*paddr = *paddr & masking121;
				paddr++;							
				*paddr = *paddr & masking340;
				paddr++;						
				*paddr = *paddr & masking341;
				paddr++;										
			}
		break;

		case 6:
			for(i=0; i<wsize; i+=6)
			{
				*paddr = *paddr & masking120;
				paddr++;			
				*paddr = *paddr & masking121;
				paddr++;						
				*paddr = *paddr & masking340;
				paddr++;			
				*paddr = *paddr & masking341;
				paddr++;							
				*paddr = *paddr & masking560;
				paddr++;				
				*paddr = *paddr & masking561;
				paddr++;								
			}
		break;		
		}
	}	
	
	destdatasizebyte = (unsigned int) ((unsigned char* )paddr - (unsigned char* )pstartaddr);	
	printf("Masking [size: 0x%x (%d byte)] is finished. \n\
orginal data: %d ch, %d bit, 0x%x (%d byte) @ 0x%x\n",
					destdatasizebyte,destdatasizebyte,
			Totalch, bit, datasizeByte, datasizeByte, pstartaddr);	
	return 1;
}



//pcm : little endian continous format => little endian fifo format(2byte, 4byte seperated format) 
// converting and copy
//          L         R        L          R 
//ex) byte# 0        1        2          3 	    		8bit
//			0 1      2 3      4 5        6 7    		16bit
//          0 1 2    3 4 5    6 7 8      9 10 11 		24bit
//          0 1 2 3  4 5 6 7  8 9 10 11  12 13 14 15	32bit

//orgsize : byte
bool PCM_ContinuousPCM2FifoFormat_converting(unsigned int destaddr, unsigned int* destsizeByte, int destbit,
						unsigned int orgaddr, int orgsizeByte, int orgbit)
{
	unsigned char* 	pstartaddr=(unsigned char *)destaddr;
	unsigned int* pdestaddr = (unsigned int* )destaddr;
	unsigned char* porgaddr = (unsigned char* )orgaddr;
	int i;	
	bool bprint=0;

	printf("original is pcm continous format!!!\n");
	if(orgbit == 8)
	{
		printf("not yet supported\n");
		return;
	}
	
	if(orgbit == 16)
	{
		if(destbit == 24)
		{
			for(i=0; i<orgsizeByte; i+=2)
			{
				*pdestaddr = (porgaddr[i]<<8) | (porgaddr[i+1]<<16);		
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
				
			}
		}
		else
		if(destbit == 16 || destbit == 8)
		{
			for(i=0; i<orgsizeByte; i+=4)
			{
				*pdestaddr = (porgaddr[i]<<0) | (porgaddr[i+1]<<8) | (porgaddr[i+2]<<16) | (porgaddr[i+3]<<24);
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
			}
			
		}
	}
	else
	if(orgbit == 24)
	{
		if(destbit == 24)
		{
			for(i=0; i<orgsizeByte; i+=3)
			{
				*pdestaddr = (porgaddr[i]<<0) |(porgaddr[i+1]<<8) | (porgaddr[i+2]<<16);		
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
			}
		}
		else
		if(destbit == 16)
		{
			for(i=0; i<orgsizeByte; i+=6)
			{
				*pdestaddr = (porgaddr[i+1]<<0) | (porgaddr[i+2]<<8) |  (porgaddr[i+4]<<16) | (porgaddr[i+5]<<24);		
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
			}			
		}
		else
		if(destbit == 8)
		{
			for(i=0; i<orgsizeByte; i+=12)
			{
				*pdestaddr = (porgaddr[i+2]<<0) | (porgaddr[i+5]<<8) |  (porgaddr[i+8]<<16) | (porgaddr[i+11]<<24);		
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
			}			
		}
		
	}
	else
	if(orgbit == 32)
	{
		if(destbit == 24)
		{
			for(i=0; i<orgsizeByte; i+=4)
			{
				*pdestaddr = (porgaddr[i+1]<<0) | (porgaddr[i+2]<<8) | (porgaddr[i+3]<<16);
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
			}
		}			
		else
		if(destbit == 16 || destbit == 8)
		{
			for(i=0; i<orgsizeByte; i+=8)
			{
				*pdestaddr = (porgaddr[i+2]<<0) | (porgaddr[i+3]<<8) |  (porgaddr[i+6]<<16) | (porgaddr[i+7]<<24);		
				pdestaddr++;
				if(bprint)printf("%x : %x\n", pdestaddr, *pdestaddr);
			}			
		}
	}	
	
	*destsizeByte = (unsigned int)((unsigned char* )pdestaddr - (unsigned char* )pstartaddr);		
	
	printf("Converting from %d bit(size:0x%x-%d byte) to %d bit(size:0x%x %dbyte) is finished\n",
			orgbit, orgsizeByte, orgsizeByte, destbit, *destsizeByte, *destsizeByte);
	
	return 1;
}


//pcm : little endian continous format => little endian fifo format(2byte, 4byte seperated format) 
// converting and copy
//          L         R        L          R 
//ex) byte# 0 1      2 3      4 5        6 7    		16bit
//          0 1 2    3 4 5    6 7 8      9 10 11 		24bit
//          0 1 2 3  4 5 6 7  8 9 10 11  12 13 14 15	32bit

//orgsize : byte
bool PCM_Resampling(unsigned int destaddr, unsigned int* destsizeByte, unsigned int destSamplerate,
						unsigned int orgaddr, int orgsizeByte, unsigned int orgSamplerate, int orgbit)
{
	unsigned char* 	pstartaddr=(unsigned char *)destaddr;
	unsigned int* pdestaddr = (unsigned int* )destaddr;
	unsigned short int* pdestaddrHalf = (unsigned short int* )destaddr;
	unsigned int* porgaddr = (unsigned int* )orgaddr;
	int i;	
	unsigned int  orgsizeWord = orgsizeByte/4;
	unsigned int  orgsizeHalfWord = orgsizeByte/2;
	unsigned int  downsampleratio;
	
	//
	if(destSamplerate == orgSamplerate) 
	{
		printf("same sampling rate, return\n");
		return;		
	}
	
	//downsampling
	downsampleratio = orgSamplerate / destSamplerate;
	if(downsampleratio<1) 
	{
		printf("downsampling is supported, \n");
		return;
	}
	
	if(orgSamplerate==96000 && destSamplerate ==64000 && orgbit==24)
		return PCM_Resampling96to64(destaddr, destsizeByte, orgaddr, orgsizeByte);
	
	if(downsampleratio * destSamplerate != orgSamplerate)
	{
		printf("please choose destSamplerate as a propotional of orgsamplerate(%d)\n", orgSamplerate );
		return;
	}
	
	if(orgbit == 16)
	{
		for(i=0; i<orgsizeWord; i+=downsampleratio)
		{
			*pdestaddr = porgaddr[i];
			pdestaddr++;
		}
	}
	else
	if(orgbit == 24)
	{
		for(i=0; i<orgsizeWord; i+=2*downsampleratio)
		{
			*pdestaddr = porgaddr[i];
			pdestaddr++;
			*pdestaddr = porgaddr[i+1];
			pdestaddr++;
		}
	}
	else	
	if(orgbit == 8)
	{
		for(i=0; i<orgsizeHalfWord; i+=downsampleratio )
		{
			*pdestaddrHalf = porgaddr[i];
			pdestaddrHalf++;
		}
	}	
	
	if(orgbit == 16 || orgbit == 24)
		*destsizeByte = (unsigned int)((unsigned char* )pdestaddr - (unsigned char* )pstartaddr);		
	else
		*destsizeByte = (unsigned int)((unsigned char* )pdestaddrHalf - (unsigned char* )pstartaddr);		
	
	printf("Resampling %d bit from %d Hz(size:0x%x - %dbyte) to %d Hz(size:0x%x - %d byte) is finished\n",
			orgbit, orgSamplerate, orgsizeByte, orgsizeByte, destSamplerate, *destsizeByte, *destsizeByte);
	
	return 1;
}

bool PCM_Resampling96to64(unsigned int destaddr, unsigned int* destsizeByte, 
						unsigned int orgaddr, int orgsizeByte)
{
	unsigned char* 	pstartaddr=(unsigned char *)destaddr;
	unsigned int* pdestaddr = (unsigned int* )destaddr;
	unsigned int* porgaddr = (unsigned int* )orgaddr;
	int i;	
	unsigned int  orgsizeWord = (orgsizeByte-orgsizeByte%6)/4;
	unsigned int  downsampleratio;


	unsigned int 	destSamplerate=64000;
	unsigned int 	orgSamplerate=96000;
	int 			orgbit=24;

	int 			unitcnt;//0,1,2
	
	unitcnt=0;
	for(i=0; i<orgsizeWord; i+=2)
	{
		if(unitcnt!=2)
		{
			*pdestaddr = porgaddr[i];
			pdestaddr++;
			*pdestaddr = porgaddr[i+1];
			pdestaddr++;
			
		}		
		unitcnt = (unitcnt>=2)? 0 : unitcnt+1;
	}

	
	*destsizeByte = (unsigned int)((unsigned char* )pdestaddr - (unsigned char* )pstartaddr);		
	
	printf("Resampling %d bit from %d Hz(size:0x%x) to %d Hz(size:0x%x) is finished\n",
			orgbit, orgSamplerate, orgsizeByte, destSamplerate, *destsizeByte);
	
	return 1;
}



//end of file

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -