Update Sound(Chunk) Wrapper

This commit is contained in:
Kirigaya Kazuto 2017-06-23 14:16:15 +08:00
parent 0ea8797093
commit 1b02c209fe
2 changed files with 172 additions and 114 deletions

View File

@ -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"

View File

@ -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"