SDL入门教程(十二):音乐和音效

作者:龙飞

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,  2 4096  ) 

其中,第一个参数是频率,第二个参数是格式,第三个参数是声道,第四个参数是采样率。因为我下不到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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值