基于libmad 的简单MP3流媒体播放器的实现

http://tech.ddvip.com   2007年03月10日    社区交流

本文详细介绍基于libmad 的简单MP3流媒体播放器的实现

  这里配置的 PCM 格式是 SND_PCM_FORMAT_S32_LE,采样的格式是每个采样有 32-bit 的数据,数据按照 little-endian 存放。如果通过 mad_frame_decode() 函数得到 PCM 数据后,要求每个采样数据只占 16-bit,需要把数据进行MAD的定点类型到 signed short 类型进行转换。那么,PCM 数据如何写入声卡中呢?函数实现例程如下所示:

  清单 7:PCM 数据写入声卡函数实现例程

while (nsamples--) {
/* nsamples 是采样的数目 */
    signed int sample;
    sample = pcm->samples[0][j];
    *(OutputPtr++) = sample & 0xff;
    *(OutputPtr++) = (sample >> 8);
    *(OutputPtr++) = (sample >> 16);
    *(OutputPtr++) = (sample >> 24);
    if (nchannels == 2) {
     sample = pcm->samples[1][j];
     *(OutputPtr++) = sample & 0xff;
     *(OutputPtr++) = sample >> 8;
     *(OutputPtr++) = (sample >> 16);
     *(OutputPtr++) = (sample >> 24);
    }
    j++;
  }
  if ((err = snd_pcm_writei (playback_handle, buf, samples)) < 0) {
   err = xrun_recovery(playback_handle, err);
   if (err < 0) {
     printf("Write error: %s
", snd_strerror(err));
     return -1;
   }
  }

  这里用到了 http://www.alsa-project.org/ 关于 ALSA 文档中的例子函数 xrun_recovery( )。详细例子请参见 http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html。使用此函数的目的是避免出现由于网络原因,声卡不能及时得到音频数据而使得 snd_pcm_writei() 不能正常连续工作。实际上在 xrun_recovery( ) 中,又调用 snd_pcm_prepare() 和 snd_pcm_resume() 以实现能“恢复错误”的功能。-EPIPE 错误表示应用程序没有及时把 PCM 采样数据送入ASLA 库。xrun_recovery() 函数如下所示:

责编:豆豆技术应用

正在加载评论...