Mercurial > cpython-lru_cache-weakref
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 |
| rev | line source |
|---|---|
| 877 | 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 | 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 | 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 | 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 | 28 ** (c) Craig Reese, Joe Campbell and Jeff Poskanzer 1989 */ |
| 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 | 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 | 106 |
| 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 | 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 | 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 | 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 | 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 | 270 /* End of code taken from sox */ |
| 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 | 290 #define CHARP(cp, i) ((signed char *)(cp+i)) |
| 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 | 293 |
| 294 | |
| 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 | 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 | 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 | 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 | 340 } |
| 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 | 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 | 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 | 362 } |
| 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 | 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 | 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 | 384 } |
| 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 | 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 | 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 | 409 } |
| 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 | 720 } |
| 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 | 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 | 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 | 745 } |
| 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 | 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 | 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 | 788 } |
| 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 | 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 | 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 | 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 | 839 } |
| 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 | 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 | 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 | 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 | 954 } |
| 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 | 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 | 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 | 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 | 988 } |
| 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 | 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 | 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 | 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 | 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 | 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 | 1285 } |
| 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 | 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 | 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 | 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 | 1392 } |
| 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 | 1618 }; |
| 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 | 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 | 1633 } |
