diff --git a/lib/xsound/xsound.cpp b/lib/xsound/xsound.cpp index 1e2229d6..90561d43 100644 --- a/lib/xsound/xsound.cpp +++ b/lib/xsound/xsound.cpp @@ -4,6 +4,8 @@ //#include #include +#include + #include "xglobal.h" #include "xgraph.h" #include "_xsound.h" @@ -45,15 +47,14 @@ void xtDeactivateSysFinitFnc(int id); static XSoundChannel channels[MAX_CHANNELS]; int XSoundError = 0; -int XSoundInitFlag = 0; -clunk::Context context; -clunk::Object * clunk_object; +std::unique_ptr context; +clunk::Object * clunk_object = nullptr; int g_freq; void SoundPlay(void *lpDSB, int channel, int priority, int cropos, int flags) { - if(XSoundInitFlag){ + if(clunk_object){ clunk::Sample *source = (clunk::Sample *)lpDSB; //if (channel==2) @@ -140,6 +141,10 @@ void SoundPlay(void *lpDSB, int channel, int priority, int cropos, int flags) void SoundVolume(int channel, int volume) { + if (!context) + { + return; + } /* SDL_Mixer Version volume+=10000; volume*=0.0128;*/ @@ -148,13 +153,13 @@ void SoundVolume(int channel, int volume) //Debug //std::cout<<"SoundVolume:"< SetVolume((LONG )volume); { channels[channel].volume = volume; /* SDL_Mixer Version Mix_Volume(channel, volume);*/ - context.set_volume(channel, f_volume); + context->set_volume(channel, f_volume); } } } @@ -162,7 +167,7 @@ void SoundVolume(int channel, int volume) int GetSoundVolume(int channel) { int volume = 0; - if(XSoundInitFlag){ + if(clunk_object){ std::cout<<"GetSoundVolume:"<name<name<<" frq:"<spec.freq<name<<" channel:"<name<create_sample(); chunk->load(filename); } catch(const std::exception & e) { @@ -303,7 +313,7 @@ void SetVolume(void *lpDSB, int volume) int GetVolume(void *lpDSB) { int ret = 0; - if(XSoundInitFlag){ + if(clunk_object){ /* SDL_Mixer Version ret = Mix_VolumeChunk((Mix_Chunk *)lpDSB, 0); Mix_VolumeChunk((Mix_Chunk *)lpDSB, ret);*/ @@ -319,6 +329,7 @@ void ChannelFinished(int channel) int SoundInit(int maxHZ, int schannels) { + std::unique_ptr initializer(new clunk::Context()); //Only one freq, now sound more powerfull. /* SDL_Mixer version if (SDL_Init (SDL_INIT_AUDIO) == -1) @@ -337,10 +348,19 @@ int SoundInit(int maxHZ, int schannels) Mix_AllocateChannels(MAX_CHANNELS); */ //std::cout<<"SoundInit maxHZ:"<init(maxHZ, 2, 512); + context = std::move(initializer); + } + catch (const std::exception &e) + { + std::cerr << "unable to initialize sound, reason: " << e.what() << std::endl; + return false; + } g_freq = maxHZ; - context.set_max_sources(MAX_CHANNELS); - clunk_object = context.create_object(); + context->set_max_sources(MAX_CHANNELS); + clunk_object = context->create_object(); int i; for(i = 0; i < MAX_CHANNELS; ++i) { @@ -351,7 +371,6 @@ int SoundInit(int maxHZ, int schannels) } /* SDL_Mixer version Mix_ChannelFinished(&ChannelFinished);*/ - XSoundInitFlag = 1; //ErrH.Abort("SoundInit OK!!!"); return true; } @@ -359,14 +378,14 @@ int SoundInit(int maxHZ, int schannels) void SoundFinit(void) { int i; - if(XSoundInitFlag){ + if(clunk_object){ for(i = 0; i < MAX_CHANNELS; ++i) SoundStop(i); /* SDL_Mixer version Mix_CloseAudio();*/ delete clunk_object; - context.deinit(); - XSoundInitFlag = 0; + context->deinit(); + context.reset(); } } diff --git a/src/sound/music.cpp b/src/sound/music.cpp index a0419c81..a28e3628 100644 --- a/src/sound/music.cpp +++ b/src/sound/music.cpp @@ -1,5 +1,6 @@ //#include "PlayOgg.h" +#include #include #include "../global.h" @@ -7,7 +8,7 @@ #include "hsound.h" #include "../../lib/xsound/ogg_stream.h" -extern clunk::Context context; +extern std::unique_ptr context; //static MpegSound* music = 0; //extern LPDIRECTSOUND lpDS; @@ -59,41 +60,53 @@ void xsDeInitMusic(void) { } void xsPlayMusic(int track,int min = 0,int sec = 0) { - curTrack = track; - //music->OpenToPlay(getTrackPathName(track)); - //music=Mix_LoadMUS(getTrackPathName(track)); - //Mix_PlayMusic(music, 31); - //std::cout<<"xsPlayMusic:"<OpenToPlay(getTrackPathName(track)); + //music=Mix_LoadMUS(getTrackPathName(track)); + //Mix_PlayMusic(music, 31); + //std::cout<<"xsPlayMusic:"<play(-1, new OggStream(getTrackPathName(track)), true); + context->set_volume(-1, volume / 256.0); + } } void xsPlayOneTrackMusic(int track,int min = 0,int sec = 0) { curTrack = track; - //if (music) - // { - //Mix_HaltMusic(); - //Mix_RewindMusic(); - //Mix_FreeMusic(music); - //music = NULL; - //} - //music=Mix_LoadMUS(getTrackPathName(track)); - //Mix_RewindMusic(); - //Mix_PlayMusic(music, 31); - //music->OpenToPlay(getTrackPathName(track)); - //std::cout<<"xsPlayOneTrackMusic:"<OpenToPlay(getTrackPathName(track)); + //std::cout<<"xsPlayOneTrackMusic:"<playing(-1)) + { + context->stop(-1); + } + context->play(-1, new OggStream(getTrackPathName(track)), true); + context->set_volume(-1, volume / 256.0); + } } void xsStopMusic(void) { - //music->Stop(); - //Mix_HaltMusic(); - if (context.playing(-1)) - context.stop(-1); - + if (context) + { + //music->Stop(); + //Mix_HaltMusic(); + if (context->playing(-1)) + { + context->stop(-1); + } + } } void xsStopMusic(int &track) { @@ -102,33 +115,43 @@ void xsStopMusic(int &track) { } void xsPauseMusic(void) { - //music->Pause(); - //Mix_PausedMusic(); - context.pause(-1); + if (context) + { + //music->Pause(); + //Mix_PausedMusic(); + context->pause(-1); + } } void xsResumeMusic(void) { - //music->Resume(); - //Mix_ResumeMusic(); - context.pause(-1); + if (context) + { + //music->Resume(); + //Mix_ResumeMusic(); + context->pause(-1); + } } int xsGetStatusMusic(void) { - /*switch (music->IsPlay()) { - case MPEG_STOP: - return XCD_STOPPED; - case MPEG_PAUSE: - return XCD_PAUSED; - case MPEG_PLAY: - return XCD_PLAYING; - default: - return XCD_OTHER; - }*/ - if (context.playing(-1)) { - return XCD_PLAYING; - } else { - return XCD_STOPPED; - } + if (context) + { + /*switch (music->IsPlay()) { + case MPEG_STOP: + return XCD_STOPPED; + case MPEG_PAUSE: + return XCD_PAUSED; + case MPEG_PLAY: + return XCD_PLAYING; + default: + return XCD_OTHER; + }*/ + if (context->playing(-1)) { + return XCD_PLAYING; + } else { + return XCD_STOPPED; + } + } + return XCD_OTHER; } @@ -155,13 +178,16 @@ int xsGetVolumeMusic(void) { } void xsSetVolumeMusic(int val) { - //std::cout<<"xsSetVolumeMusic:"<SetVolume(val); - float f_val = val; - f_val/=256; - //Mix_VolumeMusic(val); - context.set_volume(-1, f_val); - volume=val; + if (context) + { + //std::cout<<"xsSetVolumeMusic:"<SetVolume(val); + float f_val = val; + f_val /= 256; + //Mix_VolumeMusic(val); + context->set_volume(-1, f_val); + volume=val; + } }