蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88
全部博文(311)
分类: C/C++
2009-11-16 20:16:58
SDL本身的音频的扩展是通过SDL_Mixer来扩展的.从文档来看.可以支持Wav,MP3,OGG,FAC,MIDI几种常用的音频的格式.
SDL_mixer 本身只提供WAV的解码播放功能.其余格式都是封装第三方库来实现的.下面重点播放MP3能力的支持.
MP3在SDL_mixter 的LINUX版是播放可以采用两种库来支持.一种是smpeg,另一种是常用的MP3解码库 libmad
网上有人提到用smpeg 库实现MP3播放,但实践发现.smpeg采用C++编程, SDL_mixer.运行中调用失败.因为SDL_mixer 本身用GCC编译,无法调用C++的库.如果把SDL_mixer 用G++重编译,则意味着C程序无法使用它了.通过分析SDL_mixer 相关代码,发现可以用libmad来进行mp3播放.
下面是加入libmad 支持方法
首先编译libmad库,简单的 ./configure ; make ; make install 即可
然后重新配置SDL_mixer的Makefile ,取消默认的smpeg,换成libmad的支持.采用如下语句来生成相应的Makefile.
./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no
然后 make ; make install 即可实现MP3 的播放.
SDL_mixer提供了三个测试程序 playwav ,playmus ,playmidi来演示如何使用SDL_mixer进行播放.
使用流程
1.初始化
int sound_init() { #define TMP_FREQ MIX_DEFAULT_FREQUENCY #define TMP_FORMAT MIX_DEFAULT_FORMAT #define TMP_CHAN 2 #define TMP_CHUNK_SIZE 512 return Mix_OpenAudio(TMP_FREQ,TMP_FORMAT,TMP_CHAN,TMP_CHUNK_SIZE); }
2.关闭音频设备
void sound_cleanup() { Mix_CloseAudio(); }
3.播放音乐文件
Mix_Music * sound_play(char * filename) { Mix_Music * mix_music; /* 装入声音文件 */ if((mix_music = Mix_LoadMUS(filename)) == NULL) { fprintf(stderr,"Load %s failure ,%s\n",filename,Mix_GetError()); return NULL; } /* 播放*/ if(Mix_PlayMusic(mix_music,-1) == -1) { fprintf(stderr,"play %s failure ,%s\n",filename,Mix_GetError()); return NULL; } return Mix_Music; }
其它音频操作
Mix_VolumeMusic(audio_volume); //设置音量 Mix_FreeMusic(music); //关闭打开音频文件 |