diff --git a/test_time_r.py b/test_time_r.py index b8ec35b..95cb85b 100644 --- a/test_time_r.py +++ b/test_time_r.py @@ -19,22 +19,7 @@ def my_callback_r(shmName, dataSize, dataCount, sampleRate, numChannels, channel print(f"my_callback_r, dataSize:{dataSize}, dataCount:{dataCount}, sampleRate:{sampleRate}, numChannels:{numChannels}, channelIndex:{channelIndex}") print(f"data:{shmName}") print("after my_callback_r") - #fd = os.open(shmName, os.O_RDONLY) - #if fd == -1: - # raise RuntimeError(f"无法打开共享内存 {shmName}") - ## 2. 创建内存映射 - #shm = mmap.mmap(fd, dataSize, mmap.MAP_SHARED, mmap.PROT_READ) - - ## 3. 转换为numpy数组 (零拷贝) - #audio_data = np.frombuffer(shm, dtype=c_int16, count=dataCount) - #print(f" 前5个采样点: {audio_data[:5]}") - #audioData = np.array([0, 1, -1, 0], dtype=np.int16) - #ret = rtc_plugins.sendCustomAudioData(srcChannelIndex, audioData, 48000, 1, len(audioData)) - #if ret != 0: - # print(f"resend fail, ret:{ret}") - #else: - # print("resend succ") ret = rtc_plugins.init(destUserId, destDisplayName, destRoomId, my_callback_r) if ret != 0: print(f"init fail, ret:{ret}") diff --git a/util/RTCContext.cpp b/util/RTCContext.cpp index 7307ced..6b071a6 100644 --- a/util/RTCContext.cpp +++ b/util/RTCContext.cpp @@ -711,18 +711,22 @@ np::ndarray RTCContext::getNumpydata() { size_t length = frame.dataCount; // 数据长度 std::cout << "step4" << std::endl; - // 创建 NumPy 数组(拷贝数据) - if (!data_ptr || length == 0) { - // 返回空数组或抛出异常 - return np::zeros(bp::make_tuple(0), np::dtype::get_builtin()); + PyGILState_STATE gstate = PyGILState_Ensure(); + np::ndarray result; + try { + if (!data_ptr || length == 0) { + result = np::zeros(bp::make_tuple(0), np::dtype::get_builtin()); + } else { + result = np::empty(bp::make_tuple(length), np::dtype::get_builtin()); + std::memcpy(result.get_data(), data_ptr, length * sizeof(int16_t)); + } + } catch (...) { + PyGILState_Release(gstate); // 异常时释放GIL + throw; } - std::cout << "step5" << std::endl; - - np::ndarray result = np::empty(bp::make_tuple(length), np::dtype::get_builtin()); - std::cout << "step6" << std::endl; - std::memcpy(result.get_data(), data_ptr, length * sizeof(int16_t)); - std::cout << "step7" << std::endl; + PyGILState_Release(gstate); return result; + } int16_t RTCContext::getDataCount() {