#ifndef _ASSIGNSRCDATATHREAD_H_ #define _ASSIGNSRCDATATHREAD_H_ #include "BaseRecordThread.h" #include #include #include #include struct AudioSrcData; class RecordThread; class CreateDBThread; class CreateWAVThread; class CreateLongFileThread; /** 线程功能: 1、获取小于1s的数据,将其拼接成1s大小的数据,并配上这段数据开始时间(由数据大小推算而来) 2、线程等待不再使用线程休眠的方式,使用条件变量休眠线程,有数据后可以立马唤醒线程 3、常规分发数据: 将拼接好的数据分发给各个数据处理线程,满1秒就分发一次 4、实时分发数据: 收到数据后立马进行转发 */ class AssignSrcDataThread : public BaseRecordThread { public: AssignSrcDataThread(RecordThreadInfo_t& threadInfo); ~AssignSrcDataThread() override; /* 停止线程 */ void stopThread() override; /* 设置数据,这里不用 */ bool setData(const AudioSrcData& srcData) override; /* 设置数据,输入小于1秒的数据 */ bool setSrcData(const char* srcData, int32_t dataSize, QDateTime& endTime); protected: /* 线程任务函数 */ void task() override; /* 初始化一些数据 */ bool initData() override; /* 清理数据 */ void clearData() override; private: /* 获取需要分派数据的线程 */ bool getDispatchThread(); /* ---------------------- 发送常规音量 ---------------------- */ /* 发送常规数据,对实时性要求不高的数据,数据时长1秒 */ void sendRegularData(const AudioSrcData& srcData); /* 判断是否满足1秒的数据 */ bool isFullOneSecondData() const; /* 处理数据,将数据分配成1秒的小数据 */ bool processData(); /* ---------------------- 发送实时音频数据 ---------------------- */ /* 发送实时音频数据 */ void sendRealTimeSrcData(const AudioSrcData& srcData); /* 发送原始数据到Rtp中,实时发送,有新的就发送 */ inline void sendSrcDataToRtp(const AudioSrcData& srcData); private: /* 条件变量 */ std::atomic_bool m_isDataUpdate = false; /* 数据更新标志,数据更新时设置为true */ std::condition_variable m_condDataUpdate; /* 数据更新条件变量 */ std::mutex m_mutexDataUpdate; /* 数据更新互斥锁 */ /* ---------------------- 数据缓存列表 ---------------------- */ // QReadWriteLock m_pRwLock; /* 读写锁,保护数据的读写 */ QList m_listAudioSrcData; /* 数据缓存列表,这里使用QList,可以使用[]运算符 */ int32_t m_listDataSize = 0; /* 缓存中的数据是否满1秒大小 */ AudioSrcData* m_dispatchSrcData = nullptr; /* 分发的数据,1秒大小 */ AudioSrcData* m_pCurrentSrcData = nullptr; /* 当前处理的数据 */ int32_t m_remainingDataSize = 0; /* 当前的AudioSrcData剩余可用数据的大小 */ /* ---------------------- 录音线程指针 ---------------------- */ RecordThread* m_pThreadRecord = nullptr; /* 录音线程 */ /* ---------------------- RTP发送相关变量 ---------------------- */ BaseRecordThread* m_rtpSenderThread = nullptr; /* RTP发送线程 */ QDateTime m_lastSendTime; /* 上次发送数据的时间 */ /* ---------------------- 计算音量的线程 ---------------------- */ CreateDBThread* m_pThreadCreateDB = nullptr; /* 创建音量的线程 */ /* ---------------------- 生成Wav小文件的线程 ---------------------- */ CreateWAVThread* m_pThreadCreateWAV = nullptr; /* 创建Wav小文件的线程 */ /* ---------------------- 生成长文件的线程 ---------------------- */ CreateLongFileThread* m_pThreadCreateLongFile = nullptr; /* 创建长文件的线程 */ }; #endif // _ASSIGNSRCDATATHREAD_H_