随笔 - 96  文章 - 255  trackbacks - 0
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

E-mail:zbln426@163.com QQ:85132383 长期寻找对战略游戏感兴趣的合作伙伴。

常用链接

留言簿(21)

随笔分类

随笔档案

SDL相关网站

我的个人网页

我的小游戏

资源下载

搜索

  •  

积分与排名

  • 积分 - 489367
  • 排名 - 37

最新评论

阅读排行榜

评论排行榜

作者:龙飞

1:扩展库SDL_mixer

        根据网上资料的说法,SDL本身的声音体系做得不是很完善,好在还有一个比较完善的扩展库SDL_mixer,这个库支持包括wav, mp3, ogg和midi的声音和音乐,也算是相当完善了。下载地址在:
http://www.libsdl.org/projects/SDL_mixer/
安装设置参考前面的涉及SDL扩展库安装设置的章节。

2:SDL_mixer的启动和退出,设计MixSoundClass的基类

        这个库又是通过open...close这样的格式来初始化启动以及退出的。但是我们将用到的音乐和音效将分别用到不同的结构体。SDL_mixer中音乐和音效的共同点在于都需要打开Mix_OpenAudio(),使用完后都应该关闭Mix_CloseAudio()。所以,可以为这两种类设计共同的基类,并设计一个计数器,作为打开和关闭的自动开关。
class BaseMixSound
{
private:
    
static int MixNUM;
protected:
    BaseMixSound();
public:
    
virtual ~BaseMixSound();
};
在打开函数中,也就是这个“假”ABC的构造函数中,我们用到了SDL_mixer的函数:
Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 24096 ) 
其中,第一个参数是频率,第二个参数是格式,第三个参数是声道,第四个参数是采样率。因为我下不到SDL_mixer的说明文档,大概的情况只能描述到这样。试验的情况看,这样的数据是可以比较良好的工作的。
退出的函数是:
Mix_CloseAudio()
我们放在了析构函数中。

3:音效类EffectSound
class EffectSound: public BaseMixSound
{
private:
    Mix_Chunk
* sound;
public:
    EffectSound(
const std::string& sound_fileName);
    
~EffectSound();
    
void play() const;
};
        Mix_Chunk是音效的结构,由函数Mix_LoadWAV()创建,Mix_FreeChunk()释放。在方法play()中,我们用到了函数:
Mix_PlayChannel(-1, sound, 0
第一个参数是指定播放音效的通道,这里设置为-1,则系统会自动寻找使用第一个可以使用的通道;第二个参数是要播放的音效的结构指针;第三个是重复次数,这里为0表示不重复,即播放一次。

4:音乐类MusicSound
class MusicSound: public BaseMixSound
{
private:
    Mix_Music
* music;
public:
    MusicSound(
const std::string& music_fileName);
    
~MusicSound();
    
void play() const;
    
void stop() const;
};
        Mix_Music是音乐的结构,由函数Mix_LoadMUS()创建,Mix_FreeMusic()释放。我们播放音乐用到的函数为:
Mix_PlayMusic( music, -1 )
第一个参数是要播放的音乐的结构指针;第二个是播放次数,这里使用-1将不停止的循环播放,直到被停止。
另外三个行为的函数为:暂停Mix_PauseMusic(),继续Mix_ResumeMusic(),结束Mix_HaltMusic()。
还有两个判断当前音乐状态的函数Mix_PlayingMusic()和Mix_PausedMusic(),表示是否在播放,是否暂停了。返回的是int,0为假,1为真。

5:完整的源代码
http://www.cppblog.com/lf426/archive/2008/04/20/47642.html
posted on 2008-04-20 11:59 lf426 阅读(5746) 评论(8)  编辑 收藏 引用 所属分类: SDL入门教程

FeedBack:
# re: SDL入门教程(十二):音乐和音效 2008-04-28 12:18 ted
能正常播放mp3吗?是不是还要用到smpg?我用mixer无法正常播放mp3  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效 2008-04-28 12:53 lf426
我试过可以呀。SDL_mixer所带的dll文件里面就包含smpeg.dll。  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效 2009-05-14 13:41 wb
你好,最近看了你的文章,很是不错,在此请教一下,SDL_mixer怎么播放Midi,我用的库是编译的mobile5版本,运行时一打开midi文件,程序都退出了,wav播放正常,  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效 2009-06-15 23:06 lf426
我在Linux下尝试过midi也失败可,可能是系统默认的组件中不支持midi吧。  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效 2009-08-04 16:18 apple
最近写了个sdl程序,发现只能将音频文件放在当前目录下,指定一个目录,它居然不认。当音频文件不在当前目录下,那如何指定该音频文件所在的目录?  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效 2009-08-04 16:18 apple
在音频文件快进与倒退的过程中,如何获得该音频文件的播放一次的时间、以及现在播放在哪一时刻?  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效[未登录] 2010-07-14 10:44 dd
@lf426
MID 的播放需要timidity.tar.gz 较原始的一个版本,tar 后直接复制到/usr/local/lib下即可.  回复  更多评论
  
# re: SDL入门教程(十二):音乐和音效[未登录] 2010-07-14 11:11 lf426
好,谢谢,我有空试试。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理