Browse Source

V0.4
1、完成了发送对比项信息的功能
2、修复了计算音量的错误问题

Apple 2 ngày trước cách đây
mục cha
commit
0c40f9dd78

+ 14 - 16
JSON/对比项信息.json

@@ -2,22 +2,20 @@
     {
         "compareItem_id": 1,
         "compareItem_name": "one",
-        "overload_duration": 30,
-        "overload_sensitivity": 20,
-        "overload_switch": true,
-        "overload_threshold": 4,
-        "reverse_duration": 60,
-        "reverse_sensitivity": 60,
-        "reverse_switch": true,
-        "reverse_threshold": 0.75,
-        "silence_duration": 8,
-        "silence_sensitivity": 80,
-        "silence_switch": true,
-        "silence_threshold": 64
-    },
-    {
-        "compareItem_id": 2,
-        "compareItem_name": "two",
+        "compareItem_roads": [
+            {
+                "road_name": "主通道",
+                "road_num": 1,
+                "sound_card_num": 0,
+                "sound_card_road_num": 0
+            },
+            {
+                "road_name": "第2通道",
+                "road_num": 2,
+                "sound_card_num": 0,
+                "sound_card_road_num": 0
+            }
+        ],
         "overload_duration": 30,
         "overload_sensitivity": 20,
         "overload_switch": true,

+ 34 - 11
Server/ACAServer.cpp

@@ -52,6 +52,8 @@ bool ACAServer::initGlobalInfo()
         spdlog::error("读取配置文件失败");
         return false;
     }
+
+
     /* 设置MQTT服务器信息 */
     GInfo.setMqttInfo(m_mqttIP, m_mqttPort);
 
@@ -92,7 +94,8 @@ bool ACAServer::initGlobalInfo()
         SPDLOG_LOGGER_WARN(m_logger, "更新声卡信息到WebAPI失败");
     }
 
-    /* 更新SysConfig,对比项管理线程中类中有这个函数,这里复用一下 */
+    /*------------------------------------------------------------------------------------*/
+    /* 更新SysConfig */
     QMap<std::string, std::string> mapSysConfig;
     if(!m_fromWebAPI.getSystemConfig(mapSysConfig))
     {
@@ -101,20 +104,21 @@ bool ACAServer::initGlobalInfo()
     }
     SysConfig.parseConfigFromDatabase(mapSysConfig);
 
+    /* 设置录音文件目录 */
+    QString recordFilePath = SysConfig.getDatabaseConfig().strRecordFilePath;
+    if(recordFilePath.isEmpty())
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "录音文件路径未设置");
+        return false;
+    }
+    GInfo.setRootPath(recordFilePath);
+
     /*------------------------------------------------------------------------------------*/
-    /* 初始化全局参数信息 */
+    /* 初始化全局数信息 */
     GInfo.initGlobalInfo();
 
     /*------------------------------------------------------------------------------------*/
-    SPDLOG_LOGGER_INFO(m_logger, "=========================================================================================");
-    /* 打印一些基础参数 */
-    SPDLOG_LOGGER_INFO(m_logger, "MQTT服务器地址: {}, 端口: {}", m_mqttIP.toStdString(), m_mqttPort);
-    SPDLOG_LOGGER_INFO(m_logger, "WebAPI地址: {}, ID: {}", m_webAPIUrl.toStdString(), m_webAPIID.toStdString());
-    SPDLOG_LOGGER_INFO(m_logger, "录音参数: ");
-    SPDLOG_LOGGER_INFO(m_logger, "      采样率: {}, 通道数: {}, 位深: {}", 
-                        GInfo.m_sampleRate, GInfo.m_numChannels, GInfo.m_bitsPerSample);
-    SPDLOG_LOGGER_INFO(m_logger, "RTP服务TCP监听端口: {}", SysConfig.getDatabaseConfig().nListenPort);
-    SPDLOG_LOGGER_INFO(m_logger, "=========================================================================================");
+    printACAServerConfig();
 
     return true;
 }
@@ -220,6 +224,25 @@ void ACAServer::thread_RTPServer()
 
 }
 
+/* 打印ACA服务一些基础配置参数 */
+void ACAServer::printACAServerConfig()
+{
+    SPDLOG_LOGGER_INFO(m_logger, "=========================================================================================");
+    SPDLOG_LOGGER_INFO(m_logger," ");
+    /* 打印一些基础参数 */
+    SPDLOG_LOGGER_INFO(m_logger, "MQTT服务器地址: {}, 端口: {}", m_mqttIP.toStdString(), m_mqttPort);
+    SPDLOG_LOGGER_INFO(m_logger, "WebAPI地址: {}, ID: {}", m_webAPIUrl.toStdString(), m_webAPIID.toStdString());
+    SPDLOG_LOGGER_INFO(m_logger, "录音参数: ");
+    SPDLOG_LOGGER_INFO(m_logger, "      采样率: {}, 通道数: {}, 位深: {}", GInfo.m_sampleRate, GInfo.m_numChannels, GInfo.m_bitsPerSample);
+    SPDLOG_LOGGER_INFO(m_logger, "RTP服务TCP监听端口: {}", SysConfig.getDatabaseConfig().nListenPort);
+    SPDLOG_LOGGER_INFO(m_logger, "录音文件路径: {}", SysConfig.getDatabaseConfig().strRecordFilePath.toStdString());
+
+    // SPDLOG_LOGGER_INFO(m_logger, "-----------------------------------------------------------------------------------------");
+
+
+    SPDLOG_LOGGER_INFO(m_logger, "=========================================================================================");
+}
+
 
 /* 处理MQTT消息 */
 void ACAServer::do_receiveMQTTMessage(const QMQTT::Message& message)

