extern "C" void va_g729a_init_decoder();//解压缩库初始化函数
extern "C" void va_g729a_decoder(unsigned char *bitstream, short *synth_short, int bfi);// 解压缩
int _stdcall InitSD878AU();//初始化音频输入
int _stdcall StarAudioIn(int ChanNum);//启动音频输入。
void _stdcall SaveAudioStream(int ChanNum,char *Aubufp,int bufsize,int AuMutFlag)//音频回调函数,每路音频采样//4800个样例, 通知应用程序处理的函数
va_g729a_encoder(short *speech, unsigned char *bitstream); //压缩编码函数,每次压缩82个16位数据 输出10 字节的压缩数据, speech是指向16位数据指针,bitstream是指向压缩数据指针,在此要注意采样数据类型char与 short *speech的转换:pin=(short*)Aubufp 即强制变成16位指针。
如一次压缩 480个16位数据的程序片段如下:
va_g729a_encoder(alldataptr, codedataptr);
// alldataptr源数据首指针,
//codedataptr 存放编码数据首指针
va_g729a_encoder(alldataptr+80, codedataptr+10);
va_g729a_encoder(alldataptr+160, codedataptr+20);
va_g729a_encoder(alldataptr+240, codedataptr+30);
va_g729a_encoder(alldataptr+320, codedataptr+40);
va_g729a_encoder(alldataptr+400, codedataptr+50);
480个16位数据压缩后变成60个字节数据。
3 编程技巧
3.1 任务调度 本程序要实时采样1---30路音频数据,要对各路采样数据实时进行分析处理,还要实时压缩音频数据, 这除了需要很高的运行速度,还要对采样、分析处理与压缩过程进行合理的调度,这里采用了线程技术,采样、分析处理过程安排在C主程序中,压缩过程安排在一个线程中,与采样、分析处理过程并行运行,这样压缩过程的运行不影响C主过程的运行,可在C主过程中启动或挂起线程。下面是有关线程函数:
|