cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: #ifndef _PROCESSOR_H_ cannam@0: #define _PROCESSOR_H_ cannam@0: cannam@0: #include cannam@0: #include cannam@0: #include cannam@0: cannam@0: #include "audioio/BufferingAudioCallbackRecordTarget.h" cannam@0: Chris@15: #include cannam@0: cannam@4: #include "Rule.h" cannam@4: cannam@1: #include cannam@1: #include cannam@1: cannam@0: class Processor : public QThread cannam@0: { cannam@6: Q_OBJECT cannam@6: cannam@0: public: cannam@0: Processor(BufferingAudioCallbackRecordTarget *audioRecordTarget); cannam@0: virtual ~Processor(); cannam@0: cannam@0: int addPlugin(QString pluginId); // returns reference number, 0 for failure cannam@0: void removePlugin(int number); cannam@0: cannam@7: void addRule(Rule *rule); // I take ownership of rule cannam@6: cannam@0: protected: cannam@0: virtual void run(); cannam@1: bool runPlugins(); cannam@4: bool processRules(); cannam@0: cannam@0: bool m_exiting; cannam@0: BufferingAudioCallbackRecordTarget *m_audioRecordTarget; cannam@0: cannam@1: // Plugins indexed by plugin number cannam@0: typedef std::map PluginMap; cannam@0: PluginMap m_plugins; cannam@0: int m_nextNumber; cannam@0: cannam@4: // Map back from plugin to index cannam@4: typedef std::map PluginRMap; cannam@4: PluginRMap m_pluginRMap; cannam@4: cannam@1: // The same plugins, indexed by step and block sizes cannam@1: typedef std::set PluginSet; cannam@1: typedef std::map BlockSizePluginMap; cannam@1: typedef std::map StepSizePluginMap; cannam@1: StepSizePluginMap m_processingMap; cannam@0: cannam@1: // A map from step size to ring buffer reader number cannam@1: typedef std::map StepSizeReaderMap; cannam@5: typedef std::set ReaderSet; cannam@1: StepSizeReaderMap m_stepSizeReaderMap; cannam@5: ReaderSet m_unusedReaders; cannam@1: cannam@7: typedef std::multiset RuleSet; cannam@7: RuleSet m_rules; cannam@4: cannam@4: class OutputState { cannam@4: public: cannam@4: OutputState() : cannam@14: present(false), silentInput(true), changed(false), value(0.f) { } cannam@14: OutputState(bool p, bool si, bool c, float v, Vamp::RealTime s, Vamp::RealTime g) : cannam@14: present(p), silentInput(si), changed(c), value(v), laststamp(s), gap(g) { } cannam@4: bool present; cannam@14: bool silentInput; cannam@4: bool changed; cannam@4: float value; cannam@4: Vamp::RealTime laststamp; cannam@4: Vamp::RealTime gap; cannam@4: }; cannam@4: cannam@4: // Map from plugin index to output index to state cannam@5: typedef std::map OutputStateMap; cannam@5: typedef std::map PluginStateMap; cannam@4: PluginStateMap m_pluginStates; cannam@4: cannam@1: bool m_havePlugins; cannam@1: size_t m_minBlockSize; cannam@1: size_t m_maxBlockSize; cannam@0: QMutex m_mutex; cannam@0: }; cannam@0: cannam@0: #endif cannam@0: