#ifndef _ASSIGNSRCDATATHREAD_H_ #define _ASSIGNSRCDATATHREAD_H_ #include "BaseRecordThread.h" #include #include #include struct AudioSrcData; class RecordThread; /** * 线程功能: * 1、获取小于1s的数据,将其拼接成1s大小的数据,并配上这段数据开始时间(由数据大小推算而来) * 2、将拼接好的数据分发给各个数据处理线程,满1秒就分发一次 */ class AssignSrcDataThread : public BaseRecordThread { public: AssignSrcDataThread(RecordThreadInfo_t& threadInfo); ~AssignSrcDataThread() 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秒的数据 */ bool isFullOneSecondData() const; /* 处理数据,将数据分配成1秒的小数据 */ bool processData(); /* 发送原始数据到Rtp中,实时发送,有新的就发送 */ void sendSrcDataToRtp(); private: /* 需要分配数据的线程指针集合 */ std::list m_listDispatchThreads; RecordThread* m_pRecordThread = nullptr; /* 录音线程 */ BaseRecordThread* m_rtpSenderThread = nullptr; /* RTP发送线程 */ AudioSrcData* m_pSendSrcData = nullptr; /* 已发送的数据,用牌判断是否有新数据了 */ QReadWriteLock* m_pRwLock = nullptr; /* 读写锁,保护数据的读写 */ std::list m_listAudioSrcData; /* 数据缓存列表 */ int32_t m_listDataSize = 0; /* 缓存中的数据是否满1秒大小 */ AudioSrcData* m_dispatchSrcData = nullptr; /* 分发的数据,1秒大小 */ AudioSrcData* m_pCurrentSrcData = nullptr; /* 当前处理的数据 */ int32_t m_remainingDataSize = 0; /* 当前的AudioSrcData剩余可用数据的大小 */ }; #endif // _ASSIGNSRCDATATHREAD_H_