#include "util/RTCContext.h" #include #include // pybind11 的 NumPy 支持 namespace py = pybind11; #include "util/RTCContext.h" int init(const char* selfUserId, const char* selfDisplayName, const char* selfRoomId) { bool res = RTCContext::instance().init(selfUserId, selfDisplayName, selfRoomId); if (res) { return 0; } else { return -1; } } int initRecv(const char* destRoomId, const char* srcUserId, const int16_t destChannelIndex) { bool res = RTCContext::instance().initRecv(destRoomId, srcUserId, destChannelIndex); if (res) { return 0; } else { return -1; } } int initSend(const char* srcRoomId, const char* destRoomId, const int16_t destChannelIndex, const int16_t channelNum) { bool res = RTCContext::instance().initSend(srcRoomId, destRoomId, destChannelIndex, channelNum); if (res) { return 0; } else { return -1; } } // NumPy 数据交互(关键修改) py::array_t getNumpyData() { return py::array_t( RTCContext::instance().getNumpyData() // 假设返回的是已有 NumPy 数组 ); } int sendCustomAudioData(int16_t destChannelIndex, py::array_t inputArray, int32_t sampleRate, uint64_t channelNum, uint64_t dataLen) { //py::gil_scoped_release release; py::array_t contiguous = py::array::ensure(inputArray); if (!contiguous) throw py::value_error("Array conversion failed"); auto buf = contiguous.request(); if (buf.size != dataLen) { throw py::value_error("Array length does not match dataLen"); } std::vector localCopy(static_cast(buf.ptr), static_cast(buf.ptr) + buf.size); return RTCContext::instance().sendCustomAudioData( destChannelIndex, localCopy.data(), sampleRate, channelNum, dataLen ); //return RTCContext::instance().sendCustomAudioData( // destChannelIndex, buf.ptr, sampleRate, channelNum, dataLen //); } py::list getListData() { return RTCContext::instance().getListData(); } int getSize() { return RTCContext::instance().getSize(); } RetAudioFrame getData() { return RTCContext::instance().getData(); } int16_t getDataCount() { return RTCContext::instance().getDataCount(); } PYBIND11_MODULE(rtc_plugins, m) { // 可选:暴露 RetAudioFrame 类(需额外绑定) py::class_(m, "RetAudioFrame") // 定义 data 属性(包含 getter 和 setter) .def_property("data", // Getter:返回 NumPy 数组 [](RetAudioFrame& self) { return py::array_t( {self.dataCount}, // 数组形状 {sizeof(short)}, // 步长 self.data.get() // 数据指针(原始内存) ); }, // Setter:从 NumPy 数组复制数据 [](RetAudioFrame& self, py::array_t arr) { auto buf = arr.request(); // 获取数组信息 self.data.reset(new short[buf.size]); // 重新分配内存 std::memcpy( self.data.get(), // 目标指针 buf.ptr, // 源数据指针 buf.size * sizeof(short) // 数据大小 ); self.dataCount = buf.size; // 更新数据长度 } ) .def_readwrite("dataCount", &RetAudioFrame::dataCount) .def_readwrite("sampleRate", &RetAudioFrame::sampleRate) .def_readwrite("numChannels", &RetAudioFrame::numChannels) .def_readwrite("channelIndex", &RetAudioFrame::channelIndex); m.def("init", &init); m.def("initRecv", &initRecv); m.def("initSend", &initSend); m.def("sendCustomAudioData", &sendCustomAudioData); m.def("getSize", &getSize); m.def("getData", &getData); m.def("getNumpyData", &getNumpyData); m.def("getListData", &getListData); m.def("getDataCount", &getDataCount); }