📄 echo.c
字号:
/////////////////////////////////////////////////
// Example For ICETEK-VC5416-EDU //
// CTR Version : V4 //
// Filename: Echo.c //
// Project : Echo.pjt //
// Version : 2.00 //
// Write by: Daniel Hawk //
// Company : Realtimedsp Co.Ltd. //
// //
// All Rights opened & no Onus 2005.06 //
/////////////////////////////////////////////////
#include "myapp.h"
int ioport port8000;
int ioport port3002;
ioport unsigned int port3005;
#define DataBuffSize 8192 // 设置缓冲区大小
#define DELAYTIME 6134
int iLeftIn [DataBuffSize]; // 设置左声道输入缓冲区
int iTempBuff[DataBuffSize];
int nTime,nTime1,nCount;
unsigned int bEcho=0,bCodec=0;
unsigned int G711ALawEncode(int nLeft,int nRight);
unsigned char IntToALaw(int nInput);
int ALawToInt(unsigned char nInput);
void main( void )
{
long int i,k;
port3005=1;
initCLK(CPU_SPEED_160M);
initMcBSP1();
initAIC23();
initMcBSP0();
nCount=DELAYTIME;
nTime1=DELAYTIME/2;
nTime=0;
// 缓冲区初始化
for(i=0;i<DataBuffSize;i++)
{
iLeftIn[i]=0;
iTempBuff[i]=0;
}
initInterrupt();
port8000=0;
port8000=0x8888;
port8000=0;
bEcho=0;
for(;;)
{
}
}
interrupt void rxData( void )
{
int i,j;
int left, right;
unsigned int uWork;
unsigned char cWork;
i=DRR10;
j=DRR20;
left=i;
right=j;
// iLeftIn[nCount]=i;
// 回声效果,2级回声
// DXR10=i;
if(bEcho)
{
if ( bCodec )
{
uWork=G711ALawEncode(left,right);
iLeftIn[nCount]=uWork;
cWork=uWork>>8;
left=ALawToInt(cWork);
cWork=uWork&0x0ff;
right=ALawToInt(cWork);
}
// iTempBuff[nCount]=iLeftIn[nCount]/2+
// iLeftIn[nTime1]/4 +
// iLeftIn[nTime]/4;
DXR10=i;
DXR20=right;
}
else
DXR20=j;
DXR10=i;
}
unsigned int G711ALawEncode(int nLeft,int nRight)
{
unsigned char cL,cR;
unsigned int uWork;
cL=IntToALaw(nLeft);
cR=IntToALaw(nRight);
uWork=cL; uWork<<=8; uWork|=cR;
return(uWork);
}
unsigned char IntToALaw(int nInput)
{
char segment;
unsigned int i, sign,quant;
unsigned int absol, temp;
int nOutput;
unsigned char cOutput;
temp=absol=abs(nInput);
sign=(nInput >= 0)?1:0;
for(i=0;i<16;i++){
nOutput=temp&0x8000;
if(nOutput)break;
temp<<=1;
}
segment=11-i;
if(segment<=0){
segment=0;
quant=(absol>>1)&0x0F;
}
else
quant=(absol>>segment)&0x0F;
segment<<=4;
nOutput=segment+quant;
if(absol>4095) nOutput=0x7F;
if(sign)
nOutput^=0xD5;
else
nOutput^=0x55;
cOutput=(unsigned char)nOutput;
return cOutput;
}
int ALawToInt(unsigned char nInput)
{
int sign, segment;
int temp, quant,nOutput;
temp=nInput^0xD5;
sign=(temp&0x80)>>7;
segment=(temp&0x70)>>4;
quant=temp&0x0F;
quant<<=1;
if(!segment)
quant+=1;
else{
quant+=33;
quant<<=segment-1;
}
if ( sign )
nOutput=-quant;
else
nOutput=quant;
return nOutput;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -