diff --git a/rtc_plugins.cpp b/rtc_plugins.cpp index c850c34..d7b8399 100644 --- a/rtc_plugins.cpp +++ b/rtc_plugins.cpp @@ -33,36 +33,48 @@ int initSend(const char* destRoomId, const int16_t destChannelIndex) { } 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; + try { + std::cout << "step 1" << std::endl; + // 1. 检查输入有效性 + if (pyData.ptr() == nullptr) { + throw std::runtime_error("Input data is NULL"); + } - // 检查数据类型是否为 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 << "step 2" << std::endl; + // 2. 检查是否是 numpy 数组 + if (!PyArray_Check(pyData.ptr())) { + throw std::runtime_error("Input is not a numpy array"); + } - 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 << "step 3" << std::endl; + // 3. 转换为 PyArrayObject + PyArrayObject* npArray = reinterpret_cast(pyData.ptr()); + + std::cout << "step 4" << std::endl; + // 4. 检查数据类型是否为 int16 + if (PyArray_TYPE(npArray) != NPY_INT16) { + throw std::runtime_error("Array must be of type int16 (np.int16)"); + } + + std::cout << "step 5" << std::endl; + // 5. 检查数据是否连续 + if (!PyArray_ISCONTIGUOUS(npArray)) { + throw std::runtime_error("Array must be contiguous in memory"); + } + std::cout << "step 6" << std::endl; + + // 6. 获取数据指针 + void* dataPtr = PyArray_DATA(npArray); + if (dataPtr == nullptr) { + throw std::runtime_error("Invalid data pointer"); + } + std::cout << "step 7" << std::endl; + return RTCContext::instance().sendCustomAudioData(destChannelIndex, dataPtr, sampleRate, channelNum, dataLen); + + } catch (const std::exception& e) { + std::cout << "error:" << e.what() << std::endl; + return -1; } - std::cout << "step5" << std::endl; - return RTCContext::instance().sendCustomAudioData(destChannelIndex, dataPtr, sampleRate, channelNum, dataLen); } BOOST_PYTHON_MODULE(rtc_plugins) { diff --git a/test_send.py b/test_send.py index c86e54f..30791d3 100644 --- a/test_send.py +++ b/test_send.py @@ -21,7 +21,7 @@ ret = rtc_plugins.initSend(destRoomId, destChannelIndex) if ret != 0: print(f"initSend fail, ret:{ret}") exit(1) -audioData = np.zeros(16, dtype=np.int16) +audioData = np.array([0, 1, -1, 0], dtype=np.int16) while True: ret = rtc_plugins.sendCustomAudioData(destChannelIndex, audioData, 48000, 1, len(audioData)) if ret != 0: