1 /*[clinic input]
2 preserve
3 [clinic start generated code]*/
4 
5 PyDoc_STRVAR(audioop_getsample__doc__,
6 "getsample($module, fragment, width, index, /)\n"
7 "--\n"
8 "\n"
9 "Return the value of sample index from the fragment.");
10 
11 #define AUDIOOP_GETSAMPLE_METHODDEF    \
12     {"getsample", _PyCFunction_CAST(audioop_getsample), METH_FASTCALL, audioop_getsample__doc__},
13 
14 static PyObject *
15 audioop_getsample_impl(PyObject *module, Py_buffer *fragment, int width,
16                        Py_ssize_t index);
17 
18 static PyObject *
audioop_getsample(PyObject * module,PyObject * const * args,Py_ssize_t nargs)19 audioop_getsample(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
20 {
21     PyObject *return_value = NULL;
22     Py_buffer fragment = {NULL, NULL};
23     int width;
24     Py_ssize_t index;
25 
26     if (!_PyArg_CheckPositional("getsample", nargs, 3, 3)) {
27         goto exit;
28     }
29     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
30         goto exit;
31     }
32     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
33         _PyArg_BadArgument("getsample", "argument 1", "contiguous buffer", args[0]);
34         goto exit;
35     }
36     width = _PyLong_AsInt(args[1]);
37     if (width == -1 && PyErr_Occurred()) {
38         goto exit;
39     }
40     {
41         Py_ssize_t ival = -1;
42         PyObject *iobj = _PyNumber_Index(args[2]);
43         if (iobj != NULL) {
44             ival = PyLong_AsSsize_t(iobj);
45             Py_DECREF(iobj);
46         }
47         if (ival == -1 && PyErr_Occurred()) {
48             goto exit;
49         }
50         index = ival;
51     }
52     return_value = audioop_getsample_impl(module, &fragment, width, index);
53 
54 exit:
55     /* Cleanup for fragment */
56     if (fragment.obj) {
57        PyBuffer_Release(&fragment);
58     }
59 
60     return return_value;
61 }
62 
63 PyDoc_STRVAR(audioop_max__doc__,
64 "max($module, fragment, width, /)\n"
65 "--\n"
66 "\n"
67 "Return the maximum of the absolute value of all samples in a fragment.");
68 
69 #define AUDIOOP_MAX_METHODDEF    \
70     {"max", _PyCFunction_CAST(audioop_max), METH_FASTCALL, audioop_max__doc__},
71 
72 static PyObject *
73 audioop_max_impl(PyObject *module, Py_buffer *fragment, int width);
74 
75 static PyObject *
audioop_max(PyObject * module,PyObject * const * args,Py_ssize_t nargs)76 audioop_max(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
77 {
78     PyObject *return_value = NULL;
79     Py_buffer fragment = {NULL, NULL};
80     int width;
81 
82     if (!_PyArg_CheckPositional("max", nargs, 2, 2)) {
83         goto exit;
84     }
85     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
86         goto exit;
87     }
88     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
89         _PyArg_BadArgument("max", "argument 1", "contiguous buffer", args[0]);
90         goto exit;
91     }
92     width = _PyLong_AsInt(args[1]);
93     if (width == -1 && PyErr_Occurred()) {
94         goto exit;
95     }
96     return_value = audioop_max_impl(module, &fragment, width);
97 
98 exit:
99     /* Cleanup for fragment */
100     if (fragment.obj) {
101        PyBuffer_Release(&fragment);
102     }
103 
104     return return_value;
105 }
106 
107 PyDoc_STRVAR(audioop_minmax__doc__,
108 "minmax($module, fragment, width, /)\n"
109 "--\n"
110 "\n"
111 "Return the minimum and maximum values of all samples in the sound fragment.");
112 
113 #define AUDIOOP_MINMAX_METHODDEF    \
114     {"minmax", _PyCFunction_CAST(audioop_minmax), METH_FASTCALL, audioop_minmax__doc__},
115 
116 static PyObject *
117 audioop_minmax_impl(PyObject *module, Py_buffer *fragment, int width);
118 
119 static PyObject *
audioop_minmax(PyObject * module,PyObject * const * args,Py_ssize_t nargs)120 audioop_minmax(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
121 {
122     PyObject *return_value = NULL;
123     Py_buffer fragment = {NULL, NULL};
124     int width;
125 
126     if (!_PyArg_CheckPositional("minmax", nargs, 2, 2)) {
127         goto exit;
128     }
129     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
130         goto exit;
131     }
132     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
133         _PyArg_BadArgument("minmax", "argument 1", "contiguous buffer", args[0]);
134         goto exit;
135     }
136     width = _PyLong_AsInt(args[1]);
137     if (width == -1 && PyErr_Occurred()) {
138         goto exit;
139     }
140     return_value = audioop_minmax_impl(module, &fragment, width);
141 
142 exit:
143     /* Cleanup for fragment */
144     if (fragment.obj) {
145        PyBuffer_Release(&fragment);
146     }
147 
148     return return_value;
149 }
150 
151 PyDoc_STRVAR(audioop_avg__doc__,
152 "avg($module, fragment, width, /)\n"
153 "--\n"
154 "\n"
155 "Return the average over all samples in the fragment.");
156 
157 #define AUDIOOP_AVG_METHODDEF    \
158     {"avg", _PyCFunction_CAST(audioop_avg), METH_FASTCALL, audioop_avg__doc__},
159 
160 static PyObject *
161 audioop_avg_impl(PyObject *module, Py_buffer *fragment, int width);
162 
163 static PyObject *
audioop_avg(PyObject * module,PyObject * const * args,Py_ssize_t nargs)164 audioop_avg(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
165 {
166     PyObject *return_value = NULL;
167     Py_buffer fragment = {NULL, NULL};
168     int width;
169 
170     if (!_PyArg_CheckPositional("avg", nargs, 2, 2)) {
171         goto exit;
172     }
173     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
174         goto exit;
175     }
176     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
177         _PyArg_BadArgument("avg", "argument 1", "contiguous buffer", args[0]);
178         goto exit;
179     }
180     width = _PyLong_AsInt(args[1]);
181     if (width == -1 && PyErr_Occurred()) {
182         goto exit;
183     }
184     return_value = audioop_avg_impl(module, &fragment, width);
185 
186 exit:
187     /* Cleanup for fragment */
188     if (fragment.obj) {
189        PyBuffer_Release(&fragment);
190     }
191 
192     return return_value;
193 }
194 
195 PyDoc_STRVAR(audioop_rms__doc__,
196 "rms($module, fragment, width, /)\n"
197 "--\n"
198 "\n"
199 "Return the root-mean-square of the fragment, i.e. sqrt(sum(S_i^2)/n).");
200 
201 #define AUDIOOP_RMS_METHODDEF    \
202     {"rms", _PyCFunction_CAST(audioop_rms), METH_FASTCALL, audioop_rms__doc__},
203 
204 static PyObject *
205 audioop_rms_impl(PyObject *module, Py_buffer *fragment, int width);
206 
207 static PyObject *
audioop_rms(PyObject * module,PyObject * const * args,Py_ssize_t nargs)208 audioop_rms(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
209 {
210     PyObject *return_value = NULL;
211     Py_buffer fragment = {NULL, NULL};
212     int width;
213 
214     if (!_PyArg_CheckPositional("rms", nargs, 2, 2)) {
215         goto exit;
216     }
217     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
218         goto exit;
219     }
220     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
221         _PyArg_BadArgument("rms", "argument 1", "contiguous buffer", args[0]);
222         goto exit;
223     }
224     width = _PyLong_AsInt(args[1]);
225     if (width == -1 && PyErr_Occurred()) {
226         goto exit;
227     }
228     return_value = audioop_rms_impl(module, &fragment, width);
229 
230 exit:
231     /* Cleanup for fragment */
232     if (fragment.obj) {
233        PyBuffer_Release(&fragment);
234     }
235 
236     return return_value;
237 }
238 
239 PyDoc_STRVAR(audioop_findfit__doc__,
240 "findfit($module, fragment, reference, /)\n"
241 "--\n"
242 "\n"
243 "Try to match reference as well as possible to a portion of fragment.");
244 
245 #define AUDIOOP_FINDFIT_METHODDEF    \
246     {"findfit", _PyCFunction_CAST(audioop_findfit), METH_FASTCALL, audioop_findfit__doc__},
247 
248 static PyObject *
249 audioop_findfit_impl(PyObject *module, Py_buffer *fragment,
250                      Py_buffer *reference);
251 
252 static PyObject *
audioop_findfit(PyObject * module,PyObject * const * args,Py_ssize_t nargs)253 audioop_findfit(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
254 {
255     PyObject *return_value = NULL;
256     Py_buffer fragment = {NULL, NULL};
257     Py_buffer reference = {NULL, NULL};
258 
259     if (!_PyArg_CheckPositional("findfit", nargs, 2, 2)) {
260         goto exit;
261     }
262     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
263         goto exit;
264     }
265     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
266         _PyArg_BadArgument("findfit", "argument 1", "contiguous buffer", args[0]);
267         goto exit;
268     }
269     if (PyObject_GetBuffer(args[1], &reference, PyBUF_SIMPLE) != 0) {
270         goto exit;
271     }
272     if (!PyBuffer_IsContiguous(&reference, 'C')) {
273         _PyArg_BadArgument("findfit", "argument 2", "contiguous buffer", args[1]);
274         goto exit;
275     }
276     return_value = audioop_findfit_impl(module, &fragment, &reference);
277 
278 exit:
279     /* Cleanup for fragment */
280     if (fragment.obj) {
281        PyBuffer_Release(&fragment);
282     }
283     /* Cleanup for reference */
284     if (reference.obj) {
285        PyBuffer_Release(&reference);
286     }
287 
288     return return_value;
289 }
290 
291 PyDoc_STRVAR(audioop_findfactor__doc__,
292 "findfactor($module, fragment, reference, /)\n"
293 "--\n"
294 "\n"
295 "Return a factor F such that rms(add(fragment, mul(reference, -F))) is minimal.");
296 
297 #define AUDIOOP_FINDFACTOR_METHODDEF    \
298     {"findfactor", _PyCFunction_CAST(audioop_findfactor), METH_FASTCALL, audioop_findfactor__doc__},
299 
300 static PyObject *
301 audioop_findfactor_impl(PyObject *module, Py_buffer *fragment,
302                         Py_buffer *reference);
303 
304 static PyObject *
audioop_findfactor(PyObject * module,PyObject * const * args,Py_ssize_t nargs)305 audioop_findfactor(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
306 {
307     PyObject *return_value = NULL;
308     Py_buffer fragment = {NULL, NULL};
309     Py_buffer reference = {NULL, NULL};
310 
311     if (!_PyArg_CheckPositional("findfactor", nargs, 2, 2)) {
312         goto exit;
313     }
314     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
315         goto exit;
316     }
317     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
318         _PyArg_BadArgument("findfactor", "argument 1", "contiguous buffer", args[0]);
319         goto exit;
320     }
321     if (PyObject_GetBuffer(args[1], &reference, PyBUF_SIMPLE) != 0) {
322         goto exit;
323     }
324     if (!PyBuffer_IsContiguous(&reference, 'C')) {
325         _PyArg_BadArgument("findfactor", "argument 2", "contiguous buffer", args[1]);
326         goto exit;
327     }
328     return_value = audioop_findfactor_impl(module, &fragment, &reference);
329 
330 exit:
331     /* Cleanup for fragment */
332     if (fragment.obj) {
333        PyBuffer_Release(&fragment);
334     }
335     /* Cleanup for reference */
336     if (reference.obj) {
337        PyBuffer_Release(&reference);
338     }
339 
340     return return_value;
341 }
342 
343 PyDoc_STRVAR(audioop_findmax__doc__,
344 "findmax($module, fragment, length, /)\n"
345 "--\n"
346 "\n"
347 "Search fragment for a slice of specified number of samples with maximum energy.");
348 
349 #define AUDIOOP_FINDMAX_METHODDEF    \
350     {"findmax", _PyCFunction_CAST(audioop_findmax), METH_FASTCALL, audioop_findmax__doc__},
351 
352 static PyObject *
353 audioop_findmax_impl(PyObject *module, Py_buffer *fragment,
354                      Py_ssize_t length);
355 
356 static PyObject *
audioop_findmax(PyObject * module,PyObject * const * args,Py_ssize_t nargs)357 audioop_findmax(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
358 {
359     PyObject *return_value = NULL;
360     Py_buffer fragment = {NULL, NULL};
361     Py_ssize_t length;
362 
363     if (!_PyArg_CheckPositional("findmax", nargs, 2, 2)) {
364         goto exit;
365     }
366     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
367         goto exit;
368     }
369     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
370         _PyArg_BadArgument("findmax", "argument 1", "contiguous buffer", args[0]);
371         goto exit;
372     }
373     {
374         Py_ssize_t ival = -1;
375         PyObject *iobj = _PyNumber_Index(args[1]);
376         if (iobj != NULL) {
377             ival = PyLong_AsSsize_t(iobj);
378             Py_DECREF(iobj);
379         }
380         if (ival == -1 && PyErr_Occurred()) {
381             goto exit;
382         }
383         length = ival;
384     }
385     return_value = audioop_findmax_impl(module, &fragment, length);
386 
387 exit:
388     /* Cleanup for fragment */
389     if (fragment.obj) {
390        PyBuffer_Release(&fragment);
391     }
392 
393     return return_value;
394 }
395 
396 PyDoc_STRVAR(audioop_avgpp__doc__,
397 "avgpp($module, fragment, width, /)\n"
398 "--\n"
399 "\n"
400 "Return the average peak-peak value over all samples in the fragment.");
401 
402 #define AUDIOOP_AVGPP_METHODDEF    \
403     {"avgpp", _PyCFunction_CAST(audioop_avgpp), METH_FASTCALL, audioop_avgpp__doc__},
404 
405 static PyObject *
406 audioop_avgpp_impl(PyObject *module, Py_buffer *fragment, int width);
407 
408 static PyObject *
audioop_avgpp(PyObject * module,PyObject * const * args,Py_ssize_t nargs)409 audioop_avgpp(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
410 {
411     PyObject *return_value = NULL;
412     Py_buffer fragment = {NULL, NULL};
413     int width;
414 
415     if (!_PyArg_CheckPositional("avgpp", nargs, 2, 2)) {
416         goto exit;
417     }
418     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
419         goto exit;
420     }
421     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
422         _PyArg_BadArgument("avgpp", "argument 1", "contiguous buffer", args[0]);
423         goto exit;
424     }
425     width = _PyLong_AsInt(args[1]);
426     if (width == -1 && PyErr_Occurred()) {
427         goto exit;
428     }
429     return_value = audioop_avgpp_impl(module, &fragment, width);
430 
431 exit:
432     /* Cleanup for fragment */
433     if (fragment.obj) {
434        PyBuffer_Release(&fragment);
435     }
436 
437     return return_value;
438 }
439 
440 PyDoc_STRVAR(audioop_maxpp__doc__,
441 "maxpp($module, fragment, width, /)\n"
442 "--\n"
443 "\n"
444 "Return the maximum peak-peak value in the sound fragment.");
445 
446 #define AUDIOOP_MAXPP_METHODDEF    \
447     {"maxpp", _PyCFunction_CAST(audioop_maxpp), METH_FASTCALL, audioop_maxpp__doc__},
448 
449 static PyObject *
450 audioop_maxpp_impl(PyObject *module, Py_buffer *fragment, int width);
451 
452 static PyObject *
audioop_maxpp(PyObject * module,PyObject * const * args,Py_ssize_t nargs)453 audioop_maxpp(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
454 {
455     PyObject *return_value = NULL;
456     Py_buffer fragment = {NULL, NULL};
457     int width;
458 
459     if (!_PyArg_CheckPositional("maxpp", nargs, 2, 2)) {
460         goto exit;
461     }
462     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
463         goto exit;
464     }
465     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
466         _PyArg_BadArgument("maxpp", "argument 1", "contiguous buffer", args[0]);
467         goto exit;
468     }
469     width = _PyLong_AsInt(args[1]);
470     if (width == -1 && PyErr_Occurred()) {
471         goto exit;
472     }
473     return_value = audioop_maxpp_impl(module, &fragment, width);
474 
475 exit:
476     /* Cleanup for fragment */
477     if (fragment.obj) {
478        PyBuffer_Release(&fragment);
479     }
480 
481     return return_value;
482 }
483 
484 PyDoc_STRVAR(audioop_cross__doc__,
485 "cross($module, fragment, width, /)\n"
486 "--\n"
487 "\n"
488 "Return the number of zero crossings in the fragment passed as an argument.");
489 
490 #define AUDIOOP_CROSS_METHODDEF    \
491     {"cross", _PyCFunction_CAST(audioop_cross), METH_FASTCALL, audioop_cross__doc__},
492 
493 static PyObject *
494 audioop_cross_impl(PyObject *module, Py_buffer *fragment, int width);
495 
496 static PyObject *
audioop_cross(PyObject * module,PyObject * const * args,Py_ssize_t nargs)497 audioop_cross(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
498 {
499     PyObject *return_value = NULL;
500     Py_buffer fragment = {NULL, NULL};
501     int width;
502 
503     if (!_PyArg_CheckPositional("cross", nargs, 2, 2)) {
504         goto exit;
505     }
506     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
507         goto exit;
508     }
509     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
510         _PyArg_BadArgument("cross", "argument 1", "contiguous buffer", args[0]);
511         goto exit;
512     }
513     width = _PyLong_AsInt(args[1]);
514     if (width == -1 && PyErr_Occurred()) {
515         goto exit;
516     }
517     return_value = audioop_cross_impl(module, &fragment, width);
518 
519 exit:
520     /* Cleanup for fragment */
521     if (fragment.obj) {
522        PyBuffer_Release(&fragment);
523     }
524 
525     return return_value;
526 }
527 
528 PyDoc_STRVAR(audioop_mul__doc__,
529 "mul($module, fragment, width, factor, /)\n"
530 "--\n"
531 "\n"
532 "Return a fragment that has all samples in the original fragment multiplied by the floating-point value factor.");
533 
534 #define AUDIOOP_MUL_METHODDEF    \
535     {"mul", _PyCFunction_CAST(audioop_mul), METH_FASTCALL, audioop_mul__doc__},
536 
537 static PyObject *
538 audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width,
539                  double factor);
540 
541 static PyObject *
audioop_mul(PyObject * module,PyObject * const * args,Py_ssize_t nargs)542 audioop_mul(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
543 {
544     PyObject *return_value = NULL;
545     Py_buffer fragment = {NULL, NULL};
546     int width;
547     double factor;
548 
549     if (!_PyArg_CheckPositional("mul", nargs, 3, 3)) {
550         goto exit;
551     }
552     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
553         goto exit;
554     }
555     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
556         _PyArg_BadArgument("mul", "argument 1", "contiguous buffer", args[0]);
557         goto exit;
558     }
559     width = _PyLong_AsInt(args[1]);
560     if (width == -1 && PyErr_Occurred()) {
561         goto exit;
562     }
563     if (PyFloat_CheckExact(args[2])) {
564         factor = PyFloat_AS_DOUBLE(args[2]);
565     }
566     else
567     {
568         factor = PyFloat_AsDouble(args[2]);
569         if (factor == -1.0 && PyErr_Occurred()) {
570             goto exit;
571         }
572     }
573     return_value = audioop_mul_impl(module, &fragment, width, factor);
574 
575 exit:
576     /* Cleanup for fragment */
577     if (fragment.obj) {
578        PyBuffer_Release(&fragment);
579     }
580 
581     return return_value;
582 }
583 
584 PyDoc_STRVAR(audioop_tomono__doc__,
585 "tomono($module, fragment, width, lfactor, rfactor, /)\n"
586 "--\n"
587 "\n"
588 "Convert a stereo fragment to a mono fragment.");
589 
590 #define AUDIOOP_TOMONO_METHODDEF    \
591     {"tomono", _PyCFunction_CAST(audioop_tomono), METH_FASTCALL, audioop_tomono__doc__},
592 
593 static PyObject *
594 audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width,
595                     double lfactor, double rfactor);
596 
597 static PyObject *
audioop_tomono(PyObject * module,PyObject * const * args,Py_ssize_t nargs)598 audioop_tomono(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
599 {
600     PyObject *return_value = NULL;
601     Py_buffer fragment = {NULL, NULL};
602     int width;
603     double lfactor;
604     double rfactor;
605 
606     if (!_PyArg_CheckPositional("tomono", nargs, 4, 4)) {
607         goto exit;
608     }
609     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
610         goto exit;
611     }
612     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
613         _PyArg_BadArgument("tomono", "argument 1", "contiguous buffer", args[0]);
614         goto exit;
615     }
616     width = _PyLong_AsInt(args[1]);
617     if (width == -1 && PyErr_Occurred()) {
618         goto exit;
619     }
620     if (PyFloat_CheckExact(args[2])) {
621         lfactor = PyFloat_AS_DOUBLE(args[2]);
622     }
623     else
624     {
625         lfactor = PyFloat_AsDouble(args[2]);
626         if (lfactor == -1.0 && PyErr_Occurred()) {
627             goto exit;
628         }
629     }
630     if (PyFloat_CheckExact(args[3])) {
631         rfactor = PyFloat_AS_DOUBLE(args[3]);
632     }
633     else
634     {
635         rfactor = PyFloat_AsDouble(args[3]);
636         if (rfactor == -1.0 && PyErr_Occurred()) {
637             goto exit;
638         }
639     }
640     return_value = audioop_tomono_impl(module, &fragment, width, lfactor, rfactor);
641 
642 exit:
643     /* Cleanup for fragment */
644     if (fragment.obj) {
645        PyBuffer_Release(&fragment);
646     }
647 
648     return return_value;
649 }
650 
651 PyDoc_STRVAR(audioop_tostereo__doc__,
652 "tostereo($module, fragment, width, lfactor, rfactor, /)\n"
653 "--\n"
654 "\n"
655 "Generate a stereo fragment from a mono fragment.");
656 
657 #define AUDIOOP_TOSTEREO_METHODDEF    \
658     {"tostereo", _PyCFunction_CAST(audioop_tostereo), METH_FASTCALL, audioop_tostereo__doc__},
659 
660 static PyObject *
661 audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width,
662                       double lfactor, double rfactor);
663 
664 static PyObject *
audioop_tostereo(PyObject * module,PyObject * const * args,Py_ssize_t nargs)665 audioop_tostereo(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
666 {
667     PyObject *return_value = NULL;
668     Py_buffer fragment = {NULL, NULL};
669     int width;
670     double lfactor;
671     double rfactor;
672 
673     if (!_PyArg_CheckPositional("tostereo", nargs, 4, 4)) {
674         goto exit;
675     }
676     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
677         goto exit;
678     }
679     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
680         _PyArg_BadArgument("tostereo", "argument 1", "contiguous buffer", args[0]);
681         goto exit;
682     }
683     width = _PyLong_AsInt(args[1]);
684     if (width == -1 && PyErr_Occurred()) {
685         goto exit;
686     }
687     if (PyFloat_CheckExact(args[2])) {
688         lfactor = PyFloat_AS_DOUBLE(args[2]);
689     }
690     else
691     {
692         lfactor = PyFloat_AsDouble(args[2]);
693         if (lfactor == -1.0 && PyErr_Occurred()) {
694             goto exit;
695         }
696     }
697     if (PyFloat_CheckExact(args[3])) {
698         rfactor = PyFloat_AS_DOUBLE(args[3]);
699     }
700     else
701     {
702         rfactor = PyFloat_AsDouble(args[3]);
703         if (rfactor == -1.0 && PyErr_Occurred()) {
704             goto exit;
705         }
706     }
707     return_value = audioop_tostereo_impl(module, &fragment, width, lfactor, rfactor);
708 
709 exit:
710     /* Cleanup for fragment */
711     if (fragment.obj) {
712        PyBuffer_Release(&fragment);
713     }
714 
715     return return_value;
716 }
717 
718 PyDoc_STRVAR(audioop_add__doc__,
719 "add($module, fragment1, fragment2, width, /)\n"
720 "--\n"
721 "\n"
722 "Return a fragment which is the addition of the two samples passed as parameters.");
723 
724 #define AUDIOOP_ADD_METHODDEF    \
725     {"add", _PyCFunction_CAST(audioop_add), METH_FASTCALL, audioop_add__doc__},
726 
727 static PyObject *
728 audioop_add_impl(PyObject *module, Py_buffer *fragment1,
729                  Py_buffer *fragment2, int width);
730 
731 static PyObject *
audioop_add(PyObject * module,PyObject * const * args,Py_ssize_t nargs)732 audioop_add(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
733 {
734     PyObject *return_value = NULL;
735     Py_buffer fragment1 = {NULL, NULL};
736     Py_buffer fragment2 = {NULL, NULL};
737     int width;
738 
739     if (!_PyArg_CheckPositional("add", nargs, 3, 3)) {
740         goto exit;
741     }
742     if (PyObject_GetBuffer(args[0], &fragment1, PyBUF_SIMPLE) != 0) {
743         goto exit;
744     }
745     if (!PyBuffer_IsContiguous(&fragment1, 'C')) {
746         _PyArg_BadArgument("add", "argument 1", "contiguous buffer", args[0]);
747         goto exit;
748     }
749     if (PyObject_GetBuffer(args[1], &fragment2, PyBUF_SIMPLE) != 0) {
750         goto exit;
751     }
752     if (!PyBuffer_IsContiguous(&fragment2, 'C')) {
753         _PyArg_BadArgument("add", "argument 2", "contiguous buffer", args[1]);
754         goto exit;
755     }
756     width = _PyLong_AsInt(args[2]);
757     if (width == -1 && PyErr_Occurred()) {
758         goto exit;
759     }
760     return_value = audioop_add_impl(module, &fragment1, &fragment2, width);
761 
762 exit:
763     /* Cleanup for fragment1 */
764     if (fragment1.obj) {
765        PyBuffer_Release(&fragment1);
766     }
767     /* Cleanup for fragment2 */
768     if (fragment2.obj) {
769        PyBuffer_Release(&fragment2);
770     }
771 
772     return return_value;
773 }
774 
775 PyDoc_STRVAR(audioop_bias__doc__,
776 "bias($module, fragment, width, bias, /)\n"
777 "--\n"
778 "\n"
779 "Return a fragment that is the original fragment with a bias added to each sample.");
780 
781 #define AUDIOOP_BIAS_METHODDEF    \
782     {"bias", _PyCFunction_CAST(audioop_bias), METH_FASTCALL, audioop_bias__doc__},
783 
784 static PyObject *
785 audioop_bias_impl(PyObject *module, Py_buffer *fragment, int width, int bias);
786 
787 static PyObject *
audioop_bias(PyObject * module,PyObject * const * args,Py_ssize_t nargs)788 audioop_bias(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
789 {
790     PyObject *return_value = NULL;
791     Py_buffer fragment = {NULL, NULL};
792     int width;
793     int bias;
794 
795     if (!_PyArg_CheckPositional("bias", nargs, 3, 3)) {
796         goto exit;
797     }
798     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
799         goto exit;
800     }
801     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
802         _PyArg_BadArgument("bias", "argument 1", "contiguous buffer", args[0]);
803         goto exit;
804     }
805     width = _PyLong_AsInt(args[1]);
806     if (width == -1 && PyErr_Occurred()) {
807         goto exit;
808     }
809     bias = _PyLong_AsInt(args[2]);
810     if (bias == -1 && PyErr_Occurred()) {
811         goto exit;
812     }
813     return_value = audioop_bias_impl(module, &fragment, width, bias);
814 
815 exit:
816     /* Cleanup for fragment */
817     if (fragment.obj) {
818        PyBuffer_Release(&fragment);
819     }
820 
821     return return_value;
822 }
823 
824 PyDoc_STRVAR(audioop_reverse__doc__,
825 "reverse($module, fragment, width, /)\n"
826 "--\n"
827 "\n"
828 "Reverse the samples in a fragment and returns the modified fragment.");
829 
830 #define AUDIOOP_REVERSE_METHODDEF    \
831     {"reverse", _PyCFunction_CAST(audioop_reverse), METH_FASTCALL, audioop_reverse__doc__},
832 
833 static PyObject *
834 audioop_reverse_impl(PyObject *module, Py_buffer *fragment, int width);
835 
836 static PyObject *
audioop_reverse(PyObject * module,PyObject * const * args,Py_ssize_t nargs)837 audioop_reverse(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
838 {
839     PyObject *return_value = NULL;
840     Py_buffer fragment = {NULL, NULL};
841     int width;
842 
843     if (!_PyArg_CheckPositional("reverse", nargs, 2, 2)) {
844         goto exit;
845     }
846     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
847         goto exit;
848     }
849     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
850         _PyArg_BadArgument("reverse", "argument 1", "contiguous buffer", args[0]);
851         goto exit;
852     }
853     width = _PyLong_AsInt(args[1]);
854     if (width == -1 && PyErr_Occurred()) {
855         goto exit;
856     }
857     return_value = audioop_reverse_impl(module, &fragment, width);
858 
859 exit:
860     /* Cleanup for fragment */
861     if (fragment.obj) {
862        PyBuffer_Release(&fragment);
863     }
864 
865     return return_value;
866 }
867 
868 PyDoc_STRVAR(audioop_byteswap__doc__,
869 "byteswap($module, fragment, width, /)\n"
870 "--\n"
871 "\n"
872 "Convert big-endian samples to little-endian and vice versa.");
873 
874 #define AUDIOOP_BYTESWAP_METHODDEF    \
875     {"byteswap", _PyCFunction_CAST(audioop_byteswap), METH_FASTCALL, audioop_byteswap__doc__},
876 
877 static PyObject *
878 audioop_byteswap_impl(PyObject *module, Py_buffer *fragment, int width);
879 
880 static PyObject *
audioop_byteswap(PyObject * module,PyObject * const * args,Py_ssize_t nargs)881 audioop_byteswap(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
882 {
883     PyObject *return_value = NULL;
884     Py_buffer fragment = {NULL, NULL};
885     int width;
886 
887     if (!_PyArg_CheckPositional("byteswap", nargs, 2, 2)) {
888         goto exit;
889     }
890     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
891         goto exit;
892     }
893     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
894         _PyArg_BadArgument("byteswap", "argument 1", "contiguous buffer", args[0]);
895         goto exit;
896     }
897     width = _PyLong_AsInt(args[1]);
898     if (width == -1 && PyErr_Occurred()) {
899         goto exit;
900     }
901     return_value = audioop_byteswap_impl(module, &fragment, width);
902 
903 exit:
904     /* Cleanup for fragment */
905     if (fragment.obj) {
906        PyBuffer_Release(&fragment);
907     }
908 
909     return return_value;
910 }
911 
912 PyDoc_STRVAR(audioop_lin2lin__doc__,
913 "lin2lin($module, fragment, width, newwidth, /)\n"
914 "--\n"
915 "\n"
916 "Convert samples between 1-, 2-, 3- and 4-byte formats.");
917 
918 #define AUDIOOP_LIN2LIN_METHODDEF    \
919     {"lin2lin", _PyCFunction_CAST(audioop_lin2lin), METH_FASTCALL, audioop_lin2lin__doc__},
920 
921 static PyObject *
922 audioop_lin2lin_impl(PyObject *module, Py_buffer *fragment, int width,
923                      int newwidth);
924 
925 static PyObject *
audioop_lin2lin(PyObject * module,PyObject * const * args,Py_ssize_t nargs)926 audioop_lin2lin(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
927 {
928     PyObject *return_value = NULL;
929     Py_buffer fragment = {NULL, NULL};
930     int width;
931     int newwidth;
932 
933     if (!_PyArg_CheckPositional("lin2lin", nargs, 3, 3)) {
934         goto exit;
935     }
936     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
937         goto exit;
938     }
939     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
940         _PyArg_BadArgument("lin2lin", "argument 1", "contiguous buffer", args[0]);
941         goto exit;
942     }
943     width = _PyLong_AsInt(args[1]);
944     if (width == -1 && PyErr_Occurred()) {
945         goto exit;
946     }
947     newwidth = _PyLong_AsInt(args[2]);
948     if (newwidth == -1 && PyErr_Occurred()) {
949         goto exit;
950     }
951     return_value = audioop_lin2lin_impl(module, &fragment, width, newwidth);
952 
953 exit:
954     /* Cleanup for fragment */
955     if (fragment.obj) {
956        PyBuffer_Release(&fragment);
957     }
958 
959     return return_value;
960 }
961 
962 PyDoc_STRVAR(audioop_ratecv__doc__,
963 "ratecv($module, fragment, width, nchannels, inrate, outrate, state,\n"
964 "       weightA=1, weightB=0, /)\n"
965 "--\n"
966 "\n"
967 "Convert the frame rate of the input fragment.");
968 
969 #define AUDIOOP_RATECV_METHODDEF    \
970     {"ratecv", _PyCFunction_CAST(audioop_ratecv), METH_FASTCALL, audioop_ratecv__doc__},
971 
972 static PyObject *
973 audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width,
974                     int nchannels, int inrate, int outrate, PyObject *state,
975                     int weightA, int weightB);
976 
977 static PyObject *
audioop_ratecv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)978 audioop_ratecv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
979 {
980     PyObject *return_value = NULL;
981     Py_buffer fragment = {NULL, NULL};
982     int width;
983     int nchannels;
984     int inrate;
985     int outrate;
986     PyObject *state;
987     int weightA = 1;
988     int weightB = 0;
989 
990     if (!_PyArg_CheckPositional("ratecv", nargs, 6, 8)) {
991         goto exit;
992     }
993     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
994         goto exit;
995     }
996     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
997         _PyArg_BadArgument("ratecv", "argument 1", "contiguous buffer", args[0]);
998         goto exit;
999     }
1000     width = _PyLong_AsInt(args[1]);
1001     if (width == -1 && PyErr_Occurred()) {
1002         goto exit;
1003     }
1004     nchannels = _PyLong_AsInt(args[2]);
1005     if (nchannels == -1 && PyErr_Occurred()) {
1006         goto exit;
1007     }
1008     inrate = _PyLong_AsInt(args[3]);
1009     if (inrate == -1 && PyErr_Occurred()) {
1010         goto exit;
1011     }
1012     outrate = _PyLong_AsInt(args[4]);
1013     if (outrate == -1 && PyErr_Occurred()) {
1014         goto exit;
1015     }
1016     state = args[5];
1017     if (nargs < 7) {
1018         goto skip_optional;
1019     }
1020     weightA = _PyLong_AsInt(args[6]);
1021     if (weightA == -1 && PyErr_Occurred()) {
1022         goto exit;
1023     }
1024     if (nargs < 8) {
1025         goto skip_optional;
1026     }
1027     weightB = _PyLong_AsInt(args[7]);
1028     if (weightB == -1 && PyErr_Occurred()) {
1029         goto exit;
1030     }
1031 skip_optional:
1032     return_value = audioop_ratecv_impl(module, &fragment, width, nchannels, inrate, outrate, state, weightA, weightB);
1033 
1034 exit:
1035     /* Cleanup for fragment */
1036     if (fragment.obj) {
1037        PyBuffer_Release(&fragment);
1038     }
1039 
1040     return return_value;
1041 }
1042 
1043 PyDoc_STRVAR(audioop_lin2ulaw__doc__,
1044 "lin2ulaw($module, fragment, width, /)\n"
1045 "--\n"
1046 "\n"
1047 "Convert samples in the audio fragment to u-LAW encoding.");
1048 
1049 #define AUDIOOP_LIN2ULAW_METHODDEF    \
1050     {"lin2ulaw", _PyCFunction_CAST(audioop_lin2ulaw), METH_FASTCALL, audioop_lin2ulaw__doc__},
1051 
1052 static PyObject *
1053 audioop_lin2ulaw_impl(PyObject *module, Py_buffer *fragment, int width);
1054 
1055 static PyObject *
audioop_lin2ulaw(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1056 audioop_lin2ulaw(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1057 {
1058     PyObject *return_value = NULL;
1059     Py_buffer fragment = {NULL, NULL};
1060     int width;
1061 
1062     if (!_PyArg_CheckPositional("lin2ulaw", nargs, 2, 2)) {
1063         goto exit;
1064     }
1065     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
1066         goto exit;
1067     }
1068     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
1069         _PyArg_BadArgument("lin2ulaw", "argument 1", "contiguous buffer", args[0]);
1070         goto exit;
1071     }
1072     width = _PyLong_AsInt(args[1]);
1073     if (width == -1 && PyErr_Occurred()) {
1074         goto exit;
1075     }
1076     return_value = audioop_lin2ulaw_impl(module, &fragment, width);
1077 
1078 exit:
1079     /* Cleanup for fragment */
1080     if (fragment.obj) {
1081        PyBuffer_Release(&fragment);
1082     }
1083 
1084     return return_value;
1085 }
1086 
1087 PyDoc_STRVAR(audioop_ulaw2lin__doc__,
1088 "ulaw2lin($module, fragment, width, /)\n"
1089 "--\n"
1090 "\n"
1091 "Convert sound fragments in u-LAW encoding to linearly encoded sound fragments.");
1092 
1093 #define AUDIOOP_ULAW2LIN_METHODDEF    \
1094     {"ulaw2lin", _PyCFunction_CAST(audioop_ulaw2lin), METH_FASTCALL, audioop_ulaw2lin__doc__},
1095 
1096 static PyObject *
1097 audioop_ulaw2lin_impl(PyObject *module, Py_buffer *fragment, int width);
1098 
1099 static PyObject *
audioop_ulaw2lin(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1100 audioop_ulaw2lin(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1101 {
1102     PyObject *return_value = NULL;
1103     Py_buffer fragment = {NULL, NULL};
1104     int width;
1105 
1106     if (!_PyArg_CheckPositional("ulaw2lin", nargs, 2, 2)) {
1107         goto exit;
1108     }
1109     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
1110         goto exit;
1111     }
1112     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
1113         _PyArg_BadArgument("ulaw2lin", "argument 1", "contiguous buffer", args[0]);
1114         goto exit;
1115     }
1116     width = _PyLong_AsInt(args[1]);
1117     if (width == -1 && PyErr_Occurred()) {
1118         goto exit;
1119     }
1120     return_value = audioop_ulaw2lin_impl(module, &fragment, width);
1121 
1122 exit:
1123     /* Cleanup for fragment */
1124     if (fragment.obj) {
1125        PyBuffer_Release(&fragment);
1126     }
1127 
1128     return return_value;
1129 }
1130 
1131 PyDoc_STRVAR(audioop_lin2alaw__doc__,
1132 "lin2alaw($module, fragment, width, /)\n"
1133 "--\n"
1134 "\n"
1135 "Convert samples in the audio fragment to a-LAW encoding.");
1136 
1137 #define AUDIOOP_LIN2ALAW_METHODDEF    \
1138     {"lin2alaw", _PyCFunction_CAST(audioop_lin2alaw), METH_FASTCALL, audioop_lin2alaw__doc__},
1139 
1140 static PyObject *
1141 audioop_lin2alaw_impl(PyObject *module, Py_buffer *fragment, int width);
1142 
1143 static PyObject *
audioop_lin2alaw(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1144 audioop_lin2alaw(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1145 {
1146     PyObject *return_value = NULL;
1147     Py_buffer fragment = {NULL, NULL};
1148     int width;
1149 
1150     if (!_PyArg_CheckPositional("lin2alaw", nargs, 2, 2)) {
1151         goto exit;
1152     }
1153     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
1154         goto exit;
1155     }
1156     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
1157         _PyArg_BadArgument("lin2alaw", "argument 1", "contiguous buffer", args[0]);
1158         goto exit;
1159     }
1160     width = _PyLong_AsInt(args[1]);
1161     if (width == -1 && PyErr_Occurred()) {
1162         goto exit;
1163     }
1164     return_value = audioop_lin2alaw_impl(module, &fragment, width);
1165 
1166 exit:
1167     /* Cleanup for fragment */
1168     if (fragment.obj) {
1169        PyBuffer_Release(&fragment);
1170     }
1171 
1172     return return_value;
1173 }
1174 
1175 PyDoc_STRVAR(audioop_alaw2lin__doc__,
1176 "alaw2lin($module, fragment, width, /)\n"
1177 "--\n"
1178 "\n"
1179 "Convert sound fragments in a-LAW encoding to linearly encoded sound fragments.");
1180 
1181 #define AUDIOOP_ALAW2LIN_METHODDEF    \
1182     {"alaw2lin", _PyCFunction_CAST(audioop_alaw2lin), METH_FASTCALL, audioop_alaw2lin__doc__},
1183 
1184 static PyObject *
1185 audioop_alaw2lin_impl(PyObject *module, Py_buffer *fragment, int width);
1186 
1187 static PyObject *
audioop_alaw2lin(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1188 audioop_alaw2lin(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1189 {
1190     PyObject *return_value = NULL;
1191     Py_buffer fragment = {NULL, NULL};
1192     int width;
1193 
1194     if (!_PyArg_CheckPositional("alaw2lin", nargs, 2, 2)) {
1195         goto exit;
1196     }
1197     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
1198         goto exit;
1199     }
1200     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
1201         _PyArg_BadArgument("alaw2lin", "argument 1", "contiguous buffer", args[0]);
1202         goto exit;
1203     }
1204     width = _PyLong_AsInt(args[1]);
1205     if (width == -1 && PyErr_Occurred()) {
1206         goto exit;
1207     }
1208     return_value = audioop_alaw2lin_impl(module, &fragment, width);
1209 
1210 exit:
1211     /* Cleanup for fragment */
1212     if (fragment.obj) {
1213        PyBuffer_Release(&fragment);
1214     }
1215 
1216     return return_value;
1217 }
1218 
1219 PyDoc_STRVAR(audioop_lin2adpcm__doc__,
1220 "lin2adpcm($module, fragment, width, state, /)\n"
1221 "--\n"
1222 "\n"
1223 "Convert samples to 4 bit Intel/DVI ADPCM encoding.");
1224 
1225 #define AUDIOOP_LIN2ADPCM_METHODDEF    \
1226     {"lin2adpcm", _PyCFunction_CAST(audioop_lin2adpcm), METH_FASTCALL, audioop_lin2adpcm__doc__},
1227 
1228 static PyObject *
1229 audioop_lin2adpcm_impl(PyObject *module, Py_buffer *fragment, int width,
1230                        PyObject *state);
1231 
1232 static PyObject *
audioop_lin2adpcm(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1233 audioop_lin2adpcm(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1234 {
1235     PyObject *return_value = NULL;
1236     Py_buffer fragment = {NULL, NULL};
1237     int width;
1238     PyObject *state;
1239 
1240     if (!_PyArg_CheckPositional("lin2adpcm", nargs, 3, 3)) {
1241         goto exit;
1242     }
1243     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
1244         goto exit;
1245     }
1246     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
1247         _PyArg_BadArgument("lin2adpcm", "argument 1", "contiguous buffer", args[0]);
1248         goto exit;
1249     }
1250     width = _PyLong_AsInt(args[1]);
1251     if (width == -1 && PyErr_Occurred()) {
1252         goto exit;
1253     }
1254     state = args[2];
1255     return_value = audioop_lin2adpcm_impl(module, &fragment, width, state);
1256 
1257 exit:
1258     /* Cleanup for fragment */
1259     if (fragment.obj) {
1260        PyBuffer_Release(&fragment);
1261     }
1262 
1263     return return_value;
1264 }
1265 
1266 PyDoc_STRVAR(audioop_adpcm2lin__doc__,
1267 "adpcm2lin($module, fragment, width, state, /)\n"
1268 "--\n"
1269 "\n"
1270 "Decode an Intel/DVI ADPCM coded fragment to a linear fragment.");
1271 
1272 #define AUDIOOP_ADPCM2LIN_METHODDEF    \
1273     {"adpcm2lin", _PyCFunction_CAST(audioop_adpcm2lin), METH_FASTCALL, audioop_adpcm2lin__doc__},
1274 
1275 static PyObject *
1276 audioop_adpcm2lin_impl(PyObject *module, Py_buffer *fragment, int width,
1277                        PyObject *state);
1278 
1279 static PyObject *
audioop_adpcm2lin(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1280 audioop_adpcm2lin(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1281 {
1282     PyObject *return_value = NULL;
1283     Py_buffer fragment = {NULL, NULL};
1284     int width;
1285     PyObject *state;
1286 
1287     if (!_PyArg_CheckPositional("adpcm2lin", nargs, 3, 3)) {
1288         goto exit;
1289     }
1290     if (PyObject_GetBuffer(args[0], &fragment, PyBUF_SIMPLE) != 0) {
1291         goto exit;
1292     }
1293     if (!PyBuffer_IsContiguous(&fragment, 'C')) {
1294         _PyArg_BadArgument("adpcm2lin", "argument 1", "contiguous buffer", args[0]);
1295         goto exit;
1296     }
1297     width = _PyLong_AsInt(args[1]);
1298     if (width == -1 && PyErr_Occurred()) {
1299         goto exit;
1300     }
1301     state = args[2];
1302     return_value = audioop_adpcm2lin_impl(module, &fragment, width, state);
1303 
1304 exit:
1305     /* Cleanup for fragment */
1306     if (fragment.obj) {
1307        PyBuffer_Release(&fragment);
1308     }
1309 
1310     return return_value;
1311 }
1312 /*[clinic end generated code: output=a581c3893ef8ad75 input=a9049054013a1b77]*/
1313