diff --git a/src/framework/cmake/FindICU.cmake b/src/framework/cmake/FindICU.cmake index 46949252..cff30902 100644 --- a/src/framework/cmake/FindICU.cmake +++ b/src/framework/cmake/FindICU.cmake @@ -8,14 +8,18 @@ SET(_ICUI18N_STATIC_LIBS libicui18n.a) SET(_ICUI18N_SHARED_LIBS libicui18n.dll.a icui18n) SET(_ICUUC_STATIC_LIBS libicuuc.a) SET(_ICUUC_SHARED_LIBS libicuuc.dll.a icuuc) +SET(_ICUDATA_STATIC_LIBS libicudata.a) +SET(_ICUDATA_SHARED_LIBS libicudata.dll.a icudata) IF(USE_STATIC_LIBS) FIND_LIBRARY(ICUI18N_LIBRARY NAMES ${_ICUI18N_STATIC_LIBS} ${_ICUI18N_SHARED_LIBS}) FIND_LIBRARY(ICUUC_LIBRARY NAMES ${_ICUUC_STATIC_LIBS} ${_ICUUC_SHARED_LIBS}) + FIND_LIBRARY(ICUDATA_LIBRARY NAMES ${_ICUDATA_STATIC_LIBS} ${_ICUDATA_SHARED_LIBS}) ELSE() FIND_LIBRARY(ICUI18N_LIBRARY NAMES ${_ICUI18N_SHARED_LIBS} ${_ICUI18N_STATIC_LIBS}) FIND_LIBRARY(ICUUC_LIBRARY NAMES ${_ICUUC_SHARED_LIBS} ${_ICUUC_STATIC_LIBS}) + FIND_LIBRARY(ICUDATA_LIBRARY NAMES ${_ICUDATA_SHARED_LIBS} ${_ICUDATA_STATIC_LIBS}) ENDIF() -SET(ICU_LIBRARIES ${ICUI18N_LIBRARY} ${ICUUC_LIBRARY}) +SET(ICU_LIBRARIES ${ICUI18N_LIBRARY} ${ICUUC_LIBRARY} ${ICUDATA_LIBRARY}) INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(ICU DEFAULT_MSG ICU_LIBRARIES ICU_INCLUDE_DIR) MARK_AS_ADVANCED(ICU_LIBRARIES ICU_INCLUDE_DIR) \ No newline at end of file diff --git a/src/framework/sound/soundchannel.cpp b/src/framework/sound/soundchannel.cpp new file mode 100644 index 00000000..fdb938fa --- /dev/null +++ b/src/framework/sound/soundchannel.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2010-2013 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "soundchannel.h" +#include "streamsoundsource.h" +#include "soundmanager.h" + +SoundSourcePtr SoundChannel::play(const std::string& filename, float fadetime, float gain) +{ + if(!g_sounds.isAudioEnabled() || !m_enabled) + return nullptr; + + if(m_currentSource) + m_currentSource->stop(); + + m_currentSource = g_sounds.play(filename, fadetime, m_gain*gain); + return m_currentSource; +} + +void SoundChannel::stop(float fadetime) +{ + m_queue.clear(); + + if(m_currentSource) { + if(fadetime > 0) + m_currentSource->setFading(StreamSoundSource::FadingOff, fadetime); + else { + m_currentSource->stop(); + m_currentSource = nullptr; + } + } +} + +void SoundChannel::enqueue(const std::string& filename, float fadetime, float gain) +{ + if(gain == 0) + gain = 1.0f; + m_queue.push_back(QueueEntry{g_sounds.resolveSoundFile(filename), fadetime, gain}); + std::random_shuffle(m_queue.begin(), m_queue.end()); + //update(); +} + +void SoundChannel::update() +{ + if(m_currentSource && !m_currentSource->isPlaying()) + m_currentSource = nullptr; + + if(!m_currentSource && !m_queue.empty() && g_sounds.isAudioEnabled() && m_enabled) { + QueueEntry entry = m_queue.front(); + m_queue.pop_front(); + m_queue.push_back(entry); + play(entry.filename, entry.fadetime, entry.gain); + } +} + +void SoundChannel::setEnabled(bool enable) +{ + if(m_enabled == enable) + return; + + if(enable) { + m_enabled = true; + update(); + } else { + m_enabled = false; + if(m_currentSource) { + m_currentSource->stop(); + m_currentSource = nullptr; + } + } +} + +void SoundChannel::setGain(float gain) +{ + if(m_currentSource) + m_currentSource->setGain(gain); + m_gain = gain; +} diff --git a/src/framework/sound/soundchannel.h b/src/framework/sound/soundchannel.h new file mode 100644 index 00000000..935ca04a --- /dev/null +++ b/src/framework/sound/soundchannel.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010-2013 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef SHOUNDCHANNEL_H +#define SHOUNDCHANNEL_H + +#include "soundsource.h" + +// @bindclass +class SoundChannel : public LuaObject +{ +public: + SoundChannel(int id) : m_id(id), m_gain(1) { } + + SoundSourcePtr play(const std::string& filename, float fadetime = 0, float gain = 1.0f); + void stop(float fadetime = 0); + void enqueue(const std::string& filename, float fadetime = 0, float gain = 1.0f); + void enable() { setEnabled(true); } + void disable() { setEnabled(false); } + + void setGain(float gain); + float getGain() { return m_gain; } + + void setEnabled(bool enable); + bool isEnabled() { return m_enabled; } + + int getId() { return m_id; } + +protected: + void update(); + friend class SoundManager; + +private: + struct QueueEntry { + std::string filename; + float fadetime; + float gain; + }; + std::deque m_queue; + SoundSourcePtr m_currentSource; + stdext::boolean m_enabled; + int m_id; + float m_gain; +}; + +#endif