123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- #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 <list>
- #include <mutex>
- 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<SoundCardRoadInfo_t, std::list<int>> m_mapRecordThreadRefCount;
- /* 录音线程队列 */
- std::mutex m_mutexRecordThreads;
- std::list<BaseRecordThread*> m_recordThreads;
- /* 分派数据线程队列 */
- std::mutex m_mutexAssignSrcDataThreads;
- std::list<BaseRecordThread*> m_assignSrcDataThreads;
- /* 生成wav小文件线程队列 */
- std::mutex m_mutexCreateWAVThreads;
- std::list<BaseRecordThread*> m_createWAVThreads;
- /* 计算音量和反相线程队列 */
- std::mutex m_mutexCreateDBThreads;
- std::list<BaseRecordThread*> m_createDBThreads;
- /* 生成长文件线程队列 */
- std::mutex m_mutexCreateLongWAVThreads;
- std::list<BaseRecordThread*> m_createLongWAVThreads;
- /* 发送Rtp数据的线程 */
- std::mutex m_mutexRtpSendThreads;
- std::list<BaseRecordThread*> m_rtpSendThreads;
- /* 一致性比对的线程 */
- // std::mutex m_mutexConsistencyCompareThreads; /* 互斥锁,保护一致性比对线程列表 */
- // int m_referCountConsistencyCompare = 0; /* 一致性比对线程的引用计数 */
- // std::list<ConsistencyCompareThread*> m_listConsistencyCompareThreads;
- /* 噪音检测线程 */
- std::mutex m_mutexNoiseDetectThreads; /* 互斥锁,保护噪音检测线程列表 */
- /* 噪音检测线程的引用计数,键是录音通道,值是对比项ID集合 */
- std::map<SoundCardRoadInfo_t, std::list<int>> m_mapNoiseDetectThreadRefCount;
- std::list<NoiseDetectThread*> m_listNoiseDetectThreads;
- /* 音量计算线程 */
- // std::mutex m_mutexCalculateDBPhaseThreads; /* 互斥锁,保护音量计算线程列表 */
- // int m_referCountCalculateDBPhase = 0; /* 音量计算线程的引用计数 */
- // std::list<CalculateDBPhaseThread*> m_listCalculateDBPhaseThreads;
- private:
- std::shared_ptr<spdlog::logger> m_logger = nullptr; /* 日志记录器 */
- std::string m_logBase; /* 日志基础信息 */
- std::atomic_bool m_isDestroyeRecordThread = false; /* 是否销毁录音线程标志 */
-
- };
- #endif // _THREADMANAGER_H_
|