From 4fd97158762b4cdd4c73a6e29960e371d9de56e7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lo=C3=AFc=20Blot?= Date: Sat, 24 Mar 2018 15:45:25 +0100 Subject: [PATCH] Cleanup sound manager class (#7158) * Cleanup sound manager client * Use some const refs * Use auto on iterators * Drop unused parameters * Move sound_openal.* to client folder * Move sound.cpp + OnDemandSoundFetcher to client/ folder + reorganize includes properly --- build/android/jni/Android.mk | 4 +- src/CMakeLists.txt | 15 ---- src/client.cpp | 1 + src/client.h | 1 + src/client/CMakeLists.txt | 17 ++++ src/{ => client}/sound.cpp | 2 - src/client/sound.h | 111 +++++++++++++++++++++++++ src/{ => client}/sound_openal.cpp | 32 ++----- src/{ => client}/sound_openal.h | 3 +- src/content_cao.cpp | 3 +- src/game.cpp | 6 +- src/gamedef.h | 1 - src/gui/guiEngine.cpp | 2 +- src/gui/guiEngine.h | 2 +- src/network/clientpackethandler.cpp | 1 + src/script/lua_api/l_client.cpp | 1 + src/sound.h | 85 +------------------ src/unittest/test.cpp | 1 + util/travis/clang-format-whitelist.txt | 3 +- 19 files changed, 151 insertions(+), 140 deletions(-) rename src/{ => client}/sound.cpp (99%) create mode 100644 src/client/sound.h rename src/{ => client}/sound_openal.cpp (95%) rename src/{ => client}/sound_openal.h (90%) diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk index 4f2e788a8..1fa8fb7b0 100644 --- a/build/android/jni/Android.mk +++ b/build/android/jni/Android.mk @@ -227,8 +227,6 @@ LOCAL_SRC_FILES := \ jni/src/serverobject.cpp \ jni/src/shader.cpp \ jni/src/sky.cpp \ - jni/src/sound.cpp \ - jni/src/sound_openal.cpp \ jni/src/staticobject.cpp \ jni/src/subgame.cpp \ jni/src/tileanimation.cpp \ @@ -280,6 +278,8 @@ LOCAL_SRC_FILES := \ jni/src/client/hud.cpp \ jni/src/client/inputhandler.cpp \ jni/src/client/renderingengine.cpp \ + jni/src/client/sound.cpp \ + jni/src/client/sound_openal.cpp \ jni/src/client/tile.cpp \ jni/src/client/joystick_controller.cpp \ jni/src/client/render/factory.cpp \ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7673b6fa5..8c7f6b56e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -101,19 +101,6 @@ if(BUILD_CLIENT AND ENABLE_SOUND) endif() endif() -if(USE_SOUND) - set(sound_SRCS sound_openal.cpp) - set(SOUND_INCLUDE_DIRS - ${OPENAL_INCLUDE_DIR} - ${VORBIS_INCLUDE_DIR} - ${OGG_INCLUDE_DIR} - ) - set(SOUND_LIBRARIES - ${OPENAL_LIBRARY} - ${VORBIS_LIBRARIES} - ) -endif() - option(ENABLE_GLES "Enable OpenGL ES support" FALSE) mark_as_advanced(ENABLE_GLES) @@ -440,7 +427,6 @@ set(common_SRCS serverlist.cpp serverobject.cpp settings.cpp - sound.cpp staticobject.cpp subgame.cpp terminal_chat_console.cpp @@ -489,7 +475,6 @@ set(client_SRCS ${client_SRCS} ${common_SRCS} ${gui_SRCS} - ${sound_SRCS} ${client_network_SRCS} ${client_irrlicht_changes_SRCS} camera.cpp diff --git a/src/client.cpp b/src/client.cpp index 837116888..5356ef151 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/clientevent.h" #include "client/gameui.h" #include "client/renderingengine.h" +#include "client/sound.h" #include "client/tile.h" #include "util/auth.h" #include "util/directiontables.h" diff --git a/src/client.h b/src/client.h index 8b8923f29..a468aa721 100644 --- a/src/client.h +++ b/src/client.h @@ -48,6 +48,7 @@ class MapBlockMesh; class IWritableTextureSource; class IWritableShaderSource; class IWritableItemDefManager; +class ISoundManager; class NodeDefManager; //class IWritableCraftDefManager; class ClientMediaDownloader; diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index ea8acd064..1cabe1b11 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,4 +1,21 @@ +set(sound_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/sound.cpp) + +if(USE_SOUND) + set(sound_SRCS ${sound_SRCS} + ${CMAKE_CURRENT_SOURCE_DIR}/sound_openal.cpp) + set(SOUND_INCLUDE_DIRS + ${OPENAL_INCLUDE_DIR} + ${VORBIS_INCLUDE_DIR} + ${OGG_INCLUDE_DIR} + PARENT_SCOPE) + set(SOUND_LIBRARIES + ${OPENAL_LIBRARY} + ${VORBIS_LIBRARIES} + PARENT_SCOPE) +endif() + set(client_SRCS + ${sound_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/meshgen/collector.cpp ${CMAKE_CURRENT_SOURCE_DIR}/render/anaglyph.cpp ${CMAKE_CURRENT_SOURCE_DIR}/render/core.cpp diff --git a/src/sound.cpp b/src/client/sound.cpp similarity index 99% rename from src/sound.cpp rename to src/client/sound.cpp index 707065043..44a96dd25 100644 --- a/src/sound.cpp +++ b/src/client/sound.cpp @@ -21,5 +21,3 @@ with this program; if not, write to the Free Software Foundation, Inc., // Global DummySoundManager singleton DummySoundManager dummySoundManager; - - diff --git a/src/client/sound.h b/src/client/sound.h new file mode 100644 index 000000000..c1d3c0cfa --- /dev/null +++ b/src/client/sound.h @@ -0,0 +1,111 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#pragma once + +#include +#include +#include "irr_v3d.h" +#include "../sound.h" + +class OnDemandSoundFetcher +{ +public: + virtual void fetchSounds(const std::string &name, + std::set &dst_paths, + std::set &dst_datas) = 0; +}; + +class ISoundManager +{ +public: + virtual ~ISoundManager() = default; + + // Multiple sounds can be loaded per name; when played, the sound + // should be chosen randomly from alternatives + // Return value determines success/failure + virtual bool loadSoundFile( + const std::string &name, const std::string &filepath) = 0; + virtual bool loadSoundData( + const std::string &name, const std::string &filedata) = 0; + + virtual void updateListener( + const v3f &pos, const v3f &vel, const v3f &at, const v3f &up) = 0; + virtual void setListenerGain(float gain) = 0; + + // playSound functions return -1 on failure, otherwise a handle to the + // sound. If name=="", call should be ignored without error. + virtual int playSound(const std::string &name, bool loop, float volume, + float fade = 0.0f, float pitch = 1.0f) = 0; + virtual int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, + float pitch = 1.0f) = 0; + virtual void stopSound(int sound) = 0; + virtual bool soundExists(int sound) = 0; + virtual void updateSoundPosition(int sound, v3f pos) = 0; + virtual bool updateSoundGain(int id, float gain) = 0; + virtual float getSoundGain(int id) = 0; + virtual void step(float dtime) = 0; + virtual void fadeSound(int sound, float step, float gain) = 0; + + int playSound(const SimpleSoundSpec &spec, bool loop) + { + return playSound(spec.name, loop, spec.gain, spec.fade, spec.pitch); + } + int playSoundAt(const SimpleSoundSpec &spec, bool loop, const v3f &pos) + { + return playSoundAt(spec.name, loop, spec.gain, pos, spec.pitch); + } +}; + +class DummySoundManager : public ISoundManager +{ +public: + virtual bool loadSoundFile(const std::string &name, const std::string &filepath) + { + return true; + } + virtual bool loadSoundData(const std::string &name, const std::string &filedata) + { + return true; + } + void updateListener(const v3f &pos, const v3f &vel, const v3f &at, const v3f &up) + { + } + void setListenerGain(float gain) {} + int playSound(const std::string &name, bool loop, float volume, float fade, + float pitch) + { + return 0; + } + int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, + float pitch) + { + return 0; + } + void stopSound(int sound) {} + bool soundExists(int sound) { return false; } + void updateSoundPosition(int sound, v3f pos) {} + bool updateSoundGain(int id, float gain) { return false; } + float getSoundGain(int id) { return 0; } + void step(float dtime) {} + void fadeSound(int sound, float step, float gain) {} +}; + +// Global DummySoundManager singleton +extern DummySoundManager dummySoundManager; diff --git a/src/sound_openal.cpp b/src/client/sound_openal.cpp similarity index 95% rename from src/sound_openal.cpp rename to src/client/sound_openal.cpp index 853aba1cc..d66360057 100644 --- a/src/sound_openal.cpp +++ b/src/client/sound_openal.cpp @@ -68,26 +68,6 @@ static void delete_alccontext(ALCcontext *p) } } -static const char *alcErrorString(ALCenum err) -{ - switch (err) { - case ALC_NO_ERROR: - return "no error"; - case ALC_INVALID_DEVICE: - return "invalid device"; - case ALC_INVALID_CONTEXT: - return "invalid context"; - case ALC_INVALID_ENUM: - return "invalid enum"; - case ALC_INVALID_VALUE: - return "invalid value"; - case ALC_OUT_OF_MEMORY: - return "out of memory"; - default: - return ""; - } -} - static const char *alErrorString(ALenum err) { switch (err) { @@ -331,7 +311,6 @@ private: int m_next_id; std::unordered_map> m_buffers; std::unordered_map m_sounds_playing; - v3f m_listener_pos; struct FadeState { FadeState() = default; @@ -563,9 +542,8 @@ public: return false; } - void updateListener(v3f pos, v3f vel, v3f at, v3f up) + void updateListener(const v3f &pos, const v3f &vel, const v3f &at, const v3f &up) { - m_listener_pos = pos; alListener3f(AL_POSITION, pos.X, pos.Y, pos.Z); alListener3f(AL_VELOCITY, vel.X, vel.Y, vel.Z); ALfloat f[6]; @@ -634,7 +612,7 @@ public: return; float chkGain = 0; - for (std::unordered_map::iterator i = m_sounds_fading.begin(); + for (auto i = m_sounds_fading.begin(); i != m_sounds_fading.end();) { if (i->second.step < 0.f) chkGain = -(i->second.current_gain); @@ -665,7 +643,7 @@ public: void updateSoundPosition(int id, v3f pos) { - std::unordered_map::iterator i = m_sounds_playing.find(id); + auto i = m_sounds_playing.find(id); if (i == m_sounds_playing.end()) return; PlayingSound *sound = i->second; @@ -678,7 +656,7 @@ public: bool updateSoundGain(int id, float gain) { - std::unordered_map::iterator i = m_sounds_playing.find(id); + auto i = m_sounds_playing.find(id); if (i == m_sounds_playing.end()) return false; @@ -689,7 +667,7 @@ public: float getSoundGain(int id) { - std::unordered_map::iterator i = m_sounds_playing.find(id); + auto i = m_sounds_playing.find(id); if (i == m_sounds_playing.end()) return 0; diff --git a/src/sound_openal.h b/src/client/sound_openal.h similarity index 90% rename from src/sound_openal.h rename to src/client/sound_openal.h index f2cff4daa..f04ad7cac 100644 --- a/src/sound_openal.h +++ b/src/client/sound_openal.h @@ -27,4 +27,5 @@ class SoundManagerSingleton; extern std::shared_ptr g_sound_manager_singleton; std::shared_ptr createSoundManagerSingleton(); -ISoundManager *createOpenALSoundManager(SoundManagerSingleton *smg, OnDemandSoundFetcher *fetcher); +ISoundManager *createOpenALSoundManager( + SoundManagerSingleton *smg, OnDemandSoundFetcher *fetcher); diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 2e9f8f39d..1dec95839 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" // For IntervalLimiter #include "util/serialize.h" #include "util/basic_macros.h" +#include "client/sound.h" #include "client/tile.h" #include "environment.h" #include "collision.h" @@ -1177,7 +1178,7 @@ void GenericCAO::updateAnimationSpeed() { if (!m_animated_meshnode) return; - + m_animated_meshnode->setAnimationSpeed(m_animation_speed); } diff --git a/src/game.cpp b/src/game.cpp index fada349db..685fb0651 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -69,10 +69,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "script/scripting_client.h" #if USE_SOUND - #include "sound_openal.h" + #include "client/sound_openal.h" +#else + #include "client/sound.h" #endif - - /* Text input system */ diff --git a/src/gamedef.h b/src/gamedef.h index 9d3b889a0..f86eb13cd 100644 --- a/src/gamedef.h +++ b/src/gamedef.h @@ -27,7 +27,6 @@ class IItemDefManager; class NodeDefManager; class ICraftDefManager; class ITextureSource; -class ISoundManager; class IShaderSource; class MtEventManager; class IRollbackManager; diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index 00c3f85bc..7654bf7b3 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "guiMainMenu.h" #include "sound.h" -#include "sound_openal.h" +#include "client/sound_openal.h" #include "clouds.h" #include "httpfetch.h" #include "log.h" diff --git a/src/gui/guiEngine.h b/src/gui/guiEngine.h index 817d76014..409ba94c4 100644 --- a/src/gui/guiEngine.h +++ b/src/gui/guiEngine.h @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include "modalMenu.h" #include "guiFormSpecMenu.h" -#include "sound.h" +#include "client/sound.h" #include "client/tile.h" #include "util/enriched_string.h" diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 07a38e397..37b649364 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server.h" #include "util/strfnd.h" #include "client/clientevent.h" +#include "client/sound.h" #include "network/clientopcodes.h" #include "network/connection.h" #include "script/scripting_client.h" diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp index 2d36e977c..8e802d2a2 100644 --- a/src/script/lua_api/l_client.cpp +++ b/src/script/lua_api/l_client.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "chatmessage.h" #include "client.h" #include "client/clientevent.h" +#include "client/sound.h" #include "clientenvironment.h" #include "common/c_content.h" #include "common/c_converter.h" diff --git a/src/sound.h b/src/sound.h index 0ad34e5cd..81d918c81 100644 --- a/src/sound.h +++ b/src/sound.h @@ -23,14 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "irrlichttypes_bloated.h" -class OnDemandSoundFetcher -{ -public: - virtual void fetchSounds(const std::string &name, - std::set &dst_paths, - std::set &dst_datas) = 0; -}; - struct SimpleSoundSpec { SimpleSoundSpec(const std::string &name = "", float gain = 1.0f, @@ -42,83 +34,8 @@ struct SimpleSoundSpec bool exists() const { return !name.empty(); } - std::string name = ""; + std::string name; float gain = 1.0f; float fade = 0.0f; float pitch = 1.0f; }; - -class ISoundManager -{ -public: - virtual ~ISoundManager() = default; - - // Multiple sounds can be loaded per name; when played, the sound - // should be chosen randomly from alternatives - // Return value determines success/failure - virtual bool loadSoundFile( - const std::string &name, const std::string &filepath) = 0; - virtual bool loadSoundData( - const std::string &name, const std::string &filedata) = 0; - - virtual void updateListener(v3f pos, v3f vel, v3f at, v3f up) = 0; - virtual void setListenerGain(float gain) = 0; - - // playSound functions return -1 on failure, otherwise a handle to the - // sound. If name=="", call should be ignored without error. - virtual int playSound(const std::string &name, bool loop, float volume, - float fade = 0.0f, float pitch = 1.0f) = 0; - virtual int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, - float pitch = 1.0f) = 0; - virtual void stopSound(int sound) = 0; - virtual bool soundExists(int sound) = 0; - virtual void updateSoundPosition(int sound, v3f pos) = 0; - virtual bool updateSoundGain(int id, float gain) = 0; - virtual float getSoundGain(int id) = 0; - virtual void step(float dtime) = 0; - virtual void fadeSound(int sound, float step, float gain) = 0; - - int playSound(const SimpleSoundSpec &spec, bool loop) - { - return playSound(spec.name, loop, spec.gain, spec.fade, spec.pitch); - } - int playSoundAt(const SimpleSoundSpec &spec, bool loop, const v3f &pos) - { - return playSoundAt(spec.name, loop, spec.gain, pos, spec.pitch); - } -}; - -class DummySoundManager : public ISoundManager -{ -public: - virtual bool loadSoundFile(const std::string &name, const std::string &filepath) - { - return true; - } - virtual bool loadSoundData(const std::string &name, const std::string &filedata) - { - return true; - } - void updateListener(v3f pos, v3f vel, v3f at, v3f up) {} - void setListenerGain(float gain) {} - int playSound(const std::string &name, bool loop, float volume, float fade, - float pitch) - { - return 0; - } - int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, - float pitch) - { - return 0; - } - void stopSound(int sound) {} - bool soundExists(int sound) { return false; } - void updateSoundPosition(int sound, v3f pos) {} - bool updateSoundGain(int id, float gain) { return false; } - float getSoundGain(int id) { return 0; } - void step(float dtime) {} - void fadeSound(int sound, float step, float gain) {} -}; - -// Global DummySoundManager singleton -extern DummySoundManager dummySoundManager; diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 150bddc56..18215a947 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "test.h" +#include "client/sound.h" #include "nodedef.h" #include "itemdef.h" #include "gamedef.h" diff --git a/util/travis/clang-format-whitelist.txt b/util/travis/clang-format-whitelist.txt index f522d46cd..8e0f7fdeb 100644 --- a/util/travis/clang-format-whitelist.txt +++ b/util/travis/clang-format-whitelist.txt @@ -7,6 +7,7 @@ src/chat.h src/chat_interface.h src/client/clientlauncher.cpp src/client/clientlauncher.h +src/client/sound_openal.cpp src/client.cpp src/clientenvironment.cpp src/clientenvironment.h @@ -328,8 +329,6 @@ src/shader.cpp src/shader.h src/sky.cpp src/sound.cpp -src/sound_openal.cpp -src/sound_openal.h src/staticobject.cpp src/staticobject.h src/subgame.cpp -- 2.25.1