环境准备
请按照我之前的文章-Android下基于SDL的位图渲染,安装必要的开发环境。
实践篇
准备你要播放的PCM文件
如故你不想使用我提供的PCM,可以自己用ffmpeg转一个PCM文件,具体命令如下:
$ ffmpeg -i src.wav -f s16le -acodec pcm_s16le out.pcm
注意你需要知道这个PCM的采样率、量化位数、声道数。后续播放的时候会用到。
生成之后,将pcm文件放到手机的目录下,我使用的是/sdcard/congtou_8k_mono_16bit.pcm。
SDL音频播放流程
SDL中音频播放相对简单,只要通过SDL_OpenAudio打开设备,调用SDL_PauseAudio开始播放,播放结束调用SDL_CloseAudio。
这里说明一点,SDL2支持多音频同时播放,不过在打开音频设备的时候需要调用SDL_OpenAudioDevice。
下面是实现的代码:
struct AudioPlayContext
{
bool is_exit; // is audio play buffer empty?
FILE * fpcm;
};
void MyAudioCallback(void* userdata, Uint8* stream, int need_size)
{
AudioPlayContext * context = reinterpret_cast(userdata);
size_t actual_read = fread(stream, 1, need_size, c