mirror of
https://github.com/Kiritow/MiniEngine.git
synced 2024-03-22 13:11:22 +08:00
Update Sound(Chunk) Wrapper
This commit is contained in:
parent
0ea8797093
commit
1b02c209fe
|
@ -1,20 +1,140 @@
|
||||||
#include "Sound.h"
|
#include "Sound.h"
|
||||||
#include "begin_code.h"
|
#include "begin_code.h"
|
||||||
|
//private
|
||||||
void Sound::_set(Mix_Chunk* p)
|
void Sound::_set(Mix_Chunk* p)
|
||||||
{
|
{
|
||||||
_sound.reset(p,Mix_FreeChunk);
|
_sound.reset(p,Mix_FreeChunk);
|
||||||
}
|
}
|
||||||
|
//private
|
||||||
void Sound::_clear()//private
|
void Sound::_clear()
|
||||||
{
|
{
|
||||||
_sound.reset();
|
_sound.reset();
|
||||||
}
|
}
|
||||||
|
//private
|
||||||
Mix_Chunk* Sound::_get()
|
Mix_Chunk* Sound::_get() const
|
||||||
{
|
{
|
||||||
return _sound.get();
|
return _sound.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sound::Sound(const std::string& WAVFilename)
|
||||||
|
{
|
||||||
|
_set(Mix_LoadWAV(WAVFilename.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Sound::isReady() const
|
||||||
|
{
|
||||||
|
return (_get()!=nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sound::release()
|
||||||
|
{
|
||||||
|
_clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//private
|
||||||
|
void Channel::_set(int ChannelID)
|
||||||
|
{
|
||||||
|
_id=ChannelID;
|
||||||
|
}
|
||||||
|
//private
|
||||||
|
int Channel::_get() const
|
||||||
|
{
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
//private
|
||||||
|
void Channel::_clear()
|
||||||
|
{
|
||||||
|
_id=-1;
|
||||||
|
}
|
||||||
|
//protected
|
||||||
|
Channel::Channel()
|
||||||
|
{
|
||||||
|
_id=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Channel& Channel::playSound(Sound sound, int loops) throw (ErrorViewer)
|
||||||
|
{
|
||||||
|
int cret=Mix_PlayChannel(_get(),sound._get(),loops);
|
||||||
|
if(cret==-1)
|
||||||
|
{
|
||||||
|
ErrorViewer e;
|
||||||
|
e.fetch();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
_set(cret);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Channel& Channel::fadeIn(Sound sound, int loops, int ms) throw (ErrorViewer)
|
||||||
|
{
|
||||||
|
int cret=Mix_FadeInChannel(_get(),sound._get(),loops,ms);
|
||||||
|
if(cret==-1)
|
||||||
|
{
|
||||||
|
ErrorViewer e;
|
||||||
|
e.fetch();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
_set(cret);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Channel::fadeOut(int ms)
|
||||||
|
{
|
||||||
|
return Mix_FadeOutChannel(_get(), ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Channel::pause()
|
||||||
|
{
|
||||||
|
Mix_Pause(_get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Channel::resume()
|
||||||
|
{
|
||||||
|
Mix_Resume(_get());
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::stop()
|
||||||
|
{
|
||||||
|
return Mix_HaltChannel(_get());
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::setPanning(uint8_t left, uint8_t right)
|
||||||
|
{
|
||||||
|
return Mix_SetPanning(_get(),left,right);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::setPosition(int16_t angle, uint8_t distance)
|
||||||
|
{
|
||||||
|
return Mix_SetPosition(_get(),angle,distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::setDistance(uint8_t distance)
|
||||||
|
{
|
||||||
|
return Mix_SetDistance(_get(),distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::setReverseStereo(int flip)
|
||||||
|
{
|
||||||
|
return Mix_SetReverseStereo(_get(),flip);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::addEffect(Mix_EffectFunc_t f, Mix_EffectDone_t d, void* arg)
|
||||||
|
{
|
||||||
|
return Mix_RegisterEffect(_get(),f,d,arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::removeEffect(Mix_EffectFunc_t f)
|
||||||
|
{
|
||||||
|
return Mix_UnregisterEffect(_get(),f);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Channel::removeAllEffect()
|
||||||
|
{
|
||||||
|
return Mix_UnregisterAllEffects(_get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//static
|
//static
|
||||||
int SoundPlayer::GetDecoderNum()
|
int SoundPlayer::GetDecoderNum()
|
||||||
{
|
{
|
||||||
|
@ -32,96 +152,17 @@ SoundPlayer::SoundPlayer(int Channels)
|
||||||
Mix_AllocateChannels(Channels);
|
Mix_AllocateChannels(Channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
Sound SoundPlayer::loadSound(std::string Filename) throw(ErrorViewer)
|
Channel SoundPlayer::playSound(Sound sound, int loops) throw(ErrorViewer)
|
||||||
{
|
{
|
||||||
Mix_Chunk* temp = Mix_LoadWAV(Filename.c_str());
|
Channel c;
|
||||||
if (temp == NULL)
|
c.playSound(sound,loops);
|
||||||
{
|
return c;
|
||||||
ErrorViewer e;
|
|
||||||
e.fetch();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
Sound s;
|
|
||||||
s._set(temp);
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChannelID SoundPlayer::playSound(Sound sound, int loops) throw(ErrorViewer)
|
Channel SoundPlayer::fadeIn(Sound sound, int loops, int ms) throw(ErrorViewer)
|
||||||
{
|
{
|
||||||
ChannelID id;
|
Channel c;
|
||||||
if (-1 == (id = Mix_PlayChannel(-1, sound._get(), loops)))
|
c.fadeIn(sound,loops,ms);
|
||||||
{
|
return c;
|
||||||
ErrorViewer e;
|
|
||||||
e.fetch();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChannelID SoundPlayer::fadein(Sound sound, int loops, int ms) throw(ErrorViewer)
|
|
||||||
{
|
|
||||||
ChannelID id;
|
|
||||||
if (-1 == (id = Mix_FadeInChannel(-1, sound._get(), loops, ms)))
|
|
||||||
{
|
|
||||||
ErrorViewer e;
|
|
||||||
e.fetch();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::fadeout(ChannelID id, int ms)
|
|
||||||
{
|
|
||||||
return Mix_FadeOutChannel(id, ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundPlayer::pause(ChannelID id)
|
|
||||||
{
|
|
||||||
Mix_Pause(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoundPlayer::resume(ChannelID id)
|
|
||||||
{
|
|
||||||
Mix_Resume(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::stop(ChannelID id)
|
|
||||||
{
|
|
||||||
return Mix_HaltChannel(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::setPanning(ChannelID id, uint8_t left, uint8_t right)
|
|
||||||
{
|
|
||||||
return Mix_SetPanning(id,left,right);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::setPosition(ChannelID id, int16_t angle, uint8_t distance)
|
|
||||||
{
|
|
||||||
return Mix_SetPosition(id,angle,distance);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::setDistance(ChannelID id, uint8_t distance)
|
|
||||||
{
|
|
||||||
return Mix_SetDistance(id,distance);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::setReverseStereo(ChannelID id, int flip)
|
|
||||||
{
|
|
||||||
return Mix_SetReverseStereo(id,flip);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::addEffect(ChannelID id,Mix_EffectFunc_t f, Mix_EffectDone_t d, void* arg)
|
|
||||||
{
|
|
||||||
return Mix_RegisterEffect(id,f,d,arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::removeEffect(ChannelID id,Mix_EffectFunc_t f)
|
|
||||||
{
|
|
||||||
return Mix_UnregisterEffect(id,f);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SoundPlayer::removeAllEffect(ChannelID id)
|
|
||||||
{
|
|
||||||
return Mix_UnregisterAllEffects(id);
|
|
||||||
}
|
}
|
||||||
#include "end_code.h"
|
#include "end_code.h"
|
||||||
|
|
|
@ -8,17 +8,50 @@
|
||||||
class Sound
|
class Sound
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
protected:
|
|
||||||
Sound() = default;
|
Sound() = default;
|
||||||
|
Sound(const std::string& WAVFilename);
|
||||||
|
bool isReady() const;
|
||||||
|
void release();
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Mix_Chunk> _sound;
|
std::shared_ptr<Mix_Chunk> _sound;
|
||||||
void _set(Mix_Chunk*);
|
void _set(Mix_Chunk*);
|
||||||
void _clear();
|
void _clear();
|
||||||
Mix_Chunk* _get();
|
Mix_Chunk* _get() const;
|
||||||
friend class SoundPlayer;
|
|
||||||
|
friend class Channel;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int ChannelID;
|
class Channel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Channel& playSound(Sound sound,int loops) throw (ErrorViewer);
|
||||||
|
Channel& fadeIn(Sound sound,int loops,int ms) throw (ErrorViewer);
|
||||||
|
|
||||||
|
int fadeOut(int ms);
|
||||||
|
void pause();
|
||||||
|
void resume();
|
||||||
|
int stop();
|
||||||
|
|
||||||
|
/// Experimental
|
||||||
|
int setPanning(uint8_t left,uint8_t right);
|
||||||
|
int setPosition(int16_t angle,uint8_t distance);
|
||||||
|
int setDistance(uint8_t distance);
|
||||||
|
int setReverseStereo(int flip);
|
||||||
|
|
||||||
|
/// Experimental: Direct Add/Remove Effect
|
||||||
|
int addEffect(Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg);
|
||||||
|
int removeEffect(Mix_EffectFunc_t f);
|
||||||
|
int removeAllEffect();
|
||||||
|
protected:
|
||||||
|
Channel();
|
||||||
|
private:
|
||||||
|
void _set(int ChannelID);
|
||||||
|
int _get() const;
|
||||||
|
void _clear();
|
||||||
|
|
||||||
|
int _id;
|
||||||
|
friend class SoundPlayer;
|
||||||
|
};
|
||||||
|
|
||||||
class SoundPlayer : public AudioPlayer
|
class SoundPlayer : public AudioPlayer
|
||||||
{
|
{
|
||||||
|
@ -26,24 +59,8 @@ public:
|
||||||
static int GetDecoderNum();
|
static int GetDecoderNum();
|
||||||
static std::string GetDecoderName(int index);
|
static std::string GetDecoderName(int index);
|
||||||
|
|
||||||
SoundPlayer(int Channels = 16);
|
SoundPlayer(int NumChannels = 16);
|
||||||
Sound loadSound(std::string Filename) throw (ErrorViewer);
|
Channel playSound(Sound sound, int loops) throw (ErrorViewer);
|
||||||
ChannelID playSound(Sound sound, int loops) throw (ErrorViewer);
|
Channel fadeIn(Sound sound, int loops, int ms) throw (ErrorViewer);
|
||||||
ChannelID fadein(Sound sound, int loops, int ms) throw (ErrorViewer);
|
|
||||||
int fadeout(ChannelID id, int ms);
|
|
||||||
void pause(ChannelID id);
|
|
||||||
void resume(ChannelID id);
|
|
||||||
int stop(ChannelID id);
|
|
||||||
|
|
||||||
/// Experimental
|
|
||||||
int setPanning(ChannelID id,uint8_t left,uint8_t right);
|
|
||||||
int setPosition(ChannelID id,int16_t angle,uint8_t distance);
|
|
||||||
int setDistance(ChannelID id,uint8_t distance);
|
|
||||||
int setReverseStereo(ChannelID id,int flip);
|
|
||||||
|
|
||||||
/// Experimental: Direct Add/Remove Effect
|
|
||||||
int addEffect(ChannelID id,Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg);
|
|
||||||
int removeEffect(ChannelID id,Mix_EffectFunc_t f);
|
|
||||||
int removeAllEffect(ChannelID id);
|
|
||||||
};
|
};
|
||||||
#include "end_code.h"
|
#include "end_code.h"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user