annotate Modules/audioop.c @ 79675:c0a2294de787 2.7

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