1*4930cef6SMatthias Ringwald /****************************************************************************** 2*4930cef6SMatthias Ringwald * 3*4930cef6SMatthias Ringwald * Copyright 2022 Google LLC 4*4930cef6SMatthias Ringwald * 5*4930cef6SMatthias Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 6*4930cef6SMatthias Ringwald * you may not use this file except in compliance with the License. 7*4930cef6SMatthias Ringwald * You may obtain a copy of the License at: 8*4930cef6SMatthias Ringwald * 9*4930cef6SMatthias Ringwald * http://www.apache.org/licenses/LICENSE-2.0 10*4930cef6SMatthias Ringwald * 11*4930cef6SMatthias Ringwald * Unless required by applicable law or agreed to in writing, software 12*4930cef6SMatthias Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 13*4930cef6SMatthias Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*4930cef6SMatthias Ringwald * See the License for the specific language governing permissions and 15*4930cef6SMatthias Ringwald * limitations under the License. 16*4930cef6SMatthias Ringwald * 17*4930cef6SMatthias Ringwald ******************************************************************************/ 18*4930cef6SMatthias Ringwald 19*4930cef6SMatthias Ringwald #include <Python.h> 20*4930cef6SMatthias Ringwald #include <numpy/ndarrayobject.h> 21*4930cef6SMatthias Ringwald 22*4930cef6SMatthias Ringwald #include <mdct.c> 23*4930cef6SMatthias Ringwald #include "ctypes.h" 24*4930cef6SMatthias Ringwald 25*4930cef6SMatthias Ringwald 26*4930cef6SMatthias Ringwald static PyObject *mdct_forward_py(PyObject *m, PyObject *args) 27*4930cef6SMatthias Ringwald { 28*4930cef6SMatthias Ringwald PyObject *x_obj, *xd_obj, *y_obj, *d_obj; 29*4930cef6SMatthias Ringwald enum lc3_dt dt; 30*4930cef6SMatthias Ringwald enum lc3_srate sr; 31*4930cef6SMatthias Ringwald float *x, *xd, *y, *d; 32*4930cef6SMatthias Ringwald 33*4930cef6SMatthias Ringwald if (!PyArg_ParseTuple(args, "iiOO", &dt, &sr, &x_obj, &xd_obj)) 34*4930cef6SMatthias Ringwald return NULL; 35*4930cef6SMatthias Ringwald 36*4930cef6SMatthias Ringwald CTYPES_CHECK("dt", (unsigned)dt < LC3_NUM_DT); 37*4930cef6SMatthias Ringwald CTYPES_CHECK("sr", (unsigned)sr < LC3_NUM_SRATE); 38*4930cef6SMatthias Ringwald 39*4930cef6SMatthias Ringwald int ns = LC3_NS(dt, sr), nd = LC3_ND(dt, sr); 40*4930cef6SMatthias Ringwald 41*4930cef6SMatthias Ringwald CTYPES_CHECK("x", to_1d_ptr(x_obj, NPY_FLOAT, ns, &x)); 42*4930cef6SMatthias Ringwald CTYPES_CHECK("xd", to_1d_ptr(xd_obj, NPY_FLOAT, nd, &xd)); 43*4930cef6SMatthias Ringwald d_obj = new_1d_ptr(NPY_FLOAT, nd, &d); 44*4930cef6SMatthias Ringwald y_obj = new_1d_ptr(NPY_FLOAT, ns, &y); 45*4930cef6SMatthias Ringwald 46*4930cef6SMatthias Ringwald memcpy(d, xd, nd * sizeof(float)); 47*4930cef6SMatthias Ringwald 48*4930cef6SMatthias Ringwald lc3_mdct_forward(dt, sr, sr, x, d, y); 49*4930cef6SMatthias Ringwald 50*4930cef6SMatthias Ringwald return Py_BuildValue("NN", y_obj, d_obj); 51*4930cef6SMatthias Ringwald } 52*4930cef6SMatthias Ringwald 53*4930cef6SMatthias Ringwald static PyObject *mdct_inverse_py(PyObject *m, PyObject *args) 54*4930cef6SMatthias Ringwald { 55*4930cef6SMatthias Ringwald PyObject *x_obj, *xd_obj, *d_obj, *y_obj; 56*4930cef6SMatthias Ringwald enum lc3_dt dt; 57*4930cef6SMatthias Ringwald enum lc3_srate sr; 58*4930cef6SMatthias Ringwald float *x, *xd, *d, *y; 59*4930cef6SMatthias Ringwald 60*4930cef6SMatthias Ringwald if (!PyArg_ParseTuple(args, "iiOO", &dt, &sr, &x_obj, &xd_obj)) 61*4930cef6SMatthias Ringwald return NULL; 62*4930cef6SMatthias Ringwald 63*4930cef6SMatthias Ringwald CTYPES_CHECK("dt", (unsigned)dt < LC3_NUM_DT); 64*4930cef6SMatthias Ringwald CTYPES_CHECK("sr", (unsigned)sr < LC3_NUM_SRATE); 65*4930cef6SMatthias Ringwald 66*4930cef6SMatthias Ringwald int ns = LC3_NS(dt, sr), nd = LC3_ND(dt, sr); 67*4930cef6SMatthias Ringwald 68*4930cef6SMatthias Ringwald CTYPES_CHECK("x", to_1d_ptr(x_obj, NPY_FLOAT, ns, &x)); 69*4930cef6SMatthias Ringwald CTYPES_CHECK("xd", to_1d_ptr(xd_obj, NPY_FLOAT, nd, &xd)); 70*4930cef6SMatthias Ringwald d_obj = new_1d_ptr(NPY_FLOAT, nd, &d); 71*4930cef6SMatthias Ringwald y_obj = new_1d_ptr(NPY_FLOAT, ns, &y); 72*4930cef6SMatthias Ringwald 73*4930cef6SMatthias Ringwald memcpy(d, xd, nd * sizeof(float)); 74*4930cef6SMatthias Ringwald 75*4930cef6SMatthias Ringwald lc3_mdct_inverse(dt, sr, sr, x, d, y); 76*4930cef6SMatthias Ringwald 77*4930cef6SMatthias Ringwald return Py_BuildValue("NN", y_obj, d_obj); 78*4930cef6SMatthias Ringwald } 79*4930cef6SMatthias Ringwald 80*4930cef6SMatthias Ringwald static PyMethodDef methods[] = { 81*4930cef6SMatthias Ringwald { "mdct_forward", mdct_forward_py, METH_VARARGS }, 82*4930cef6SMatthias Ringwald { "mdct_inverse", mdct_inverse_py, METH_VARARGS }, 83*4930cef6SMatthias Ringwald { NULL }, 84*4930cef6SMatthias Ringwald }; 85*4930cef6SMatthias Ringwald 86*4930cef6SMatthias Ringwald PyMODINIT_FUNC lc3_mdct_py_init(PyObject *m) 87*4930cef6SMatthias Ringwald { 88*4930cef6SMatthias Ringwald import_array(); 89*4930cef6SMatthias Ringwald 90*4930cef6SMatthias Ringwald PyModule_AddFunctions(m, methods); 91*4930cef6SMatthias Ringwald 92*4930cef6SMatthias Ringwald return m; 93*4930cef6SMatthias Ringwald } 94