Example #1
0
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;
}
Example #3
0
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;
         }
    }
}