#ifndef _GLOBALINFO_H_ #define _GLOBALINFO_H_ /** * @file GlobalInfo.h * @author your name (you@domain.com) * @brief * @version 0.1 * @date 2025-07-15 * * @copyright Copyright (c) 2025 * * 1、Server的全局信息,一些参数通过ReadConfig读取,这个类是ReadConfig友元 */ #include #include #include class ReadConfig; /* 全局变量信息 */ #define GInfo GlobalInfo::getInstance() class GlobalInfo { friend class ACAServer; // 允许ReadConfig访问私有成员 GlobalInfo() = default; GlobalInfo(const GlobalInfo&) = delete; // 禁止拷贝构造 GlobalInfo& operator=(const GlobalInfo&) = delete; // 禁止赋值操作 public: ~GlobalInfo(); /* 获取全局信息单例 */ static GlobalInfo& getInstance() { static GlobalInfo instance; // 局部静态变量,线程安全 return instance; } /* 初始化全局信息 */ void initGlobalInfo(); /* 获取mqtt信息 */ QString mqttIP() const {return m_mqttIP;} int mqttPort() const {return m_mqttPort;} void setMqttInfo(const QString& ip, int port); QString mqttPublishTopic() const {return m_mqttPublishTopic;} QString mqttPubTopicDB() const {return m_pubTopicDB;} /* 获取WebAPI信息 */ QString webAPIUrl() const {return m_webAPIUrl;} QString webAPIID() const {return m_webAPIID;} QString appType() const {return m_appType;} void setWebAPIInfo(const QString& url, const QString& id); public: /* 音频相关数据 */ int32_t sampleRate() const {return m_sampleRate;} /* 获取采样率 */ uint16_t numChannels() const {return m_numChannels;} /* 获取声道数 */ uint16_t bitsPerSample() const {return m_bitsPerSample;} /* 获取每个采样点的位数 */ /* 获取环形队列元素数目 */ int32_t queueElementCount() const {return m_queueElementCount;} /* 获取一秒音频字节大小 */ // int32_t oneSecondCount() const {return m_oneSecondCount;} /* 获取wav文件时长 */ int32_t wavFileDuration() const {return m_wavFileDuration;} /* 获取噪音检测元素大小,单位:秒 */ int32_t noiseElementDuration() const {return m_noiseElementDuration;} /* 获取计算音量和反相的环形队列元素数目 */ // int32_t DBQueueElementCount() const {return m_DBQueueElementCount;} /* wav小文件路径 */ QString wavPath() const {return m_wavPath;} /* 记录的长文件路径 */ QString longWavPath() const {return m_longWavPath;} /* 报警文件路径 */ QString alarmWavPath() const {return m_alarmWavPath;} /* 配置文件路径 */ // QString configPath() const {return m_configPath;} /* 获取音频不对称百分比 */ int pcmErrorPercent() const {return m_pcmErrorPercent;} /* 获取音频少于百分比 */ int pcmLessPercent() const {return m_pcmLessPercent;} /* 获取偏移量,单位:毫秒 */ long offsetMSeconds() const {return m_offsetMSeconds;} /* 获取静音反相过载灵敏度 */ int silentSensitivity() const {return m_silentSensitivity;} /* 获取反相灵敏度 */ int iPhaseSensitivity() const {return m_iPhaseSensitivity;} /* 获取过载灵敏度 */ int overloadSensitivity() const {return m_overloadSensitivity;} /* 获取计算所需要的秒数 */ int calculateDataSeconds() const {return m_calculateDataSeconds;} /* 获取计算平均音量所需要的时长 */ int avgDBCalculateSeconds() const {return m_avgDBCalculateSeconds;} /* 获取静音阈值 */ int silentThreshold() const {return m_silentThreshold;} /* 要忽视的反相阀值,反相值接近0时忽视掉,维持当前反相状态 */ int ignorePhaseThreshold() const {return m_ignorePhaseThreshold;} /* 获取正弦波计算所需要的时长 */ int sinSeconds() const {return m_sinSeconds;} /* 获取正弦波有效数据个数 */ int sinEffectiveNum() const {return m_sinEffectiveNum;} /* 获取杭州台是否按上面的逻辑来 */ bool isAINotConsistencyAlone() const {return m_isAINotConsistencyAlone; } /* 获取是否需要等待静音状态 */ int nIsSameBothMinDBWaitNum() const {return m_nIsSameBothMinDBWaitNum;} /* 获取一致性对比时间间隔 */ int compareTimeSpan() const {return m_nCompareTimeSpan <= 500 ? 500 : m_nCompareTimeSpan; } // 最小500毫秒 /* 获取AI对比持续次数 */ int AICMPThresholdNum() const {return m_nAICMPThresholdNum;} /* 获取AI对比相似度阀值 */ float AICMPThresholdNot() const {return m_fAICMPThresholdNot;} /* 获取音频错位百分比 */ float AICMPOffset() const {return m_fAICMPOffset;} /* 获取AI对比相似度阀值 */ float AICMPThreshold() const {return m_fAICMPThresholdNot > 0.99 ? 0.99 : m_fAICMPThresholdNot; } // private: /* 初始化文件夹 */ void initDirectories(); /* 初始化数据 */ void initData(); private: /******************** 系统基础设置 *********************/ /* MQTT信息 */ QString m_mqttIP; /* MQTT服务器IP */ int m_mqttPort = 1883; /* MQTT服务器端口 */ /* WebAPI地址 */ QString m_webAPIUrl; /* WebAPI地址 */ QString m_webAPIID; /* WebAPI ID */ const QString m_appType = "ACAWatch"; /* 应用类型 */ QString m_mqttPublishTopic = "LH_ACAServer"; /* MQTT发布主题 */ QString m_pubTopicDB = "LH_ACAServer/DB"; /* 音量包发布主题 */ /******************** 音频基础数据 *********************/ /* 环形队列中每个文件的大小,也是生成的wav文件的大小 这个大小和录音时长相对应,计算方式如下 48khz * 2字节/采样点 * 2声道 * 时长(秒) = 文件大小(字节) 例如:48khz * 2 * 2 * 60 = 5760000字节 = 5.76MB 这里的48khz是采样率,2字节/采样点是16位采样深度,2声道是立体声 */ int32_t m_sampleRate = 48000; /* 采样率 */ uint16_t m_numChannels = 2; /* 声道数 */ uint16_t m_bitsPerSample = 16; /* 每个采样点的位数 */ /******************** 一些默认的设置 *********************/ // int32_t m_oneSecondCount = 0; /* 这里使用一秒音频的字节个数 */ int32_t m_queueElementCount = 180; /* 默认缓冲区的大小,也就是音频处理线程的环形队列的大小,单位是秒 */ int32_t m_wavFileDuration = 60; /* 一个wav小文件有多少秒的数据 */ int32_t m_noiseElementDuration = 1; /* 噪音检测元素大小,单位:秒 */ /* 相关的文件夹 */ const QString m_dirWav = "WAV"; /* wav文件存储目录 */ const QString m_dirLongWav = "Record"; /* 长文件存储目录 */ const QString m_dirAlarm = "AlarmWav"; /* 报警文件存储目录 */ const QString m_dirConfig = "config"; /* 配置文件存储目录 */ QString m_wavPath; /* wav文件存储路径 */ QString m_longWavPath; /* 长文件存储路径 */ QString m_alarmWavPath; /* 报警文件存储路径 */ // QString m_configPath; /* 配置文件存储路径 */ /* 比对计算相关参数 */ int m_pcmErrorPercent = 10; /* PCM数据不对称少于多少百分比,就判断为噪音,0表示不判断 */ int m_pcmLessPercent = 0; /* PCM数据少于多少百分比,就判断为噪音,0表示不用这个算法判断噪音 */ /* 偏移量,通道1和通道2可能会有偏移,如果通道1是发射出去,通道2是结束过来,之间可能会有 * 几秒钟的偏移,这个偏移量是手动设置的 * 正数是通道1向后偏移几秒 * 负数是通道2向后偏移几秒 */ long m_offsetMSeconds = 0; /* 偏移量,单位:毫秒 */ /* 静音反相过载相关参数 */ int m_silentSensitivity = 100; /* 静音灵敏度 */ int m_iPhaseSensitivity = 100; /* 反相灵敏度 */ int m_overloadSensitivity = 100; /* 过载灵敏度 */ int m_calculateDataSeconds = 0; /* 一致性、静音、反相等计算所需要的秒数 */ int m_avgDBCalculateSeconds = 5; /* 平均音量计算所需要的秒数 */ int m_sinSeconds = 0; /* 正弦波计算所需要的时长,单位秒 */ int m_sinEffectiveNum = 0; /* 正弦波有效数据个数,比这个数字大就表示是正弦波,最大30 */ int m_silentThreshold = 0; /* 静音阈值 */ int m_ignorePhaseThreshold = 0; /* 要忽视的反相阀值,反相值接近0时忽视掉,维持当前反相状态 */ /******************** 定制化的配置选项 *********************/ /* 杭州台:在其它报警时,不一致不报警且后台不进行不一致比对,在其它报警恢复后,不一致重新计时比对 * 1表示按上面的逻辑来,0表示不按上面的逻辑来 */ bool m_isAINotConsistencyAlone = false; /* 因为音频播放存在时间偏移,判断两个都是静音,或者判断一个静音一个非静音时, * 需要有延时时间(次数),CalcRefreshDataThread线程一秒一次 */ int m_nIsSameBothMinDBWaitNum = 3; /******************** AI比对参数(动态库比对参数) *********************/ // AI对比持续次数 int m_nAICMPThresholdNum = 3; // AI对比相似度阀值,比这个阀值小,就表示不一致性 float m_fAICMPThresholdNot = 0.6; // 音频错位百分比(比如0.5就是错位不能超过一半,超过一半判断为不一致): float m_fAICMPOffset = 0.5; // AI对比相似度阀值,比这个阀值大,就表示一致性 float m_fAICMPThreshold = 0.7; // 一致性对比时间间隔(单位毫秒);8000采样时建议1000毫秒,48000采样时建议3000;DoubleCompare比较时时间会自动翻倍 int m_nCompareTimeSpan = 3000; }; #endif // _GLOBALINFO_H_