|
@@ -75,7 +75,7 @@ bool CreateRecordFileThread::setData(const AudioSrcData& srcData)
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
/* 记录日期 */
|
|
/* 记录日期 */
|
|
- if(m_bufferData.startTime.isNull() || m_bufferData.startTime.isValid())
|
|
|
|
|
|
+ if(m_bufferData.startTime.isNull() || !m_bufferData.startTime.isValid())
|
|
{
|
|
{
|
|
m_bufferData.startTime = srcData.startTime;
|
|
m_bufferData.startTime = srcData.startTime;
|
|
}
|
|
}
|
|
@@ -141,28 +141,31 @@ bool CreateRecordFileThread::stopRecordLongFile(const OneCompareItemRoadInfo_t&
|
|
/* 开启录制 */
|
|
/* 开启录制 */
|
|
bool CreateRecordFileThread::startRecordAlarmFile(const AlarmInfo_t& alarmInfo)
|
|
bool CreateRecordFileThread::startRecordAlarmFile(const AlarmInfo_t& alarmInfo)
|
|
{
|
|
{
|
|
- std::lock_guard<std::mutex> lock(m_mutexAlarmFile);
|
|
|
|
- /* 先检查是否已经在队列中了 */
|
|
|
|
- AlarmKey_t key = {alarmInfo.CompareItemID, alarmInfo.RoadInfo.nCompareRoadNum,
|
|
|
|
- alarmInfo.AlarmType, alarmInfo.StartTime};
|
|
|
|
- if(m_mapAlarmFile.find(key) != m_mapAlarmFile.end())
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_WARN(m_logger, "{} 对比项ID:{},{}, 通道:{}, 报警类型: {}, 已经在报警录制队列中,无法重复添加", m_logBase,
|
|
|
|
- alarmInfo.CompareItemID, alarmInfo.strCompareItemName.toStdString(), alarmInfo.RoadInfo.nCompareRoadNum,
|
|
|
|
- static_cast<int>(alarmInfo.AlarmType));
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
|
|
+ {
|
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexAlarmFile);
|
|
|
|
+ /* 先检查是否已经在队列中了 */
|
|
|
|
+ AlarmKey_t key = {alarmInfo.CompareItemID, alarmInfo.RoadInfo.nCompareRoadNum,
|
|
|
|
+ alarmInfo.AlarmType, alarmInfo.StartTime};
|
|
|
|
+ if(m_mapAlarmFile.find(key) != m_mapAlarmFile.end())
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 对比项ID:{},{}, 通道:{}, 报警类型: {}, 已经在报警录制队列中,无法重复添加", m_logBase,
|
|
|
|
+ alarmInfo.CompareItemID, alarmInfo.strCompareItemName.toStdString(), alarmInfo.RoadInfo.nCompareRoadNum,
|
|
|
|
+ static_cast<int>(alarmInfo.AlarmType));
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
|
|
- /* 将数据值插入map中 */
|
|
|
|
- AlarmValue_t value;
|
|
|
|
- value.alarmType = alarmInfo.AlarmType;
|
|
|
|
- value.startTime = alarmInfo.StartTime;
|
|
|
|
- value.endTime = alarmInfo.EndTime;
|
|
|
|
- value.numConpareItemID = alarmInfo.CompareItemID;
|
|
|
|
- value.strCompareItemName = alarmInfo.strCompareItemName;
|
|
|
|
- value.itemRoadInfo = alarmInfo.RoadInfo;
|
|
|
|
|
|
+ /* 将数据值插入map中 */
|
|
|
|
+ AlarmValue_t value;
|
|
|
|
+ value.alarmType = alarmInfo.AlarmType;
|
|
|
|
+ value.startTime = alarmInfo.StartTime;
|
|
|
|
+ value.endTime = alarmInfo.EndTime;
|
|
|
|
+ value.numConpareItemID = alarmInfo.CompareItemID;
|
|
|
|
+ value.strCompareItemName = alarmInfo.strCompareItemName;
|
|
|
|
+ value.itemRoadInfo = alarmInfo.RoadInfo;
|
|
|
|
|
|
- m_mapAlarmFile.insert({key, value});
|
|
|
|
|
|
+ m_mapAlarmFile.insert({key, value});
|
|
|
|
+ }
|
|
|
|
+ m_cond_var.notify_one();
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -214,8 +217,9 @@ void CreateRecordFileThread::task()
|
|
|
|
|
|
while(m_isRunning)
|
|
while(m_isRunning)
|
|
{
|
|
{
|
|
- /* 线程休眠100ms */
|
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
|
+ /* 使用条件变量阻塞线程,加快开启报警时的响应速度 */
|
|
|
|
+ std::unique_lock<std::mutex> lock(m_mutexCondVar);
|
|
|
|
+ m_cond_var.wait_for(lock, std::chrono::milliseconds(500));
|
|
|
|
|
|
/*--------------------------------------------------------------
|
|
/*--------------------------------------------------------------
|
|
* 写入报警文件
|
|
* 写入报警文件
|
|
@@ -321,8 +325,10 @@ bool CreateRecordFileThread::writeLongRecordFile()
|
|
{
|
|
{
|
|
/* 如果没有写入过数据,则是新文件 */
|
|
/* 如果没有写入过数据,则是新文件 */
|
|
isNewFile = true;
|
|
isNewFile = true;
|
|
- m_writtenStartTime = m_srcData.startTime; // 记录开始时间
|
|
|
|
- m_writtenNowTime = m_writtenStartTime; // 记录当前时间
|
|
|
|
|
|
+ m_writtenStartTime = m_srcData.startTime; // 记录开始时间
|
|
|
|
+ m_writtenNowTime = m_writtenStartTime;
|
|
|
|
+ // SPDLOG_LOGGER_WARN(m_logger, "新录音文件: {} - {}", m_writtenStartTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(),
|
|
|
|
+ // m_writtenNowTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
}
|
|
}
|
|
/* 设置今日目录 */
|
|
/* 设置今日目录 */
|
|
if(!setTodayPath(isNewFile))
|
|
if(!setTodayPath(isNewFile))
|
|
@@ -353,7 +359,7 @@ bool CreateRecordFileThread::writeLongRecordFile()
|
|
{
|
|
{
|
|
std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
wSize = wavFile.write(m_srcData.pData, m_srcData.dataSize);
|
|
wSize = wavFile.write(m_srcData.pData, m_srcData.dataSize);
|
|
- /* 更新结束时间 */
|
|
|
|
|
|
+ /* 记录当前结束时间 */
|
|
m_writtenNowTime = m_srcData.endTime;
|
|
m_writtenNowTime = m_srcData.endTime;
|
|
/* 清空缓冲区 */
|
|
/* 清空缓冲区 */
|
|
m_srcData.clear();
|
|
m_srcData.clear();
|
|
@@ -368,8 +374,8 @@ bool CreateRecordFileThread::writeLongRecordFile()
|
|
SPDLOG_LOGGER_TRACE(m_logger, "{} 写入WAV文件成功: {}, 大小: {} 字节", m_logBase, m_wavFileName.toStdString(), wSize);
|
|
SPDLOG_LOGGER_TRACE(m_logger, "{} 写入WAV文件成功: {}, 大小: {} 字节", m_logBase, m_wavFileName.toStdString(), wSize);
|
|
}
|
|
}
|
|
wavFile.close();
|
|
wavFile.close();
|
|
- // SPDLOG_LOGGER_DEBUG(m_logger, "{} 写入WAV文件完成: {}, 大小: {} 字节",
|
|
|
|
- // m_logBase, m_wavFileName.toStdString(), wSize);
|
|
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "写入录音文件成功, 写入的时间段: {} - {}",
|
|
|
|
+ // m_writtenStartTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(), m_writtenNowTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
|
|
|
/*--------------------------------------------------------------
|
|
/*--------------------------------------------------------------
|
|
* 对该文件进行其他操作,判断是否已经过了一个整点,修改其文件名称
|
|
* 对该文件进行其他操作,判断是否已经过了一个整点,修改其文件名称
|
|
@@ -398,16 +404,22 @@ bool CreateRecordFileThread::writeLongRecordFile()
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 结束记录一个文件: {}, 已写入大小: {} 字节",
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 结束记录一个文件: {}, 已写入大小: {} 字节",
|
|
m_logBase, m_wavFileName.toStdString(), m_writtenSize);
|
|
m_logBase, m_wavFileName.toStdString(), m_writtenSize);
|
|
isRecordCompleted = true;
|
|
isRecordCompleted = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 更新文件信息到数据库 */
|
|
|
|
+ updateRecordFileInfoToDB(isNewFile, isRecordCompleted);
|
|
|
|
+
|
|
|
|
+ /* 清空已经结束的文件信息 */
|
|
|
|
+ if(isRecordCompleted)
|
|
|
|
+ {
|
|
/* 重置已写入大小 */
|
|
/* 重置已写入大小 */
|
|
m_writtenSize = 0;
|
|
m_writtenSize = 0;
|
|
m_writtenStartTime = QDateTime(); // 重新开始时间
|
|
m_writtenStartTime = QDateTime(); // 重新开始时间
|
|
- m_writtenNowTime = m_writtenStartTime; // 重新开始时间
|
|
|
|
|
|
+ m_writtenNowTime = QDateTime(); // 重新开始时间
|
|
m_wavFileName.clear(); // 清空文件名
|
|
m_wavFileName.clear(); // 清空文件名
|
|
m_openFileErrorSize = 0; // 重置错误次数
|
|
m_openFileErrorSize = 0; // 重置错误次数
|
|
}
|
|
}
|
|
|
|
|
|
- /* 更新文件信息到数据库 */
|
|
|
|
- updateRecordFileInfoToDB(isNewFile, isRecordCompleted);
|
|
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -530,18 +542,14 @@ bool CreateRecordFileThread::isOneHourPassed()
|
|
{
|
|
{
|
|
if(m_writtenSize >= m_oneHourSize)
|
|
if(m_writtenSize >= m_oneHourSize)
|
|
{
|
|
{
|
|
- return true; // 已经写入的数据大小超过了一小时的大小
|
|
|
|
|
|
+ // 已经写入的数据大小超过了一小时的大小
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
/* 下面是判断刚启动的时候,到下一个整点不足1小时,也会保存文件 */
|
|
/* 下面是判断刚启动的时候,到下一个整点不足1小时,也会保存文件 */
|
|
int minute = m_writtenNowTime.time().minute();
|
|
int minute = m_writtenNowTime.time().minute();
|
|
bool isPassed = false;
|
|
bool isPassed = false;
|
|
- /* 如果当前时间的分钟数小于等于2,并且已经写入的大小超过两次写入的大小 */
|
|
|
|
- if(minute <= 2 && m_writtenSize >= m_writeCriticalSize * 2)
|
|
|
|
- {
|
|
|
|
- isPassed = true;
|
|
|
|
- }
|
|
|
|
- /* 或者已经写入的数据大小超过了一小时的大小,则认为过了整点 */
|
|
|
|
- if(m_writtenSize >= m_oneHourSize)
|
|
|
|
|
|
+ /* 如果当前时间的分钟数小于等于2,并且已经写入的大小超过三分钟大小 */
|
|
|
|
+ if( (minute <= 2) && (m_writtenSize > m_oneSecondSize * 60 * 3) )
|
|
{
|
|
{
|
|
isPassed = true;
|
|
isPassed = true;
|
|
}
|
|
}
|
|
@@ -608,6 +616,7 @@ QString CreateRecordFileThread::generateAlarmFileName(const AlarmValue_t& value,
|
|
|
|
|
|
/* 拼接文件夹路径 */
|
|
/* 拼接文件夹路径 */
|
|
retFileName = itemDir.filePath(fileName);
|
|
retFileName = itemDir.filePath(fileName);
|
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "{} 生成新的报警文件名: {}", m_logBase, retFileName.toStdString());
|
|
}else
|
|
}else
|
|
{
|
|
{
|
|
/* 已有的文件,是报警结束的文件名 */
|
|
/* 已有的文件,是报警结束的文件名 */
|
|
@@ -617,6 +626,8 @@ QString CreateRecordFileThread::generateAlarmFileName(const AlarmValue_t& value,
|
|
QString endTimeStr = value.endTime.toString("yyyyMMdd_hhmmss");
|
|
QString endTimeStr = value.endTime.toString("yyyyMMdd_hhmmss");
|
|
/* 替换掉原来的结束时间 */
|
|
/* 替换掉原来的结束时间 */
|
|
retFileName.replace("-.wav", QString("-%1.wav").arg(endTimeStr));
|
|
retFileName.replace("-.wav", QString("-%1.wav").arg(endTimeStr));
|
|
|
|
+
|
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "{} 原文件名:{} 生成报警结束文件名: {}", m_logBase, value.fileName.toStdString(), retFileName.toStdString());
|
|
}
|
|
}
|
|
|
|
|
|
return retFileName;
|
|
return retFileName;
|
|
@@ -626,32 +637,14 @@ QString CreateRecordFileThread::generateAlarmFileName(const AlarmValue_t& value,
|
|
/* 写入报警文件 */
|
|
/* 写入报警文件 */
|
|
void CreateRecordFileThread::writeAlarmFile()
|
|
void CreateRecordFileThread::writeAlarmFile()
|
|
{
|
|
{
|
|
- const int writeSeconds = 2;
|
|
|
|
- const int newAlarmSeconds = 10;
|
|
|
|
/* 新文件,从报警时间往前推10秒写入 */
|
|
/* 新文件,从报警时间往前推10秒写入 */
|
|
std::list<AudioSrcData*> newDataList;
|
|
std::list<AudioSrcData*> newDataList;
|
|
- /* 已经打开的文件写入数据 */
|
|
|
|
- std::list<AudioSrcData*> dataList;
|
|
|
|
|
|
+ int writeSize = m_numNewAlarmSeconds > 10 ? m_numNewAlarmSeconds : 10;
|
|
{
|
|
{
|
|
- /* 先判断环形队列中数据是否足够的秒数,不一定是每一秒都会写的 */
|
|
|
|
std::lock_guard<std::mutex> lock(m_ringQueue.mutex);
|
|
std::lock_guard<std::mutex> lock(m_ringQueue.mutex);
|
|
- /* 目前暂定2秒写一次 */
|
|
|
|
- if(m_numNewAlarmSeconds < writeSeconds)
|
|
|
|
- {
|
|
|
|
- /* 不够两秒时间,退出 */
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
/* 取出环形队列中的数据 */
|
|
/* 取出环形队列中的数据 */
|
|
int size = m_ringQueue.QueueSize();
|
|
int size = m_ringQueue.QueueSize();
|
|
- for(int i = size - writeSeconds; i < size; ++i)
|
|
|
|
- {
|
|
|
|
- AudioSrcData* data = m_ringQueue[i];
|
|
|
|
- if(data != nullptr)
|
|
|
|
- {
|
|
|
|
- dataList.push_back(data);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- int start = size - newAlarmSeconds;
|
|
|
|
|
|
+ int start = size - writeSize;
|
|
if(start < 0)
|
|
if(start < 0)
|
|
{
|
|
{
|
|
start = 0; // 防止越界
|
|
start = 0; // 防止越界
|
|
@@ -667,52 +660,13 @@ void CreateRecordFileThread::writeAlarmFile()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /* 创建新文件并写入数据 */
|
|
|
|
- std::lock_guard<std::mutex> lock(m_mutexAlarmFile);
|
|
|
|
- /* 将数据循环写入到文件中 */
|
|
|
|
- for(auto& alarmInfo : m_mapAlarmFile)
|
|
|
|
- {
|
|
|
|
- /* 获取报警信息 */
|
|
|
|
- // const AlarmKey_t& key = alarmInfo.first;
|
|
|
|
- AlarmValue_t& value = alarmInfo.second;
|
|
|
|
- /* 判断是新否是新录音的文件 */
|
|
|
|
- if(value.state == eRecordState::eRS_Init)
|
|
|
|
- {
|
|
|
|
- /* 创建新的文件,并写入wav头文件 */
|
|
|
|
- createNewAlarmFile(value, newDataList);
|
|
|
|
- } else
|
|
|
|
- {
|
|
|
|
- /* 已经存在的文件,直接写入新录制的文件 */
|
|
|
|
- /* 打开文件 */
|
|
|
|
- QFile wavFile(value.fileName);
|
|
|
|
- if(!wavFile.open(QIODevice::WriteOnly | QIODevice::Append))
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 打开报警文件失败: {}", m_logBase, value.fileName.toStdString());
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "错误原因: {}", wavFile.errorString().toStdString());
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- /* 写入音频数据到文件 */
|
|
|
|
- for(auto& audioData : dataList)
|
|
|
|
- {
|
|
|
|
- if(audioData == nullptr || audioData->pData == nullptr || audioData->dataSize == 0)
|
|
|
|
- {
|
|
|
|
- continue; // 跳过空数据
|
|
|
|
- }
|
|
|
|
- auto writeSize = wavFile.write(reinterpret_cast<const char*>(audioData->pData), audioData->dataSize);
|
|
|
|
- if(writeSize < 0)
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 写入报警文件失败: {}", m_logBase, value.fileName.toStdString());
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "错误原因: {}", wavFile.errorString().toStdString());
|
|
|
|
- break; // 写入失败,跳出循环
|
|
|
|
- }else
|
|
|
|
- {
|
|
|
|
- value.writtenSize += writeSize; // 累加写入大小
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- wavFile.close();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ /* 写入已经创建的报警文件的数据,需要先写入已经创建的文件,再创建新的文件,防止
|
|
|
|
+ 创建新的文件后再次写入重复的数据 */
|
|
|
|
+ writeExistingAlarmFileData(newDataList);
|
|
|
|
+ /* 写入新的报警文件 */
|
|
|
|
+ writeNewAlarmFileData(newDataList);
|
|
|
|
+
|
|
|
|
|
|
/* 处理已经结束的报警,修改文件名,并将其移除队列中 */
|
|
/* 处理已经结束的报警,修改文件名,并将其移除队列中 */
|
|
for(auto it = m_mapAlarmFile.begin(); it != m_mapAlarmFile.end(); )
|
|
for(auto it = m_mapAlarmFile.begin(); it != m_mapAlarmFile.end(); )
|
|
@@ -736,7 +690,6 @@ void CreateRecordFileThread::writeAlarmFile()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/* 清空标志位 */
|
|
/* 清空标志位 */
|
|
m_numNewAlarmSeconds = 0;
|
|
m_numNewAlarmSeconds = 0;
|
|
|
|
|
|
@@ -748,7 +701,6 @@ void CreateRecordFileThread::createNewAlarmFile(AlarmValue_t& value, const std::
|
|
{
|
|
{
|
|
/* 新的报警录音,生成文件名 */
|
|
/* 新的报警录音,生成文件名 */
|
|
value.fileName = generateAlarmFileName(value, true);
|
|
value.fileName = generateAlarmFileName(value, true);
|
|
- value.state = eRecordState::eRS_Recording; // 设置为录音状态
|
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 开始写入报警文件: {}", m_logBase, value.fileName.toStdString());
|
|
SPDLOG_LOGGER_INFO(m_logger, "{} 开始写入报警文件: {}", m_logBase, value.fileName.toStdString());
|
|
|
|
|
|
/* 计算出报警开始位置在报警文件中的偏移,这个偏移值在设置结束的时候取出 */
|
|
/* 计算出报警开始位置在报警文件中的偏移,这个偏移值在设置结束的时候取出 */
|
|
@@ -803,6 +755,107 @@ void CreateRecordFileThread::createNewAlarmFile(AlarmValue_t& value, const std::
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+/* 写入新文件数据 */
|
|
|
|
+void CreateRecordFileThread::writeNewAlarmFileData(std::list<AudioSrcData*> dataList)
|
|
|
|
+{
|
|
|
|
+ /* 判断是否有新的报警信息 */
|
|
|
|
+ bool isNewAlarm = false;
|
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexAlarmFile);
|
|
|
|
+ for(const auto& pair : m_mapAlarmFile)
|
|
|
|
+ {
|
|
|
|
+ const AlarmValue_t& value = pair.second;
|
|
|
|
+ if(value.state == eRecordState::eRS_Init)
|
|
|
|
+ {
|
|
|
|
+ isNewAlarm = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(!isNewAlarm)
|
|
|
|
+ {
|
|
|
|
+ return; // 没有新的报警信息
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 创建新文件并写入数据 */
|
|
|
|
+ for(auto& alarmInfo : m_mapAlarmFile)
|
|
|
|
+ {
|
|
|
|
+ AlarmValue_t& value = alarmInfo.second;
|
|
|
|
+ /* 判断是新否是新录音的文件 */
|
|
|
|
+ if(value.state == eRecordState::eRS_Init)
|
|
|
|
+ {
|
|
|
|
+ /* 创建新的文件,并写入wav头文件 */
|
|
|
|
+ createNewAlarmFile(value, dataList);
|
|
|
|
+ value.state = eRecordState::eRS_Recording; // 设置为录音状态
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* 写入已经创建的报警文件数据 */
|
|
|
|
+void CreateRecordFileThread::writeExistingAlarmFileData(std::list<AudioSrcData*> newList)
|
|
|
|
+{
|
|
|
|
+ const int listSize = static_cast<int>(newList.size());
|
|
|
|
+ if(m_numNewAlarmSeconds > listSize)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 音频队列中数据小于需要写入的新的数据大小", m_logBase);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ /* 已经打开的文件写入数据 */
|
|
|
|
+ std::list<AudioSrcData*> dataList;
|
|
|
|
+ if(m_numNewAlarmSeconds > 0)
|
|
|
|
+ {
|
|
|
|
+ /* 取出最后 m_numNewAlarmSeconds 个数据 */
|
|
|
|
+ int i = newList.size() - m_numNewAlarmSeconds;
|
|
|
|
+ for(auto it = newList.end(); i < listSize; ++i)
|
|
|
|
+ {
|
|
|
|
+ --it;
|
|
|
|
+ dataList.push_back(*it);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 写入数据 */
|
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexAlarmFile);
|
|
|
|
+ /* 将数据循环写入到文件中 */
|
|
|
|
+ for(auto& alarmInfo : m_mapAlarmFile)
|
|
|
|
+ {
|
|
|
|
+ /* 获取报警信息 */
|
|
|
|
+ // const AlarmKey_t& key = alarmInfo.first;
|
|
|
|
+ AlarmValue_t& value = alarmInfo.second;
|
|
|
|
+ /* 判断是新否是新录音的文件 */
|
|
|
|
+ if(eRecordState::eRS_Recording == value.state)
|
|
|
|
+ {
|
|
|
|
+ /* 已经存在的文件,直接写入新录制的文件 */
|
|
|
|
+ /* 打开文件 */
|
|
|
|
+ QFile wavFile(value.fileName);
|
|
|
|
+ if(!wavFile.open(QIODevice::WriteOnly | QIODevice::Append))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 打开报警文件失败: {}", m_logBase, value.fileName.toStdString());
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "错误原因: {}", wavFile.errorString().toStdString());
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ /* 写入音频数据到文件 */
|
|
|
|
+ for(auto& audioData : dataList)
|
|
|
|
+ {
|
|
|
|
+ if(audioData == nullptr || audioData->pData == nullptr || audioData->dataSize == 0)
|
|
|
|
+ {
|
|
|
|
+ continue; // 跳过空数据
|
|
|
|
+ }
|
|
|
|
+ auto writeSize = wavFile.write(reinterpret_cast<const char*>(audioData->pData), audioData->dataSize);
|
|
|
|
+ if(writeSize < 0)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 写入报警文件失败: {}", m_logBase, value.fileName.toStdString());
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "错误原因: {}", wavFile.errorString().toStdString());
|
|
|
|
+ break; // 写入失败,跳出循环
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ value.writtenSize += writeSize; // 累加写入大小
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ wavFile.close();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/* 设置今日报警文件夹 */
|
|
/* 设置今日报警文件夹 */
|
|
bool CreateRecordFileThread::setTodayAlarmPath()
|
|
bool CreateRecordFileThread::setTodayAlarmPath()
|
|
{
|
|
{
|