From 0042f506c22a13d07018d6dd002297f65f06f974 Mon Sep 17 00:00:00 2001 From: wangjiyu Date: Wed, 16 Apr 2025 15:30:55 +0800 Subject: [PATCH] debug --- rtc_plugins.cpp | 4 ++++ test_time_r.py | 2 ++ util/RTCContext.cpp | 35 +++++++++++++++++++++++++++++++++++ util/RTCContext.h | 20 ++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/rtc_plugins.cpp b/rtc_plugins.cpp index 79ce811..c4fc061 100644 --- a/rtc_plugins.cpp +++ b/rtc_plugins.cpp @@ -47,6 +47,9 @@ int initSend(const char* srcRoomId, const char* destRoomId, const int16_t destCh return -1; } } +int getSize() { + return RTCContext::instance().getSize(); +} py::object create_int16_array() { // 1. 定义数组维度(1维,长度为 4) @@ -196,6 +199,7 @@ BOOST_PYTHON_MODULE(rtc_plugins) { py::def("initRecv", &initRecv); py::def("initSend", &initSend); py::def("sendCustomAudioData", &sendCustomAudioData); + py::def("getSize", &getSize); } catch (...) { PyErr_SetString(PyExc_RuntimeError, "Module initialization failed"); } diff --git a/test_time_r.py b/test_time_r.py index 9b8188a..f95ff77 100644 --- a/test_time_r.py +++ b/test_time_r.py @@ -56,4 +56,6 @@ while True: print(f"resend fail, ret:{ret}") else: print("resend succ") + size = rtc_plugins.getSize() + print(f"data size:{size}") time.sleep(30) diff --git a/util/RTCContext.cpp b/util/RTCContext.cpp index 4560834..bd6dddc 100644 --- a/util/RTCContext.cpp +++ b/util/RTCContext.cpp @@ -301,6 +301,7 @@ void RTCContext::onAudioProcess(const char* roomId, const char* peerId, std::cout << "audioFrame:" << audioFrame.dataCount << "," << audioFrame.sampleRate << "," << audioFrame.numChannels << "," << audioFrame.channelIndex << std::endl; + setData(audioFrame); // 1. 获取GIL std::cout << "[1] 获取GIL锁..." << std::endl; //PyGILState_STATE gstate = PyGILState_Ensure(); @@ -654,3 +655,37 @@ void RTCContext::setNumpyApi(void **numpyApi) { numpyApi_ = numpyApi; std::cout << "setNupyApi, numpyApi_:" << numpyApi_[93] << std::endl; } +void RTCContext::setData(const mrtc::MRTCAudioFrame& frame) { + std::lock_guard lock(dataMutex_); + if (dataSize_ == totalSize_) { + bottom_ = (bottom_ + 1) % totalSize_; + dataSize_--; + } + RetAudioFrame newFrame; + newFrame.dataCount = frame.dataCount; + newFrame.sampleRate = frame.sampleRate; + newFrame.numChannels = frame.numChannels; + newFrame.channelIndex = frame.channelIndex; + newFrame.data = std::make_unique(frame.dataCount); + std::memcpy(newFrame.data.get(), frame.data, frame.dataCount* sizeof(int16_t)); + data_[head_] = std::move(newFrame); + head_ = (head_ + 1) % totalSize_; + dataSize_++; + +} + +RetAudioFrame RTCContext::getData() { + std::lock_guard lock(dataMutex_); + if (dataSize_ > 0) { + RetAudioFrame frame = std::move(data_[bottom_]); // 移动而非拷贝 + bottom_ = (bottom_ + 1) % totalSize_; + dataSize_--; + return frame; // 返回值优化(RVO)会生效 + } + return {}; // 返回空对象 +} + +int16_t RTCContext::getSize() { + std::lock_guard lock(dataMutex_); + return dataSize; +} \ No newline at end of file diff --git a/util/RTCContext.h b/util/RTCContext.h index 2eb131a..42124e7 100644 --- a/util/RTCContext.h +++ b/util/RTCContext.h @@ -35,6 +35,16 @@ namespace fs = std::filesystem; #define ENV_PRODUCT //#define SEND_MODE +// 音频数据帧 +struct RetAudioFrame final +{ + std::unique_ptr data; + int dataCount = 0; + int sampleRate = 48000; + int numChannels = 1; + int channelIndex = 0; +}; + class RTCContext : public RTCENGINE_NAMESPACE::IMRTCRoomCallBack, public RTCENGINE_NAMESPACE::IMRTCConsumerCallBack, @@ -85,6 +95,7 @@ public: bool init(const char* selfUserId, const char* selfDisplayName, const char* selfRoomId); bool initRecv(const char* destRoomId, const char* srcUserId, const int16_t destChannelIndex); bool initSend(const char* srcRoomId, const char* destRoomId, const int16_t destChannelIndex, const uint8_t channelNum); + int16_t getSize(); void* getpData() const; void setpData(void* pData); @@ -99,6 +110,7 @@ public: private: RTCContext() { + data_.resize(totalSize_); } mutable std::mutex mutex_; mrtc::IMRTCEngine * rtcEngine_ = nullptr; @@ -109,6 +121,12 @@ private: bool isMultiRoom_ = false; boost::python::object pyCallback_; void ** numpyApi_; + std::vector data_; + mutable std::mutex dataMutex_; + const int16_t totalSize_ = 100; + int16_t dataSize_ = 0; + int16_t bottom_ = 0; + int16_t head_= 0; void onRoom(uint32_t typeId, RTCENGINE_NAMESPACE::MRTCRoomInfo& roomInfo); void onConsumer(uint32_t msgId, const char* roomId, const char* peerId, RTCENGINE_NAMESPACE::MRTCConsumerInfo& consumerInfo); void onRender(const char* roomId, const char* peerId, @@ -119,4 +137,6 @@ private: void onAudioProcess(const char* roomId, const char* peerId, mrtc::MRTCAudioFrame& audioFrame, mrtc::MRTCAudioSourceType audioSourceType); void onProducer(uint32_t msgId, mrtc::MRTCProducerInfo& info); + void setData(const mrtc::MRTCAudioFrame& frame); + RetAudioFrame getData(); };