关闭

SDL 混音同时播放多个媒体文件

612人阅读 评论(0) 收藏 举报
分类:

转自http://blog.csdn.net/u013080313/article/details/50375098

首先,跟学习任何东西一样,官方的资料永远是最应该看的。传送门:sdl官方网站 http://www.libsdl.org/
好在org后缀的外网还能够上,SDL是开源的,包括源代码在内,都可以从官网上下载到。SDL并不能算作是音频库,更不是解码库,Simple DirectMedia Layer 从名字上来看就可以归结为一个媒体库(囊括了输入、输出、Video、Audio、Opengl、DX相关的多个方法)。

1.SDL_OpenAudio

这个函数很关键,这个函数将获取你设备的Audio并将其打开,无论你在当前的软件中的哪一个进程,都可以访问到这个设备,并对设备进行操作(列如:SDL_PauseAudio,SDL_CloseAudio)。
值得注意的是,设备Audio只能打开一次,我曾经尝试多线程打开多个Audio设备,最后都失败了,返回Error说Audio已经打开,那一瞬间我懵了,既然不能用多线程,如何播放多个音频呢?别急,奥秘在SDL_mixAudio里面,稍后我回提。

2.SDL_PauseAudio

每次调用这个函数,设备都将回调你在打开Audio时预设的回调函数(也就是SDL_AudioSpec.callback)。这样的回调允许你一次次的将PCM buffer填入Audio预设的steam中,使得设备顺利的播放音频文件。而如何将buffer填入steam中呢?则需要使用SDL_mixAudio。

3.PCM
什么是PCM?可以自习搜索PCM看详细的介绍。简单的来说,音频文件解压后的文件格式就是PCM,而SDL仅提供播放PCM和WAV(都是未压缩的文件格式)的播放方法。简单来说,要想播放MP3等通用格式,必须先解码成音频格式文件,再进行播放,当然也可以一边解压一边播放,只是需要使用多线程罢了。使用SDL_Thread来创建并管理线程,蛮方便的。(线程我以后再总结)

4.SDL_mixAudio
我最想说的就是这个,因为我苦苦寻求了半天的“同时播放多个音频文件”,奥秘就在SDL_mixAudio。这个函数其实很傻很简单,无非是把两个buffer内容叠加起来。于是你只需要把希望播放的音频buffer叠加在一起,就可以成功的播放多个音频文件。官方给的例子是这样的
void audio_callback(void *udata, Uint8 *stream, int len)
{
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
}
这就是把stream与audio_pos两个buffer叠加到stream当中,其中的使用方式大家多试一试吧。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25540次
    • 积分:437
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:84篇
    • 译文:0篇
    • 评论:8条
    最新评论