/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { //============================================================================== /** Maintains an ongoing measurement of the proportion of time which is being spent inside an audio callback. */ class JUCE_API AudioProcessLoadMeasurer { public: /** */ AudioProcessLoadMeasurer(); /** Destructor. */ ~AudioProcessLoadMeasurer(); //============================================================================== /** Resets the state. */ void reset(); /** Resets the counter, in preparation for use with the given sample rate and block size. */ void reset (double sampleRate, int blockSize); /** Returns the current load as a proportion 0 to 1.0 */ double getLoadAsProportion() const; /** Returns the current load as a percentage 0 to 100.0 */ double getLoadAsPercentage() const; /** Returns the number of over- (or under-) runs recorded since the state was reset. */ int getXRunCount() const; //============================================================================== /** This class measures the time between its construction and destruction and adds it to an AudioProcessLoadMeasurer. e.g. @code { AudioProcessLoadMeasurer::ScopedTimer timer (myProcessLoadMeasurer); myCallback->doTheCallback(); } @endcode */ struct JUCE_API ScopedTimer { ScopedTimer (AudioProcessLoadMeasurer&); ~ScopedTimer(); private: AudioProcessLoadMeasurer& owner; double startTime; JUCE_DECLARE_NON_COPYABLE (ScopedTimer) }; /** Can be called manually to add the time of a callback to the stats. Normally you probably would never call this - it's simpler and more robust to use a ScopedTimer to measure the time using an RAII pattern. */ void registerBlockRenderTime (double millisecondsTaken); private: double cpuUsageMs = 0, timeToCpuScale = 0, msPerBlock = 0; int xruns = 0; }; } // namespace juce