1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #ifndef _ASSIGNSRCDATATHREAD_H_
- #define _ASSIGNSRCDATATHREAD_H_
- #include "BaseRecordThread.h"
- #include <condition_variable>
- #include <cstdint>
- #include <QList>
- #include <QReadWriteLock>
- 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秒的数据 */
- bool isFullOneSecondData() const;
- /* 处理数据,将数据分配成1秒的小数据 */
- bool processData();
- /* 发送原始数据到Rtp中,实时发送,有新的就发送 */
- void sendSrcDataToRtp(const AudioSrcData& srcData);
- /* 发送常规数据,对实时性要求不高的数据,数据时长1秒 */
- void sendRegularData(const AudioSrcData& srcData);
- private:
- /* 条件变量 */
- std::atomic_bool m_isDataUpdate = false; /* 数据更新标志,数据更新时设置为true */
- std::condition_variable m_condDataUpdate; /* 数据更新条件变量 */
- std::mutex m_mutexDataUpdate; /* 数据更新互斥锁 */
- /* ---------------------- 数据缓存列表 ---------------------- */
- // QReadWriteLock m_pRwLock; /* 读写锁,保护数据的读写 */
- QList<AudioSrcData*> 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_
|