+ 4 - 1
Server/ACAServer.h

@@ -56,7 +56,10 @@ private:
     void thread_deleteRecordThread();
     /* 线程函数,开启RTP监听服务,一个壳 */
     void thread_RTPServer();
-    /* 线程函数,为了发送MQTT消息,更新对比项信息到MQTT中,数据由对比项管理器提供 */
+    
+    /* 打印ACA服务一些基础配置参数 */
+    void printACAServerConfig();
+    
 
 private slots:
     /* 处理MQTT消息 */

+ 7 - 4
Server/DataManager/SoundCardData.cpp

@@ -13,6 +13,7 @@ bool SoundCardManager::InitData()
         SPDLOG_ERROR("获取声卡设备信息失败");
     }
 
+    SPDLOG_INFO("----------------------------------------------------------------------------");
     /* 打印声卡列表 */
     printAudioDevices();
 
@@ -63,14 +64,16 @@ QMap<int, SoundCardInfo_t> SoundCardManager::getSoundCardInfo() const
 /* 打印声卡列表 */
 void SoundCardManager::printAudioDevices()
 {
+    SPDLOG_INFO("声卡列表: ");
     for(const auto& device : m_listAudioDevice)
     {
-        SPDLOG_INFO("声卡编号: {}, ID: {}, 名称: {}, 驱动: {}, 长名称: {}, 混音器名称: {}, 组件信息: {}",
-                     device.CardNumber, device.CardID, device.CardName, device.CardDriver,
-                     device.CardLongName, device.CardMixername, device.CardComponents);
+        SPDLOG_INFO("   声卡编号: {}, ID: {}, 名称: {}, 驱动: {}",
+                     device.CardNumber, device.CardID, device.CardName, device.CardDriver);
+        SPDLOG_INFO("   长名称: {}, 混音器名称: {}, 组件信息: {}", 
+                    device.CardLongName, device.CardMixername, device.CardComponents);
         for(const auto& pcmDevice : device.PCMDevices)
         {
-            SPDLOG_INFO("  PCM设备编号: {}, 子设备编号: {}, 声卡编号: {}, PCM ID: {}, 名称: {}, 子设备名称: {}",
+            SPDLOG_INFO("       PCM设备编号: {}, 子设备编号: {}, PCM ID: {}, 名称: {}, 子设备名称: {}",
                          pcmDevice.PCMDevice, pcmDevice.SubDevice, pcmDevice.CardNumber,
                          pcmDevice.PCMID, pcmDevice.PCMName, pcmDevice.PCMSubName);
         }

+ 10 - 7
Server/GlobalInfo/GlobalInfo.cpp

@@ -34,13 +34,16 @@ void GlobalInfo::setWebAPIInfo(const QString& url, const QString& id)
 /* 初始化文件夹 */
 void GlobalInfo::initDirectories()
 {
-    /* 拼接文件夹路径 */
-    QString appDataPath = QCoreApplication::applicationDirPath();
-    appDataPath += "/ACAServerData"; // 应用数据目录
-    m_wavPath = appDataPath + "/" + m_dirWav;
-    m_longWavPath = appDataPath + "/" + m_dirLongWav;
-    m_alarmWavPath = appDataPath + "/" + m_dirAlarm;
-    // m_configPath = appDataPath + "/" + m_dirConfig;
+    /* 拼接文件夹路径,确保最后以 / 结尾 */
+    if(!m_rootPath.endsWith('/'))
+    {
+        m_rootPath += '/';
+    }
+    // QString appDataPath = m_rootPath;
+    // appDataPath += "/ACAServerData"; // 应用数据目录
+    m_wavPath = m_rootPath + m_dirWav;
+    m_longWavPath = m_rootPath + m_dirLongWav;
+    m_alarmWavPath = m_rootPath + m_dirAlarm;
 
     /* 判断相关文件夹是否存在 */
     QDir dirWav(m_wavPath);

+ 5 - 6
Server/GlobalInfo/GlobalInfo.h

@@ -76,15 +76,14 @@ public:
     /* 获取计算音量和反相的环形队列元素数目 */
     // int32_t DBQueueElementCount() const {return m_DBQueueElementCount;}
 
-
+    /* 设置根目录 */
+    void setRootPath(const QString& path) { m_rootPath = path; }
     /* 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;}
 
 
     /* 获取音频不对称百分比 */
@@ -167,15 +166,15 @@ private:
     int32_t m_wavFileDuration = 60;             /* 一个wav小文件有多少秒的数据 */
 
     /* 相关的文件夹 */
-    const QString m_dirWav = "WAV";             /* wav文件存储目录 */
-    const QString m_dirLongWav = "Record";      /* 长文件存储目录 */
+    const QString m_dirWav = "WavTemp";         /* 一致性对比的wav文件存储目录 */
+    const QString m_dirLongWav = "RecordWav";   /* 长文件存储目录 */
     const QString m_dirAlarm = "AlarmWav";      /* 报警文件存储目录 */
     const QString m_dirConfig = "config";       /* 配置文件存储目录 */
 
+    QString m_rootPath;                         /* 根目录 */
     QString m_wavPath;                          /* wav文件存储路径 */
     QString m_longWavPath;                      /* 长文件存储路径 */
     QString m_alarmWavPath;                     /* 报警文件存储路径 */
-    // QString m_configPath;                       /* 配置文件存储路径 */
 
     /* 比对计算相关参数 */
     int m_pcmErrorPercent = 10;                 /* PCM数据不对称少于多少百分比,就判断为噪音,0表示不判断 */

+ 113 - 34
Server/ThreadManager/ThreadCompareItemManager.cpp

@@ -52,11 +52,10 @@ void ThreadCompareItemManager::thread_CompareItemManager()
     m_pEventLoop = new QEventLoop();
     m_pTimer = new QTimer();
 
-    // std::function<void()> task = std::bind(&ThreadCompareItemManager::do_task, this);
-
     // m_pTimer->setInterval(10000);
     m_pTimer->setTimerType(Qt::PreciseTimer);
     m_pTimer->setSingleShot(false); // 设置为非单次定时器
+    /* 这里要设置直接连接,才会在子线程中调用槽函数 */
     connect(m_pTimer, &QTimer::timeout, this, &ThreadCompareItemManager::do_task, Qt::DirectConnection);
     
     /* 初始化webapi */
@@ -70,14 +69,16 @@ void ThreadCompareItemManager::thread_CompareItemManager()
     }
     /* 获取MQTT发布订阅 */
     m_pubTopic = GInfo.mqttPubTopicCompareItem();
-
+    initMQTT();
 
     /* 获取基础配置,目前只获取一次 */
     updateBaseSettings();
 
     SPDLOG_LOGGER_INFO(m_logger, "开启对比项管理线程");
 
-    m_pTimer->start(1000);
+    m_pTimer->start(2000);
+    /* 连接mqtt服务 */
+    m_pFromMQTT->connectToServer();
     m_pEventLoop->exec();
 
     SPDLOG_LOGGER_INFO(m_logger, "ThreadCompareItemManager: 线程结束");
@@ -131,20 +132,17 @@ SoundCardRoadInfo_t ThreadCompareItemManager::getSoundCardRoadInfo(int compareIt
 /* 任务函数 */
 void ThreadCompareItemManager::do_task()
 {
-    // SPDLOG_LOGGER_ERROR(m_logger, "ThreadCompareItemManager: do_task() 函数被调用");
     /* 如果定时间隔小于10秒,则设置成10秒,一开始小是为了线程开启后立马执行一次 */
     if(m_pTimer->interval() < 10000)
     {
-        // m_pTimer->stop();
         m_pTimer->setInterval(10000);
-        // m_pTimer->start();
     }
-    if(m_pFromMQTT == nullptr)
+    /* 判断MQTT是否连接成功,未连接则再次连接 */
+    if(m_pFromMQTT->connectState() != QMQTT::ConnectionState::STATE_CONNECTED)
     {
-        /* 初始化MQTT */
-        initMQTT();
+        SPDLOG_LOGGER_WARN(m_logger, "MQTT未连接,尝试重新连接");
+        m_pFromMQTT->connectToServer();
     }
-    // SPDLOG_LOGGER_WARN(m_logger, "定时器是否在运行: {}, 触发间隔: {} ms", m_pTimer->isActive(), m_pTimer->interval());
     /* ------------------------------------------------------------------
      * 处理对比项信息
      * ------------------------------------------------------------------ */
@@ -159,7 +157,6 @@ void ThreadCompareItemManager::do_task()
      * 更新对比项信息到MQTT
      * ------------------------------------------------------------------ */
     updateCompareItemInfoToMQTT();
-    // SPDLOG_LOGGER_WARN(m_logger, "ThreadCompareItemManager: do_task() 函数执行完毕");
 }
 
 /* 更新基础设置信息,如数据库设置,噪音参数等 */
@@ -247,6 +244,11 @@ void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& ne
     {
         if(!m_mapNowCompareItem.contains(item.nID))
         {
+            /* 判断这个是否被启用 */
+            if(item.isEnable == false)
+            {
+                continue;
+            }
             /* 新对比项,添加到创建列表 */
             createList.append(item);
         } else
@@ -256,7 +258,13 @@ void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& ne
             /* 先对比基础信息 */
             if(!existingItem.isEqualBase(item))
             {
-                /* 基础信息不同,需要更新 */
+                /* 基础信息不同,需要更新,也可能是被禁用了导致的不同 */
+                if(item.isEnable == false)
+                {
+                    /* 如果新对比项被禁用,则需要删除 */
+                    deleteList.append(item.nID);
+                    continue;
+                }
                 updateList.append(item);
                 continue;
             }
@@ -267,6 +275,7 @@ void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& ne
                 updateList.append(item);
                 continue;
             }
+
         }
     }
     /* 遍历当前对比项信息,找出需要删除的对比项 */
@@ -277,8 +286,9 @@ void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& ne
         {
             if(it.nID == newItem.nID)
             {
+                /* 找到对应的对比项,跳过 */
                 isFound = true;
-                break; // 找到对应的对比项,不需要删除
+                break; 
             }
         }
         if(!isFound)
@@ -289,6 +299,7 @@ void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& ne
         
     }
 
+
 }
 
 
