From 3cc3667347f0212b4287b264cf2b80c63ba03d64 Mon Sep 17 00:00:00 2001 From: Kai Blaschke Date: Mon, 4 Apr 2022 22:54:33 +0200 Subject: [PATCH] Moved class members to bottom, replaced some types and added default initializers. Mostly replaced raw pointers with std::unique_ptr for easier memory management. Probably not needed for many of those classes, but was the least intrusive change for now. --- src/libprojectM/ProjectM.cpp | 150 +++++++-------------------- src/libprojectM/ProjectM.hpp | 71 +++++-------- src/libprojectM/ProjectMCWrapper.cpp | 4 +- 3 files changed, 69 insertions(+), 156 deletions(-) diff --git a/src/libprojectM/ProjectM.cpp b/src/libprojectM/ProjectM.cpp index c0ad084b8..d934e7355 100644 --- a/src/libprojectM/ProjectM.cpp +++ b/src/libprojectM/ProjectM.cpp @@ -56,29 +56,6 @@ ProjectM::~ProjectM() #endif destroyPresetTools(); - - if (m_renderer) - { - delete (m_renderer); - } - if (m_beatDetect) - { - delete (m_beatDetect); - } - if (m_pcm) - { - delete (m_pcm); - m_pcm = 0; - } - - if (m_timeKeeper) - { - delete m_timeKeeper; - m_timeKeeper = NULL; - } - - delete (m_pipelineContext); - delete (m_pipelineContext2); } unsigned ProjectM::initRenderToTexture() @@ -93,16 +70,9 @@ void ProjectM::projectM_resetTextures() ProjectM::ProjectM(std::string config_file, int flags) - : m_renderer(0) - , m_pcm(0) - , m_beatDetect(0) + : m_flags(flags) , m_pipelineContext(new PipelineContext()) , m_pipelineContext2(new PipelineContext()) - , m_presetPos(0) - , m_timeKeeper(NULL) - , m_flags(flags) - , m_matcher(NULL) - , m_merger(NULL) { readConfig(config_file); projectM_reset(); @@ -111,16 +81,9 @@ ProjectM::ProjectM(std::string config_file, int flags) } ProjectM::ProjectM(Settings settings, int flags) - : m_renderer(0) - , m_pcm(0) - , m_beatDetect(0) + : m_flags(flags) , m_pipelineContext(new PipelineContext()) , m_pipelineContext2(new PipelineContext()) - , m_presetPos(0) - , m_timeKeeper(NULL) - , m_flags(flags) - , m_matcher(NULL) - , m_merger(NULL) { readSettings(settings); projectM_reset(); @@ -502,7 +465,7 @@ void ProjectM::projectM_reset() void ProjectM::projectM_init(int gx, int gy, int fps, int texsize, int width, int height) { /** Initialise start time */ - m_timeKeeper = new TimeKeeper(m_settings.presetDuration, m_settings.softCutDuration, m_settings.hardCutDuration, + m_timeKeeper = std::make_unique(m_settings.presetDuration, m_settings.softCutDuration, m_settings.hardCutDuration, m_settings.easterEgg); /** Nullify frame stash */ @@ -511,14 +474,9 @@ void ProjectM::projectM_init(int gx, int gy, int fps, int texsize, int width, in /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */ assert(!m_beatDetect); - if (!m_pcm) - { - m_pcm = new Pcm(); - } - assert(pcm()); - m_beatDetect = new BeatDetect(*m_pcm); + m_beatDetect = std::make_unique(m_pcm); - this->m_renderer = new Renderer(width, height, gx, gy, m_beatDetect, settings().presetURL, settings().titleFontURL, + this->m_renderer = std::make_unique(width, height, gx, gy, m_beatDetect.get(), settings().presetURL, settings().titleFontURL, settings().menuFontURL, settings().datadir); initPresetTools(gx, gy); @@ -531,7 +489,6 @@ void ProjectM::projectM_init(int gx, int gy, int fps, int texsize, int width, in /// @bug order of operatoins here is busted //renderer->setPresetName ( m_activePreset->name() ); m_timeKeeper->StartPreset(); - assert(pcm()); // ToDo: Calculate the real FPS instead pipelineContext().fps = fps; @@ -585,16 +542,16 @@ int ProjectM::initPresetTools(int gx, int gy) std::string url = (m_flags & FLAG_DISABLE_PLAYLIST_LOAD) ? std::string() : settings().presetURL; - if ((m_presetLoader = new PresetLoader(gx, gy, url)) == 0) + if ((m_presetLoader = std::make_unique(gx, gy, url)) == 0) { m_presetLoader = 0; std::cerr << "[projectM] error allocating preset loader" << std::endl; return PROJECTM_FAILURE; } - if ((m_presetChooser = new PresetChooser(*m_presetLoader, settings().softCutRatingsEnabled)) == 0) + if ((m_presetChooser = std::make_unique(*m_presetLoader, settings().softCutRatingsEnabled)) == 0) { - delete (m_presetLoader); + m_presetLoader.reset(); m_presetChooser = 0; m_presetLoader = 0; @@ -606,7 +563,7 @@ int ProjectM::initPresetTools(int gx, int gy) // Start the iterator if (!m_presetPos) { - m_presetPos = new PresetIterator(); + m_presetPos = std::make_unique(); } // Initialize a preset queue position as well @@ -633,8 +590,8 @@ int ProjectM::initPresetTools(int gx, int gy) ///< m_presetLoader->directoryName() << "\"" << std::endl; } - m_matcher = new RenderItemMatcher(); - m_merger = new MasterRenderItemMerge(); + m_matcher = std::make_unique(); + m_merger = std::make_unique(); //_merger->add(new WaveFormMergeFunction()); m_merger->add(new ShapeMerge()); m_merger->add(new BorderMerge()); @@ -655,39 +612,11 @@ void ProjectM::destroyPresetTools() { m_activePreset.reset(); m_activePreset2.reset(); - - if (m_presetPos) - { - delete (m_presetPos); - } - - m_presetPos = 0; - - if (m_presetChooser) - { - delete (m_presetChooser); - } - - m_presetChooser = 0; - - if (m_presetLoader) - { - delete (m_presetLoader); - } - - m_presetLoader = 0; - - if (m_matcher) - { - delete m_matcher; - m_matcher = NULL; - } - - if (m_merger) - { - delete m_merger; - m_merger = NULL; - } + m_presetPos.reset(); + m_presetChooser.reset(); + m_presetLoader.reset(); + m_matcher.reset(); + m_merger.reset(); } /// @bug queuePreset case isn't handled @@ -862,7 +791,7 @@ void ProjectM::selectRandom(const bool hardCut) { return; } - presetHistory.push_back(m_presetPos->lastIndex()); + m_presetHistory.push_back(m_presetPos->lastIndex()); for (int i = 0; i < kMaxSwitchRetries; ++i) { @@ -873,11 +802,11 @@ void ProjectM::selectRandom(const bool hardCut) } } // If presetHistory is tracking more than 10, then delete the oldest entry so we cap to a history of 10. - if (presetHistory.size() >= 10) + if (m_presetHistory.size() >= 10) { - presetHistory.erase(presetHistory.begin()); + m_presetHistory.erase(m_presetHistory.begin()); } - presetFuture.clear(); + m_presetFuture.clear(); } @@ -904,18 +833,18 @@ void ProjectM::selectPrevious(const bool hardCut) selectPresetByName(m_renderer->m_presetList[m_renderer->m_activePresetID - 1].name, true); } } - else if (settings().shuffleEnabled && presetHistory.size() >= 1 && - static_cast(presetHistory.back()) != m_presetLoader->size() && !m_renderer->showmenu) + else if (settings().shuffleEnabled && m_presetHistory.size() >= 1 && + static_cast(m_presetHistory.back()) != m_presetLoader->size() && !m_renderer->showmenu) { // if randomly browsing presets, "previous" should return to last random preset not the index--. Avoid returning to size() because that's the idle:// preset. - presetFuture.push_back(m_presetPos->lastIndex()); - selectPreset(presetHistory.back()); - presetHistory.pop_back(); + m_presetFuture.push_back(m_presetPos->lastIndex()); + selectPreset(m_presetHistory.back()); + m_presetHistory.pop_back(); } else { // if we are not shuffling or there is no random future history, then let's not track a random vector and move backwards in the preset index. - presetHistory.clear(); - presetFuture.clear(); + m_presetHistory.clear(); + m_presetFuture.clear(); m_presetChooser->previousPreset(*m_presetPos); if (!startPresetTransition(hardCut)) { @@ -947,18 +876,18 @@ void ProjectM::selectNext(const bool hardCut) selectPresetByName(m_renderer->m_presetList[m_renderer->m_activePresetID - 1].name, true); } } - else if (settings().shuffleEnabled && presetFuture.size() >= 1 && - static_cast(presetFuture.front()) != m_presetLoader->size() && !m_renderer->showmenu) + else if (settings().shuffleEnabled && m_presetFuture.size() >= 1 && + static_cast(m_presetFuture.front()) != m_presetLoader->size() && !m_renderer->showmenu) { // if shuffling and we have future presets already stashed then let's go forward rather than truely move randomly. - presetHistory.push_back(m_presetPos->lastIndex()); - selectPreset(presetFuture.back()); - presetFuture.pop_back(); + m_presetHistory.push_back(m_presetPos->lastIndex()); + selectPreset(m_presetFuture.back()); + m_presetFuture.pop_back(); } else { // if we are not shuffling or there is no random history, then let's not track a random vector and move forwards in the preset index. - presetFuture.clear(); - presetHistory.clear(); + m_presetFuture.clear(); + m_presetHistory.clear(); m_presetChooser->nextPreset(*m_presetPos); if (!startPresetTransition(hardCut)) { @@ -1400,10 +1329,9 @@ void ProjectM::setHelpText(const std::string& helpText) void ProjectM::recreateRenderer() { - delete m_renderer; - m_renderer = new Renderer(m_settings.windowWidth, m_settings.windowHeight, - m_settings.meshX, m_settings.meshY, - m_beatDetect, m_settings.presetURL, - m_settings.titleFontURL, m_settings.menuFontURL, - m_settings.datadir); + m_renderer = std::make_unique(m_settings.windowWidth, m_settings.windowHeight, + m_settings.meshX, m_settings.meshY, + m_beatDetect.get(), m_settings.presetURL, + m_settings.titleFontURL, m_settings.menuFontURL, + m_settings.datadir); } diff --git a/src/libprojectM/ProjectM.hpp b/src/libprojectM/ProjectM.hpp index e65d2058c..d7d33785f 100644 --- a/src/libprojectM/ProjectM.hpp +++ b/src/libprojectM/ProjectM.hpp @@ -343,7 +343,7 @@ public: }; - inline Pcm* pcm() + inline Pcm& pcm() { return m_pcm; } @@ -360,10 +360,6 @@ public: return *m_pipelineContext2; } - int lastPreset = 0; - std::vector presetHistory; - std::vector presetFuture; - /// Get the preset index given a name unsigned int getSearchIndex(const std::string& name) const; @@ -390,20 +386,9 @@ public: void default_key_handler(projectMEvent event, projectMKeycode keycode); - Renderer* m_renderer; - private: - Pcm* m_pcm; - double sampledPresetDuration(); - BeatDetect* m_beatDetect; - PipelineContext* m_pipelineContext; - PipelineContext* m_pipelineContext2; - Settings m_settings; - - int m_count; - void readConfig(const std::string& configFile); void readSettings(const Settings& settings); @@ -422,39 +407,39 @@ private: /// Deinitialize all preset related tools. Usually done before projectM cleanup void destroyPresetTools(); - /// The current position of the directory iterator - PresetIterator* m_presetPos; - - /// Last preset index (when randomizing) - PresetIterator* m_lastPresetPos; - - /// Required by the preset chooser. Manages a loaded preset directory - PresetLoader* m_presetLoader; - - /// Provides accessor functions to choose presets - PresetChooser* m_presetChooser; - - /// Currently loaded preset - std::unique_ptr m_activePreset; - - /// Destination preset when smooth preset switching - std::unique_ptr m_activePreset2; - - TimeKeeper* m_timeKeeper; - - int m_flags; - - RenderItemMatcher* m_matcher; - MasterRenderItemMerge* m_merger; - - bool m_errorLoadingCurrentPreset; - std::unique_ptr switchToCurrentPreset(); bool startPresetTransition(bool hard_cut); void recreateRenderer(); + class Pcm m_pcm; //!< Audio data buffer and analyzer instance. + + Settings m_settings; //!< The projectM settings. + + int m_flags{ 0 }; //!< Behaviour flags. + + std::vector m_presetHistory; //!< List of previously played preset indices. + std::vector m_presetFuture; //!< List of preset indices queued for playing. + + /** Timing information */ + int m_count{ 0 }; //!< Rendered frame count since start + + bool m_errorLoadingCurrentPreset{ false }; //!< Error flag for preset loading errors. + + std::unique_ptr m_renderer; //!< The Preset renderer. + std::unique_ptr m_beatDetect; //!< The beat detection class. + std::unique_ptr m_pipelineContext; //!< Pipeline context for the first/current preset. + std::unique_ptr m_pipelineContext2; //!< Pipeline context for the next/transitioning preset. + std::unique_ptr m_presetPos; //!< The current position of the directory iterator. + std::unique_ptr m_presetLoader; //!< Required by the preset chooser. Manages a loaded preset directory. + std::unique_ptr m_presetChooser; //!< Provides accessor functions to choose presets. + std::unique_ptr m_activePreset; //!< Currently loaded preset. + std::unique_ptr m_activePreset2; //!< Destination preset when smooth preset switching. + std::unique_ptr m_timeKeeper; //!< Keeps the different timers used to render and switch presets. + std::unique_ptr m_matcher; //!< Render item matcher for preset transitions. + std::unique_ptr m_merger; //!< Render item merger for preset transitions. + #if USE_THREADS void ThreadWorker(); diff --git a/src/libprojectM/ProjectMCWrapper.cpp b/src/libprojectM/ProjectMCWrapper.cpp index 255c033d9..cae88252f 100644 --- a/src/libprojectM/ProjectMCWrapper.cpp +++ b/src/libprojectM/ProjectMCWrapper.cpp @@ -738,10 +738,10 @@ static auto PcmAdd(projectm_handle instance, const BufferType* samples, unsigned auto* projectMInstance = handle_to_instance(instance); if(channels == PROJECTM_MONO) { - projectMInstance->pcm()->AddMono(samples, count); + projectMInstance->pcm().AddMono(samples, count); } else { - projectMInstance->pcm()->AddStereo(samples, count); + projectMInstance->pcm().AddStereo(samples, count); } }