#ifndef _THREADMANAGER_H_ #define _THREADMANAGER_H_ #include "spdlog/spdlog.h" #include "BaseRecordThread.h" // #include "CreateDBThread.h" #include "GlobalVariable.h" #include "AudioData.h" #include "RingQueue.hpp" #include "RingQueueManualMutex.hpp" #include #include class CreateWAVThread; class ConsistencyCompareThread; class NoiseDetectThread; class RTPOneRoadThread; class CreateLongFileThread; class CreateDBThread; #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(); /* ------------------------------------------------------------------------------------------- 创建录音线程,传入声卡编号和录音通道编号 录音线程是统一创建的,有一路录音通道,就会有所有的对应的原始音频处理线程 创建的时候需要传入对比项ID,这里会记录对比项ID,作为该录音通道的引用计数,该对比项销毁的时候需要调用 销毁该录音线程的函数,这样引用计数就会减1,直到引用计数为0时,会销毁该线程 注意,这里只会停止线程运行,删除线程实例由其他管理线程来完成 * -------------------------------------------------------------------------------------------- */ /* 创建一个录音通道及其附属的线程 */ bool createRecordThread(const SoundCardRoadInfo_t& roadInfo, int compareItemID); /* 移除一个录音通道一个录音通道及其附属的线程 */ bool removeRecordThread(const SoundCardRoadInfo_t& roadInfo, int compareItemID); /* 获取是否需要销毁录音线程实例 */ bool isDestroyeRecordThread() const { return m_isDestroyeRecordThread.load(); } /* 销毁录音线程,由外部的管理线程调用 */ void destroyeRecordThread(); /* ------------------------------------------------------------------------------------------- * 获取录音线程,录音线程是统一创建的,有一路录音通道,就会有所有的对应的录音处理线程 * -------------------------------------------------------------------------------------------- */ /* 查找录音线程,给原始音频分派数据的线程使用的 */ BaseRecordThread* findRecordThread(EThreadType type, int cardID, int recordID); /* 这三个线程给对比项以及其附属的计算线程使用的 */ /* 获取创建WAV线程指针 */ CreateWAVThread* getCreateWAVThread(int cardID, int recordID); /* 获取创建音量值的线程 */ CreateDBThread* getCreateDBThread(int cardID, int recordID); /* 获取发送Rtp数据的线程 */ RTPOneRoadThread* getRtpSendThread(int cardID, int recordID); /* 获取录制报警文件的线程 */ CreateLongFileThread* getCreateLongFileThread(int cardID, int recordID); /* ------------------------------------------------------------------------------------------- * 获取计算线程,如果该线程不存在则创建该线程 * 当不需要此线程后,调用remove()函数去掉该线程 * 补充: * 1、能在这里获取的线程是为了尽可能复用线程,这些都是和对比项无关的计算线程 * 2、和对比项有关的计算线程由对比项线程启动和管理 * -------------------------------------------------------------------------------------------- */ // /* 获取一致性比对线程,线程不存在则创建 */ // 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, int compareItemID); /* 去掉噪音检测线程,线程使用的计数减一,计数为0则销毁该线程 */ bool removeNoiseDetectThread(const SoundCardRoadInfo_t& roadInfo, int compareItemID); // /* 获取音量报警线程,如果不存在,则创建线程 */ // CalculateDBPhaseThread* getCalculateDBPhaseThread(const SoundCardRoadInfo_t& roadInfo); // /* 去掉音量报警线程,线程使用的计数减一,计数为0则销毁该线程 */ // bool removeCalculateDBPhaseThread(SoundCardRoadInfo_t& roadInfo); private: /* RTP线程函数,套一层壳 */ static void thread_RTPSend(RecordThreadInfo_t& threadInfo); private: /* 记录每个录音通道的引用计数 */ std::mutex m_mutexRecordThreadRefCount; std::map> m_mapRecordThreadRefCount; /* 录音线程队列 */ std::mutex m_mutexRecordThreads; std::list m_recordThreads; /* 分派数据线程队列 */ std::mutex m_mutexAssignSrcDataThreads; std::list m_assignSrcDataThreads; /* 生成wav小文件线程队列 */ std::mutex m_mutexCreateWAVThreads; std::list m_createWAVThreads; /* 计算音量和反相线程队列 */ std::mutex m_mutexCreateDBThreads; std::list m_createDBThreads; /* 生成长文件线程队列 */ std::mutex m_mutexCreateLongWAVThreads; std::list m_createLongWAVThreads; /* 发送Rtp数据的线程 */ std::mutex m_mutexRtpSendThreads; std::list m_rtpSendThreads; /* 一致性比对的线程 */ // std::mutex m_mutexConsistencyCompareThreads; /* 互斥锁,保护一致性比对线程列表 */ // int m_referCountConsistencyCompare = 0; /* 一致性比对线程的引用计数 */ // std::list m_listConsistencyCompareThreads; /* 噪音检测线程 */ std::mutex m_mutexNoiseDetectThreads; /* 互斥锁,保护噪音检测线程列表 */ /* 噪音检测线程的引用计数,键是录音通道,值是对比项ID集合 */ std::map> m_mapNoiseDetectThreadRefCount; 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; /* 日志基础信息 */ std::atomic_bool m_isDestroyeRecordThread = false; /* 是否销毁录音线程标志 */ }; #endif // _THREADMANAGER_H_