//-------------------------------------------------
// 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);
}
// 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);
}