void af_resample_api_normal(char *buffer, unsigned int *size,int Chnum, aml_audio_dec_t *audec) { int len; int resample_enable; af_resampe_ctl_t *paf_resampe_ctl; short data_in[MAX_NUMSAMPS_PERCH*DEFALT_NUMCH], *data_out; short outbuftmp16[MAX_NUMSAMPS_PERCH*DEFALT_NUMCH]; int NumSamp_in,NumSamp_out,NumCh,NumSampRequir=0; static int print_flag=0; int outbuf_offset=0; int dsp_format_changed_flag=0; static int pcm_left_len=-1; //------------------------------------------ NumCh=Chnum;//buffer->channelCount; resample_enable= af_get_resample_enable_flag(); paf_resampe_ctl=af_resampler_ctx_get(); data_out=date_temp;//buffer->i16 NumSamp_out = *size/sizeof(short);//buffer->size/sizeof(short); if(NumSamp_out>MAXCH_NUMBER*MAXFRAMESIZE) NumSamp_out=MAXCH_NUMBER*MAXFRAMESIZE; NumSampRequir=NumSamp_out; int resample_type=af_get_resample_type(); //adec_print("REQURE_NUM-----------------------------%d\n",NumSamp_out); //------------------------------- //add this part for support rapid Resample_Type covet: if (resample_enable) { if(paf_resampe_ctl->LastResamType!=resample_type) { adec_print("ReSample Type Changed: FromTYpe/%d ToType/%d \n", paf_resampe_ctl->LastResamType,resample_type); if((paf_resampe_ctl->OutSampReserveLen==0) // to ensure phase continue: && (paf_resampe_ctl->ResevedSampsValid==0)) { adec_print("ReSample Type Changed: ENABLE"); af_resample_stop_process(paf_resampe_ctl); }else{ adec_print("ReSample Type Changed DISABLE:"); adec_print(" OutSampSaved/%d InSampSaved/%d in Resampler!", paf_resampe_ctl->OutSampReserveLen,paf_resampe_ctl->ResevedSampsValid); resample_enable=0; } } } //------------------------------- if(resample_enable){ int pcm_cnt=0; if (!paf_resampe_ctl->InitFlag) af_resample_set_SampsNumRatio(paf_resampe_ctl); af_get_pcm_in_resampler(paf_resampe_ctl,data_out+outbuf_offset,&NumSampRequir); //adec_print("RETURN_SIZE_1:%d OutSampReserve=%d \n",NumSampRequir,paf_resampe_ctl->OutSampReserveLen); outbuf_offset += NumSampRequir; NumSamp_out -= NumSampRequir; while(NumSamp_out >= DEFALT_NUMSAMPS_PERCH*NumCh) { int delta_input_sampsnum=af_get_delta_inputsampnum(paf_resampe_ctl,NumCh); NumSamp_in =dsp_pcm_read(audec,(char*)data_in,delta_input_sampsnum*sizeof(short)); af_resample_process_linear_inner(paf_resampe_ctl,data_in, &NumSamp_in,data_out+outbuf_offset,&pcm_cnt,NumCh); //adec_print("RETURN_SIZE_2:%d OutSampReserve=%d \n",pcm_cnt,paf_resampe_ctl->OutSampReserveLen); if(pcm_cnt==0) goto resample_out; outbuf_offset += pcm_cnt; NumSamp_out -= pcm_cnt; } if(NumSamp_out>0) { int delta_input_sampsnum=af_get_delta_inputsampnum(paf_resampe_ctl,NumCh); NumSamp_in =dsp_pcm_read(audec,(char*)data_in,delta_input_sampsnum*sizeof(short)); af_resample_process_linear_inner(paf_resampe_ctl,data_in, &NumSamp_in,outbuftmp16,&pcm_cnt,NumCh); if(pcm_cnt==0) goto resample_out; //adec_print("RETURN_SIZE_3:%d OutSampReserve=%d \n",NumSamp_out,pcm_cnt-NumSamp_out); memcpy(data_out+outbuf_offset,outbuftmp16,NumSamp_out*sizeof(short)); outbuf_offset +=NumSamp_out; memcpy(paf_resampe_ctl->OutSampReserveBuf,outbuftmp16+NumSamp_out,(pcm_cnt-NumSamp_out)*sizeof(short)); paf_resampe_ctl->OutSampReserveLen = (pcm_cnt-NumSamp_out); } }else{ if(paf_resampe_ctl->OutSampReserveLen > 0){ af_get_pcm_in_resampler(paf_resampe_ctl,data_out+outbuf_offset,&NumSampRequir); //adec_print("RETURN_SIZE_4:%d OutSampReserve=%d \n",NumSampRequir,paf_resampe_ctl->OutSampReserveLen); outbuf_offset += NumSampRequir; NumSamp_out -= NumSampRequir; NumSampRequir = NumSamp_out; } if(paf_resampe_ctl->ResevedSampsValid > 0){ af_get_unpro_inputsampnum(paf_resampe_ctl,data_out+outbuf_offset,&NumSampRequir); //adec_print("RETURN_SIZE_5:%d OutSampReserve=%d \n",NumSampRequir,paf_resampe_ctl->ResevedSampsValid); outbuf_offset += NumSampRequir; NumSamp_out -= NumSampRequir; } if((paf_resampe_ctl->OutSampReserveLen==0) && (paf_resampe_ctl->ResevedSampsValid==0)) af_resample_stop_process(paf_resampe_ctl); if(NumSamp_out > 0){ len=audec->adsp_ops.dsp_read(&audec->adsp_ops, (char*)(data_out+outbuf_offset),NumSamp_out*sizeof(short)); outbuf_offset += len/sizeof(short); audec->pcm_bytes_readed +=len; } } resample_out: *size=outbuf_offset*sizeof(short); memcpy(buffer,data_out,*size); //------------------------------------ dsp_format_changed_flag=audiodsp_format_update(audec); if(dsp_format_changed_flag>0){ pcm_left_len=audiodsp_get_pcm_left_len(); } if(pcm_left_len>=0){ if(pcm_left_len>(*size)){ pcm_left_len-=(*size); memset((char*)(data_out),0,*size); }else if(pcm_left_len<=(*size)){ memset((char*)(data_out),0,pcm_left_len); pcm_left_len=-1; } } //dump_pcm_bin("/data/post1.pcm",(char*)(buffer->i16),buffer->size); //--------------------------------------------- }
void audioCallback(int event, void* user, void *info) { int len; AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); aml_audio_dec_t *audec = static_cast<aml_audio_dec_t *>(user); int resample_enable; af_resampe_ctl_t *paf_resampe_ctl; short data_in[MAX_NUMSAMPS_PERCH*DEFALT_NUMCH], *data_out; short outbuftmp16[MAX_NUMSAMPS_PERCH*DEFALT_NUMCH]; int NumSamp_in,NumSamp_out,NumCh,NumSampRequir=0; static int print_flag=0; int outbuf_offset=0; int dsp_format_changed_flag=0; static int pcm_left_len=-1; if (event != AudioTrack::EVENT_MORE_DATA) { adec_print("audioCallback: event = %d \n", event); return; } if (buffer == NULL || buffer->size == 0) { adec_print("audioCallback: Wrong buffer\n"); return; } adec_refresh_pts(audec); if (audec->adsp_ops.dsp_on) { //------------------------------------------ NumCh=buffer->channelCount; resample_enable= af_get_reample_enable_flag(); paf_resampe_ctl=af_resampler_ctx_get(); data_out=buffer->i16; NumSamp_out = buffer->size/sizeof(short); NumSampRequir=NumSamp_out; //adec_print("resample_enable = %d\n",resample_enable); //adec_print("REQURE_NUM-----------------------------%d\n",NumSamp_out); //adec_print("PCM_IN_OUTSAMPBUF:%d\n",paf_resampe_ctl->OutSampReserveLen); if(resample_enable){ int pcm_cnt=0; if (!paf_resampe_ctl->InitFlag) af_resample_set_SampsNumRatio(paf_resampe_ctl); af_get_pcm_in_resampler(paf_resampe_ctl,data_out+outbuf_offset,&NumSampRequir); //adec_print("RETURN_SIZE_1:%d OutSampReserve=%d \n",NumSampRequir,paf_resampe_ctl->OutSampReserveLen); outbuf_offset += NumSampRequir; NumSamp_out -= NumSampRequir; while(NumSamp_out >= DEFALT_NUMSAMPS_PERCH*NumCh) { int delta_input_sampsnum=af_get_delta_inputsampnum(paf_resampe_ctl,NumCh); NumSamp_in =dsp_pcm_read(audec,(char*)data_in,delta_input_sampsnum*sizeof(short)); af_resample_process_linear_inner(paf_resampe_ctl,data_in, &NumSamp_in,data_out+outbuf_offset,&pcm_cnt,NumCh); //adec_print("RETURN_SIZE_2:%d OutSampReserve=%d \n",pcm_cnt,paf_resampe_ctl->OutSampReserveLen); if(pcm_cnt==0) goto resample_out; outbuf_offset += pcm_cnt; NumSamp_out -= pcm_cnt; } if(NumSamp_out>0) { int delta_input_sampsnum=af_get_delta_inputsampnum(paf_resampe_ctl,NumCh); NumSamp_in =dsp_pcm_read(audec,(char*)data_in,delta_input_sampsnum*sizeof(short)); af_resample_process_linear_inner(paf_resampe_ctl,data_in, &NumSamp_in,outbuftmp16,&pcm_cnt,NumCh); if(pcm_cnt==0) goto resample_out; //adec_print("RETURN_SIZE_3:%d OutSampReserve=%d \n",NumSamp_out,pcm_cnt-NumSamp_out); memcpy(data_out+outbuf_offset,outbuftmp16,NumSamp_out*sizeof(short)); outbuf_offset +=NumSamp_out; memcpy(paf_resampe_ctl->OutSampReserveBuf,outbuftmp16+NumSamp_out,(pcm_cnt-NumSamp_out)*sizeof(short)); paf_resampe_ctl->OutSampReserveLen = (pcm_cnt-NumSamp_out); } }else{ if(paf_resampe_ctl->OutSampReserveLen > 0){ af_get_pcm_in_resampler(paf_resampe_ctl,data_out+outbuf_offset,&NumSampRequir); //adec_print("RETURN_SIZE_4:%d OutSampReserve=%d \n",NumSampRequir,paf_resampe_ctl->OutSampReserveLen); outbuf_offset += NumSampRequir; NumSamp_out -= NumSampRequir; NumSampRequir = NumSamp_out; } if(paf_resampe_ctl->ResevedSampsValid > 0){ af_get_unpro_inputsampnum(paf_resampe_ctl,data_out+outbuf_offset,&NumSampRequir); //adec_print("RETURN_SIZE_5:%d OutSampReserve=%d \n",NumSampRequir,paf_resampe_ctl->ResevedSampsValid); outbuf_offset += NumSampRequir; NumSamp_out -= NumSampRequir; } if((paf_resampe_ctl->OutSampReserveLen==0) && (paf_resampe_ctl->ResevedSampsValid==0)) af_resample_stop_process(paf_resampe_ctl); if(NumSamp_out > 0){ len=audec->adsp_ops.dsp_read(&audec->adsp_ops, (char*)(data_out+outbuf_offset),NumSamp_out*sizeof(short)); outbuf_offset += len/sizeof(short); } } resample_out: buffer->size=outbuf_offset*sizeof(short); //------------------------------------ dsp_format_changed_flag=audiodsp_format_update(audec); if(dsp_format_changed_flag>0){ pcm_left_len=audiodsp_get_pcm_left_len(); //audiodsp_set_format_changed_flag(1); } if(pcm_left_len>=0){ if(pcm_left_len>buffer->size){ pcm_left_len-=buffer->size; memset((char*)(data_out),0,buffer->size); }else if(pcm_left_len<=buffer->size){ memset((char*)(data_out),0,pcm_left_len); pcm_left_len=-1; //adec_reset_track(audec); } } //--------------------------------------------- } else { adec_print("audioCallback: dsp not work!\n"); } return; }
void af_resample_process_linear_inner(af_resampe_ctl_t *paf_resampe_ctl,short *data_in, int *NumSamp_in,short* data_out,int* NumSamp_out,int NumCh) { int index,ChId; int NumSampsPerCh_in=(*NumSamp_in)/NumCh; int NumSampsPerCh_Pre=paf_resampe_ctl->ResevedSampsValid/NumCh; int NumSampsPerCh_out; short buf16_in[MAX_NUMSAMPS_PERCH]; short buf16_in_valid; short *pPreSamps=paf_resampe_ctl->ResevedBuf; short *pindex=paf_resampe_ctl->InterpolateIndexArray; int *pcoef=paf_resampe_ctl->InterpolateCoefArray; int input_offset=0,output_offset=0; int cur_out_samp_reserve_num=0; if (!paf_resampe_ctl->InitFlag) { af_resample_set_SampsNumRatio(paf_resampe_ctl); } //indecate at the end of pcm stream if( NumSampsPerCh_Pre + NumSampsPerCh_in < paf_resampe_ctl->SampNumIn ){ memcpy(pPreSamps+paf_resampe_ctl->ResevedSampsValid,data_in,(*NumSamp_in)*sizeof(short)); paf_resampe_ctl->ResevedSampsValid += (*NumSamp_in); //memcpy(data_out,paf_resampe_ctl->ResevedBuf,paf_resampe_ctl->ResevedSampsValid); //*NumSamp_out=paf_resampe_ctl->ResevedSampsValid; *NumSamp_out=0; }else{ int NumSampsPerCh_Rest=NumSampsPerCh_Pre + NumSampsPerCh_in -paf_resampe_ctl->SampNumIn; input_offset +=(paf_resampe_ctl->SampNumIn-NumSampsPerCh_Pre)*NumCh; output_offset+= paf_resampe_ctl->OutSampReserveLen; memcpy(pPreSamps+paf_resampe_ctl->ResevedSampsValid,data_in,sizeof(short)*input_offset); memcpy(data_out,paf_resampe_ctl->OutSampReserveBuf,sizeof(short)*paf_resampe_ctl->OutSampReserveLen); buf16_in_valid=paf_resampe_ctl->SampNumIn; for(ChId=0;ChId<NumCh;ChId++) { for(index=0;index<buf16_in_valid;index++) buf16_in[index]= pPreSamps[NumCh*index+ChId]; for(index=0;index<paf_resampe_ctl->SampNumOut-1;index++) { int pos=pindex[index]; short t16; t16 =buf16_in[pos]+Q14_INT_GET((pcoef[index]*(buf16_in[pos+1]-buf16_in[pos]))); data_out[output_offset+NumCh*index+ChId]=t16; } data_out[output_offset+NumCh*(paf_resampe_ctl->SampNumOut-1)+ChId]=buf16_in[buf16_in_valid-1]; } output_offset +=paf_resampe_ctl->SampNumOut*NumCh; paf_resampe_ctl->ResevedSampsValid = 0; while(NumSampsPerCh_Rest > paf_resampe_ctl->SampNumIn) { buf16_in_valid=paf_resampe_ctl->SampNumIn; for(ChId=0;ChId<NumCh;ChId++) { for(index=0;index<buf16_in_valid;index++) buf16_in[index]= data_in[input_offset+NumCh*index+ChId]; for(index=0;index<paf_resampe_ctl->SampNumOut-1;index++) { int pos=pindex[index]; short t16; t16 =buf16_in[pos]+Q14_INT_GET(((int64_t)pcoef[index]*(buf16_in[pos+1]-buf16_in[pos]))); data_out[output_offset+NumCh*index+ChId]=t16; } data_out[output_offset+NumCh*(paf_resampe_ctl->SampNumOut-1)+ChId]=buf16_in[buf16_in_valid-1]; } NumSampsPerCh_Rest -= paf_resampe_ctl->SampNumIn; input_offset +=paf_resampe_ctl->SampNumIn*NumCh; output_offset +=paf_resampe_ctl->SampNumOut*NumCh; } cur_out_samp_reserve_num = output_offset%(DEFALT_NUMSAMPS_PERCH*NumCh) ; paf_resampe_ctl->OutSampReserveLen = cur_out_samp_reserve_num; memcpy(paf_resampe_ctl->OutSampReserveBuf, data_out+output_offset-cur_out_samp_reserve_num, sizeof(short)*cur_out_samp_reserve_num); *NumSamp_out=output_offset-cur_out_samp_reserve_num; if(input_offset< (*NumSamp_in)){ memcpy(pPreSamps,data_in+input_offset,sizeof(short)*NumSampsPerCh_Rest*NumCh); paf_resampe_ctl->ResevedSampsValid=NumSampsPerCh_Rest*NumCh; }else{ paf_resampe_ctl->ResevedSampsValid=0; } } }