From 15ff1d512b9e103396144bec1cd8004ecf4f7f9c Mon Sep 17 00:00:00 2001 From: erihel Date: Sat, 22 Sep 2012 00:11:16 +0200 Subject: * Fixed audio problems * Added colobot.ini to CApp in Create function * Fixes to plugin manager * Fixed CProfile segfault --- src/CMakeLists.txt | 3 ++ src/app/app.cpp | 36 +++++++++++++++-- src/app/app.h | 4 ++ src/common/profile.cpp | 2 +- src/plugins/plugininterface.h | 8 ++-- src/plugins/pluginmanager.cpp | 2 + src/sound/plugins/oalsound/alsound.cpp | 49 +++++++++-------------- src/sound/plugins/oalsound/alsound.h | 1 - src/sound/sound.h | 71 ++++++++++++++++++++-------------- 9 files changed, 106 insertions(+), 70 deletions(-) (limited to 'src') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index efc104b..d7c837a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -178,6 +178,8 @@ ui/slider.cpp ui/studio.cpp ui/target.cpp ui/window.cpp +plugins/pluginmanager.cpp +plugins/pluginloader.cpp ) set(LIBS @@ -190,6 +192,7 @@ ${OPTIONAL_LIBS} ${PLATFORM_LIBS} ${Boost_LIBRARIES} CBot +ltdl ) include_directories( diff --git a/src/app/app.cpp b/src/app/app.cpp index 1da237e..73f7237 100644 --- a/src/app/app.cpp +++ b/src/app/app.cpp @@ -83,9 +83,11 @@ struct ApplicationPrivate CApplication::CApplication() { - m_private = new ApplicationPrivate(); - m_iMan = new CInstanceManager(); - m_eventQueue = new CEventQueue(m_iMan); + m_private = new ApplicationPrivate(); + m_iMan = new CInstanceManager(); + m_eventQueue = new CEventQueue(m_iMan); + m_pluginManager = new CPluginManager(); + m_profile = new CProfile(); m_engine = nullptr; m_device = nullptr; @@ -140,6 +142,12 @@ CApplication::~CApplication() delete m_eventQueue; m_eventQueue = nullptr; + delete m_pluginManager; + m_pluginManager = nullptr; + + delete m_profile; + m_profile = nullptr; + delete m_iMan; m_iMan = nullptr; @@ -302,8 +310,28 @@ bool CApplication::Create() m_deviceConfig.fullScreen = false; // Create the sound instance. - m_sound = new CSoundInterface(); + if (!GetProfile()->InitCurrentDirectory()) { + GetLogger()->Warn("Config not found. Default values will be used!\n"); + m_sound = new CSoundInterface(); + } else { + std::string path; + if (GetProfile()->GetLocalProfileString("Resources", "Data", path)) + m_dataPath = path; + + m_pluginManager->LoadFromProfile(); + m_sound = static_cast(CInstanceManager::GetInstancePointer()->SearchInstance(CLASS_SOUND)); + + if (!m_sound) { + GetLogger()->Error("Sound not loaded!\n"); + return false; + } + m_sound->Create(true); + if (GetProfile()->GetLocalProfileString("Resources", "Sound", path)) + m_sound->CacheAll(path); + else + m_sound->CacheAll(m_dataPath); + } std::string standardInfoMessage = "\nPlease see the console output or log file\n" diff --git a/src/app/app.h b/src/app/app.h index 03199aa..06879ae 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -30,6 +30,8 @@ #include "graphics/engine/engine.h" #include "graphics/opengl/gldevice.h" +#include "plugins/pluginmanager.h" + #include #include @@ -331,6 +333,8 @@ protected: CSoundInterface* m_sound; //! Main class of the proper game engine CRobotMain* m_robotMain; + CPluginManager* m_pluginManager; + CProfile* m_profile; //! Code to return at exit int m_exitCode; diff --git a/src/common/profile.cpp b/src/common/profile.cpp index efcfa66..1025567 100644 --- a/src/common/profile.cpp +++ b/src/common/profile.cpp @@ -57,7 +57,7 @@ bool CProfile::SetLocalProfileString(std::string section, std::string key, std:: bool CProfile::GetLocalProfileString(std::string section, std::string key, std::string &buffer) { const char* value = m_ini->GetValue(section.c_str(), key.c_str(), nullptr); - if (strlen(value) > 0) { + if (value != nullptr && strlen(value) > 0) { buffer = std::string(value); return true; } diff --git a/src/plugins/plugininterface.h b/src/plugins/plugininterface.h index 87c355d..6554b44 100644 --- a/src/plugins/plugininterface.h +++ b/src/plugins/plugininterface.h @@ -47,19 +47,19 @@ class CPluginInterface { /** Function to get plugin name or description * @return returns plugin name */ - inline std::string PluginName() { return "abc"; }; + inline virtual std::string PluginName() { return "abc"; }; /** Function to get plugin version. 1 means version 0.01, 2 means 0.02 etc. * @return number indicating plugin version */ - inline int PluginVersion() { return 0; }; + inline virtual int PluginVersion() { return 0; }; /** Function to initialize plugin */ - inline void InstallPlugin() {}; + inline virtual void InstallPlugin() {}; /** Function called before removing plugin */ - inline bool UninstallPlugin(std::string &) { return true; }; + inline virtual bool UninstallPlugin(std::string &) { return true; }; }; diff --git a/src/plugins/pluginmanager.cpp b/src/plugins/pluginmanager.cpp index 470ac2f..561e9ab 100644 --- a/src/plugins/pluginmanager.cpp +++ b/src/plugins/pluginmanager.cpp @@ -39,9 +39,11 @@ CPluginManager::~CPluginManager() void CPluginManager::LoadFromProfile() { + GetLogger()->Info("Trying to load from profile...\n"); std::vector< std::string > dirs = GetProfile()->GetLocalProfileSection("Plugins", "Path"); std::vector< std::string > plugins = GetProfile()->GetLocalProfileSection("Plugins", "File"); + GetLogger()->Info("Path %d, files %d\n", dirs.size(), plugins.size()); for (std::string dir : dirs) m_folders.insert(dir); diff --git a/src/sound/plugins/oalsound/alsound.cpp b/src/sound/plugins/oalsound/alsound.cpp index 571eacc..83a4def 100644 --- a/src/sound/plugins/oalsound/alsound.cpp +++ b/src/sound/plugins/oalsound/alsound.cpp @@ -179,20 +179,6 @@ bool ALSound::Cache(Sound sound, std::string filename) } -void ALSound::CacheAll() -{ - char filename[100]; - for ( int i = 1; i < 69; i++ ) - { - sprintf(filename, "high/sound%.3d.wav", i); - if ( !Cache((Sound) i, std::string(filename)) ) - { - fprintf(stderr, "Unable to load audio: %s\n", filename); - } - } -} - - int ALSound::RetPriority(Sound sound) { if ( sound == SOUND_FLYh || @@ -276,23 +262,25 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) } // Seeks a channel completely free. - auto it = mChannels.end(); - it--; - int i = (*it).first; - while (++i) - { - if (mChannels.find(i) == mChannels.end()) { - Channel *chn = new Channel(); - // check if we channel ready to play music, if not destroy it and seek free one - if (chn->IsReady()) { - chn->SetPriority(priority); - mChannels[1] = chn; - channel = 1; - bAlreadyLoaded = false; - return true; + if (mChannels.size() < 64) { + auto it = mChannels.end(); + it--; + int i = (*it).first; + while (++i) + { + if (mChannels.find(i) == mChannels.end()) { + Channel *chn = new Channel(); + // check if channel is ready to play music, if not destroy it and seek free one + if (chn->IsReady()) { + chn->SetPriority(priority); + mChannels[++i] = chn; + channel = i; + bAlreadyLoaded = false; + return true; + } + delete chn; + GetLogger()->Warn("Could not open additional channel to play sound!"); } - delete chn; - GetLogger()->Warn("Could not open additional channel to play sound!"); } } @@ -513,7 +501,6 @@ void ALSound::FrameMove(float delta) void ALSound::SetListener(Math::Vector eye, Math::Vector lookat) { - GetLogger()->Info("Setting listener position.\n"); float orientation[] = {lookat.x, lookat.y, lookat.z, 0.f, 1.f, 0.f}; alListener3f(AL_POSITION, eye.x, eye.y, eye.z); alListenerfv(AL_ORIENTATION, orientation); diff --git a/src/sound/plugins/oalsound/alsound.h b/src/sound/plugins/oalsound/alsound.h index d13f95b..01ccc71 100644 --- a/src/sound/plugins/oalsound/alsound.h +++ b/src/sound/plugins/oalsound/alsound.h @@ -40,7 +40,6 @@ class ALSound : public CSoundInterface ~ALSound(); bool Create(bool b3D); - void CacheAll(); bool Cache(Sound, std::string); bool RetEnable(); diff --git a/src/sound/sound.h b/src/sound/sound.h index 883c659..11138c3 100644 --- a/src/sound/sound.h +++ b/src/sound/sound.h @@ -26,9 +26,15 @@ #include +#include +#include + #include #include +#include +#include +#include /*! @@ -152,20 +158,27 @@ class CSoundInterface : public CPluginInterface { public: inline CSoundInterface() { - //CInstanceManager::getInstance().AddInstance(CLASS_SOUND, this); + CInstanceManager::GetInstance().AddInstance(CLASS_SOUND, this); //m_iMan->AddInstance(CLASS_SOUND, this); }; - inline ~CSoundInterface() {}; + inline virtual ~CSoundInterface() {}; /** Function to initialize sound device * @param bool b3D - enable support for 3D sound */ - inline bool Create(bool b3D) { return true; }; + inline virtual bool Create(bool b3D) { return true; }; /** Function called to cache all sound effect files. * Function calls \link CSoundInterface::Cache() \endlink for each file */ - inline void CacheAll() {}; + inline void CacheAll(std::string path) { + for ( int i = 1; i < 69; i++ ) { + std::stringstream filename; + filename << path << "/sound" << std::setfill('0') << std::setw(3) << i << ".wav"; + if ( !Cache(static_cast(i), filename.str()) ) + GetLogger()->Warn("Unable to load audio: %s\n", filename.str().c_str()); + } + }; /** Function called to cache sound effect file. * This function is called by plugin interface for each file. @@ -173,58 +186,58 @@ class CSoundInterface : public CPluginInterface * @param std::string bFile - file to load * @return return true on success */ - inline bool Cache(Sound bSound, std::string bFile) { return true; }; + inline virtual bool Cache(Sound bSound, std::string bFile) { return true; }; /** Geturn if plugin is enabled * @return return true if plugin is enabled */ - inline bool GetEnable() {return true;}; + inline virtual bool GetEnable() {return true;}; /** Change sound mode to 2D/3D * @param bool bMode - true to enable 3D sound */ - inline void SetSound3D(bool bMode) {}; + inline virtual void SetSound3D(bool bMode) {}; /** Geturn if we use 3D sound * @return true if we have 3D sound enabled */ - inline bool GetSound3D() {return true;}; + inline virtual bool GetSound3D() {return true;}; /** Geturn if we have 3D sound capable card * @return true for 3D sound support */ - inline bool GetSound3DCap() {return true;}; + inline virtual bool GetSound3DCap() {return true;}; /** Change global sound volume * @param int volume - range from 0 to MAXVOLUME */ - inline void SetAudioVolume(int volume) {}; + inline virtual void SetAudioVolume(int volume) {}; /** Geturn global sound volume * @return global volume as int in range from 0 to MAXVOLUME */ - inline int GetAudioVolume() {return 0;}; + inline virtual int GetAudioVolume() {return 0;}; /** Set music volume * @param int volume - range from 0 to MAXVOLUME */ - inline void SetMusicVolume(int volume) {}; + inline virtual void SetMusicVolume(int volume) {}; /** Geturn music volume * @return music volume as int in range from 0 to MAXVOLUME */ - inline int GetMusicVolume() {return 0;}; + inline virtual int GetMusicVolume() {return 0;}; /** Set listener position * @param Math::Vector eye - position of listener * @param Math::Vector lookat - direction listener is looking at */ - inline void SetListener(Math::Vector eye, Math::Vector lookat) {}; + inline virtual void SetListener(Math::Vector eye, Math::Vector lookat) {}; /** Update data each frame * @param float rTime - time since last update */ - inline void FrameMove(float rTime) {}; + inline virtual void FrameMove(float rTime) {}; /** Play specific sound * @param Sound sound - sound to play @@ -233,7 +246,7 @@ class CSoundInterface : public CPluginInterface * @param bool bLoop - loop sound * @return identifier of channel that sound will be played on */ - inline int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) {return 0;}; + inline virtual int Play(Sound sound, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) {return 0;}; /** Play specific sound * @param Sound sound - sound to play @@ -243,13 +256,13 @@ class CSoundInterface : public CPluginInterface * @param bool bLoop - loop sound * @return identifier of channel that sound will be played on */ - inline int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) {return 0;}; + inline virtual int Play(Sound sound, Math::Vector pos, float amplitude=1.0f, float frequency=1.0f, bool bLoop = false) {return 0;}; /** Remove all operations that would be made on sound in channel. * @param int channel - channel to work on * @return return true on success */ - inline bool FlushEnvelope(int channel) {return true;}; + inline virtual bool FlushEnvelope(int channel) {return true;}; /** Add envelope to sound. Envelope is a operatino that will be performend on sound in future like changing frequency * @param int channel - channel to work on @@ -259,64 +272,64 @@ class CSoundInterface : public CPluginInterface * @param SoundNext oper - operation to perform * @return return true on success */ - inline bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper) {return true;}; + inline virtual bool AddEnvelope(int channel, float amplitude, float frequency, float time, SoundNext oper) {return true;}; /** Set sound position in space * @param int channel - channel to work on * @param Math::Vector pos - new positino of a sound * @return return true on success */ - inline bool Position(int channel, Math::Vector pos) {return true;}; + inline virtual bool Position(int channel, Math::Vector pos) {return true;}; /** Set sound frequency * @param int channel - channel to work on * @param float frequency - change sound frequency * @return return true on success */ - inline bool Frequency(int channel, float frequency) {return true;}; + inline virtual bool Frequency(int channel, float frequency) {return true;}; /** Stop playing sound * @param int channel - channel to work on * @return return true on success */ - inline bool Stop(int channel) {return true;}; + inline virtual bool Stop(int channel) {return true;}; /** Stop playing all sounds * @return return true on success */ - inline bool StopAll() {return true;}; + inline virtual bool StopAll() {return true;}; /** Mute/unmute all sounds * @param bool bMute * @return return true on success */ - inline bool MuteAll(bool bMute) {return true;}; + inline virtual bool MuteAll(bool bMute) {return true;}; /** Start playing music * @param int rank - track number * @param bool bRepeat - repeat playing * @return return true on success */ - inline bool PlayMusic(int rank, bool bRepeat) {return true;}; + inline virtual bool PlayMusic(int rank, bool bRepeat) {return true;}; /** Restart music * @return return true on success */ - inline bool RestartMusic() {return true;}; + inline virtual bool RestartMusic() {return true;}; /** Susspend paying music * @return return true on success */ - inline void SuspendMusic() {}; + inline virtual void SuspendMusic() {}; /** Stop playing music * @return return true on success */ - inline void StopMusic() {}; + inline virtual void StopMusic() {}; /** Check if music if playing * @return return true if music is playing */ - inline bool IsPlayingMusic() {return true;}; + inline virtual bool IsPlayingMusic() {return true;}; }; -- cgit v1.2.3-1-g7c22