ThreadManager.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef _THREADMANAGER_H_
  2. #define _THREADMANAGER_H_
  3. #include "spdlog/spdlog.h"
  4. #include "BaseRecordThread.h"
  5. // #include "CreateDBThread.h"
  6. #include "GlobalVariable.h"
  7. #include "AudioData.h"
  8. #include "RingQueue.hpp"
  9. #include "RingQueueManualMutex.hpp"
  10. #include <list>
  11. #include <mutex>
  12. #include <string>
  13. class CreateWAVThread;
  14. class ConsistencyCompareThread;
  15. class NoiseDetectThread;
  16. class RTPOneRoadThread;
  17. class CreateRecordFileThread;
  18. class CreateDBThread;
  19. #define ThreadMan ThreadManager::getInstance()
  20. /**
  21. * @brief 线程管理类,这里只是提供线程的存储,释放和搜索功能
  22. *
  23. */
  24. class ThreadManager
  25. {
  26. ThreadManager();
  27. ThreadManager(const ThreadManager&) = delete; // 禁止拷贝构造
  28. ThreadManager& operator=(const ThreadManager&) = delete; // 禁止赋值操作
  29. public:
  30. ~ThreadManager() = default;
  31. static ThreadManager& getInstance()
  32. {
  33. static ThreadManager instance; // 局部静态变量,线程安全
  34. return instance;
  35. }
  36. /* 启动所有线程 */
  37. // void startAllThreads();
  38. /* 停止所有线程 */
  39. void stopAllThreads();
  40. /* 线程函数,销毁录音线程 */
  41. void thread_destroyeRecordThread();
  42. /* -------------------------------------------------------------------------------------------
  43. 创建录音线程,传入声卡编号和录音通道编号
  44. 录音线程是统一创建的,有一路录音通道,就会有所有的对应的原始音频处理线程
  45. 创建的时候需要传入对比项ID,这里会记录对比项ID,作为该录音通道的引用计数,该对比项销毁的时候需要调用
  46. 销毁该录音线程的函数,这样引用计数就会减1,直到引用计数为0时,会销毁该线程
  47. 注意,这里只会停止线程运行,删除线程实例由其他管理线程来完成
  48. * -------------------------------------------------------------------------------------------- */
  49. /* 创建一个录音通道及其附属的线程 */
  50. bool createRecordThread(const OneSoundCardPCMInfo_t& pcmInfo, int compareItemID);
  51. /* 移除一个录音通道一个录音通道及其附属的线程 */
  52. bool removeRecordThread(const OneSoundCardPCMInfo_t& pcmInfo, int compareItemID);
  53. /* -------------------------------------------------------------------------------------------
  54. * 获取录音线程,录音线程是统一创建的,有一路录音通道,就会有所有的对应的录音处理线程
  55. * -------------------------------------------------------------------------------------------- */
  56. /* 查找录音线程,给原始音频分派数据的线程使用的 */
  57. BaseRecordThread* findRecordThread(EThreadType type, std::string pcmName);
  58. /* 这三个线程给对比项以及其附属的计算线程使用的 */
  59. /* 获取创建WAV线程指针 */
  60. CreateWAVThread* getCreateWAVThread(std::string pcmName);
  61. /* 获取创建音量值的线程 */
  62. CreateDBThread* getCreateDBThread(std::string pcmName);
  63. /* 获取发送Rtp数据的线程 */
  64. RTPOneRoadThread* getRtpSendThread(std::string pcmName);
  65. /* 获取录制报警文件的线程 */
  66. CreateRecordFileThread* getCreateRecordFileThread(std::string pcmName);
  67. private:
  68. /* RTP线程函数,套一层壳 */
  69. static void thread_RTPSend(RecordThreadInfo_t& threadInfo);
  70. /* 停止某个录音通道的所有的线程 */
  71. void stopRecordAllThreads(const OneSoundCardPCMInfo_t& pcmInfo);
  72. /* 销毁录音线程函数 */
  73. void destroyRecordThread();
  74. private:
  75. /* 销毁录音线程的条件变量 */
  76. std::condition_variable m_condVarDestroyRecord;
  77. /* 记录每个录音通道的引用计数,key是PCM通道名,在系统中是唯一的 */
  78. std::mutex m_mutexRecordThreadRefCount;
  79. std::map<std::string, std::list<int>> m_mapRecordThreadRefCount;
  80. /* 录音线程队列 */
  81. std::mutex m_mutexRecordThreads;
  82. std::list<BaseRecordThread*> m_recordThreads;
  83. /* 分派数据线程队列 */
  84. std::mutex m_mutexAssignSrcDataThreads;
  85. std::list<BaseRecordThread*> m_assignSrcDataThreads;
  86. /* 生成wav小文件线程队列 */
  87. std::mutex m_mutexCreateWAVThreads;
  88. std::list<BaseRecordThread*> m_createWAVThreads;
  89. /* 计算音量和反相线程队列 */
  90. std::mutex m_mutexCreateDBThreads;
  91. std::list<BaseRecordThread*> m_createDBThreads;
  92. /* 生成长文件线程队列 */
  93. std::mutex m_mutexCreateLongWAVThreads;
  94. std::list<BaseRecordThread*> m_createLongWAVThreads;
  95. /* 发送Rtp数据的线程 */
  96. std::mutex m_mutexRtpSendThreads;
  97. std::list<BaseRecordThread*> m_rtpSendThreads;
  98. /* 一致性比对的线程 */
  99. // std::mutex m_mutexConsistencyCompareThreads; /* 互斥锁,保护一致性比对线程列表 */
  100. // int m_referCountConsistencyCompare = 0; /* 一致性比对线程的引用计数 */
  101. // std::list<ConsistencyCompareThread*> m_listConsistencyCompareThreads;
  102. /* 噪音检测线程 */
  103. // std::mutex m_mutexNoiseDetectThreads; /* 互斥锁,保护噪音检测线程列表 */
  104. /* 噪音检测线程的引用计数,键是录音通道,值是对比项ID集合 */
  105. // std::map<SoundCardRoadInfo_t, std::list<int>> m_mapNoiseDetectThreadRefCount;
  106. // std::list<NoiseDetectThread*> m_listNoiseDetectThreads;
  107. /* 音量计算线程 */
  108. // std::mutex m_mutexCalculateDBPhaseThreads; /* 互斥锁,保护音量计算线程列表 */
  109. // int m_referCountCalculateDBPhase = 0; /* 音量计算线程的引用计数 */
  110. // std::list<CalculateDBPhaseThread*> m_listCalculateDBPhaseThreads;
  111. private:
  112. std::shared_ptr<spdlog::logger> m_logger = nullptr; /* 日志记录器 */
  113. std::string m_logBase; /* 日志基础信息 */
  114. std::atomic_bool m_isDestroyeRecordThread = false; /* 是否销毁录音线程标志 */
  115. std::mutex m_mutexDestroyRecordThread; /* 互斥锁,保护销毁录音线程标志 */
  116. };
  117. #endif // _THREADMANAGER_H_