基于SDL的mp3播放器

4 篇文章 0 订阅

基于SDLmp3播放器

 

         SDL虽然本身提供播放音乐都功能但是不好用,SDL_mixerSDL提供了快捷的音乐播放功能。但是SDL_mixer本身只能播放wav格式的音乐,并不能播放mp3,为了能完美支持mp3,需要为SDL_mixer提供mp3的解码库,

       Mp3的解码库有很多中,可以用smpeglibmad,用播放音乐的效果上来说本文注重讲解libmad

       首先为SDL_mixer安装libmad解码库,下载好libmad后直接./configure make make install,然后配置SDL_mixerMakefile文件,要去掉默认的smpeg,换成libmad,可以用如下命令设置

./configure --enable-music-mp3-mad-gpl --enable-music-mp3=no

然后 make make install .

 

SDL_mixerlibmad解码库就安装成功了。

下面是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) ;
}


 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值