基于SDL的mp3播放器
SDL虽然本身提供播放音乐都功能但是不好用,SDL_mixer为SDL提供了快捷的音乐播放功能。但是SDL_mixer本身只能播放wav格式的音乐,并不能播放mp3,为了能完美支持mp3,需要为SDL_mixer提供mp3的解码库,
Mp3的解码库有很多中,可以用smpeg,libmad,用播放音乐的效果上来说本文注重讲解libmad。
首先为SDL_mixer安装libmad解码库,下载好libmad后直接./configure make make install,然后配置SDL_mixer的Makefile文件,要去掉默认的smpeg,换成libmad,可以用如下命令设置
./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no
然后 make make install .
SDL_mixer的libmad解码库就安装成功了。
下面是mp3播放器的源代码
/*
这是一个mp3播放器的源码,是基于SDL图形库,SDL_gfx,SDL_mixer以及libmad解码库,
linux 编译方法 gcc player.c -o player -I/SDL头文件所在的目录 -L/SDL的图形库所在的目录
-lSDL -lSDL_gfx -lSDL_mixer
write by douyuan888 2013-7-5
*/
#include "SDL/SDL.h"
#include "SDL/SDL_mixer.h"
#include "math.h"
#include "string.h"
#include "SDL/SDL_gfxPrimitives.h"
void Init()//初始化音视频
{
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)== -1)
{
printf("SDL_INIT fault !\n");
exit(-1);
}
}
SDL_Surface *Creat_Screen(int w,int h)//创建一个屏幕
{
return SDL_SetVideoMode(w ,h , 0 ,SDL_SWSURFACE );
}
void Free_Image(SDL_Surface * image)//释放SDL_Surface所申请的空间
{
SDL_FreeSurface(image);
}
void Open_Audio()//打开音频驱动 设置比特率 和 采样率,
{
int audio_rate = 22050;
Uint16 audio_format = MIX_DEFAULT_FORMAT;
int audio_channel = 2;
int audio_buffer = 1024;
if (Mix_OpenAudio(audio_rate, audio_format, audio_channel, audio_buffer) != 0)
{
fprintf(stderr, "Unable to initialize audio: %s\n", Mix_GetError());
exit(1);
}
}
void Close_Audio()//关闭音频驱动
{
Mix_CloseAudio();
}
Mix_Music * Load_Musci(char *filename)//加载音乐 filename是音乐的绝对路径
//至于支持什么格式与解码库有关系。libmad 几乎支持所有的常见格式
{
Mix_Music *music = NULL;
music = Mix_LoadMUS(filename);
if (music == NULL)
{
fprintf(stderr, "Unable to load mp3 file: %s\n", Mix_GetError());
}
return music ;
}
int Start_Play(Mix_Music * music)//播放音乐
{
if (Mix_PlayMusic(music, 0) == -1)
{
fprintf(stderr, "Unable to play mp3 file: %s\n", Mix_GetError());
return -1;
}
else
return 0 ;
}
void Music_Pause()//暂停音乐
{
Mix_PauseMusic();
}
void Music_Resume()//取消暂停 状态
{
Mix_ResumeMusic();
}
void Halt_Music()//停止
{
Mix_HaltMusic();
}
int Event()//事件循环
{
int flag = 1 ;
SDL_Event event ;
while (flag == 1 )
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
flag = 0;
}
}
}
int main(int argc ,char **argv)
{
Init();
SDL_Surface *screen = NULL ;
Mix_Music * music = NULL ;
screen = Creat_Screen(320,240);//创建一个 320*240的屏幕
boxColor(screen,0, 0, 320, 240, 0xff00ffff);//填充颜色
SDL_UpdateRect(screen , 0 , 0 , 0 , 0 );
Open_Audio();
music = Load_Musci("./test.mp3") ;//在之处可以加载许多中格式的音乐
Start_Play(music);
Event();
Close_Audio();
Free_Image(screen) ;
}