/* * ---------------------------------------------------------------- * * ITA core libs * (c) Copyright Institute of Technical Acoustics (ITA) * RWTH Aachen University, Germany, 2015-2017 * * ---------------------------------------------------------------- * ____ __________ _______ * // / //__ ___/ // _ | * // / // / // /_| | * // / // / // ___ | * //__/ //__/ //__/ |__| * * ---------------------------------------------------------------- * */ #ifndef INCLUDE_WATCHER_DSMBC_TRIGGER #define INCLUDE_WATCHER_DSMBC_TRIGGER #include #include // Lightweight atomic trigger for synchronized filter exchanges class ITA_CONVOLUTION_API DSMBCTrigger : public ITAUncopyable { public: DSMBCTrigger() : m_iState(0) {}; // Returns the current state int getState() const { return m_iState; }; // Pull the trigger. Update/alter the state. void trigger() { ++m_iState; }; private: volatile int m_iState; }; // Simple watcher class, realization update checks on a trigger class ITA_CONVOLUTION_API DSMBCTriggerWatch { public: DSMBCTriggerWatch() : m_pTrigger(0), bFirst(true), m_iPrevTriggerState(0) {}; const DSMBCTrigger* getWatchedTrigger() const { return m_pTrigger; }; void setWatchedTrigger(const DSMBCTrigger* pNewTrigger) { m_pTrigger = pNewTrigger; bFirst = true; }; // Logic: We always fire, if there is no trigger associated. This is needed in the convolver. bool fire() { if (!m_pTrigger) return true; int iNewTriggerState = m_pTrigger->getState(); if ((iNewTriggerState != m_iPrevTriggerState) || bFirst) { m_iPrevTriggerState = iNewTriggerState; bFirst = false; return true; } return false; }; private: const DSMBCTrigger* m_pTrigger; bool bFirst; int m_iPrevTriggerState; }; #endif // INCLUDE_WATCHER_DSMBC_TRIGGER