@@ -460,16 +471,83 @@ void ThreadCompareItemManager::checkDetectPeriodInfo(QMap<int, DetectPeriodConfi
 
 /* 更新对比项信息到MQTT */
 void ThreadCompareItemManager::updateCompareItemInfoToMQTT()
+{
+    QMap<int, CompareItemInfo_t> newMap;
+    /* 获取当前的对比项信息 */
+    for(auto it = m_mapThreads.begin(); it != m_mapThreads.end(); ++it)
+    {
+        BaseCalculateThread* pThread = it.value();
+        if(pThread == nullptr)
+        {
+            continue;
+        }
+        
+        /* 获取对比项信息 */
+        CompareItemInfo_t itemInfo = pThread->getThreadInfo().compareItemInfo;
+        newMap.insert(itemInfo.nID, itemInfo);
+    }
+
+    /* 和之前的对比,对比项是否有更新,有更新则发送 */
+    bool isUpdated = false;
+    if(newMap.size() != m_mapMQTTItemInfo.size())
+    {
+        isUpdated = true;
+    } else
+    {
+        /* 进一步对比相信信息 */
+        for(const auto& newItem : newMap)
+        {
+            auto nowIt = m_mapMQTTItemInfo.find(newItem.nID);
+            if(nowIt == m_mapMQTTItemInfo.end())
+            {
+                isUpdated = true;
+                break;
+            }
+            /* 比较对比项通道数量和对比项名称 */
+            if(nowIt.value().strName != newItem.strName || nowIt.value().mapRoad.size() != newItem.mapRoad.size())
+            {
+                isUpdated = true;
+                break;
+            }
+            /* 挨个比较对比项通道信息 */
+            for(const auto& road : newItem.mapRoad)
+            {
+                auto roadIt = nowIt.value().mapRoad.find(road.nCompareRoadNum);
+                if(roadIt == nowIt.value().mapRoad.end() || roadIt.value().strCompareRoadName != road.strCompareRoadName)
+                {
+                    isUpdated = true;
+                    break;
+                }
+            }
+        }
+    }
+
+    if(isUpdated)
+    {
+        sendCompareItemInfoToMQTT(newMap);
+        m_mapMQTTItemInfo = newMap;
+    }
+}
+
+/* 发送到MQTT */
+void ThreadCompareItemManager::sendCompareItemInfoToMQTT(const QMap<int, CompareItemInfo_t>& mapCompareItem)
 {
     /* 生成发送的json文件 */
     nJson jsonArray = nJson::array();
-    for(const auto& it : m_mapNowCompareItem)
+    for(const auto& it : mapCompareItem)
     {
+        /* 判断这个对比项是否启用,不启用就跳过 */
+        if(it.isEnable == false)
+        {
+            continue;
+        }
+
         nJson jsonItem;
         /* 对比项ID */
         jsonItem["compareItem_id"] = it.nID;
         /* 对比项名称 */
         jsonItem["compareItem_name"] = it.strName.toStdString();
+        nJson josnItemRoads = nJson::array();
         for(const auto& road : it.mapRoad)
         {
             nJson jsonRoad;
@@ -477,26 +555,27 @@ void ThreadCompareItemManager::updateCompareItemInfoToMQTT()
             jsonRoad["road_num"] = road.nCompareRoadNum;
             jsonRoad["road_name"] = road.strCompareRoadName.toStdString();
             /* 通道使用的声卡编号 */
-            jsonRoad["sound_card_num"] = road.scRoadInfo.nSoundCardNum;
-            jsonRoad["sound_card_road_num"] = road.scRoadInfo.roadInfo.nRoadNum;
+            // jsonRoad["sound_card_num"] = road.scRoadInfo.nSoundCardNum;
+            // jsonRoad["sound_card_road_num"] = road.scRoadInfo.roadInfo.nRoadNum;
 
-            jsonRoad["compareItem_roads"].push_back(jsonRoad);
+            josnItemRoads.push_back(jsonRoad);
         }
-        /* 静音条件 */
-        jsonItem["silence_switch"] = it.paramMute.isEnable;
-        jsonItem["silence_threshold"] = it.paramMute.threshold.nThreshold;
-        jsonItem["silence_duration"] = it.paramMute.nLen;
-        jsonItem["silence_sensitivity"] = it.paramMute.nSensitivity;
-        /* 过载条件 */
-        jsonItem["overload_switch"] = it.paramOverload.isEnable;
-        jsonItem["overload_threshold"] = it.paramOverload.threshold.nThreshold;
-        jsonItem["overload_duration"] = it.paramOverload.nLen;
-        jsonItem["overload_sensitivity"] = it.paramOverload.nSensitivity;
-        /* 反相条件 */
-        jsonItem["reverse_switch"] = it.paramPhase.isEnable;
-        jsonItem["reverse_threshold"] = it.paramPhase.threshold.dThreshold;
-        jsonItem["reverse_duration"] = it.paramPhase.nLen;
-        jsonItem["reverse_sensitivity"] = it.paramPhase.nSensitivity;
+        jsonItem["compareItem_roads"] = josnItemRoads;
+        // /* 静音条件 */
+        // jsonItem["silence_switch"] = it.paramMute.isEnable;
+        // jsonItem["silence_threshold"] = it.paramMute.threshold.nThreshold;
+        // jsonItem["silence_duration"] = it.paramMute.nLen;
+        // jsonItem["silence_sensitivity"] = it.paramMute.nSensitivity;
+        // /* 过载条件 */
+        // jsonItem["overload_switch"] = it.paramOverload.isEnable;
+        // jsonItem["overload_threshold"] = it.paramOverload.threshold.nThreshold;
+        // jsonItem["overload_duration"] = it.paramOverload.nLen;
+        // jsonItem["overload_sensitivity"] = it.paramOverload.nSensitivity;
+        // /* 反相条件 */
+        // jsonItem["reverse_switch"] = it.paramPhase.isEnable;
+        // jsonItem["reverse_threshold"] = it.paramPhase.threshold.dThreshold;
+        // jsonItem["reverse_duration"] = it.paramPhase.nLen;
+        // jsonItem["reverse_sensitivity"] = it.paramPhase.nSensitivity;
 
         jsonArray.push_back(jsonItem);
     }
@@ -534,7 +613,7 @@ void ThreadCompareItemManager::initMQTT()
     m_pFromMQTT->setIPAndPort(GInfo.mqttIP(), GInfo.mqttPort());
     // m_pFromMQTT->addSubcribe("LH_WEBINFO");
     m_pFromMQTT->setAutoReconnect(true);
-    m_pFromMQTT->connectToServer();
+    // m_pFromMQTT->connectToServer();
 
     // connect(m_pFromMQTT, &FromMQTT::signal_recvMessage, [this](const QMQTT::Message& message) {
     //     SPDLOG_LOGGER_WARN(m_logger, "--------------------- 接收到MQTT消息: {}", message.topic().toStdString());

+ 5 - 0
Server/ThreadManager/ThreadCompareItemManager.h

@@ -83,6 +83,8 @@ private:
     /* ---------------------- 向MQTT发送对比项信息 ---------------------- */
     /* 更新对比项信息到MQTT */
     void updateCompareItemInfoToMQTT();
+    /* 发送到MQTT */
+    void sendCompareItemInfoToMQTT(const QMap<int, CompareItemInfo_t>& mapCompareItem);
     /* 初始化MQTT */
     void initMQTT();
 
@@ -113,6 +115,9 @@ private:
     /* ---------------------- 检测时段信息 ---------------------- */
     /* 检测时段,int是对比项ID */
     QMap<int, DetectPeriodConfig_t> m_mapDetectPeriod;
+
+    /* ---------------------- 向MQTT发送对比项信息 ---------------------- */
+    QMap<int, CompareItemInfo_t> m_mapMQTTItemInfo;
 };
 
 

+ 11 - 8
Server/ThreadRecord/CreateDBThread.cpp

@@ -251,10 +251,13 @@ bool CreateDBThread::initData()
 
     /* 一秒钟数据大小,单位:字节 */
     m_oneSecondSize = m_sampleRate * m_numChannels * (m_bitsPerSample / 8);
+    /* 计算每个音量值需要的数据大小,单位数据单位: short,一个通道的大小 */
+    m_oneDBLengthOfSrcData = m_sampleRate / VOLUME_INFO_NUM;
+    m_singleDataLength = m_oneSecondSize / m_numChannels;
 
     /* 计算音量和反相的环形队列元素数目,默认是180个,即180秒 */
-    m_queueAudioDataCapacity = queueSize; 
-    m_queueResultData = new RingQueueManualMutex<OneSecondData*>(m_queueAudioDataCapacity);
+    // m_queueAudioDataCapacity = queueSize; 
+    m_queueResultData = new RingQueueManualMutex<OneSecondData*>(queueSize);
     m_queueResultData->mutex.lock();
     m_queueResultData->setDefaultValue(nullptr);
     m_queueResultData->mutex.unlock();
@@ -285,10 +288,10 @@ void CreateDBThread::clearData()
 /* 计算音量和反相 */
 bool CreateDBThread::CreateDBPhase(AudioSrcData* audioData)
 {
-    short* pWaveVu = (short*)(audioData->pData);
+    short* pWaveVu = reinterpret_cast<short*>(audioData->pData);
 
     /* 一秒钟平分30个音量值,每个音量值占有的长度 */
-    const int oneDBSize = m_oneDBLengthOfSrcData;;
+    const int oneDBSize = m_oneDBLengthOfSrcData;
 
     StAudioNum audioInfo;
     audioInfo.roadInfo = m_threadInfo.cardRoadInfo; // 设置通道信息
@@ -301,12 +304,12 @@ bool CreateDBThread::CreateDBPhase(AudioSrcData* audioData)
     /* 音量值计算,好多个字节计算出一个最大音量值 */
     for(int i = 0; i < VOLUME_INFO_NUM; ++i)
     {
-        // oneDBSize / 2 除以2是因为左右声道同时计算
         // 采样点最大值
         short sMaxA, sMaxB, sRMSA, sRMSB;
-        audioCor.CorrelateChunks(pWaveVu + iCurPos, (pWaveVu + iCurPos + 1), oneDBSize / 2, &sMaxA, &sMaxB, &sRMSA, &sRMSB, audioInfo);
+        audioCor.CorrelateChunks(pWaveVu + iCurPos, (pWaveVu + iCurPos + 1), oneDBSize, &sMaxA, &sMaxB, &sRMSA, &sRMSB, audioInfo);
 
-        iCurPos += oneDBSize;
+        /* 这里乘2是要增加两个通道的数据大小 */
+        iCurPos += (oneDBSize * 2);
         m_result->aryLeftDB[i] = calculateDB(sMaxA);
         m_result->aryRightDB[i] = calculateDB(sMaxB);
 
@@ -317,7 +320,7 @@ bool CreateDBThread::CreateDBPhase(AudioSrcData* audioData)
             iReversed = 0;
         }
 
-        // 和反相值比较,来判定是否为反相
+        // 和反相值比较,来判定是否为反相
         float dReversed = iReversed / 100.00;
         m_result->aryPhase[i] = dReversed;
     }

+ 2 - 2
Server/ThreadRecord/CreateDBThread.h

@@ -51,11 +51,11 @@ private:
     // AudioSrcData* m_remainData = nullptr;   /* 不满一个队列元素的剩余数据,使用AudioSrcData来存储,方便管理 */
 
     /* 计算相关的变量 */
-    int m_oneDBLengthOfSrcData = 0;         /* 计算一个DB需要的原始音频数据的长度,双通道的长度,单位:short */
+    int m_oneDBLengthOfSrcData = 0;         /* 计算一个DB需要的原始音频数据的长度,单位:short */
     int m_singleDataLength = 0;             /* 一秒钟单声道数据长度,单位:字节 */
 
     OneSecondData* m_result = nullptr;      /* 存储每秒钟的音量和反相数据 */
-    int m_queueAudioDataCapacity = 0;       /* 音频数据环形队列的容量,单位:秒 */
+    // int m_queueAudioDataCapacity = 0;       /* 音频数据环形队列的容量,单位:秒 */
     /* 存储结果 */
     RingQueueManualMutex<OneSecondData*>* m_queueResultData = nullptr; /* 计算结果环形队列,存储每秒钟的音量和反相数据 */
 };

