#ifndef _THREADMANAGER_H_ #define _THREADMANAGER_H_ #include "spdlog/spdlog.h" #include "BaseRecordThread.h" #include "CreateDBPhaseThread.h" #include "GlobalVariable.h" #include "AudioData.h" #include "RingQueue.hpp" #include "RingQueueManualMutex.hpp" #include class CreateWAVThread; class CalculateDBAndPhase; class ConsistencyCompareThread; class NoiseDetectThread; class CalculateDBPhaseThread; class RTPOneRoadThread; #define ThreadMan ThreadManager::getInstance() /** * @brief 线程管理类,这里只是提供线程的存储,释放和搜索功能 * */ class ThreadManager { ThreadManager(); ThreadManager(const ThreadManager&) = delete; // 禁止拷贝构造 ThreadManager& operator=(const ThreadManager&) = delete; // 禁止赋值操作 public: ~ThreadManager() = default; static ThreadManager& getInstance() { static ThreadManager instance; // 局部静态变量,线程安全 return instance; } /* 启动所有线程 */ void startAllThreads(); /* 停止所有线程 */ void stopAllThreads(); /* 添加线程 */ // void addThread(StRecordThreadInfo* pThreadInfo); /* 查找录音线程 */ BaseRecordThread* findRecordThread(EThreadType type, int cardID, int recordID); /* ------------------------------------------------------------------------------------------- * 获取录音线程,录音线程是统一创建的,有一路录音通道,就会有所有的对应的录音处理线程 * -------------------------------------------------------------------------------------------- */ /* 获取创建WAV线程指针 */ CreateWAVThread* getCreateWAVThread(int cardID, int recordID); /* 获取创建音量值的线程 */ CreateDBPhaseThread* getCreateDBPhaseThread(int cardID, int recordID); /* 获取发送Rtp数据的线程 */ RTPOneRoadThread* getRtpSendThread(int cardID, int recordID); /* ------------------------------------------------------------------------------------------- * 获取计算线程,如果该线程不存在则创建该线程 * 当不需要此线程后,调用remove()函数去掉该线程 * 补充: * 1、能在这里获取的线程是为了尽可能复用线程,这些都是和对比项无关的计算线程 * -------------------------------------------------------------------------------------------- */ /* 获取一致性比对线程,线程不存在则创建 */ ConsistencyCompareThread* getConsistencyCompareThread(const SoundCardRoadInfo_t& roadInfo1, const SoundCardRoadInfo_t& roadInfo2); /* 去掉线程,线程使用的计数减一,计数为0则销毁该线程 */ bool removeConsistencyCompareThread(SoundCardRoadInfo_t& roadInfo1, SoundCardRoadInfo_t& roadInfo2); /* 获取噪音检测线程,如果不存在,则创建线程 */ NoiseDetectThread* getNoiseDetectThread(const SoundCardRoadInfo_t& roadInfo); /* 去掉噪音检测线程,线程使用的计数减一,计数为0则销毁该线程 */ bool removeNoiseDetectThread(SoundCardRoadInfo_t& roadInfo); // /* 获取音量报警线程,如果不存在,则创建线程 */ // CalculateDBPhaseThread* getCalculateDBPhaseThread(const SoundCardRoadInfo_t& roadInfo); // /* 去掉音量报警线程,线程使用的计数减一,计数为0则销毁该线程 */ // bool removeCalculateDBPhaseThread(SoundCardRoadInfo_t& roadInfo); private: /* 录音线程队列 */ std::list m_recordThreads; /* 分派数据线程队列 */ std::list m_assignSrcDataThreads; /* 生成wav小文件线程队列 */ std::list m_createWAVThreads; /* 计算音量和反相线程队列 */ std::list m_createDBPhaseThreads; /* 生成长文件线程队列 */ std::list m_createLongWAVThreads; /* 发送Rtp数据的线程 */ std::list m_rtpSendThreads; /* 一致性比对的线程 */ std::mutex m_mutexConsistencyCompareThreads; /* 互斥锁,保护一致性比对线程列表 */ int m_referCountConsistencyCompare = 0; /* 一致性比对线程的引用计数 */ std::list m_listConsistencyCompareThreads; /* 噪音检测线程 */ std::mutex m_mutexNoiseDetectThreads; /* 互斥锁,保护噪音检测线程列表 */ int m_referCountNoiseDetect = 0; /* 噪音检测线程的引用计数 */ std::list m_listNoiseDetectThreads; /* 音量计算线程 */ // std::mutex m_mutexCalculateDBPhaseThreads; /* 互斥锁,保护音量计算线程列表 */ // int m_referCountCalculateDBPhase = 0; /* 音量计算线程的引用计数 */ // std::list m_listCalculateDBPhaseThreads; private: std::shared_ptr m_logger = nullptr; /* 日志记录器 */ std::string m_logBase; /* 日志基础信息 */ }; #endif // _THREADMANAGER_H_