📄 echo.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"
/********************************************************************************/
#define AUDIOTRY 0xAA0A//音频试听
#define AUDIOECHO 0xAA08//音频回声
//实验操控:
//选择TESTCOMMAND,1为试听;2为和声。
//选择CODECAGAIN,48-127之间。是调整增益的参数。
//最好在110-127之间,否则声音太小,难以听到。
#define TESTCOMMAND 2 //操作命令选择
unsigned int Command =0;
/********************************************************************************/
/*数据缓冲区的首址为0x8000,长度为0x8000*/
#pragma DATA_SECTION(DataBuffer,".Audio_data");
short DataBuffer[0x8000];
/////////////////////////////////////////////////////////////////////
HANDLE codec_command =0;
HANDLE codec_data=0;
/////////////////////////////////////////////////////////////////////
unsigned int audioleft,audioright;
/*********************************************************************/
void echo();
/*********************************************************************/
main()
{
/*设置系统时钟*/
sys_clk(CLK160);
#if TESTCOMMAND==1
Command =AUDIOTRY;//试听 0xAA0A
#endif
#if TESTCOMMAND==2
Command =AUDIOECHO;//回声 0xAA08
#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:
while (!MCBSP_RRDY(CODEC_DATA)) {};
audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
while (!MCBSP_RRDY(CODEC_DATA)) {};
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;
/*音频和声*/
case AUDIOECHO:
echo();
break;
default:
break;
}
}
}
/***********************************************************************************/
/*函数名:echo() */
/* 描述: */
/* 使输入的音频具有合唱的效果 */
/* 输入参数: */
/* int freq : chorus's speed */
/* int decay : chorus's deepth */
/* 返回值 : */
/* none */
/***********************************************************************************/
void echo()
{
short uDelay=256,uEffect=256;
short nWork,nWork1;
int lpWork1;
int lpWork;
int luWork,luWork1;
short fWork,fWork1;
short nLoop ;
lpWork=0;
luWork=0;
uEffect%=1024; // 保证输入在0-1023之间
uDelay%=1024; // 保证输入在0-1023之间
nLoop = 100;
nLoop *= uDelay;
for ( luWork1=0;luWork1<0x8000;luWork1++ )
DataBuffer[luWork1] =0;
do
{
while (!MCBSP_RRDY(CODEC_DATA)) {};
audioleft = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
while (!MCBSP_RRDY(CODEC_DATA)) {};
nWork = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
// 保存到缓冲区
DataBuffer[lpWork] =nWork;
luWork1=luWork-nLoop;
if ( luWork1<0 )
luWork1+=0x48000;
lpWork1 = 0;
lpWork1 += luWork1; // 根据uDelay参数计算
nWork1 = DataBuffer[lpWork1]; // 取得保存的音频数据
nWork1 /= 512;
nWork1 *= uEffect;
nWork += nWork1; // 与当前声音混响
while (!MCBSP_XRDY(CODEC_DATA)) {};
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = nWork;
while (!MCBSP_XRDY(CODEC_DATA)) {};
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = nWork;
luWork++;
lpWork++; // 循环使用缓冲区
if ( luWork>=0x8000 )
{
luWork=0;
lpWork=0;
}
}
while(Command==0xaa08);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -