#pragma once #include #include #include #include "DemodulatorThread.h" class DemodulatorInstance { public: DemodulatorThreadInputQueue* threadQueueDemod; DemodulatorThreadCommandQueue* threadQueueCommand; DemodulatorThreadCommandQueue* threadQueueNotify; DemodulatorThread *demodulatorThread; #ifdef __APPLE__ pthread_t t_Demod; #else std::thread *t_Demod; #endif AudioThreadInputQueue *audioInputQueue; AudioThread *audioThread; std::thread *t_Audio; DemodulatorInstance(); ~DemodulatorInstance(); void setVisualOutputQueue(DemodulatorThreadOutputQueue *tQueue); DemodulatorThreadCommandQueue *getCommandQueue(); DemodulatorThreadParameters &getParams(); void run(); void terminate(); std::string getLabel(); void setLabel(std::string labelStr); bool isTerminated(); void updateLabel(int freq); private: std::atomic label; bool terminated; bool demodTerminated; bool audioTerminated; }; class DemodulatorMgr { public: DemodulatorMgr(); ~DemodulatorMgr(); DemodulatorInstance *newThread(); std::vector &getDemodulators(); std::vector *getDemodulatorsAt(int freq, int bandwidth); void deleteThread(DemodulatorInstance *); void terminateAll(); void setActiveDemodulator(DemodulatorInstance *demod, bool temporary = true); DemodulatorInstance *getActiveDemodulator(); DemodulatorInstance *getLastActiveDemodulator(); private: void garbageCollect(); std::vector demods; std::vector demods_deleted; DemodulatorInstance *activeDemodulator; DemodulatorInstance *lastActiveDemodulator; DemodulatorInstance *activeVisualDemodulator; };