uC/OS下应用程序例子

//-------------------------------------------------

 


// PCM Player with Real time AMR Codec decode
//
// Useing uCOS-II to build this applications
//
// Author : XXC
//
// Target chip : Sieko Epson S1C333209
//
// Version : 1.0.0



//
//
// Shannxi MicroVantech Corp.
//
// (c) 2004 Copyright by XXC
//
// All Rights Reserved
//
//
///


#include "includes.h" // For OS
#include "amrglobal.h" // For AMR Codec
#include "dec_com.h" // For AMR decode


#define TASK_STK_SIZE 512

#define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5)

void TimerTask( void* data ); // Initlize task,only run once

void PlayTask( void* pdata ); // Preplay task,use for filling play buffer
// with first time and start playing.
void WorkTask1( void* pdata ); // Background task. use for filling play date
// when the DAC finished played the dates.

void Amr_Speech_Decode_Proc(short *en475_buf, short *synth);
extern const char en475_buf[];

OS_STK TimerStk[TASK_STK_SIZE];
OS_STK PlayStk[TASK_STK_SIZE];
OS_STK WorkStk1[TASK_STK_SIZE];

void main()
{
OSInit();
OSTaskCreate(TimerTask,(void*)0,&TimerStk[TASK_STK_SIZE - 1],5);
OSTaskCreate(PlayTask,(void*)0,&PlayStk[TASK_STK_SIZE - 1],7);
OSTaskCreate(WorkTask1,(void*)0,&WorkStk1[TASK_STK_SIZE - 1],9);
OSStart();

}

void TimerTask( void *pdata )
{

pdata = pdata;

OS_ENTER_CRITICAL();

*((INT8U*)0x48205) = 0;
*((INT32U*)0x48200) = IDMA_START_ADDRESS;
*((INT8U*)0x48205) = 1;
DACD_Initialize();
DACD_SetSamplingMode(8000, 1, 16);
DACD_SetHeadphoneVolume(60, 60);

OS_EXIT_CRITICAL();

stop_16timer( T16P_PRUN1_ADDR );
init_16timer1();
run_16timer( T16P_PRUN1_ADDR );

OSTaskSuspend(9);
OSTaskSuspend(5); //Switch to play task
}

void PlayTask( void* pdata )
{
INT32U i;
INT8U j;
INT16U index;
INT8U* pBuf;
INT16U* serial = (INT16U*)en475_buf;
pdata = pdata;
for(;;)
{
Speech_Decode_Frame_init();
i=0;
j = 1;
run_16timer( T16P_PRUN1_ADDR );
while( i < 8 )
{
pBuf = DACD_GetNextBuffer();
if( pBuf != 0)
{
stop_16timer( T16P_PRUN1_ADDR );
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf);
i++;
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf+160);
i++;
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf+320);
i++;
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf+480);
i++;
pBuf = DACD_Acknowledge(640);
run_16timer( T16P_PRUN1_ADDR );
OSTimeDly(1);
}
}
DACD_StartPlay();
OSTaskResume(9);
OSTaskSuspend(7);
}
}

void WorkTask1( void* pdata )
{
INT32U i;
INT16U index;
INT8U* pBuf;
INT16U* serial = (INT16U*)en475_buf;

pdata = pdata;
for(;;)
{
i = 8;
while(i<FRAMESUM)
{
pBuf = DACD_GetNextBuffer();
if( pBuf != 0 )
{
stop_16timer( T16P_PRUN1_ADDR );
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf);
i++;
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf+160);
i++;
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf+320);
i++;
Amr_Speech_Decode_Proc(serial+i*SERIAL_FRAMESIZE, (short *)pBuf+480);
i++;
pBuf = DACD_Acknowledge(640);
run_16timer( T16P_PRUN1_ADDR );
}
OSTimeDly(1);
}
OSTaskResume(7);
}
}

void Amr_Speech_Decode_Proc(short *en475_buf, short *synth)
{
INT16U param[MAX_PRM_SIZE+1]={0};
Word16 Az_dec[AZ_SIZE];

Bits2prm(en475_buf+1, param);
Decoder_amr(&g_decoder_amrState, &g_ec_gain_p_st, &g_ec_gain_c_st, param, synth, Az_dec);
Post_Filter(&(g_post_state.synth_buf[M]), g_post_state.res2, g_post_state.mem_syn_pst, synth, Az_dec);
Post_Process(synth, &g_postHP_state);
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值