📄 pcm.c
字号:
/* */
/* Copyright 2004 by SEED Electronic Technology LTD. */
/* All rights reserved. SEED Electronic Technology LTD. */
/* Restricted rights to use, duplicate or disclose this code are */
/* granted through contract. */
/* */
/* Authors: david */
/* Data: 2006/10/28 */
/********************************************************************************/
#include "type.h"
#include "codec.h"
#include "sysreg.h"
#include "mcbsp54.h"
#include "memory.h"
/********************************************************************************/
/*数据缓冲区的首址为0x8000,长度为0x8000*/
#define AUDIODATA 0x8000
/********************************************************************************/
#define AUDIOTRY 0xAA0A//音频试听
#define AUDIOPCM 0xAA09//音频PCM
//实验操控:
//选择TESTCOMMAND,1为试听;2为和声。
//选择CODECAGAIN,48-127之间。是调整增益的参数。
//最好在110-127之间,否则声音太小,难以听到。
#define TESTCOMMAND 2 //操作命令选择
unsigned int Command =0;
/////////////////////////////////////////////////////////////////////
HANDLE codec_command =0;
HANDLE codec_data=0;
/////////////////////////////////////////////////////////////////////
int audioleft, audioright;
unsigned int i= 0;
/*********************************************************************/
void pcm();
/*********************************************************************/
main()
{
/*设置系统时钟*/
sys_clk(CLK160);
#if TESTCOMMAND==1
Command =AUDIOTRY;//试听 0xAA0A
#endif
#if TESTCOMMAND==2
Command =AUDIOPCM;//PCM 0xAA09
#endif
/*打开codec数据接口*/
codec_data = codec_open(CODEC_DATA);
/*打开codec命令接口*/
codec_command = codec_open(CODEC_COMMAND);
/*选择麦克风作为输入 0x14,选择Line in作为输入 0x12*/
codec_analog_mode(codec_command,0x12);
/*设置波特率,输入与输出均为8K*/
codec_sample_rate(codec_command,0xd);
/*配置系统存储器*/
memory_set(0x80);
//设置增益
codec_headhponeout_gain(codec_command,127);
for(;;)
{
switch(Command)
{
/*音频试听*/
case AUDIOTRY:
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audioright = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
while (!MCBSP_XRDY(CODEC_DATA)) {};
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioleft;
while (!MCBSP_XRDY(CODEC_DATA)) {};
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioright;
break;
/*音频PCM*/
case AUDIOPCM:
pcm();
break;
default:
break;
}
}
}
/***********************************************************************************/
/*函数名:pcm() */
/***********************************************************************************/
void pcm()
{
int *pAudio;
int sign, segment;
int temp, quant;
char seg;
unsigned int absol, tem;
int *pWork,nAudioCount;
unsigned int uWork;
unsigned char cWork;
int output;
pAudio=pWork=(int *)AUDIODATA;
nAudioCount=0;
for ( i=0;i<1024;i++,pWork++ ) (*pWork)=0;
pWork=pAudio;
do{
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audioright= *(volatile u16*)DRR1_ADDR(CODEC_DATA);
/*取右道的数据做为运算的数据*/
tem=absol=abs(audioleft);
sign=(audioleft >= 0)?1:0;
for(i=0;i<16;i++)
{
output=tem&0x8000;
if(output)
break;
tem<<=1;
}
seg=11-i;
if(seg<=0)
{
seg=0;
quant=(absol>>1)&0x0F;
}
else
quant=(absol>>seg)&0x0F;
seg<<=4;
output=seg+quant;
if(absol>4095)
output=0x7F;
if(sign)
output^=0xD5;
else
output^=0x55;
uWork=(unsigned char)output;
/*inttoa函数完结*/
uWork<<=8;
/*以下为inttoa函数:uWork|=inttoa(right);*/
tem=absol=abs(audioright);
sign=(audioright >= 0)?1:0;
for(i=0;i<16;i++)
{
output=tem&0x8000;
if(output)
break;
tem<<=1;
}
seg=11-i;
if(seg<=0)
{
seg=0;
quant=(absol>>1)&0x0F;
}
else
quant=(absol>>seg)&0x0F;
seg<<=4;
output=seg+quant;
if(absol>4095)
output=0x7F;
if(sign)
output^=0xD5;
else
output^=0x55;
uWork|=(unsigned char)output;
/*inttoa函数完结*/
(*pWork)=uWork;
cWork=uWork>>8;
/*以下为atoint函数:left=atoint(cWork);*/
temp=cWork^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 )
audioleft=-quant;
else
audioleft=quant;
/*atoint函数完结*/
cWork=uWork&0x0ff;
/*以下为atoint函数:right=atoint(cWork); */
temp=cWork^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 )
audioright=-quant;
else
audioright=quant;
/*atoint函数完结*/
/* Wait for sample from handset */
while (!MCBSP_XRDY(CODEC_DATA)) {};
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioright;
while (!MCBSP_XRDY(CODEC_DATA)) {};
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audioleft;
nAudioCount++; pWork++;
if ( nAudioCount>=1024 )
{
nAudioCount=0;
pWork=pAudio;
}
}
while(Command==0xaa09);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -