|
@@ -337,7 +337,7 @@ bool CreateLongFileThread::setTodayPath(bool isNewFile)
|
|
|
}
|
|
|
m_todayDateRecord = today;
|
|
|
/* 先检查现在的日期文件夹是否存在,因为其他线程可能已经创建了 */
|
|
|
- QString todayDirName = QString("%1/%2").arg(GInfo.longWavPath()).arg(today.toString("yyyy-MM-dd"));
|
|
|
+ QString todayDirName = QString("%1/%2").arg(GInfo.longWavPath()).arg(m_todayDateRecord.toString("yyyy-MM-dd"));
|
|
|
m_todayDir.setPath(todayDirName);
|
|
|
if(!m_todayDir.exists())
|
|
|
{
|
|
@@ -358,7 +358,8 @@ bool CreateLongFileThread::setTodayPath(bool isNewFile)
|
|
|
m_todayDir.setPath(roadDirName);
|
|
|
if(!m_todayDir.exists())
|
|
|
{
|
|
|
- if(!m_todayDir.mkpath(todayDirName))
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 记录文件目录不存在: {}", m_logBase, roadDirName.toStdString());
|
|
|
+ if(!m_todayDir.mkpath(roadDirName))
|
|
|
{
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "{} 创建目录失败: {}", m_logBase, roadDirName.toStdString());
|
|
|
return false;
|
|
@@ -468,17 +469,18 @@ QString CreateLongFileThread::generateAlarmFileName(const AlarmValue_t& value, b
|
|
|
setTodayAlarmPath();
|
|
|
|
|
|
/* 检查这个对比项的报警文件夹是否存在 */
|
|
|
+ // QString itemDirName = m_todayDirAlarm.filePath(QString("CompareItemID_%1").arg(QString::number(value.numConpareItemID)));
|
|
|
QString itemDirName = QString("CompareItemID_%1").arg(QString::number(value.numConpareItemID));
|
|
|
- QDir itemDir = m_todayDirAlarm;
|
|
|
- itemDir.cd(itemDirName);
|
|
|
+ QDir itemDir(m_todayDirAlarm.filePath(itemDirName));
|
|
|
if(!itemDir.exists())
|
|
|
{
|
|
|
- if(!itemDir.mkpath(itemDirName))
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 对比项报警文件夹不存在: {}", m_logBase, itemDir.path().toStdString());
|
|
|
+ if(!itemDir.mkpath("."))
|
|
|
{
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 创建报警文件夹失败: {}", m_logBase, itemDirName.toStdString());
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建对比项报警文件夹失败: {}", m_logBase, itemDir.path().toStdString());
|
|
|
return QString(); // 创建目录失败
|
|
|
} else {
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "{} 创建报警文件夹成功: {}", m_logBase, itemDirName.toStdString());
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 创建对比项报警文件夹成功: {}", m_logBase, itemDir.path().toStdString());
|
|
|
}
|
|
|
}
|
|
|
/* 生成文件名, 格式: Alarm_RoadNum_AlarmType_yyyyMMdd_hhmmss-yyyyMMdd_hhmmss.wav
|
|
@@ -510,7 +512,7 @@ void CreateLongFileThread::writeAlarmFile()
|
|
|
{
|
|
|
const int writeSeconds = 2;
|
|
|
const int newAlarmSeconds = 10;
|
|
|
- /* 新文件,从报警时间往前推1秒写入 */
|
|
|
+ /* 新文件,从报警时间往前推10秒写入 */
|
|
|
std::list<AudioSrcData*> newDataList;
|
|
|
/* 给已经写入的问价使用 */
|
|
|
std::list<AudioSrcData*> dataList;
|
|
@@ -559,48 +561,8 @@ void CreateLongFileThread::writeAlarmFile()
|
|
|
/* 判断是新否是新录音的文件 */
|
|
|
if(value.state == eRecordState::eAlarm_Init)
|
|
|
{
|
|
|
- /* 新的报警录音,生成文件名 */
|
|
|
- value.fileName = generateAlarmFileName(value, true);
|
|
|
- value.state = eRecordState::eAlarm_Recording; // 设置为录音状态
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "{} 开始写入报警文件: {}", m_logBase, value.fileName.toStdString());
|
|
|
-
|
|
|
- /* 计算出报警开始位置在报警文件中的偏移,这个偏移值在设置结束的时候取出 */
|
|
|
- for(const auto& audioData : newDataList)
|
|
|
- {
|
|
|
- if(audioData == nullptr || audioData->pData == nullptr || audioData->dataSize == 0)
|
|
|
- {
|
|
|
- continue; // 跳过空数据
|
|
|
- }
|
|
|
- if(audioData->startTime <= value.startTime)
|
|
|
- {
|
|
|
- /* 计算报警开始位置 */
|
|
|
- value.alarmStartPos = audioData->startTime.secsTo(value.startTime);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* 打开文件 */
|
|
|
- QFile wavFile(value.fileName);
|
|
|
- if(!wavFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 打开报警文件失败: {}", m_logBase, value.fileName.toStdString());
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "错误原因: {}", wavFile.errorString().toStdString());
|
|
|
- continue;
|
|
|
- }
|
|
|
- /* 写入音频数据到文件 */
|
|
|
- for(auto& audioData : newDataList)
|
|
|
- {
|
|
|
- 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());
|
|
|
- }
|
|
|
- }
|
|
|
- wavFile.close();
|
|
|
+ /* 创建新的文件,并写入wav头文件 */
|
|
|
+ createNewAlarmFile(value, newDataList);
|
|
|
} else
|
|
|
{
|
|
|
/* 已经存在的文件,直接写入新录制的文件 */
|
|
@@ -625,6 +587,9 @@ void CreateLongFileThread::writeAlarmFile()
|
|
|
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();
|
|
@@ -638,6 +603,10 @@ void CreateLongFileThread::writeAlarmFile()
|
|
|
AlarmValue_t& value = it->second;
|
|
|
if(value.state == eRecordState::eAlarm_Stopped)
|
|
|
{
|
|
|
+ /* 修改wav头文件,修改吸入的数据大小 */
|
|
|
+ value.wavHeader.setDataSize(value.writtenSize);
|
|
|
+ value.wavHeader.calculateDerivedFields();
|
|
|
+ modifyWavFileHeader(value.fileName, value.wavHeader);
|
|
|
/* 已经结束的报警,修改文件名 */
|
|
|
modifyFileName(value.fileName, value.fileNameEnd);
|
|
|
/* 移除这个报警 */
|
|
@@ -646,7 +615,71 @@ void CreateLongFileThread::writeAlarmFile()
|
|
|
++it; // 继续下一个
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ /* 清空标志位 */
|
|
|
+ m_numNewAlarmSeconds = 0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/* 创建新的文件 */
|
|
|
+void CreateLongFileThread::createNewAlarmFile(AlarmValue_t& value, const std::list<AudioSrcData*>& dataList)
|
|
|
+{
|
|
|
+ /* 新的报警录音,生成文件名 */
|
|
|
+ value.fileName = generateAlarmFileName(value, true);
|
|
|
+ value.state = eRecordState::eAlarm_Recording; // 设置为录音状态
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "{} 开始写入报警文件: {}", m_logBase, value.fileName.toStdString());
|
|
|
+
|
|
|
+ /* 计算出报警开始位置在报警文件中的偏移,这个偏移值在设置结束的时候取出 */
|
|
|
+ for(const auto& audioData : dataList)
|
|
|
+ {
|
|
|
+ if(audioData == nullptr || audioData->pData == nullptr || audioData->dataSize == 0)
|
|
|
+ {
|
|
|
+ continue; // 跳过空数据
|
|
|
+ }
|
|
|
+ if(audioData->startTime <= value.startTime)
|
|
|
+ {
|
|
|
+ /* 计算报警开始位置 */
|
|
|
+ value.alarmStartPos = audioData->startTime.secsTo(value.startTime);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ /* 打开文件 */
|
|
|
+ QFile wavFile(value.fileName);
|
|
|
+ if(!wavFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 打开报警文件失败: {}", m_logBase, value.fileName.toStdString());
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "错误原因: {}", wavFile.errorString().toStdString());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /* 先写入wav头文件 */
|
|
|
+ value.wavHeader.setSampleRate(m_sampleRate);
|
|
|
+ value.wavHeader.setNumChannels(m_numChannels);
|
|
|
+ value.wavHeader.setBitsPerSample(m_bitsPerSample);
|
|
|
+ value.wavHeader.setDataSize(m_writtenSize);
|
|
|
+ value.wavHeader.calculateDerivedFields();
|
|
|
+
|
|
|
+ wavFile.write(reinterpret_cast<const char*>(&value.wavHeader), sizeof(WavHeader));
|
|
|
+
|
|
|
+ /* 写入音频数据到文件 */
|
|
|
+ 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());
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ value.writtenSize += writeSize; // 累加写入大小
|
|
|
+ }
|
|
|
+ }
|
|
|
+ wavFile.close();
|
|
|
}
|
|
|
|
|
|
|