/*! @file AudioUnitSDK/AUSilentTimeout.h @copyright © 2000-2021 Apple Inc. All rights reserved. */ #ifndef AudioUnitSDK_AUSilentTimeout_h #define AudioUnitSDK_AUSilentTimeout_h #include // for UInt32 #include namespace ausdk { /*! @class AUSilentTimeout @brief Utility to assist in propagating a silence flag from signal-processing input to output, factoring in a processing delay. */ class AUSilentTimeout { public: AUSilentTimeout() = default; void Process(UInt32 inFramesToProcess, UInt32 inTimeoutLimit, bool& ioSilence) { if (ioSilence) { if (mResetTimer) { mTimeoutCounter = inTimeoutLimit; mResetTimer = false; } if (mTimeoutCounter > 0) { mTimeoutCounter -= std::min(inFramesToProcess, mTimeoutCounter); ioSilence = false; } } else { // signal to reset the next time we receive silence mResetTimer = true; } } void Reset() { mResetTimer = true; } private: UInt32 mTimeoutCounter{ 0 }; bool mResetTimer{ false }; }; } // namespace ausdk #endif // AudioUnitSDK_AUSilentTimeout_h