SDL编程三(音频)

SDL播放声音的基本流程如下:

(1)创建一个回调函数用于混合音频数据,并放入音频流;

(2)设置音频参数,调用SDL_OpenAudio,打开音频设备;

(3)调用SDL_PauseAudio(0),进行音频回放;

(4)回放结束后,调用SDL_CloseAudio() 关闭音频设备。

下面是用SDL播放PCM音频数据的代码。

全局数据:

SDL_AudioSpec wanted;//用于配置音频参数
static Uint8 *audio_chunk;//音频数据缓冲
static Uint32 audio_len;//要播放的音频数据长度(字节)
static Uint8 *audio_pos;//当前播放的位置(字节位置)

步骤(1);

void fill_audio(void *udata, Uint8 *stream, int len)
{
if (audio_len == 0)
{
   printf("audio_len=0\n");
   return;
}

len = (len>audio_len?audio_len:len);
SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);//对音频数据进行混音
audio_pos+=len;//更新播放位置
audio_len-=len;//更新数据长度
}

步骤(2)(3)(4);

void AudioPlay(const unsigned char *chunk, int len)
{
//set audio paras
wanted.freq = 44100;//音频的频率
wanted.format = AUDIO_S16;//数据格式为有符号16位
wanted.channels = 2;//双声道
wanted.samples = 1024;//采样数
wanted.callback = fill_audio;//设置回调函数
wanted.userdata = NULL;

if (SDL_OpenAudio(&wanted, NULL)<0)//步骤(2)打开音频设备
{
   printf("can't open audio.\n");
   return;
}

printf("begin....\n");


audio_chunk = (Uint8*)chunk; //设置音频数据缓冲
audio_len = len;//设置音频数据长度


audio_pos = audio_chunk;//设置初始播放位置
SDL_PauseAudio(0);//步骤(3)回放音频数据

printf("don't close, audio playing...\n");
while(audio_len>0)//等待直到音频数据播放完毕!
   SDL_Delay(100);

SDL_CloseAudio();//步骤(4)关闭音频设备
}

你可能感兴趣的:(编程)