⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dec_audio.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
    mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_CantFindAudioCodec,sh_audio->format);    mp_msg(MSGT_DECAUDIO,MSGL_HINT, MSGTR_RTFMCodecs);    return 0; // failed}mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Selected audio codec: [%s] afm:%s (%s)\n",    sh_audio->codec->name,sh_audio->codec->drv,sh_audio->codec->info);return 1; // success}void uninit_audio(sh_audio_t *sh_audio){    if(sh_audio->afilter){	mp_msg(MSGT_DECAUDIO,MSGL_V,"Uninit audio filters...\n");	af_uninit(sh_audio->afilter);	free(sh_audio->afilter);	sh_audio->afilter=NULL;    }    if(sh_audio->inited){	mp_msg(MSGT_DECAUDIO,MSGL_V,MSGTR_UninitAudioStr,sh_audio->codec->drv);	sh_audio->ad_driver->uninit(sh_audio);#ifdef DYNAMIC_PLUGINS	if (sh_audio->dec_handle)	    dlclose(sh_audio->dec_handle);#endif	sh_audio->inited=0;    }    if(sh_audio->a_out_buffer!=sh_audio->a_buffer) free(sh_audio->a_out_buffer);    sh_audio->a_out_buffer=NULL;    if(sh_audio->a_buffer) free(sh_audio->a_buffer);    sh_audio->a_buffer=NULL;    if(sh_audio->a_in_buffer) free(sh_audio->a_in_buffer);    sh_audio->a_in_buffer=NULL;} /* Init audio filters */int preinit_audio_filters(sh_audio_t *sh_audio, 	int in_samplerate, int in_channels, int in_format,	int* out_samplerate, int* out_channels, int* out_format){  af_stream_t* afs=malloc(sizeof(af_stream_t));  memset(afs,0,sizeof(af_stream_t));  // input format: same as codec's output format:  afs->input.rate   = in_samplerate;  afs->input.nch    = in_channels;  afs->input.format = in_format;  af_fix_parameters(&(afs->input));  // output format: same as ao driver's input format (if missing, fallback to input)  afs->output.rate   = *out_samplerate ? *out_samplerate : afs->input.rate;  afs->output.nch    = *out_channels ? *out_channels : afs->input.nch;  afs->output.format = *out_format ? *out_format : afs->input.format;  af_fix_parameters(&(afs->output));  // filter config:    memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t));    mp_msg(MSGT_DECAUDIO, MSGL_INFO, "Checking audio filter chain for %dHz/%dch/%s -> %dHz/%dch/%s...\n",      afs->input.rate,afs->input.nch,af_fmt2str_short(afs->input.format),      afs->output.rate,afs->output.nch,af_fmt2str_short(afs->output.format));    // let's autoprobe it!  if(0 != af_init(afs,0)){    free(afs);    return 0; // failed :(  }    *out_samplerate=afs->output.rate;  *out_channels=afs->output.nch;  *out_format=afs->output.format;  mp_msg(MSGT_DECAUDIO, MSGL_INFO, "AF_pre: %dHz/%dch/%s\n",      afs->output.rate, afs->output.nch,      af_fmt2str_short(afs->output.format));    sh_audio->afilter=(void*)afs;  return 1;} /* Init audio filters */int init_audio_filters(sh_audio_t *sh_audio, 	int in_samplerate, int in_channels, int in_format,	int out_samplerate, int out_channels, int out_format,	int out_minsize, int out_maxsize){  af_stream_t* afs=sh_audio->afilter;  if(!afs){    afs = (af_stream_t*)malloc(sizeof(af_stream_t));    memset(afs,0,sizeof(af_stream_t));  }  // input format: same as codec's output format:  afs->input.rate   = in_samplerate;  afs->input.nch    = in_channels;  afs->input.format = in_format;  af_fix_parameters(&(afs->input));  // output format: same as ao driver's input format (if missing, fallback to input)  afs->output.rate   = out_samplerate ? out_samplerate : afs->input.rate;  afs->output.nch    = out_channels ? out_channels : afs->input.nch;  afs->output.format = out_format ? out_format : afs->input.format;  af_fix_parameters(&(afs->output));  // filter config:    memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t));    mp_msg(MSGT_DECAUDIO, MSGL_INFO, "Building audio filter chain for %dHz/%dch/%s -> %dHz/%dch/%s...\n",      afs->input.rate,afs->input.nch,af_fmt2str_short(afs->input.format),      afs->output.rate,afs->output.nch,af_fmt2str_short(afs->output.format));    // let's autoprobe it!  if(0 != af_init(afs,1)){    sh_audio->afilter=NULL;    free(afs);    return 0; // failed :(  }    // allocate the a_out_* buffers:  if(out_maxsize<out_minsize) out_maxsize=out_minsize;  if(out_maxsize<8192) out_maxsize=MAX_OUTBURST; // not sure this is ok  sh_audio->a_out_buffer_size=out_maxsize;  sh_audio->a_out_buffer=malloc(sh_audio->a_out_buffer_size);  memset(sh_audio->a_out_buffer,0,sh_audio->a_out_buffer_size);  sh_audio->a_out_buffer_len=0;    // ok!  sh_audio->afilter=(void*)afs;  return 1;}int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){  int declen;  af_data_t  afd;  // filter input  af_data_t* pafd; // filter output  ad_functions_t* mpadec = sh_audio->ad_driver;  if(!sh_audio->inited) return -1; // no codec  if(!sh_audio->afilter){      // no filter, just decode:      // FIXME: don't drop initial decoded data in a_buffer!      return mpadec->decode_audio(sh_audio,buf,minlen,maxlen);  }  //  declen=af_inputlen(sh_audio->afilter,minlen);  declen=af_calc_insize_constrained(sh_audio->afilter,minlen,maxlen,      sh_audio->a_buffer_size-sh_audio->audio_out_minsize);  mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"\ndecaudio: minlen=%d maxlen=%d declen=%d (max=%d)\n",      minlen, maxlen, declen, sh_audio->a_buffer_size);  if(declen<=0) return -1; // error!  // limit declen to buffer size: - DONE by af_calc_insize_constrained//  if(declen>sh_audio->a_buffer_size) declen=sh_audio->a_buffer_size;  // decode if needed:  while(declen>sh_audio->a_buffer_len){      int len=declen-sh_audio->a_buffer_len;      int maxlen=sh_audio->a_buffer_size-sh_audio->a_buffer_len;      mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"decaudio: decoding %d bytes, max: %d (%d)\n",        len, maxlen, sh_audio->audio_out_minsize);      if(maxlen<sh_audio->audio_out_minsize) break; // don't overflow buffer!      // not enough decoded data waiting, decode 'len' bytes more:      len=mpadec->decode_audio(sh_audio,          sh_audio->a_buffer+sh_audio->a_buffer_len, len, maxlen);      if(len<=0) break; // EOF?      sh_audio->a_buffer_len+=len;  }  if(declen>sh_audio->a_buffer_len)    declen=sh_audio->a_buffer_len; // still no enough data (EOF) :(  // round to whole samples://  declen/=sh_audio->samplesize*sh_audio->channels;//  declen*=sh_audio->samplesize*sh_audio->channels;  // run the filters:  afd.audio=sh_audio->a_buffer;  afd.len=declen;  afd.rate=sh_audio->samplerate;  afd.nch=sh_audio->channels;  afd.format=sh_audio->sample_format;  af_fix_parameters(&afd);  //pafd=&afd;//  printf("\nAF: %d --> ",declen);  pafd=af_play(sh_audio->afilter,&afd);//  printf("%d  \n",pafd->len);  if(!pafd) return -1; // error  mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"decaudio: declen=%d out=%d (max %d)\n",      declen, pafd->len, maxlen);    // copy filter==>out:  if(maxlen < pafd->len) {    maxlen -= maxlen % (sh_audio->channels * sh_audio->samplesize);    mp_msg(MSGT_DECAUDIO,MSGL_WARN,"%i bytes of audio data lost due to buffer overflow, len = %i\n", pafd->len - maxlen,pafd->len);  }  else    maxlen=pafd->len;  memmove(buf, pafd->audio, maxlen);    // remove processed data from decoder buffer:  sh_audio->a_buffer_len-=declen;  if(sh_audio->a_buffer_len>0)    memmove(sh_audio->a_buffer, sh_audio->a_buffer+declen, sh_audio->a_buffer_len);    return maxlen;}void resync_audio_stream(sh_audio_t *sh_audio){  sh_audio->a_in_buffer_len=0;        // clear audio input buffer  if(!sh_audio->inited) return;  sh_audio->ad_driver->control(sh_audio,ADCTRL_RESYNC_STREAM,NULL);}void skip_audio_frame(sh_audio_t *sh_audio){  if(!sh_audio->inited) return;  if(sh_audio->ad_driver->control(sh_audio,ADCTRL_SKIP_FRAME,NULL)==CONTROL_TRUE) return;  // default skip code:  ds_fill_buffer(sh_audio->ds);  // skip block}void adjust_volume(){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -