#include #include #include #include "./util/RTCContext.h" namespace py = boost::python; int init(const char* selfUserId, const char* selfDisplayName, const char* selfRoomId, boost::python::object callback) { RTCContext::instance().setPyCallback(callback); 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* destRoomId, const int16_t destChannelIndex) { bool res = RTCContext::instance().initSend(destRoomId, destChannelIndex); if (res) { return 0; } else { return -1; } } int sendCustomAudioData(const int16_t destChannelIndex, py::object pyData, int32_t sampleRate, uint64_t channelNum, uint64_t dataLen) { std::cout << "step1" << std::endl; // 检查是否为 numpy 数组 if (!PyArray_Check(pyData.ptr())) { std::cout << "check fail, ptr:" << pyData.ptr() << std::endl; PyErr_SetString(PyExc_TypeError, "Expected a numpy array"); throw py::error_already_set(); } std::cout << "step2" << std::endl; // 检查数据类型是否为 int16 PyArrayObject* npArray = (PyArrayObject*)pyData.ptr(); if (PyArray_TYPE(npArray) != NPY_INT16) { PyErr_SetString(PyExc_TypeError, "Array must be of type int16 (np.int16)"); throw py::error_already_set(); } std::cout << "step3" << std::endl; if (npArray == nullptr) { std::cout << "npArray is null" << std::endl; PyErr_SetString(PyExc_TypeError, "npArray is null"); throw py::error_already_set(); } std::cout << "step4" << std::endl; void* dataPtr = PyArray_DATA(npArray); if (dataPtr == nullptr) { PyErr_SetString(PyExc_ValueError, "Invalid data pointer"); throw py::error_already_set(); } std::cout << "step5" << std::endl; return RTCContext::instance().sendCustomAudioData(destChannelIndex, dataPtr, sampleRate, channelNum, dataLen); } BOOST_PYTHON_MODULE(rtc_plugins) { py::def("init", &init); py::def("initRecv", &initRecv); py::def("initSend", &initSend); py::def("sendCustomAudioData", &sendCustomAudioData); }