HifiExperimentscleanup, fixes, update QML750c5f22 years agoHistory
143 lines · 5.0 KB · C
RawDownload
////  RefreshRateManager.h//  interface/src/////  Created by Dante Ruiz on 2019-04-15.//  Copyright 2019 High Fidelity, Inc.//  Copyright 2022-2023 Overte e.V.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//  SPDX-License-Identifier: Apache-2.0// #ifndef hifi_RefreshRateManager_h#define hifi_RefreshRateManager_h #include <map>#include <string>#include <functional> #include <QTimer> #include <SettingHandle.h>#include <ScriptEngineCast.h>#include <ScriptManager.h>#include <shared/ReadWriteLockable.h> class RefreshRateManager : QObject {    Q_OBJECTpublic:    enum RefreshRateProfile {        ECO = 0,        INTERACTIVE,        REALTIME,        CUSTOM,        PROFILE_NUM    };    Q_ENUM(RefreshRateProfile)    static bool isValidRefreshRateProfile(RefreshRateProfile value) { return (value >= 0 && value < RefreshRateProfile::PROFILE_NUM); }     /*@jsdoc     * <p>Interface states that affect the refresh rate.</p>     * <table>     *   <thead>     *     <tr><th>Value</th><th>Name</th><th>Description</th>     *   </thead>     *   <tbody>     *     <tr><td><code>0</code></td><td>FOCUS_ACTIVE</td><td>Interface has focus and the user is active or is in VR.</td></tr>     *     <tr><td><code>1</code></td><td>FOCUS_INACTIVE</td><td>Interface has focus and the user is inactive.</td></tr>     *     <tr><td><code>2</code></td><td>UNFOCUS</td><td>Interface doesn't have focus.</td></tr>     *     <tr><td><code>3</code></td><td>MINIMIZED</td><td>Interface is minimized.</td></tr>     *     <tr><td><code>4</code></td><td>STARTUP</td><td>Interface is starting up.</td></tr>     *     <tr><td><code>5</code></td><td>SHUTDOWN</td><td>Interface is shutting down.</td></tr>     *   </tbody>     * </table>     * @typedef {number} RefreshRateRegime     */    enum RefreshRateRegime {        FOCUS_ACTIVE = 0,        FOCUS_INACTIVE,        UNFOCUS,        MINIMIZED,        STARTUP,        SHUTDOWN,        REGIME_NUM    };    Q_ENUM(RefreshRateRegime)    static bool isValidRefreshRateRegime(RefreshRateRegime value) { return (value >= RefreshRateRegime::FOCUS_ACTIVE && value <= RefreshRateRegime::SHUTDOWN); }     /*@jsdoc     * <p>User experience (UX) modes.</p>     * <table>     *   <thead>     *     <tr><th>Value</th><th>Name</th><th>Description</th>     *   </thead>     *   <tbody>     *     <tr><td><code>0</code></td><td>DESKTOP</td><td>Desktop user experience.</td></tr>     *     <tr><td><code>1</code></td><td>VR</td><td>VR use experience.</td></tr>     *   </tbody>     * </table>     * @typedef {number} UXMode     */    enum UXMode {        DESKTOP = 0,        VR,        UX_NUM    };    Q_ENUM(UXMode)    static bool isValidUXMode(UXMode value) { return (value >= UXMode::DESKTOP && value <= UXMode::VR); }     RefreshRateManager();    ~RefreshRateManager() = default;     void setRefreshRateProfile(RefreshRateProfile refreshRateProfile);    RefreshRateProfile getRefreshRateProfile() const;     void setRefreshRateRegime(RefreshRateRegime refreshRateRegime);    RefreshRateRegime getRefreshRateRegime() const;     void setUXMode(UXMode uxMode);    UXMode getUXMode() const { return _uxMode; }     void setRefreshRateOperator(std::function<void(int)> refreshRateOperator) { _refreshRateOperator = refreshRateOperator; }    int getActiveRefreshRate() const { return _activeRefreshRate; }    void updateRefreshRateController() const;     // query the refresh rate target at the specified combination    int queryRefreshRateTarget(RefreshRateProfile profile, RefreshRateRegime regime, UXMode uxMode) const;     int getCustomRefreshRate(RefreshRateRegime regime);    void setCustomRefreshRate(RefreshRateRegime regime, int value);     void resetInactiveTimer();    void toggleInactive();     static std::string refreshRateProfileToString(RefreshRateProfile refreshRateProfile);    static RefreshRateProfile refreshRateProfileFromString(std::string refreshRateProfile);    static std::string uxModeToString(UXMode uxMode);    static std::string refreshRateRegimeToString(RefreshRateRegime refreshRateRegime); private:    mutable int _activeRefreshRate { 20 };    RefreshRateProfile _refreshRateProfile { RefreshRateProfile::INTERACTIVE};    RefreshRateRegime _refreshRateRegime { RefreshRateRegime::STARTUP };    UXMode _uxMode { UXMode::DESKTOP };     mutable ReadWriteLockable _refreshRateProfileSettingLock;    Setting::Handle<int> _refreshRateProfileSetting{ "refreshRateProfile", RefreshRateProfile::INTERACTIVE };    std::array<Setting::Handle<int>, REGIME_NUM> _customRefreshRateSettings { {        { "customRefreshRateFocusActive", 60 },        { "customRefreshRateFocusInactive", 60 },        { "customRefreshRateUnfocus", 60 },        { "customRefreshRateMinimized", 2 },        { "customRefreshRateStartup", 30 },        { "customRefreshRateShutdown", 30 }    } };     std::function<void(int)> _refreshRateOperator { nullptr };     std::shared_ptr<QTimer> _inactiveTimer { std::make_shared<QTimer>() };}; #endif