基于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() 函数如下所示:
责编:豆豆技术应用
正在加载评论...
- Linux/Unix 新闻
- Linux/Unix 入门
- Linux/Unix 命令
- Linux/Unix 安装
- Linux 嵌入式系统
- Linux/Unix 编程
- Linux/Unix 管理
- Linux/Unix 桌面
- Linux/Unix 内核
- Linux/Unix 软件
- SCO Unix
- NetBSD
- OpenBSD
- Redhat/Fedora Linux
- 手机
- Linux/Unix find 搜索命令
- Linux/Unix vi 命令
- Linux/Unix kde 桌面环境
- Linux/Unix GNOME 桌面环境
- Linux/Unix Make 命令
- Linux/Unix crontab 命令
- Linux/Unix ext3 文件系统
- Linux/Unix 文件系统详解
- Linux/Unix ADSL 拨号设置
- Linux/Unix GRUB 配置及应用
- Linux/Unix nfs配置
- Linux/Unix 硬件信息查看及管理
- Linux/Unix 优化
- Linux/Unix 交换分区Swap管理及应用
- Linux/Unix 用户管理
- Linux/Unix Ramdisk
- Linux/Unix 密码恢复管理
- Linux/Unix 文件删除恢复
- Linux/Unix fdisk分区
- Linux/Unix lvs负载均衡管理
- Linux/Unix root用户
- Linux/Unix 集群
- Linux/Unix 日志
- 更多Linux/Unix专题……