GlobalInfo.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #ifndef _GLOBALINFO_H_
  2. #define _GLOBALINFO_H_
  3. /**
  4. * @file GlobalInfo.h
  5. * @author your name (you@domain.com)
  6. * @brief
  7. * @version 0.1
  8. * @date 2025-07-15
  9. *
  10. * @copyright Copyright (c) 2025
  11. *
  12. * 1、Server的全局信息,一些参数通过ReadConfig读取,这个类是ReadConfig友元
  13. * 2、这个类里都是一些固定的参数,可以配置的在SysConfig中
  14. */
  15. #include <qt5/QtCore/qchar.h>
  16. #include <string>
  17. #include <QString>
  18. class ReadConfig;
  19. /* 全局变量信息 */
  20. #define GInfo GlobalInfo::getInstance()
  21. class GlobalInfo
  22. {
  23. friend class ACAServer; // 允许ReadConfig访问私有成员
  24. GlobalInfo() = default;
  25. GlobalInfo(const GlobalInfo&) = delete; // 禁止拷贝构造
  26. GlobalInfo& operator=(const GlobalInfo&) = delete; // 禁止赋值操作
  27. public:
  28. ~GlobalInfo();
  29. /* 获取全局信息单例 */
  30. static GlobalInfo& getInstance()
  31. {
  32. static GlobalInfo instance; // 局部静态变量,线程安全
  33. return instance;
  34. }
  35. /* 初始化全局信息 */
  36. void initGlobalInfo();
  37. /* 获取mqtt信息 */
  38. QString mqttIP() const {return m_mqttIP;}
  39. int mqttPort() const {return m_mqttPort;}
  40. void setMqttInfo(const QString& ip, int port);
  41. const QString& mqttPubTopicDB() const {return m_pubTopicDB;}
  42. const QString& mqttPubTopicCompareItem() const {return m_pubTopicCompareItem;}
  43. const QString& mqttPubTopicServerInfo() const {return m_pubTopicServerInfo;}
  44. /* 获取WebAPI信息 */
  45. QString webAPIUrl() const {return m_webAPIUrl;}
  46. QString webAPIID() const {return m_webAPIID;}
  47. QString webApiAppType() const {return m_webAPIAppType;}
  48. void setWebAPIInfo(const QString& url, const QString& id);
  49. public:
  50. /* 音频相关数据 */
  51. int32_t sampleRate() const {return m_sampleRate;} /* 获取采样率 */
  52. uint16_t numChannels() const {return m_numChannels;} /* 获取声道数 */
  53. uint16_t bitsPerSample() const {return m_bitsPerSample;} /* 获取每个采样点的位数 */
  54. /* 获取环形队列元素数目 */
  55. int32_t queueElementCount() const {return m_queueElementCount;}
  56. /* 获取一秒音频字节大小 */
  57. // int32_t oneSecondCount() const {return m_oneSecondCount;}
  58. /* 获取wav文件时长 */
  59. int32_t wavFileDuration() const {return m_wavFileDuration;}
  60. /* 获取噪音检测元素大小,单位:秒 */
  61. int32_t noiseElementDuration() const {return m_noiseElementDuration;}
  62. /* 获取计算音量和反相的环形队列元素数目 */
  63. // int32_t DBQueueElementCount() const {return m_DBQueueElementCount;}
  64. /* 设置根目录 */
  65. void setRootPath(const QString& path) { m_rootPath = path; }
  66. /* wav小文件路径 */
  67. QString wavPath() const {return m_wavPath;}
  68. /* 记录的长文件路径 */
  69. QString longWavPath() const {return m_longWavPath;}
  70. /* 报警文件路径 */
  71. QString alarmWavPath() const {return m_alarmWavPath;}
  72. /* 获取音频不对称百分比 */
  73. int pcmErrorPercent() const {return m_pcmErrorPercent;}
  74. /* 获取音频少于百分比 */
  75. int pcmLessPercent() const {return m_pcmLessPercent;}
  76. /* 获取偏移量,单位:毫秒 */
  77. long offsetMSeconds() const {return m_offsetMSeconds;}
  78. /* 获取静音反相过载灵敏度 */
  79. int silentSensitivity() const {return m_silentSensitivity;}
  80. /* 获取反相灵敏度 */
  81. int iPhaseSensitivity() const {return m_iPhaseSensitivity;}
  82. /* 获取过载灵敏度 */
  83. int overloadSensitivity() const {return m_overloadSensitivity;}
  84. /* 获取计算所需要的秒数 */
  85. int calculateDataSeconds() const {return m_calculateDataSeconds;}
  86. /* 获取计算平均音量所需要的时长 */
  87. int avgDBCalculateSeconds() const {return m_avgDBCalculateSeconds;}
  88. /* 获取静音阈值 */
  89. int silentThreshold() const {return m_silentThreshold;}
  90. /* 要忽视的反相阀值,反相值接近0时忽视掉,维持当前反相状态 */
  91. int ignorePhaseThreshold() const {return m_ignorePhaseThreshold;}
  92. /* 获取正弦波计算所需要的时长 */
  93. int sinSeconds() const {return m_sinSeconds;}
  94. /* 获取正弦波有效数据个数 */
  95. int sinEffectiveNum() const {return m_sinEffectiveNum;}
  96. /* 获取杭州台是否按上面的逻辑来 */
  97. // bool isAINotConsistencyAlone() const {return m_isAINotConsistencyAlone; }
  98. /* 获取是否需要等待静音状态 */
  99. int nIsSameBothMinDBWaitNum() const {return m_nIsSameBothMinDBWaitNum;}
  100. /* 获取一致性对比时间间隔 */
  101. // int compareTimeSpan() const {return m_nCompareTimeSpan <= 500 ? 500 : m_nCompareTimeSpan; } // 最小500毫秒
  102. /* 获取AI对比持续次数 */
  103. // int AICMPThresholdNum() const {return m_nAICMPThresholdNum;}
  104. // /* 获取AI对比相似度阀值 */
  105. // float AICMPThresholdNot() const {return m_fAICMPThresholdNot;}
  106. // /* 获取音频错位百分比 */
  107. // float AICMPOffset() const {return m_fAICMPOffset;}
  108. // /* 获取AI对比相似度阀值 */
  109. // float AICMPThreshold() const {return m_fAICMPThresholdNot > 0.99 ? 0.99 : m_fAICMPThresholdNot; } //
  110. private:
  111. /* 初始化文件夹 */
  112. void initDirectories();
  113. /* 初始化数据 */
  114. void initData();
  115. private:
  116. /******************** 系统基础设置 *********************/
  117. /* MQTT信息 */
  118. QString m_mqttIP; /* MQTT服务器IP */
  119. int m_mqttPort = 1883; /* MQTT服务器端口 */
  120. /* WebAPI地址 */
  121. QString m_webAPIUrl; /* WebAPI地址 */
  122. QString m_webAPIID; /* WebAPI ID */
  123. const QString m_webAPIAppType = "ACAWatch"; /* 应用类型 */
  124. QString m_pubTopicDB = "LH_ACAServer/DB"; /* 音量包发布主题 */
  125. QString m_pubTopicCompareItem = "LH_ACAServer/CompareItems"; /* 对比项发布主题 */
  126. QString m_pubTopicServerInfo = "LH_ACAServer/ServerInfo"; /* 服务信息发布主题 */
  127. /******************** 音频基础数据 *********************/
  128. /* 环形队列中每个文件的大小,也是生成的wav文件的大小
  129. 这个大小和录音时长相对应,计算方式如下
  130. 48khz * 2字节/采样点 * 2声道 * 时长(秒) = 文件大小(字节)
  131. 例如:48khz * 2 * 2 * 60 = 5760000字节 = 5.76MB
  132. 这里的48khz是采样率,2字节/采样点是16位采样深度,2声道是立体声
  133. */
  134. int32_t m_sampleRate = 48000; /* 采样率 */
  135. uint16_t m_numChannels = 2; /* 声道数 */
  136. uint16_t m_bitsPerSample = 16; /* 每个采样点的位数 */
  137. /******************** 一些默认的设置 *********************/
  138. // int32_t m_oneSecondCount = 0; /* 这里使用一秒音频的字节个数 */
  139. int32_t m_queueElementCount = 180; /* 默认缓冲区的大小,也就是音频处理线程的环形队列的大小,单位是秒 */
  140. int32_t m_wavFileDuration = 60; /* 一个wav小文件有多少秒的数据 */
  141. /* 相关的文件夹 */
  142. const QString m_dirWav = "WavTemp"; /* 一致性对比的wav文件存储目录 */
  143. const QString m_dirLongWav = "RecordWav"; /* 长文件存储目录 */
  144. const QString m_dirAlarm = "AlarmWav"; /* 报警文件存储目录 */
  145. const QString m_dirConfig = "config"; /* 配置文件存储目录 */
  146. QString m_rootPath; /* 根目录 */
  147. QString m_wavPath; /* wav文件存储路径 */
  148. QString m_longWavPath; /* 长文件存储路径 */
  149. QString m_alarmWavPath; /* 报警文件存储路径 */
  150. /* 比对计算相关参数 */
  151. int m_pcmErrorPercent = 10; /* PCM数据不对称少于多少百分比,就判断为噪音,0表示不判断 */
  152. int m_pcmLessPercent = 0; /* PCM数据少于多少百分比,就判断为噪音,0表示不用这个算法判断噪音 */
  153. /* 偏移量,通道1和通道2可能会有偏移,如果通道1是发射出去,通道2是结束过来,之间可能会有
  154. * 几秒钟的偏移,这个偏移量是手动设置的
  155. * 正数是通道1向后偏移几秒
  156. * 负数是通道2向后偏移几秒 */
  157. long m_offsetMSeconds = 0; /* 偏移量,单位:毫秒 */
  158. /* 静音反相过载相关参数 */
  159. int m_silentSensitivity = 100; /* 静音灵敏度 */
  160. int m_iPhaseSensitivity = 100; /* 反相灵敏度 */
  161. int m_overloadSensitivity = 100; /* 过载灵敏度 */
  162. int m_calculateDataSeconds = 0; /* 一致性、静音、反相等计算所需要的秒数 */
  163. int m_avgDBCalculateSeconds = 5; /* 平均音量计算所需要的秒数 */
  164. int m_sinSeconds = 0; /* 正弦波计算所需要的时长,单位秒 */
  165. int m_sinEffectiveNum = 0; /* 正弦波有效数据个数,比这个数字大就表示是正弦波,最大30 */
  166. int m_silentThreshold = 0; /* 静音阈值 */
  167. int m_ignorePhaseThreshold = 0; /* 要忽视的反相阀值,反相值接近0时忽视掉,维持当前反相状态 */
  168. /******************** 噪音检测参数 *********************/
  169. int32_t m_noiseElementDuration = 1; /* 噪音检测元素大小,单位:秒 */
  170. /******************** 定制化的配置选项 *********************/
  171. /* 因为音频播放存在时间偏移,判断两个都是静音,或者判断一个静音一个非静音时,
  172. * 需要有延时时间(次数),CalcRefreshDataThread线程一秒一次 */
  173. int m_nIsSameBothMinDBWaitNum = 3;
  174. /******************** AI比对参数(动态库比对参数) *********************/
  175. // // AI对比持续次数
  176. // int m_nAICMPThresholdNum = 3;
  177. // // AI对比相似度阀值,比这个阀值小,就表示不一致性
  178. // float m_fAICMPThresholdNot = 0.6;
  179. // // 音频错位百分比(比如0.5就是错位不能超过一半,超过一半判断为不一致):
  180. // float m_fAICMPOffset = 0.5;
  181. // // AI对比相似度阀值,比这个阀值大,就表示一致性
  182. // float m_fAICMPThreshold = 0.7;
  183. // // 一致性对比时间间隔(单位毫秒);8000采样时建议1000毫秒,48000采样时建议3000;DoubleCompare比较时时间会自动翻倍
  184. // int m_nCompareTimeSpan = 3000;
  185. };
  186. #endif // _GLOBALINFO_H_