+ 0 - 6
Server/main.cpp

@@ -54,10 +54,6 @@ int main(int argc, char* argv[])
     {
         SPDLOG_LOGGER_ERROR(logger, "ACAServer 初始化失败!");
     }
-    
-
-    // test();
-    // CPPTP.add_task(test1);
 
     /* 启动服务 */
     if(acas.startService())
@@ -72,8 +68,6 @@ int main(int argc, char* argv[])
 
     int result = a.exec();
 
-    /* 释放资源 */
-    // signalstats_wrapper::finalize();
     SPDLOG_LOGGER_INFO(logger, "ACAServer 结束运行");
 
     return result;

+ 2 - 0
SettingLibrary/Modules/AICompare/aicomparewidget.cpp

@@ -21,6 +21,8 @@ AICompareWidget::AICompareWidget(QWidget *parent) :
 
     /* 设置 lineEdit_length 只能输入数字 */
     ui->lineEdit_length->setValidator(new QIntValidator(1, 120, this));
+    /* 设置输入栏的弱提示符 */
+    ui->lineEdit_length->setPlaceholderText("请输入, 限制1-120秒");
 
     /* 隐藏AI对比目录,不需要了 */
     ui->lineEdit_dir->hide();

+ 18 - 4
SettingLibrary/Modules/Database/databasewidget.cpp

