diff --git a/include/AudioEngine.h b/include/AudioEngine.h index 9cf010426..a86f540cb 100644 --- a/include/AudioEngine.h +++ b/include/AudioEngine.h @@ -62,6 +62,46 @@ class LMMS_EXPORT AudioEngine : public QObject { Q_OBJECT public: + /** + * @brief RAII helper for requestChangesInModel. + * Used by AudioEngine::requestChangesGuard. + */ + class RequestChangesGuard { + friend class AudioEngine; + + private: + RequestChangesGuard(AudioEngine* audioEngine) + : m_audioEngine{audioEngine} + { + m_audioEngine->requestChangeInModel(); + } + public: + + RequestChangesGuard() + : m_audioEngine{nullptr} + { + } + + RequestChangesGuard(RequestChangesGuard&& other) + : RequestChangesGuard() + { + std::swap(other.m_audioEngine, m_audioEngine); + } + + // Disallow copy. + RequestChangesGuard(const RequestChangesGuard&) = delete; + RequestChangesGuard& operator=(const RequestChangesGuard&) = delete; + + ~RequestChangesGuard() { + if (m_audioEngine) { + m_audioEngine->doneChangeInModel(); + } + } + + private: + AudioEngine* m_audioEngine; + }; + struct qualitySettings { enum Mode @@ -309,6 +349,11 @@ public: void requestChangeInModel(); void doneChangeInModel(); + RequestChangesGuard requestChangesGuard() + { + return RequestChangesGuard{this}; + } + static bool isAudioDevNameValid(QString name); static bool isMidiDevNameValid(QString name);