#include "BaseRecordThread.h" #include BaseRecordThread::BaseRecordThread(RecordThreadInfo_t& threadInfo) : m_threadInfo(threadInfo) { m_logger = spdlog::get("RecordAudio"); if(m_logger == nullptr) { fmt::print("RecordThread: RecordAudio Logger not found.\n"); return; } m_logBase = fmt::format("录音通道: {}:{}", m_threadInfo.cardRoadInfo.strSoundCardName.toStdString(), m_threadInfo.cardRoadInfo.roadInfo.nRoadNum); } BaseRecordThread::~BaseRecordThread() { } /* 线程任务函数,子类需要实现 */ void BaseRecordThread::threadTask() { m_isRunning.store(true); m_logBase = fmt::format("录音通道: {}:{}", m_threadInfo.cardRoadInfo.strSoundCardName.toStdString(), m_threadInfo.cardRoadInfo.roadInfo.nRoadNum); m_threadInfo.threadState = EThreadState::State_Running; /* 执行任务 */ task(); m_threadInfo.threadState = EThreadState::State_Stopped; } /* 停止线程 */ void BaseRecordThread::stopThread() { m_isRunning.store(false); } /* 获取频率ID */ const RecordThreadInfo_t& BaseRecordThread::getThreadInfo() { return m_threadInfo; } /* 根据文件大小计算时间长度,单位ms */ QDateTime BaseRecordThread::previTime(QDateTime& currentTime, int64_t dataSize) { if(dataSize <= 0) { return currentTime; // 如果数据大小为0,返回当前时间 } int64_t offsetMS = dataSize * 1000 / m_oneSecondSize; return currentTime.addMSecs(-offsetMS); } /*根据当前时间和数据大小向后推算时间 */ QDateTime BaseRecordThread::nextTime(QDateTime& currentTime, int64_t dataSize) { if(dataSize <= 0) { return currentTime; // 如果数据大小为0,返回当前时间 } int64_t offsetMS = dataSize * 1000 / m_oneSecondSize; return currentTime.addMSecs(offsetMS); } /* 计算出到下一个整点秒需要去掉多少个字节 */ int32_t BaseRecordThread::calculateOffsetToNextSecond(QDateTime& currentTime) { QDateTime nextSecond = currentTime.addSecs(1); nextSecond = nextSecond.addMSecs(-nextSecond.time().msec()); // 去掉毫秒部分 int64_t offsetMS = nextSecond.toMSecsSinceEpoch() - currentTime.toMSecsSinceEpoch(); return static_cast(offsetMS * m_oneSecondSize / 1000); // 转换为字节数 }