@@ -24,16 +24,29 @@ DatabaseWidget::DatabaseWidget(QWidget *parent) :
 
     /* 限制输入栏输入格式 */
     ui->lineEdit_recordLogRetain->setValidator(new QIntValidator(1, 360, this));
-    ui->lineEdit_operatorLOgRetain->setValidator(new QIntValidator(1, 360, this));
+    ui->lineEdit_recordLogRetain->setPlaceholderText("请输入, 限制1-360天");
+
+    ui->lineEdit_operatorLogRetain->setValidator(new QIntValidator(1, 360, this));
+    ui->lineEdit_operatorLogRetain->setPlaceholderText("请输入, 限制1-360天");
+
     ui->lineEdit_recordFileRetain->setValidator(new QIntValidator(1, 24, this));
+    ui->lineEdit_recordFileRetain->setPlaceholderText("请输入, 限制1-24小时");
+
     ui->lineEdit_clientPort->setValidator(new QIntValidator(1, 65535, this));
+    ui->lineEdit_clientPort->setPlaceholderText("请输入");
+
     ui->lineEdit_listenPort->setValidator(new QIntValidator(1, 65535, this));
+    ui->lineEdit_listenPort->setPlaceholderText("请输入");
+
+    ui->lineEdit_recordFilePath->setPlaceholderText("请输入,服务端录音文件存储路径");
+
+    ui->lineEdit_ftpPath->setPlaceholderText("请输入,FTP报警文件路径");
 
     /* 获取初始配置 */
     do_pBtn_restore_clicked();
     
     /* 连接信号和槽 */
