📄 audiolibrary.c
字号:
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 + -