annotate Modules/audioop.c @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 77188bc37c74
children 104b17f8316b ce89dcba008f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1420
diff changeset
2 /* audioopmodule - Module to detect peak values in arrays */
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1420
diff changeset
3
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
4 #define PY_SSIZE_T_CLEAN
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
5
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
6 #include "Python.h"
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
8129
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
8 #if SIZEOF_INT == 4
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
9 typedef int Py_Int32;
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
10 typedef unsigned int Py_UInt32;
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
11 #else
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
12 #if SIZEOF_LONG == 4
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
13 typedef long Py_Int32;
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
14 typedef unsigned long Py_UInt32;
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
15 #else
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
16 #error "No 4-byte integral type"
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
17 #endif
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
18 #endif
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
19
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
20 typedef short PyInt16;
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
21
1827
f5f3ddfec3c7 Makefile.pre.in: add $(OPT) to link command
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
22 #if defined(__CHAR_UNSIGNED__)
f5f3ddfec3c7 Makefile.pre.in: add $(OPT) to link command
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
23 #if defined(signed)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1420
diff changeset
24 /* This module currently does not work on systems where only unsigned
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1420
diff changeset
25 characters are available. Take it out of Setup. Sorry. */
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 #endif
1827
f5f3ddfec3c7 Makefile.pre.in: add $(OPT) to link command
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
27 #endif
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
29 /* Code shamelessly stolen from sox, 12.17.7, g711.c
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 ** (c) Craig Reese, Joe Campbell and Jeff Poskanzer 1989 */
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
32 /* From g711.c:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
33 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
34 * December 30, 1994:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
35 * Functions linear2alaw, linear2ulaw have been updated to correctly
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
36 * convert unquantized 16 bit values.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
37 * Tables for direct u- to A-law and A- to u-law conversions have been
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
38 * corrected.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
39 * Borge Lindberg, Center for PersonKommunikation, Aalborg University.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
40 * bli@cpk.auc.dk
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
41 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
42 */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
43 #define BIAS 0x84 /* define the add-in bias for 16 bit samples */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
44 #define CLIP 32635
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
45 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
46 #define QUANT_MASK (0xf) /* Quantization field mask. */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
47 #define SEG_SHIFT (4) /* Left shift for segment number. */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
48 #define SEG_MASK (0x70) /* Segment field mask. */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
49
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
50 static PyInt16 seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
51 0x1FF, 0x3FF, 0x7FF, 0xFFF};
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
52 static PyInt16 seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
53 0x3FF, 0x7FF, 0xFFF, 0x1FFF};
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
54
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
55 static PyInt16
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
56 search(PyInt16 val, PyInt16 *table, int size)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
57 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
58 int i;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
59
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
60 for (i = 0; i < size; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
61 if (val <= *table++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
62 return (i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
63 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
64 return (size);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
65 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
66 #define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc])
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
67 #define st_alaw2linear16(uc) (_st_alaw2linear16[uc])
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
69 static PyInt16 _st_ulaw2linear16[256] = {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
70 -32124, -31100, -30076, -29052, -28028, -27004, -25980,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
71 -24956, -23932, -22908, -21884, -20860, -19836, -18812,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
72 -17788, -16764, -15996, -15484, -14972, -14460, -13948,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
73 -13436, -12924, -12412, -11900, -11388, -10876, -10364,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
74 -9852, -9340, -8828, -8316, -7932, -7676, -7420,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
75 -7164, -6908, -6652, -6396, -6140, -5884, -5628,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
76 -5372, -5116, -4860, -4604, -4348, -4092, -3900,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
77 -3772, -3644, -3516, -3388, -3260, -3132, -3004,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
78 -2876, -2748, -2620, -2492, -2364, -2236, -2108,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
79 -1980, -1884, -1820, -1756, -1692, -1628, -1564,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
80 -1500, -1436, -1372, -1308, -1244, -1180, -1116,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
81 -1052, -988, -924, -876, -844, -812, -780,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
82 -748, -716, -684, -652, -620, -588, -556,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
83 -524, -492, -460, -428, -396, -372, -356,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
84 -340, -324, -308, -292, -276, -260, -244,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
85 -228, -212, -196, -180, -164, -148, -132,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
86 -120, -112, -104, -96, -88, -80, -72,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
87 -64, -56, -48, -40, -32, -24, -16,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
88 -8, 0, 32124, 31100, 30076, 29052, 28028,
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
89 27004, 25980, 24956, 23932, 22908, 21884, 20860,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
90 19836, 18812, 17788, 16764, 15996, 15484, 14972,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
91 14460, 13948, 13436, 12924, 12412, 11900, 11388,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
92 10876, 10364, 9852, 9340, 8828, 8316, 7932,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
93 7676, 7420, 7164, 6908, 6652, 6396, 6140,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
94 5884, 5628, 5372, 5116, 4860, 4604, 4348,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
95 4092, 3900, 3772, 3644, 3516, 3388, 3260,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
96 3132, 3004, 2876, 2748, 2620, 2492, 2364,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
97 2236, 2108, 1980, 1884, 1820, 1756, 1692,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
98 1628, 1564, 1500, 1436, 1372, 1308, 1244,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
99 1180, 1116, 1052, 988, 924, 876, 844,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
100 812, 780, 748, 716, 684, 652, 620,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
101 588, 556, 524, 492, 460, 428, 396,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
102 372, 356, 340, 324, 308, 292, 276,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
103 260, 244, 228, 212, 196, 180, 164,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
104 148, 132, 120, 112, 104, 96, 88,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
105 80, 72, 64, 56, 48, 40, 32,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
106 24, 16, 8, 0
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
107 };
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 /*
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
110 * linear2ulaw() accepts a 14-bit signed integer and encodes it as u-law data
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
111 * stored in a unsigned char. This function should only be called with
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
112 * the data shifted such that it only contains information in the lower
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
113 * 14-bits.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
114 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
115 * In order to simplify the encoding process, the original linear magnitude
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
116 * is biased by adding 33 which shifts the encoding range from (0 - 8158) to
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
117 * (33 - 8191). The result can be seen in the following encoding table:
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
118 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
119 * Biased Linear Input Code Compressed Code
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
120 * ------------------------ ---------------
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
121 * 00000001wxyza 000wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
122 * 0000001wxyzab 001wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
123 * 000001wxyzabc 010wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
124 * 00001wxyzabcd 011wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
125 * 0001wxyzabcde 100wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
126 * 001wxyzabcdef 101wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
127 * 01wxyzabcdefg 110wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
128 * 1wxyzabcdefgh 111wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
129 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
130 * Each biased linear code has a leading 1 which identifies the segment
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
131 * number. The value of the segment number is equal to 7 minus the number
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
132 * of leading 0's. The quantization interval is directly available as the
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
133 * four bits wxyz. * The trailing bits (a - h) are ignored.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
134 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
135 * Ordinarily the complement of the resulting code word is used for
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
136 * transmission, and so the code word is complemented before it is returned.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
137 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
138 * For further information see John C. Bellamy's Digital Telephony, 1982,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
139 * John Wiley & Sons, pps 98-111 and 472-476.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
140 */
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
141 static unsigned char
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
142 st_14linear2ulaw(PyInt16 pcm_val) /* 2's complement (14-bit range) */
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
143 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
144 PyInt16 mask;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
145 PyInt16 seg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
146 unsigned char uval;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
147
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
148 /* The original sox code does this in the calling function, not here */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
149 pcm_val = pcm_val >> 2;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
150
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
151 /* u-law inverts all bits */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
152 /* Get the sign and the magnitude of the value. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
153 if (pcm_val < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
154 pcm_val = -pcm_val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
155 mask = 0x7F;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
156 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
157 mask = 0xFF;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
158 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
159 if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
160 pcm_val += (BIAS >> 2);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
161
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
162 /* Convert the scaled magnitude to segment number. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
163 seg = search(pcm_val, seg_uend, 8);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
164
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
165 /*
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
166 * Combine the sign, segment, quantization bits;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
167 * and complement the code word.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
168 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
169 if (seg >= 8) /* out of range, return maximum value. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
170 return (unsigned char) (0x7F ^ mask);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
171 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
172 uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
173 return (uval ^ mask);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
174 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
175
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
176 }
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
178 static PyInt16 _st_alaw2linear16[256] = {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
179 -5504, -5248, -6016, -5760, -4480, -4224, -4992,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
180 -4736, -7552, -7296, -8064, -7808, -6528, -6272,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
181 -7040, -6784, -2752, -2624, -3008, -2880, -2240,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
182 -2112, -2496, -2368, -3776, -3648, -4032, -3904,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
183 -3264, -3136, -3520, -3392, -22016, -20992, -24064,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
184 -23040, -17920, -16896, -19968, -18944, -30208, -29184,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
185 -32256, -31232, -26112, -25088, -28160, -27136, -11008,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
186 -10496, -12032, -11520, -8960, -8448, -9984, -9472,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
187 -15104, -14592, -16128, -15616, -13056, -12544, -14080,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
188 -13568, -344, -328, -376, -360, -280, -264,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
189 -312, -296, -472, -456, -504, -488, -408,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
190 -392, -440, -424, -88, -72, -120, -104,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
191 -24, -8, -56, -40, -216, -200, -248,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
192 -232, -152, -136, -184, -168, -1376, -1312,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
193 -1504, -1440, -1120, -1056, -1248, -1184, -1888,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
194 -1824, -2016, -1952, -1632, -1568, -1760, -1696,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
195 -688, -656, -752, -720, -560, -528, -624,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
196 -592, -944, -912, -1008, -976, -816, -784,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
197 -880, -848, 5504, 5248, 6016, 5760, 4480,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
198 4224, 4992, 4736, 7552, 7296, 8064, 7808,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
199 6528, 6272, 7040, 6784, 2752, 2624, 3008,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
200 2880, 2240, 2112, 2496, 2368, 3776, 3648,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
201 4032, 3904, 3264, 3136, 3520, 3392, 22016,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
202 20992, 24064, 23040, 17920, 16896, 19968, 18944,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
203 30208, 29184, 32256, 31232, 26112, 25088, 28160,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
204 27136, 11008, 10496, 12032, 11520, 8960, 8448,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
205 9984, 9472, 15104, 14592, 16128, 15616, 13056,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
206 12544, 14080, 13568, 344, 328, 376, 360,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
207 280, 264, 312, 296, 472, 456, 504,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
208 488, 408, 392, 440, 424, 88, 72,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
209 120, 104, 24, 8, 56, 40, 216,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
210 200, 248, 232, 152, 136, 184, 168,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
211 1376, 1312, 1504, 1440, 1120, 1056, 1248,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
212 1184, 1888, 1824, 2016, 1952, 1632, 1568,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
213 1760, 1696, 688, 656, 752, 720, 560,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
214 528, 624, 592, 944, 912, 1008, 976,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
215 816, 784, 880, 848
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
216 };
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
218 /*
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
219 * linear2alaw() accepts an 13-bit signed integer and encodes it as A-law data
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
220 * stored in a unsigned char. This function should only be called with
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
221 * the data shifted such that it only contains information in the lower
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
222 * 13-bits.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
223 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
224 * Linear Input Code Compressed Code
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
225 * ------------------------ ---------------
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
226 * 0000000wxyza 000wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
227 * 0000001wxyza 001wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
228 * 000001wxyzab 010wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
229 * 00001wxyzabc 011wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
230 * 0001wxyzabcd 100wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
231 * 001wxyzabcde 101wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
232 * 01wxyzabcdef 110wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
233 * 1wxyzabcdefg 111wxyz
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
234 *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
235 * For further information see John C. Bellamy's Digital Telephony, 1982,
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
236 * John Wiley & Sons, pps 98-111 and 472-476.
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
237 */
2150
448435bfeadc Made some more things static, and other cleanup for new naming scheme
Guido van Rossum <guido@python.org>
parents: 2061
diff changeset
238 static unsigned char
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
239 st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
240 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
241 PyInt16 mask;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
242 short seg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
243 unsigned char aval;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
244
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
245 /* The original sox code does this in the calling function, not here */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
246 pcm_val = pcm_val >> 3;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
247
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
248 /* A-law using even bit inversion */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
249 if (pcm_val >= 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
250 mask = 0xD5; /* sign (7th) bit = 1 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
251 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
252 mask = 0x55; /* sign bit = 0 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
253 pcm_val = -pcm_val - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
254 }
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
256 /* Convert the scaled magnitude to segment number. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
257 seg = search(pcm_val, seg_aend, 8);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
258
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
259 /* Combine the sign, segment, and quantization bits. */
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
261 if (seg >= 8) /* out of range, return maximum value. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
262 return (unsigned char) (0x7F ^ mask);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
263 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
264 aval = (unsigned char) seg << SEG_SHIFT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
265 if (seg < 2)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
266 aval |= (pcm_val >> 1) & QUANT_MASK;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
267 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
268 aval |= (pcm_val >> seg) & QUANT_MASK;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
269 return (aval ^ mask);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
270 }
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
271 }
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 /* End of code taken from sox */
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
274 /* Intel ADPCM step variation table */
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
275 static int indexTable[16] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
276 -1, -1, -1, -1, 2, 4, 6, 8,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
277 -1, -1, -1, -1, 2, 4, 6, 8,
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
278 };
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
279
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
280 static int stepsizeTable[89] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
281 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
282 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
283 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
284 130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
285 337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
286 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
287 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
288 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
289 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
290 };
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
291
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 #define CHARP(cp, i) ((signed char *)(cp+i))
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 #define SHORTP(cp, i) ((short *)(cp+i))
8129
1094ebbd3a45 Purported fixes for 64-bit platforms with help from John Jorgensen
Guido van Rossum <guido@python.org>
parents: 6543
diff changeset
294 #define LONGP(cp, i) ((Py_Int32 *)(cp+i))
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
298 static PyObject *AudioopError;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
300 static int
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
301 audioop_check_size(int size)
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
302 {
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
303 if (size != 1 && size != 2 && size != 4) {
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
304 PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
305 return 0;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
306 }
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
307 else
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
308 return 1;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
309 }
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
310
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
311 static int
67347
3bf4d9f1660a Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62764
diff changeset
312 audioop_check_parameters(Py_ssize_t len, int size)
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
313 {
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
314 if (!audioop_check_size(size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
315 return 0;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
316 if (len % size != 0) {
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
317 PyErr_SetString(AudioopError, "not a whole number of frames");
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
318 return 0;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
319 }
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
320 return 1;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
321 }
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
322
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
323 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
324 audioop_getsample(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
326 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
327 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
328 int size, val = 0;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
330 if ( !PyArg_ParseTuple(args, "s#in:getsample", &cp, &len, &size, &i) )
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
331 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
332 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
333 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
334 if ( i < 0 || i >= len/size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
335 PyErr_SetString(AudioopError, "Index out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
336 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
337 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
338 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
339 else if ( size == 2 ) val = (int)*SHORTP(cp, i*2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
340 else if ( size == 4 ) val = (int)*LONGP(cp, i*4);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
341 return PyLong_FromLong(val);
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
344 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
345 audioop_max(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
347 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
348 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
349 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
350 int max = 0;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
352 if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
353 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
354 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
355 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
356 for ( i=0; i<len; i+= size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
357 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
358 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
359 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
360 if ( val < 0 ) val = (-val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
361 if ( val > max ) max = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
362 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
363 return PyLong_FromLong(max);
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
366 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
367 audioop_minmax(PyObject *self, PyObject *args)
1866
9c5d333d3300 Added minmax function.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1827
diff changeset
368 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
369 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
370 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
371 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
372 int min = 0x7fffffff, max = -0x7fffffff;
1866
9c5d333d3300 Added minmax function.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1827
diff changeset
373
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
374 if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
375 return NULL;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
376 if (!audioop_check_parameters(len, size))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
377 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
378 for (i = 0; i < len; i += size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
379 if (size == 1) val = (int) *CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
380 else if (size == 2) val = (int) *SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
381 else if (size == 4) val = (int) *LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
382 if (val > max) max = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
383 if (val < min) min = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
384 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
385 return Py_BuildValue("(ii)", min, max);
1866
9c5d333d3300 Added minmax function.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1827
diff changeset
386 }
9c5d333d3300 Added minmax function.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1827
diff changeset
387
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
388 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
389 audioop_avg(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
391 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
392 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
393 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
394 double avg = 0.0;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
396 if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
397 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
398 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
399 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
400 for ( i=0; i<len; i+= size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
401 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
402 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
403 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
404 avg += val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
405 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
406 if ( len == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
407 val = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
408 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
409 val = (int)(avg / (double)(len/size));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
410 return PyLong_FromLong(val);
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
413 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
414 audioop_rms(PyObject *self, PyObject *args)
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
415 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
416 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
417 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
418 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
419 double sum_squares = 0.0;
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
420
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
421 if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
422 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
423 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
424 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
425 for ( i=0; i<len; i+= size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
426 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
427 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
428 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
429 sum_squares += (double)val*(double)val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
430 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
431 if ( len == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
432 val = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
433 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
434 val = (int)sqrt(sum_squares / (double)(len/size));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
435 return PyLong_FromLong(val);
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
436 }
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
437
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
438 static double _sum2(short *a, short *b, Py_ssize_t len)
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
439 {
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
440 Py_ssize_t i;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
441 double sum = 0.0;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
442
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
443 for( i=0; i<len; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
444 sum = sum + (double)a[i]*(double)b[i];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
445 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
446 return sum;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
447 }
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
448
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
449 /*
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
450 ** Findfit tries to locate a sample within another sample. Its main use
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
451 ** is in echo-cancellation (to find the feedback of the output signal in
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
452 ** the input signal).
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
453 ** The method used is as follows:
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
454 **
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
455 ** let R be the reference signal (length n) and A the input signal (length N)
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
456 ** with N > n, and let all sums be over i from 0 to n-1.
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
457 **
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
458 ** Now, for each j in {0..N-n} we compute a factor fj so that -fj*R matches A
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
459 ** as good as possible, i.e. sum( (A[j+i]+fj*R[i])^2 ) is minimal. This
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
460 ** equation gives fj = sum( A[j+i]R[i] ) / sum(R[i]^2).
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
461 **
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
462 ** Next, we compute the relative distance between the original signal and
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
463 ** the modified signal and minimize that over j:
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
464 ** vj = sum( (A[j+i]-fj*R[i])^2 ) / sum( A[j+i]^2 ) =>
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
465 ** vj = ( sum(A[j+i]^2)*sum(R[i]^2) - sum(A[j+i]R[i])^2 ) / sum( A[j+i]^2 )
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
466 **
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
467 ** In the code variables correspond as follows:
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
468 ** cp1 A
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
469 ** cp2 R
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
470 ** len1 N
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
471 ** len2 n
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
472 ** aj_m1 A[j-1]
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
473 ** aj_lm1 A[j+n-1]
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
474 ** sum_ri_2 sum(R[i]^2)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
475 ** sum_aij_2 sum(A[i+j]^2)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
476 ** sum_aij_ri sum(A[i+j]R[i])
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
477 **
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
478 ** sum_ri is calculated once, sum_aij_2 is updated each step and sum_aij_ri
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
479 ** is completely recalculated each step.
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
480 */
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
481 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
482 audioop_findfit(PyObject *self, PyObject *args)
1223
5ae4a8cf79ef Added lin2lin, findmax, findfactor and fintfit routines
Jack Jansen <jack.jansen@cwi.nl>
parents: 1213
diff changeset
483 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
484 short *cp1, *cp2;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
485 Py_ssize_t len1, len2;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
486 Py_ssize_t j, best_j;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
487 double aj_m1, aj_lm1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
488 double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
489
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
490 /* Passing a short** for an 's' argument is correct only
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
491 if the string contents is aligned for interpretation
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
492 as short[]. Due to the definition of PyBytesObject,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
493 this is currently (Python 2.6) the case. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
494 if ( !PyArg_ParseTuple(args, "s#s#:findfit",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
495 (char**)&cp1, &len1, (char**)&cp2, &len2) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
496 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
497 if ( len1 & 1 || len2 & 1 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
498 PyErr_SetString(AudioopError, "Strings should be even-sized");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
499 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
500 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
501 len1 >>= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
502 len2 >>= 1;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
503
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
504 if ( len1 < len2 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
505 PyErr_SetString(AudioopError, "First sample should be longer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
506 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
507 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
508 sum_ri_2 = _sum2(cp2, cp2, len2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
509 sum_aij_2 = _sum2(cp1, cp1, len2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
510 sum_aij_ri = _sum2(cp1, cp2, len2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
511
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
512 result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
513
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
514 best_result = result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
515 best_j = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
516 j = 0;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
517
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
518 for ( j=1; j<=len1-len2; j++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
519 aj_m1 = (double)cp1[j-1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
520 aj_lm1 = (double)cp1[j+len2-1];
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
521
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
522 sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
523 sum_aij_ri = _sum2(cp1+j, cp2, len2);
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
524
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
525 result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
526 / sum_aij_2;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
527
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
528 if ( result < best_result ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
529 best_result = result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
530 best_j = j;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
531 }
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
532
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
533 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
534
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
535 factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
536
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
537 return Py_BuildValue("(nf)", best_j, factor);
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
538 }
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
539
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
540 /*
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
541 ** findfactor finds a factor f so that the energy in A-fB is minimal.
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
542 ** See the comment for findfit for details.
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
543 */
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
544 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
545 audioop_findfactor(PyObject *self, PyObject *args)
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
546 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
547 short *cp1, *cp2;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
548 Py_ssize_t len1, len2;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
549 double sum_ri_2, sum_aij_ri, result;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
550
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
551 if ( !PyArg_ParseTuple(args, "s#s#:findfactor",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
552 (char**)&cp1, &len1, (char**)&cp2, &len2) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
553 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
554 if ( len1 & 1 || len2 & 1 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
555 PyErr_SetString(AudioopError, "Strings should be even-sized");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
556 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
557 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
558 if ( len1 != len2 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
559 PyErr_SetString(AudioopError, "Samples should be same size");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
560 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
561 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
562 len2 >>= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
563 sum_ri_2 = _sum2(cp2, cp2, len2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
564 sum_aij_ri = _sum2(cp1, cp2, len2);
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
565
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
566 result = sum_aij_ri / sum_ri_2;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
567
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
568 return PyFloat_FromDouble(result);
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
569 }
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
570
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
571 /*
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
572 ** findmax returns the index of the n-sized segment of the input sample
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
573 ** that contains the most energy.
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
574 */
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
575 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
576 audioop_findmax(PyObject *self, PyObject *args)
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
577 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
578 short *cp1;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
579 Py_ssize_t len1, len2;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
580 Py_ssize_t j, best_j;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
581 double aj_m1, aj_lm1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
582 double result, best_result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
583
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
584 if ( !PyArg_ParseTuple(args, "s#n:findmax",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
585 (char**)&cp1, &len1, &len2) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
586 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
587 if ( len1 & 1 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
588 PyErr_SetString(AudioopError, "Strings should be even-sized");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
589 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
590 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
591 len1 >>= 1;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
592
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
593 if ( len2 < 0 || len1 < len2 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
594 PyErr_SetString(AudioopError, "Input sample should be longer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
595 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
596 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
597
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
598 result = _sum2(cp1, cp1, len2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
599
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
600 best_result = result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
601 best_j = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
602 j = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
603
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
604 for ( j=1; j<=len1-len2; j++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
605 aj_m1 = (double)cp1[j-1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
606 aj_lm1 = (double)cp1[j+len2-1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
607
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
608 result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
609
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
610 if ( result > best_result ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
611 best_result = result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
612 best_j = j;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
613 }
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
614
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
615 }
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
616
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
617 return PyLong_FromSsize_t(best_j);
1223
5ae4a8cf79ef Added lin2lin, findmax, findfactor and fintfit routines
Jack Jansen <jack.jansen@cwi.nl>
parents: 1213
diff changeset
618 }
5ae4a8cf79ef Added lin2lin, findmax, findfactor and fintfit routines
Jack Jansen <jack.jansen@cwi.nl>
parents: 1213
diff changeset
619
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
620 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
621 audioop_avgpp(PyObject *self, PyObject *args)
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
622 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
623 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
624 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
625 int size, val = 0, prevval = 0, prevextremevalid = 0,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
626 prevextreme = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
627 double avg = 0.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
628 int diff, prevdiff, extremediff, nextreme = 0;
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
629
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
630 if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
631 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
632 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
633 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
634 /* Compute first delta value ahead. Also automatically makes us
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
635 ** skip the first extreme value
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
636 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
637 if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
638 else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
639 else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
640 if ( size == 1 ) val = (int)*CHARP(cp, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
641 else if ( size == 2 ) val = (int)*SHORTP(cp, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
642 else if ( size == 4 ) val = (int)*LONGP(cp, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
643 prevdiff = val - prevval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
644
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
645 for ( i=size; i<len; i+= size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
646 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
647 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
648 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
649 diff = val - prevval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
650 if ( diff*prevdiff < 0 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
651 /* Derivative changed sign. Compute difference to last
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
652 ** extreme value and remember.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
653 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
654 if ( prevextremevalid ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
655 extremediff = prevval - prevextreme;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
656 if ( extremediff < 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
657 extremediff = -extremediff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
658 avg += extremediff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
659 nextreme++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
660 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
661 prevextremevalid = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
662 prevextreme = prevval;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
663 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
664 prevval = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
665 if ( diff != 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
666 prevdiff = diff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
667 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
668 if ( nextreme == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
669 val = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
670 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
671 val = (int)(avg / (double)nextreme);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
672 return PyLong_FromLong(val);
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
673 }
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
674
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
675 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
676 audioop_maxpp(PyObject *self, PyObject *args)
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
677 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
678 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
679 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
680 int size, val = 0, prevval = 0, prevextremevalid = 0,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
681 prevextreme = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
682 int max = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
683 int diff, prevdiff, extremediff;
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
684
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
685 if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
686 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
687 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
688 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
689 /* Compute first delta value ahead. Also automatically makes us
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
690 ** skip the first extreme value
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
691 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
692 if ( size == 1 ) prevval = (int)*CHARP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
693 else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
694 else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
695 if ( size == 1 ) val = (int)*CHARP(cp, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
696 else if ( size == 2 ) val = (int)*SHORTP(cp, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
697 else if ( size == 4 ) val = (int)*LONGP(cp, size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
698 prevdiff = val - prevval;
993
7ce1975f11a9 Added rms, maxpp and avgpp methods.
Jack Jansen <jack.jansen@cwi.nl>
parents: 909
diff changeset
699
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
700 for ( i=size; i<len; i+= size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
701 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
702 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
703 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
704 diff = val - prevval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
705 if ( diff*prevdiff < 0 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
706 /* Derivative changed sign. Compute difference to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
707 ** last extreme value and remember.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
708 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
709 if ( prevextremevalid ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
710 extremediff = prevval - prevextreme;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
711 if ( extremediff < 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
712 extremediff = -extremediff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
713 if ( extremediff > max )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
714 max = extremediff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
715 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
716 prevextremevalid = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
717 prevextreme = prevval;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
718 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
719 prevval = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
720 if ( diff != 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
721 prevdiff = diff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
722 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
723 return PyLong_FromLong(max);
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
725
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
726 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
727 audioop_cross(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
728 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
729 signed char *cp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
730 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
731 int size, val = 0;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
732 int prevval;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
733 Py_ssize_t ncross;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
734
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
735 if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
736 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
737 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
738 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
739 ncross = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
740 prevval = 17; /* Anything <> 0,1 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
741 for ( i=0; i<len; i+= size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
742 if ( size == 1 ) val = ((int)*CHARP(cp, i)) >> 7;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
743 else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
744 else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
745 val = val & 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
746 if ( val != prevval ) ncross++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
747 prevval = val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
748 }
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
749 return PyLong_FromSsize_t(ncross);
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
750 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
751
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
752 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
753 audioop_mul(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
755 signed char *cp, *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
756 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
757 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
758 double factor, fval, maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
759 PyObject *rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
760
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
761 if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size, &factor ) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
762 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
763 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
764 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
765
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
766 if ( size == 1 ) maxval = (double) 0x7f;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
767 else if ( size == 2 ) maxval = (double) 0x7fff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
768 else if ( size == 4 ) maxval = (double) 0x7fffffff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
769 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
770 PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
771 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
772 }
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
773
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
774 rv = PyBytes_FromStringAndSize(NULL, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
775 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
776 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
777 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
778
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
779
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
780 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
781 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
782 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
783 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
784 fval = (double)val*factor;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
785 if ( fval > maxval ) fval = maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
786 else if ( fval < -maxval ) fval = -maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
787 val = (int)fval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
788 if ( size == 1 ) *CHARP(ncp, i) = (signed char)val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
789 else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
790 else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
791 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
792 return rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
793 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
794
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
795 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
796 audioop_tomono(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
798 Py_buffer pcp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
799 signed char *cp, *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
800 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
801 int size, val1 = 0, val2 = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
802 double fac1, fac2, fval, maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
803 PyObject *rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
804
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
805 if ( !PyArg_ParseTuple(args, "s*idd:tomono",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
806 &pcp, &size, &fac1, &fac2 ) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
807 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
808 cp = pcp.buf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
809 len = pcp.len;
62765
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
810 if (!audioop_check_parameters(len, size)) {
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
811 PyBuffer_Release(&pcp);
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
812 return NULL;
62765
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
813 }
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
814 if (((len / size) & 1) != 0) {
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
815 PyErr_SetString(AudioopError, "not a whole number of frames");
62765
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
816 PyBuffer_Release(&pcp);
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
817 return NULL;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
818 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
819
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
820 if ( size == 1 ) maxval = (double) 0x7f;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
821 else if ( size == 2 ) maxval = (double) 0x7fff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
822 else if ( size == 4 ) maxval = (double) 0x7fffffff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
823 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
824 PyBuffer_Release(&pcp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
825 PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
826 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
827 }
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
828
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
829 rv = PyBytes_FromStringAndSize(NULL, len/2);
62765
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
830 if ( rv == 0 ) {
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
831 PyBuffer_Release(&pcp);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
832 return 0;
62765
b67f720998a8 Merged revisions 82527 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 62737
diff changeset
833 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
834 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
835
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
836
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
837 for ( i=0; i < len; i += size*2 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
838 if ( size == 1 ) val1 = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
839 else if ( size == 2 ) val1 = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
840 else if ( size == 4 ) val1 = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
841 if ( size == 1 ) val2 = (int)*CHARP(cp, i+1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
842 else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
843 else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
844 fval = (double)val1*fac1 + (double)val2*fac2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
845 if ( fval > maxval ) fval = maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
846 else if ( fval < -maxval ) fval = -maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
847 val1 = (int)fval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
848 if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
849 else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
850 else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
851 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
852 PyBuffer_Release(&pcp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
853 return rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
855
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
856 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
857 audioop_tostereo(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
859 signed char *cp, *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
860 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
861 int size, val1, val2, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
862 double fac1, fac2, fval, maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
863 PyObject *rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
864
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
865 if ( !PyArg_ParseTuple(args, "s#idd:tostereo",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
866 &cp, &len, &size, &fac1, &fac2 ) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
867 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
868 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
869 return NULL;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
870
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
871 if ( size == 1 ) maxval = (double) 0x7f;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
872 else if ( size == 2 ) maxval = (double) 0x7fff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
873 else if ( size == 4 ) maxval = (double) 0x7fffffff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
874 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
875 PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
876 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
877 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
878
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
879 if (len > PY_SSIZE_T_MAX/2) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
880 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
881 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
882 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
883 }
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
884
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
885 rv = PyBytes_FromStringAndSize(NULL, len*2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
886 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
887 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
888 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
889
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
890
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
891 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
892 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
893 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
894 else if ( size == 4 ) val = (int)*LONGP(cp, i);
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
895
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
896 fval = (double)val*fac1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
897 if ( fval > maxval ) fval = maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
898 else if ( fval < -maxval ) fval = -maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
899 val1 = (int)fval;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
900
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
901 fval = (double)val*fac2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
902 if ( fval > maxval ) fval = maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
903 else if ( fval < -maxval ) fval = -maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
904 val2 = (int)fval;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
905
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
906 if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
907 else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
908 else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
909
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
910 if ( size == 1 ) *CHARP(ncp, i*2+1) = (signed char)val2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
911 else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
912 else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
913 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
914 return rv;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
915 }
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
916
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
917 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
918 audioop_add(PyObject *self, PyObject *args)
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
919 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
920 signed char *cp1, *cp2, *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
921 Py_ssize_t len1, len2, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
922 int size, val1 = 0, val2 = 0, maxval, newval;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
923 PyObject *rv;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
924
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
925 if ( !PyArg_ParseTuple(args, "s#s#i:add",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
926 &cp1, &len1, &cp2, &len2, &size ) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
927 return 0;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
928 if (!audioop_check_parameters(len1, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
929 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
930 if ( len1 != len2 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
931 PyErr_SetString(AudioopError, "Lengths should be the same");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
932 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
933 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
934
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
935 if ( size == 1 ) maxval = 0x7f;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
936 else if ( size == 2 ) maxval = 0x7fff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
937 else if ( size == 4 ) maxval = 0x7fffffff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
938 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
939 PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
940 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
941 }
5095
11922a2ecacd Changes by Sjoerd (reformatted).
Guido van Rossum <guido@python.org>
parents: 4987
diff changeset
942
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
943 rv = PyBytes_FromStringAndSize(NULL, len1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
944 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
945 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
946 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
947
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
948 for ( i=0; i < len1; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
949 if ( size == 1 ) val1 = (int)*CHARP(cp1, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
950 else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
951 else if ( size == 4 ) val1 = (int)*LONGP(cp1, i);
5095
11922a2ecacd Changes by Sjoerd (reformatted).
Guido van Rossum <guido@python.org>
parents: 4987
diff changeset
952
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
953 if ( size == 1 ) val2 = (int)*CHARP(cp2, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
954 else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
955 else if ( size == 4 ) val2 = (int)*LONGP(cp2, i);
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
956
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
957 newval = val1 + val2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
958 /* truncate in case of overflow */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
959 if (newval > maxval) newval = maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
960 else if (newval < -maxval) newval = -maxval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
961 else if (size == 4 && (newval^val1) < 0 && (newval^val2) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
962 newval = val1 > 0 ? maxval : - maxval;
5095
11922a2ecacd Changes by Sjoerd (reformatted).
Guido van Rossum <guido@python.org>
parents: 4987
diff changeset
963
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
964 if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
965 else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
966 else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
967 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
968 return rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
969 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
970
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
971 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
972 audioop_bias(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
973 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
974 signed char *cp, *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
975 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
976 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
977 PyObject *rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
978 int bias;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
980 if ( !PyArg_ParseTuple(args, "s#ii:bias",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
981 &cp, &len, &size , &bias) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
982 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
983
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
984 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
985 return NULL;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
986
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
987 rv = PyBytes_FromStringAndSize(NULL, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
988 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
989 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
990 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
991
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
992
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
993 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
994 if ( size == 1 ) val = (int)*CHARP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
995 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
996 else if ( size == 4 ) val = (int)*LONGP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
997
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
998 if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val+bias);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
999 else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1000 else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1001 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1002 return rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1005 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1006 audioop_reverse(PyObject *self, PyObject *args)
1238
d426c5d59254 Added audioop.reverse() which reverses an audio sample
Jack Jansen <jack.jansen@cwi.nl>
parents: 1224
diff changeset
1007 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1008 signed char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1009 unsigned char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1010 Py_ssize_t len, i, j;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1011 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1012 PyObject *rv;
1238
d426c5d59254 Added audioop.reverse() which reverses an audio sample
Jack Jansen <jack.jansen@cwi.nl>
parents: 1224
diff changeset
1013
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1014 if ( !PyArg_ParseTuple(args, "s#i:reverse",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1015 &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1016 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1017
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1018 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1019 return NULL;
1238
d426c5d59254 Added audioop.reverse() which reverses an audio sample
Jack Jansen <jack.jansen@cwi.nl>
parents: 1224
diff changeset
1020
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1021 rv = PyBytes_FromStringAndSize(NULL, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1022 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1023 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1024 ncp = (unsigned char *)PyBytes_AsString(rv);
1238
d426c5d59254 Added audioop.reverse() which reverses an audio sample
Jack Jansen <jack.jansen@cwi.nl>
parents: 1224
diff changeset
1025
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1026 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1027 if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1028 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1029 else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1030
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1031 j = len - i - size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1032
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1033 if ( size == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1034 else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1035 else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1036 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1037 return rv;
1238
d426c5d59254 Added audioop.reverse() which reverses an audio sample
Jack Jansen <jack.jansen@cwi.nl>
parents: 1224
diff changeset
1038 }
d426c5d59254 Added audioop.reverse() which reverses an audio sample
Jack Jansen <jack.jansen@cwi.nl>
parents: 1224
diff changeset
1039
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1040 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1041 audioop_lin2lin(PyObject *self, PyObject *args)
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
1042 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1043 signed char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1044 unsigned char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1045 Py_ssize_t len, i, j;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1046 int size, size2, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1047 PyObject *rv;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
1048
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1049 if ( !PyArg_ParseTuple(args, "s#ii:lin2lin",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1050 &cp, &len, &size, &size2) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1051 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1052
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1053 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1054 return NULL;
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1055 if (!audioop_check_size(size2))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1056 return NULL;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
1057
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1058 if (len/size > PY_SSIZE_T_MAX/size2) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1059 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1060 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1061 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1062 }
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1063 rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1064 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1065 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1066 ncp = (unsigned char *)PyBytes_AsString(rv);
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
1067
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1068 for ( i=0, j=0; i < len; i += size, j += size2 ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1069 if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1070 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1071 else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1072
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1073 if ( size2 == 1 ) *CHARP(ncp, j) = (signed char)(val >> 8);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1074 else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1075 else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1076 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1077 return rv;
1224
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
1078 }
7e27659eb2d9 This time really check in the new routines :-)
Jack Jansen <jack.jansen@cwi.nl>
parents: 1223
diff changeset
1079
5555
989f4ff73429 fixed ratecv to continue working if product of rates is bigger than 32 bits
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1080 static int
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13519
diff changeset
1081 gcd(int a, int b)
5555
989f4ff73429 fixed ratecv to continue working if product of rates is bigger than 32 bits
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1082 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1083 while (b > 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1084 int tmp = a % b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1085 a = b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1086 b = tmp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1087 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1088 return a;
5555
989f4ff73429 fixed ratecv to continue working if product of rates is bigger than 32 bits
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1089 }
989f4ff73429 fixed ratecv to continue working if product of rates is bigger than 32 bits
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1090
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1091 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1092 audioop_ratecv(PyObject *self, PyObject *args)
4987
1ded9438fa51 Added Sjoerd's submitted 'ratecv' method. Made corrections for new names.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4879
diff changeset
1093 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1094 char *cp, *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1095 Py_ssize_t len;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1096 int size, nchannels, inrate, outrate, weightA, weightB;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1097 int chan, d, *prev_i, *cur_i, cur_o;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1098 PyObject *state, *samps, *str, *rv = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1099 int bytes_per_frame;
5095
11922a2ecacd Changes by Sjoerd (reformatted).
Guido van Rossum <guido@python.org>
parents: 4987
diff changeset
1100
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1101 weightA = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1102 weightB = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1103 if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len, &size,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1104 &nchannels, &inrate, &outrate, &state,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1105 &weightA, &weightB))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1106 return NULL;
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1107 if (!audioop_check_size(size))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1108 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1109 if (nchannels < 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1110 PyErr_SetString(AudioopError, "# of channels should be >= 1");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1111 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1112 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1113 bytes_per_frame = size * nchannels;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1114 if (bytes_per_frame / nchannels != size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1115 /* This overflow test is rigorously correct because
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1116 both multiplicands are >= 1. Use the argument names
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1117 from the docs for the error msg. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1118 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1119 "width * nchannels too big for a C int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1120 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1121 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1122 if (weightA < 1 || weightB < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1123 PyErr_SetString(AudioopError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1124 "weightA should be >= 1, weightB should be >= 0");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1125 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1126 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1127 if (len % bytes_per_frame != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1128 PyErr_SetString(AudioopError, "not a whole number of frames");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1129 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1130 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1131 if (inrate <= 0 || outrate <= 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1132 PyErr_SetString(AudioopError, "sampling rate not > 0");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1133 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1134 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1135 /* divide inrate and outrate by their greatest common divisor */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1136 d = gcd(inrate, outrate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1137 inrate /= d;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1138 outrate /= d;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1139
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1140 if ((size_t)nchannels > PY_SIZE_MAX/sizeof(int)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1141 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1142 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1143 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1144 }
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1145 prev_i = (int *) malloc(nchannels * sizeof(int));
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1146 cur_i = (int *) malloc(nchannels * sizeof(int));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1147 if (prev_i == NULL || cur_i == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1148 (void) PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1149 goto exit;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1150 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1151
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1152 len /= bytes_per_frame; /* # of frames */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1153
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1154 if (state == Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1155 d = -outrate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1156 for (chan = 0; chan < nchannels; chan++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1157 prev_i[chan] = cur_i[chan] = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1158 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1159 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1160 if (!PyArg_ParseTuple(state,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1161 "iO!;audioop.ratecv: illegal state argument",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1162 &d, &PyTuple_Type, &samps))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1163 goto exit;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1164 if (PyTuple_Size(samps) != nchannels) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1165 PyErr_SetString(AudioopError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1166 "illegal state argument");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1167 goto exit;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1168 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1169 for (chan = 0; chan < nchannels; chan++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1170 if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1171 "ii:ratecv", &prev_i[chan],
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1172 &cur_i[chan]))
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1173 goto exit;
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1174 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1175 }
21218
656c4cf5165f SF bug 482574: audioop.ratecv crashes.
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
1176
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1177 /* str <- Space for the output buffer. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1178 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1179 /* There are len input frames, so we need (mathematically)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1180 ceiling(len*outrate/inrate) output frames, and each frame
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1181 requires bytes_per_frame bytes. Computing this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1182 without spurious overflow is the challenge; we can
61507
011940baefb0 Merged revisions 81079 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61480
diff changeset
1183 settle for a reasonable upper bound, though, in this
011940baefb0 Merged revisions 81079 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61480
diff changeset
1184 case ceiling(len/inrate) * outrate. */
011940baefb0 Merged revisions 81079 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61480
diff changeset
1185
011940baefb0 Merged revisions 81079 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61480
diff changeset
1186 /* compute ceiling(len/inrate) without overflow */
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1187 Py_ssize_t q = len > 0 ? 1 + (len - 1) / inrate : 0;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1188 if (outrate > PY_SSIZE_T_MAX / q / bytes_per_frame)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1189 str = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1190 else
61507
011940baefb0 Merged revisions 81079 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61480
diff changeset
1191 str = PyBytes_FromStringAndSize(NULL,
011940baefb0 Merged revisions 81079 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61480
diff changeset
1192 q * outrate * bytes_per_frame);
21280
3657befaba4f audioop_ratecv() again: settle for a sloppier upper bound that's less
Tim Peters <tim.peters@gmail.com>
parents: 21239
diff changeset
1193
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1194 if (str == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1195 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1196 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1197 goto exit;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1198 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1199 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1200 ncp = PyBytes_AsString(str);
5095
11922a2ecacd Changes by Sjoerd (reformatted).
Guido van Rossum <guido@python.org>
parents: 4987
diff changeset
1201
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1202 for (;;) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1203 while (d < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1204 if (len == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1205 samps = PyTuple_New(nchannels);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1206 if (samps == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1207 goto exit;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1208 for (chan = 0; chan < nchannels; chan++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1209 PyTuple_SetItem(samps, chan,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1210 Py_BuildValue("(ii)",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1211 prev_i[chan],
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1212 cur_i[chan]));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1213 if (PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1214 goto exit;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1215 /* We have checked before that the length
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1216 * of the string fits into int. */
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1217 len = (Py_ssize_t)(ncp - PyBytes_AsString(str));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1218 rv = PyBytes_FromStringAndSize
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1219 (PyBytes_AsString(str), len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1220 Py_DECREF(str);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1221 str = rv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1222 if (str == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1223 goto exit;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1224 rv = Py_BuildValue("(O(iO))", str, d, samps);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1225 Py_DECREF(samps);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1226 Py_DECREF(str);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1227 goto exit; /* return rv */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1228 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1229 for (chan = 0; chan < nchannels; chan++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1230 prev_i[chan] = cur_i[chan];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1231 if (size == 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1232 cur_i[chan] = ((int)*CHARP(cp, 0)) << 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1233 else if (size == 2)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1234 cur_i[chan] = (int)*SHORTP(cp, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1235 else if (size == 4)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1236 cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1237 cp += size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1238 /* implements a simple digital filter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1239 cur_i[chan] =
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1240 (weightA * cur_i[chan] +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1241 weightB * prev_i[chan]) /
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1242 (weightA + weightB);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1243 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1244 len--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1245 d += outrate;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1246 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1247 while (d >= 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1248 for (chan = 0; chan < nchannels; chan++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1249 cur_o = (prev_i[chan] * d +
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1250 cur_i[chan] * (outrate - d)) /
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1251 outrate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1252 if (size == 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1253 *CHARP(ncp, 0) = (signed char)(cur_o >> 8);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1254 else if (size == 2)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1255 *SHORTP(ncp, 0) = (short)(cur_o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1256 else if (size == 4)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1257 *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1258 ncp += size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1259 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1260 d -= inrate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1261 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1262 }
11256
26fbc80fadf2 Fixed memory leak in ratecv, in response to PR#72. By Sjoerd Mullender.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
1263 exit:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1264 if (prev_i != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1265 free(prev_i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1266 if (cur_i != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1267 free(cur_i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1268 return rv;
4987
1ded9438fa51 Added Sjoerd's submitted 'ratecv' method. Made corrections for new names.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4879
diff changeset
1269 }
5095
11922a2ecacd Changes by Sjoerd (reformatted).
Guido van Rossum <guido@python.org>
parents: 4987
diff changeset
1270
4987
1ded9438fa51 Added Sjoerd's submitted 'ratecv' method. Made corrections for new names.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4879
diff changeset
1271 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1272 audioop_lin2ulaw(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1273 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1274 signed char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1275 unsigned char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1276 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1277 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1278 PyObject *rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1279
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1280 if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1281 &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1282 return 0 ;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1283
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1284 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1285 return NULL;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1286
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1287 rv = PyBytes_FromStringAndSize(NULL, len/size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1288 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1289 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1290 ncp = (unsigned char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1291
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1292 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1293 if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1294 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1295 else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1296
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1297 *ncp++ = st_14linear2ulaw(val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1298 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1299 return rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1300 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1302 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1303 audioop_ulaw2lin(PyObject *self, PyObject *args)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1304 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1305 unsigned char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1306 unsigned char cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1307 signed char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1308 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1309 int size, val;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1310 PyObject *rv;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1311
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1312 if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1313 &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1314 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1315
74670
77188bc37c74 Issue #13806: The size check in audioop decompression functions was too strict and could reject valid compressed data.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
1316 if (!audioop_check_size(size))
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1317 return NULL;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1318
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1319 if (len > PY_SSIZE_T_MAX/size) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1320 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1321 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1322 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1323 }
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1324 rv = PyBytes_FromStringAndSize(NULL, len*size);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1325 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1326 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1327 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1328
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1329 for ( i=0; i < len*size; i += size ) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1330 cval = *cp++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1331 val = st_ulaw2linear16(cval);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1332
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1333 if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1334 else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1335 else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1336 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1337 return rv;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1338 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1339
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1340 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1341 audioop_lin2alaw(PyObject *self, PyObject *args)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1342 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1343 signed char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1344 unsigned char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1345 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1346 int size, val = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1347 PyObject *rv;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1348
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1349 if ( !PyArg_ParseTuple(args, "s#i:lin2alaw",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1350 &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1351 return 0;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1352
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1353 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1354 return NULL;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1355
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1356 rv = PyBytes_FromStringAndSize(NULL, len/size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1357 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1358 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1359 ncp = (unsigned char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1360
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1361 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1362 if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1363 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1364 else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1365
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1366 *ncp++ = st_linear2alaw(val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1367 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1368 return rv;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1369 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1370
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1371 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1372 audioop_alaw2lin(PyObject *self, PyObject *args)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1373 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1374 unsigned char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1375 unsigned char cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1376 signed char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1377 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1378 int size, val;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1379 PyObject *rv;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1380
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1381 if ( !PyArg_ParseTuple(args, "s#i:alaw2lin",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1382 &cp, &len, &size) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1383 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1384
74670
77188bc37c74 Issue #13806: The size check in audioop decompression functions was too strict and could reject valid compressed data.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
1385 if (!audioop_check_size(size))
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1386 return NULL;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1387
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1388 if (len > PY_SSIZE_T_MAX/size) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1389 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1390 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1391 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1392 }
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1393 rv = PyBytes_FromStringAndSize(NULL, len*size);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1394 if ( rv == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1395 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1396 ncp = (signed char *)PyBytes_AsString(rv);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1397
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1398 for ( i=0; i < len*size; i += size ) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1399 cval = *cp++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1400 val = st_alaw2linear16(cval);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1401
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1402 if ( size == 1 ) *CHARP(ncp, i) = (signed char)(val >> 8);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1403 else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1404 else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1405 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1406 return rv;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1407 }
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1409 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1410 audioop_lin2adpcm(PyObject *self, PyObject *args)
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1411 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1412 signed char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1413 signed char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1414 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1415 int size, val = 0, step, valpred, delta,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1416 index, sign, vpdiff, diff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1417 PyObject *rv, *state, *str;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1418 int outputbuffer = 0, bufferstep;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1419
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1420 if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1421 &cp, &len, &size, &state) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1422 return 0;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1423
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1424 if (!audioop_check_parameters(len, size))
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1425 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1426
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1427 str = PyBytes_FromStringAndSize(NULL, len/(size*2));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1428 if ( str == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1429 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1430 ncp = (signed char *)PyBytes_AsString(str);
1223
5ae4a8cf79ef Added lin2lin, findmax, findfactor and fintfit routines
Jack Jansen <jack.jansen@cwi.nl>
parents: 1213
diff changeset
1431
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1432 /* Decode state, should have (value, step) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1433 if ( state == Py_None ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1434 /* First time, it seems. Set defaults */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1435 valpred = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1436 step = 7;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1437 index = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1438 } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1439 return 0;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1440
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1441 step = stepsizeTable[index];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1442 bufferstep = 1;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1443
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1444 for ( i=0; i < len; i += size ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1445 if ( size == 1 ) val = ((int)*CHARP(cp, i)) << 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1446 else if ( size == 2 ) val = (int)*SHORTP(cp, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1447 else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1448
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1449 /* Step 1 - compute difference with previous value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1450 diff = val - valpred;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1451 sign = (diff < 0) ? 8 : 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1452 if ( sign ) diff = (-diff);
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1453
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1454 /* Step 2 - Divide and clamp */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1455 /* Note:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1456 ** This code *approximately* computes:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1457 ** delta = diff*4/step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1458 ** vpdiff = (delta+0.5)*step/4;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1459 ** but in shift step bits are dropped. The net result of this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1460 ** is that even if you have fast mul/div hardware you cannot
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1461 ** put it to good use since the fixup would be too expensive.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1462 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1463 delta = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1464 vpdiff = (step >> 3);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1465
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1466 if ( diff >= step ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1467 delta = 4;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1468 diff -= step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1469 vpdiff += step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1470 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1471 step >>= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1472 if ( diff >= step ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1473 delta |= 2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1474 diff -= step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1475 vpdiff += step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1476 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1477 step >>= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1478 if ( diff >= step ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1479 delta |= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1480 vpdiff += step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1481 }
1180
1d6cbeb27096 Fixed various bugs in the adpcm routines
Jack Jansen <jack.jansen@cwi.nl>
parents: 993
diff changeset
1482
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1483 /* Step 3 - Update previous value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1484 if ( sign )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1485 valpred -= vpdiff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1486 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1487 valpred += vpdiff;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1488
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1489 /* Step 4 - Clamp previous value to 16 bits */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1490 if ( valpred > 32767 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1491 valpred = 32767;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1492 else if ( valpred < -32768 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1493 valpred = -32768;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1494
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1495 /* Step 5 - Assemble value, update index and step values */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1496 delta |= sign;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1497
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1498 index += indexTable[delta];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1499 if ( index < 0 ) index = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1500 if ( index > 88 ) index = 88;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1501 step = stepsizeTable[index];
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1502
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1503 /* Step 6 - Output value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1504 if ( bufferstep ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1505 outputbuffer = (delta << 4) & 0xf0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1506 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1507 *ncp++ = (delta & 0x0f) | outputbuffer;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1508 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1509 bufferstep = !bufferstep;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1510 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1511 rv = Py_BuildValue("(O(ii))", str, valpred, index);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1512 Py_DECREF(str);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1513 return rv;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1514 }
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1515
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1516 static PyObject *
13519
070e41f2697b ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1517 audioop_adpcm2lin(PyObject *self, PyObject *args)
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1518 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1519 signed char *cp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1520 signed char *ncp;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1521 Py_ssize_t len, i;
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1522 int size, valpred, step, delta, index, sign, vpdiff;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1523 PyObject *rv, *str, *state;
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1524 int inputbuffer = 0, bufferstep;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1525
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1526 if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1527 &cp, &len, &size, &state) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1528 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1529
74670
77188bc37c74 Issue #13806: The size check in audioop decompression functions was too strict and could reject valid compressed data.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
1530 if (!audioop_check_size(size))
62737
7184421f83b5 Merged revisions 82495 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61507
diff changeset
1531 return NULL;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1532
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1533 /* Decode state, should have (value, step) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1534 if ( state == Py_None ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1535 /* First time, it seems. Set defaults */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1536 valpred = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1537 step = 7;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1538 index = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1539 } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1540 return 0;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1541
61509
9c321aaeef12 Issue #8657: Make the audioop module PY_SSIZE_T_CLEAN.
Mark Dickinson <dickinsm@gmail.com>
parents: 61507
diff changeset
1542 if (len > (PY_SSIZE_T_MAX/2)/size) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1543 PyErr_SetString(PyExc_MemoryError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1544 "not enough memory for output buffer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1545 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1546 }
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1547 str = PyBytes_FromStringAndSize(NULL, len*size*2);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1548 if ( str == 0 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1549 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1550 ncp = (signed char *)PyBytes_AsString(str);
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1551
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1552 step = stepsizeTable[index];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1553 bufferstep = 0;
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1554
61480
20ae83821ef0 Merged revisions 81045 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
1555 for ( i=0; i < len*size*2; i += size ) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1556 /* Step 1 - get the delta value and compute next index */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1557 if ( bufferstep ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1558 delta = inputbuffer & 0xf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1559 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1560 inputbuffer = *cp++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1561 delta = (inputbuffer >> 4) & 0xf;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36861
diff changeset
1562 }
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1563
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1564 bufferstep = !bufferstep;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1565
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1566 /* Step 2 - Find new index value (for later) */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1567 index += indexTable[delta];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1568 if ( index < 0 ) index = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1569 if ( index > 88 ) index = 88;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1570
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1571 /* Step 3 - Separate sign and magnitude */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1572 sign = delta & 8;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1573 delta = delta & 7;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1574
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1575 /* Step 4 - Compute difference and new predicted value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1576 /*
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1577 ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1578 ** in adpcm_coder.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1579 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1580 vpdiff = step >> 3;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1581 if ( delta & 4 ) vpdiff += step;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1582 if ( delta & 2 ) vpdiff += step>>1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1583 if ( delta & 1 ) vpdiff += step>>2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1584
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1585 if ( sign )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1586 valpred -= vpdiff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1587 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1588 valpred += vpdiff;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1589
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1590 /* Step 5 - clamp output value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1591 if ( valpred > 32767 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1592 valpred = 32767;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1593 else if ( valpred < -32768 )
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1594 valpred = -32768;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1595
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1596 /* Step 6 - Update step value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1597 step = stepsizeTable[index];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1598
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1599 /* Step 6 - Output value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1600 if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1601 else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1602 else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1603 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1604
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1605 rv = Py_BuildValue("(O(ii))", str, valpred, index);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1606 Py_DECREF(str);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1607 return rv;
909
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1608 }
4da0b7dae796 Added conversions to/from ADPCM(-4); renamed adpcm to adpcm3 (what it
Guido van Rossum <guido@python.org>
parents: 905
diff changeset
1609
4879
4514023160b4 Renamed, reindented. (was already partially complete)
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1610 static PyMethodDef audioop_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1611 { "max", audioop_max, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1612 { "minmax", audioop_minmax, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1613 { "avg", audioop_avg, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1614 { "maxpp", audioop_maxpp, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1615 { "avgpp", audioop_avgpp, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1616 { "rms", audioop_rms, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1617 { "findfit", audioop_findfit, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1618 { "findmax", audioop_findmax, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1619 { "findfactor", audioop_findfactor, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1620 { "cross", audioop_cross, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1621 { "mul", audioop_mul, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1622 { "add", audioop_add, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1623 { "bias", audioop_bias, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1624 { "ulaw2lin", audioop_ulaw2lin, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1625 { "lin2ulaw", audioop_lin2ulaw, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1626 { "alaw2lin", audioop_alaw2lin, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1627 { "lin2alaw", audioop_lin2alaw, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1628 { "lin2lin", audioop_lin2lin, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1629 { "adpcm2lin", audioop_adpcm2lin, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1630 { "lin2adpcm", audioop_lin2adpcm, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1631 { "tomono", audioop_tomono, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1632 { "tostereo", audioop_tostereo, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1633 { "getsample", audioop_getsample, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1634 { "reverse", audioop_reverse, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1635 { "ratecv", audioop_ratecv, METH_VARARGS },
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1636 { 0, 0 }
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1637 };
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1638
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1639
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1640 static struct PyModuleDef audioopmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1641 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1642 "audioop",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1643 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1644 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1645 audioop_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1646 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1647 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1648 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1649 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1650 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1651
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 21757
diff changeset
1652 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1653 PyInit_audioop(void)
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1654 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1655 PyObject *m, *d;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1656 m = PyModule_Create(&audioopmodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1657 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1658 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1659 d = PyModule_GetDict(m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1660 if (d == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1661 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1662 AudioopError = PyErr_NewException("audioop.error", NULL, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1663 if (AudioopError != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1664 PyDict_SetItemString(d,"error",AudioopError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54104
diff changeset
1665 return m;
877
9fb2a868eeee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1666 }