CreateDBThread.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #ifndef _CREATEDBTHREAD_H_
  2. #define _CREATEDBTHREAD_H_
  3. #include "BaseRecordThread.h"
  4. #include "RingQueue.hpp"
  5. #include "RingQueueManualMutex.hpp"
  6. #include "AudioData.h"
  7. struct AudioSrcData;
  8. /**
  9. * 这个功能线程计算出音量的线程,给音量报警线程使用
  10. *
  11. */
  12. class CreateDBThread : public BaseRecordThread
  13. {
  14. public:
  15. CreateDBThread(RecordThreadInfo_t& threadInfo);
  16. ~CreateDBThread() override;
  17. /* 停止线程 */
  18. void thread_stop() override;
  19. void thread_stop_block() override;
  20. /* 设置数据 */
  21. bool setData(const AudioSrcData& srcData) override;
  22. /* 设置实时数据 */
  23. bool setRealTimeData(const AudioSrcData& srcData);
  24. /* 获取最新的结果,根据时间进行对比,最新的时间比传入的晚,就是有新的数据了 */
  25. bool getLatestResult(OneSecondData& resultData);
  26. /* 获取最新的结果,让整个环形队列相等 */
  27. bool getLatestResult(RingQueueManualMutex<OneSecondData*>& resultQueue);
  28. /* 获取最新的音量包结果,count等于负数是获取所有数据,等于正数,如果暂时没有这么多数据,则返回false */
  29. bool getLatestRealTimeResult(std::list<OneDBData>& listData, const int getCount);
  30. /* 获取一个最新音量值 */
  31. bool getLatestRealTimeResult(OneDBData& resultData);
  32. private:
  33. /* 执行任务函数 */
  34. void task() override;
  35. /* 初始化一些数据 */
  36. bool initData() override;
  37. /* 清理数据 */
  38. void clearData() override;
  39. /* 计算音量和反相 */
  40. bool CreateDBPhase(AudioSrcData* audioData);
  41. /* 计算音量数据 */
  42. bool calculateVolumeData();
  43. /* 计算实时音量值 */
  44. bool calculateRealTimeVolume();
  45. private:
  46. /* --------------------------- 正常音量值的数据 --------------------------- */
  47. /* 原始音频数据环形队列 */
  48. RingQueue<AudioSrcData*> m_queueAudioData;
  49. /* 计算相关的变量 */
  50. int m_oneDBLengthOfSrcData = 0; /* 计算一个DB需要的原始音频数据的长度,单位:short */
  51. int m_singleDataLength = 0; /* 一秒钟单声道数据长度,单位:字节 */
  52. OneSecondData* m_result = nullptr; /* 存储每秒钟的音量和反相数据 */
  53. /* 计算结果环形队列,存储每秒钟的音量和反相数据 */
  54. RingQueueManualMutex<OneSecondData*> m_queueResultData;
  55. /* --------------------------- 实时音量值的数据 --------------------------- */
  56. RingQueue<AudioSrcData*> m_queueRealTimeData; /* 存储小于1秒的音频数据,应该是33m的 */
  57. std::mutex m_mutexRealTimeResult; /* 实时结果的互斥锁 */
  58. std::list<OneDBData> m_listRealTimeResult; /* 实时音量数据 */
  59. int m_numMaxResultData = 0; /* 最大实时音量数据的数量 */
  60. };
  61. #endif // _CREATEDBTHREAD_H_