-    connect(ui->btnRestore, &QPushButton::clicked, this, &DatabaseWidget::do_pBtn_restore_clicked);
+    connect(ui->pBtn_restore, &QPushButton::clicked, this, &DatabaseWidget::do_pBtn_restore_clicked);
 
     UIStyle.registerWidget(this);
 }
@@ -49,11 +62,12 @@ DatabaseWidget::~DatabaseWidget()
 bool DatabaseWidget::saveParams()
 {
     m_databaseConfig.nRecordLogRetain = ui->lineEdit_recordLogRetain->text().toInt();
-    m_databaseConfig.nOperatorLogRetain = ui->lineEdit_operatorLOgRetain->text().toInt();
+    m_databaseConfig.nOperatorLogRetain = ui->lineEdit_operatorLogRetain->text().toInt();
     m_databaseConfig.nRecordFileRetain = ui->lineEdit_recordFileRetain->text().toInt();
     m_databaseConfig.nClientPort = ui->lineEdit_clientPort->text().toInt();
     m_databaseConfig.nListenPort = ui->lineEdit_listenPort->text().toInt();
     m_databaseConfig.strRecordFilePath = ui->lineEdit_recordFilePath->text();
+    m_databaseConfig.strFtpPath = ui->lineEdit_ftpPath->text();
     
     /* 和旧数据对比 */
     const DatabaseConfig_t& oldConfig = SysConfig.getDatabaseConfig();
@@ -90,7 +104,7 @@ void DatabaseWidget::do_pBtn_restore_clicked()
 {
     m_databaseConfig = SysConfig.getDatabaseConfig();
     ui->lineEdit_recordLogRetain->setText(QString::number(m_databaseConfig.nRecordLogRetain));
-    ui->lineEdit_operatorLOgRetain->setText(QString::number(m_databaseConfig.nOperatorLogRetain));
+    ui->lineEdit_operatorLogRetain->setText(QString::number(m_databaseConfig.nOperatorLogRetain));
     ui->lineEdit_recordFileRetain->setText(QString::number(m_databaseConfig.nRecordFileRetain));
     ui->lineEdit_clientPort->setText(QString::number(m_databaseConfig.nClientPort));
     ui->lineEdit_listenPort->setText(QString::number(m_databaseConfig.nListenPort));

+ 85 - 137
SettingLibrary/Modules/Database/databasewidget.ui

@@ -62,8 +62,18 @@
       <property name="verticalSpacing">
        <number>16</number>
       </property>
-      <item row="4" column="1">
-       <widget class="QLineEdit" name="lineEdit_listenPort">
+      <item row="3" column="0">
+       <widget class="QLabel" name="label_6">
+        <property name="text">
+         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;客户端通讯端口:</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLineEdit" name="lineEdit_recordFileRetain">
         <property name="minimumSize">
          <size>
           <width>172</width>
@@ -78,41 +88,27 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_3">
-        <property name="text">
-         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;操作日志保留:</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;录音日志保留:</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="2">
-       <widget class="QLabel" name="label_11">
+      <item row="7" column="0">
+       <widget class="QPushButton" name="pBtn_restore">
         <property name="minimumSize">
          <size>
-          <width>60</width>
-          <height>0</height>
+          <width>102</width>
+          <height>32</height>
+         </size>
+        </property>
+        <property name="maximumSize">
+         <size>
+          <width>102</width>
+          <height>32</height>
          </size>
         </property>
         <property name="text">
-         <string>(1~24)</string>
+         <string>恢复配置项</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
-       <widget class="QLineEdit" name="lineEdit_recordFileRetain">
+      <item row="4" column="1">
+       <widget class="QLineEdit" name="lineEdit_listenPort">
         <property name="minimumSize">
          <size>
           <width>172</width>
@@ -127,54 +123,67 @@
         </property>
        </widget>
       </item>
-      <item row="3" column="2">
-       <spacer name="horizontalSpacer_3">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
+      <item row="5" column="1">
+       <widget class="QLineEdit" name="lineEdit_recordFilePath">
+        <property name="minimumSize">
+         <size>
+          <width>172</width>
+          <height>32</height>
+         </size>
         </property>
-        <property name="sizeHint" stdset="0">
+        <property name="maximumSize">
          <size>
-          <width>40</width>
-          <height>20</height>
+          <width>232</width>
+          <height>32</height>
          </size>
         </property>
-       </spacer>
+       </widget>
       </item>
-      <item row="4" column="0">
-       <widget class="QLabel" name="label_5">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label_2">
         <property name="text">
-         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;侦听端口:</string>
+         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;录音日志保留:</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
        </widget>
       </item>
-      <item row="2" column="0">
-       <widget class="QLabel" name="label_4">
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_3">
         <property name="text">
-         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;录音文件保留:</string>
+         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;操作日志保留:</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
        </widget>
       </item>
-      <item row="0" column="2">
-       <widget class="QLabel" name="label_10">
-        <property name="minimumSize">
+      <item row="9" column="0" colspan="3">
+       <spacer name="verticalSpacer">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
          <size>
-          <width>60</width>
-          <height>0</height>
+          <width>20</width>
+          <height>40</height>
          </size>
         </property>
+       </spacer>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_4">
         <property name="text">
-         <string>(1~360)</string>
+         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;录音文件保留:</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="lineEdit_operatorLOgRetain">
+      <item row="3" column="1">
+       <widget class="QLineEdit" name="lineEdit_clientPort">
         <property name="minimumSize">
          <size>
           <width>172</width>
@@ -189,55 +198,36 @@
         </property>
        </widget>
       </item>
-      <item row="6" column="0">
-       <widget class="QPushButton" name="btnRestore">
+      <item row="1" column="1">
+       <widget class="QLineEdit" name="lineEdit_operatorLogRetain">
         <property name="minimumSize">
          <size>
-          <width>102</width>
+          <width>172</width>
           <height>32</height>
          </size>
         </property>
         <property name="maximumSize">
          <size>
-          <width>102</width>
+          <width>232</width>
           <height>32</height>
          </size>
         </property>
-        <property name="text">
-         <string>恢复配置项</string>
-        </property>
        </widget>
       </item>
-      <item row="4" column="2">
-       <spacer name="horizontalSpacer_2">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="5" column="2">
-       <spacer name="horizontalSpacer">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
+      <item row="5" column="0">
+       <widget class="QLabel" name="label_7">
+        <property name="text">
+         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#d21f21;&quot;&gt;*&lt;/span&gt;录音文件目录:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
         </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
-       </spacer>
+       </widget>
       </item>
-      <item row="5" column="0">
-       <widget class="QLabel" name="label_7">
+      <item row="4" column="0">
+       <widget class="QLabel" name="label_5">
         <property name="text">
-         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;录音文件目录:</string>
+         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;侦听端口:</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -260,34 +250,25 @@
         </property>
        </widget>
       </item>
-      <item row="3" column="0">
-       <widget class="QLabel" name="label_6">
+      <item row="8" column="0" colspan="3">
+       <widget class="QLabel" name="label_tip">
         <property name="text">
-         <string>&lt;font color = #D21F21 &gt;*&lt;/font&gt;客户端通讯端口:</string>
-        </property>
-        <property name="alignment">
-         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+         <string>可恢复为编辑时的初始字段信息</string>
         </property>
        </widget>
       </item>
-      <item row="3" column="1">
-       <widget class="QLineEdit" name="lineEdit_clientPort">
-        <property name="minimumSize">
-         <size>
-          <width>172</width>
-          <height>32</height>
-         </size>
+      <item row="6" column="0">
+       <widget class="QLabel" name="label_8">
+        <property name="text">
+         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#d21f21;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot; color:#000000;&quot;&gt;FTP文件&lt;/span&gt;目录:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
         </property>
-        <property name="maximumSize">
-         <size>
-          <width>232</width>
-          <height>32</height>
-         </size>
+        <property name="alignment">
+         <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
        </widget>
       </item>
-      <item row="5" column="1">
-       <widget class="QLineEdit" name="lineEdit_recordFilePath">
+      <item row="6" column="1">
+       <widget class="QLineEdit" name="lineEdit_ftpPath">
         <property name="minimumSize">
          <size>
           <width>172</width>
@@ -302,39 +283,6 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="2">
-       <widget class="QLabel" name="label">
-        <property name="minimumSize">
-         <size>
-          <width>60</width>
-          <height>0</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>(1~360)</string>
-        </property>
-       </widget>
-      </item>
-      <item row="8" column="0" colspan="3">
-       <spacer name="verticalSpacer">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>40</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="7" column="0" colspan="3">
-       <widget class="QLabel" name="label_tip">
-        <property name="text">
-         <string>可恢复为编辑时的初始字段信息</string>
-        </property>
-       </widget>
-      </item>
      </layout>
     </widget>
    </item>

+ 4 - 2
SettingLibrary/Modules/Noise/noisewidget.cpp

@@ -34,8 +34,10 @@ NoiseWidget::NoiseWidget(QWidget *parent) :
     ui->lineEdit_serverPath->hide();
     ui->label_3->hide();
 
-    /* 设置输入数字的栏只能输入数字 */
-    ui->lineEdit_detectInternal->setValidator(new QIntValidator(this));
+    /* 设置输入数字的栏只能输入数字,并限制为整数0-60 */
+    ui->lineEdit_detectInternal->setValidator(new QIntValidator(0, 60, this));
+    /* 设置输入栏的弱提示符 */
+    ui->lineEdit_detectInternal->setPlaceholderText("请输入, 限制0-60秒");
 
     /* 设置初始参数 */
     do_pBtn_restore_clicked();

+ 2 - 0
common/DataManager/SystemConfig.cpp

@@ -248,6 +248,7 @@ bool SystemConfigInfo::getDatabaseConfigFromJson(const std::string& jsonStr)
         m_databaseConfig.nClientPort = jsonConfig["ClientPort"].is_null() ? 0 : jsonConfig["ClientPort"].get<int>();
         m_databaseConfig.nListenPort = jsonConfig["ListenPort"].is_null() ? 0 : jsonConfig["ListenPort"].get<int>();
         m_databaseConfig.strRecordFilePath = jsonConfig["RecordFilePath"].is_null() ? "" : QString::fromStdString(jsonConfig["RecordFilePath"].get<std::string>());
+        m_databaseConfig.strFtpPath = jsonConfig["FtpPath"].is_null() ? "" : QString::fromStdString(jsonConfig["FtpPath"].get<std::string>());
         
     }nJsonCatch
 
@@ -264,6 +265,7 @@ bool SystemConfigInfo::setDatabaseConfigToJson(const DatabaseConfig_t& databaseC
         jsonConfig["ClientPort"] = databaseConfig.nClientPort;
         jsonConfig["ListenPort"] = databaseConfig.nListenPort;
         jsonConfig["RecordFilePath"] = databaseConfig.strRecordFilePath.toStdString();
+        jsonConfig["FtpPath"] = databaseConfig.strFtpPath.toStdString();
 
         strJson = jsonConfig.dump();
     }nJsonCatch

+ 2 - 1
common/DataManager/SystemConfigStruct.cpp

@@ -106,7 +106,8 @@ bool DatabaseConfig_t::operator==(const DatabaseConfig_t &other) const
         nRecordFileRetain == other.nRecordFileRetain &&
         nClientPort == other.nClientPort &&
         nListenPort == other.nListenPort &&
-        strRecordFilePath == other.strRecordFilePath
+        strRecordFilePath == other.strRecordFilePath &&
+        strFtpPath == other.strFtpPath
     )
     {
         return true;

+ 1 - 0
common/DataManager/SystemConfigStruct.h

@@ -108,6 +108,7 @@ struct DatabaseConfig_t
     int nClientPort = 0;            /* 客户端端口 */
     int nListenPort = 0;            /* 监听端口 */
     QString strRecordFilePath;      /* 录音文件路径 */
+    QString strFtpPath;             /* FTP报警文件路径 */
 
     bool operator==(const DatabaseConfig_t &other) const;
 };