1 2 /* audioopmodule - Module to detect peak values in arrays */ 3 4 #define PY_SSIZE_T_CLEAN 5 6 #include "Python.h" 7 8 #if defined(__CHAR_UNSIGNED__) 9 #if defined(signed) 10 /* This module currently does not work on systems where only unsigned 11 characters are available. Take it out of Setup. Sorry. */ 12 #endif 13 #endif 14 15 static const int maxvals[] = {0, 0x7F, 0x7FFF, 0x7FFFFF, 0x7FFFFFFF}; 16 /* -1 trick is needed on Windows to support -0x80000000 without a warning */ 17 static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x7FFFFFFF-1}; 18 static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF}; 19 20 static int 21 fbound(double val, double minval, double maxval) 22 { 23 if (val > maxval) 24 val = maxval; 25 else if (val < minval + 1) 26 val = minval; 27 return (int)val; 28 } 29 30 31 /* Code shamelessly stolen from sox, 12.17.7, g711.c 32 ** (c) Craig Reese, Joe Campbell and Jeff Poskanzer 1989 */ 33 34 /* From g711.c: 35 * 36 * December 30, 1994: 37 * Functions linear2alaw, linear2ulaw have been updated to correctly 38 * convert unquantized 16 bit values. 39 * Tables for direct u- to A-law and A- to u-law conversions have been 40 * corrected. 41 * Borge Lindberg, Center for PersonKommunikation, Aalborg University. 42 * bli (at) cpk.auc.dk 43 * 44 */ 45 #define BIAS 0x84 /* define the add-in bias for 16 bit samples */ 46 #define CLIP 32635 47 #define SIGN_BIT (0x80) /* Sign bit for an A-law byte. */ 48 #define QUANT_MASK (0xf) /* Quantization field mask. */ 49 #define SEG_SHIFT (4) /* Left shift for segment number. */ 50 #define SEG_MASK (0x70) /* Segment field mask. */ 51 52 static const int16_t seg_aend[8] = { 53 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF 54 }; 55 static const int16_t seg_uend[8] = { 56 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF 57 }; 58 59 static int16_t 60 search(int16_t val, const int16_t *table, int size) 61 { 62 int i; 63 64 for (i = 0; i < size; i++) { 65 if (val <= *table++) 66 return (i); 67 } 68 return (size); 69 } 70 #define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc]) 71 #define st_alaw2linear16(uc) (_st_alaw2linear16[uc]) 72 73 static const int16_t _st_ulaw2linear16[256] = { 74 -32124, -31100, -30076, -29052, -28028, -27004, -25980, 75 -24956, -23932, -22908, -21884, -20860, -19836, -18812, 76 -17788, -16764, -15996, -15484, -14972, -14460, -13948, 77 -13436, -12924, -12412, -11900, -11388, -10876, -10364, 78 -9852, -9340, -8828, -8316, -7932, -7676, -7420, 79 -7164, -6908, -6652, -6396, -6140, -5884, -5628, 80 -5372, -5116, -4860, -4604, -4348, -4092, -3900, 81 -3772, -3644, -3516, -3388, -3260, -3132, -3004, 82 -2876, -2748, -2620, -2492, -2364, -2236, -2108, 83 -1980, -1884, -1820, -1756, -1692, -1628, -1564, 84 -1500, -1436, -1372, -1308, -1244, -1180, -1116, 85 -1052, -988, -924, -876, -844, -812, -780, 86 -748, -716, -684, -652, -620, -588, -556, 87 -524, -492, -460, -428, -396, -372, -356, 88 -340, -324, -308, -292, -276, -260, -244, 89 -228, -212, -196, -180, -164, -148, -132, 90 -120, -112, -104, -96, -88, -80, -72, 91 -64, -56, -48, -40, -32, -24, -16, 92 -8, 0, 32124, 31100, 30076, 29052, 28028, 93 27004, 25980, 24956, 23932, 22908, 21884, 20860, 94 19836, 18812, 17788, 16764, 15996, 15484, 14972, 95 14460, 13948, 13436, 12924, 12412, 11900, 11388, 96 10876, 10364, 9852, 9340, 8828, 8316, 7932, 97 7676, 7420, 7164, 6908, 6652, 6396, 6140, 98 5884, 5628, 5372, 5116, 4860, 4604, 4348, 99 4092, 3900, 3772, 3644, 3516, 3388, 3260, 100 3132, 3004, 2876, 2748, 2620, 2492, 2364, 101 2236, 2108, 1980, 1884, 1820, 1756, 1692, 102 1628, 1564, 1500, 1436, 1372, 1308, 1244, 103 1180, 1116, 1052, 988, 924, 876, 844, 104 812, 780, 748, 716, 684, 652, 620, 105 588, 556, 524, 492, 460, 428, 396, 106 372, 356, 340, 324, 308, 292, 276, 107 260, 244, 228, 212, 196, 180, 164, 108 148, 132, 120, 112, 104, 96, 88, 109 80, 72, 64, 56, 48, 40, 32, 110 24, 16, 8, 0 111 }; 112 113 /* 114 * linear2ulaw() accepts a 14-bit signed integer and encodes it as u-law data 115 * stored in an unsigned char. This function should only be called with 116 * the data shifted such that it only contains information in the lower 117 * 14-bits. 118 * 119 * In order to simplify the encoding process, the original linear magnitude 120 * is biased by adding 33 which shifts the encoding range from (0 - 8158) to 121 * (33 - 8191). The result can be seen in the following encoding table: 122 * 123 * Biased Linear Input Code Compressed Code 124 * ------------------------ --------------- 125 * 00000001wxyza 000wxyz 126 * 0000001wxyzab 001wxyz 127 * 000001wxyzabc 010wxyz 128 * 00001wxyzabcd 011wxyz 129 * 0001wxyzabcde 100wxyz 130 * 001wxyzabcdef 101wxyz 131 * 01wxyzabcdefg 110wxyz 132 * 1wxyzabcdefgh 111wxyz 133 * 134 * Each biased linear code has a leading 1 which identifies the segment 135 * number. The value of the segment number is equal to 7 minus the number 136 * of leading 0's. The quantization interval is directly available as the 137 * four bits wxyz. * The trailing bits (a - h) are ignored. 138 * 139 * Ordinarily the complement of the resulting code word is used for 140 * transmission, and so the code word is complemented before it is returned. 141 * 142 * For further information see John C. Bellamy's Digital Telephony, 1982, 143 * John Wiley & Sons, pps 98-111 and 472-476. 144 */ 145 static unsigned char 146 st_14linear2ulaw(int16_t pcm_val) /* 2's complement (14-bit range) */ 147 { 148 int16_t mask; 149 int16_t seg; 150 unsigned char uval; 151 152 /* u-law inverts all bits */ 153 /* Get the sign and the magnitude of the value. */ 154 if (pcm_val < 0) { 155 pcm_val = -pcm_val; 156 mask = 0x7F; 157 } else { 158 mask = 0xFF; 159 } 160 if ( pcm_val > CLIP ) pcm_val = CLIP; /* clip the magnitude */ 161 pcm_val += (BIAS >> 2); 162 163 /* Convert the scaled magnitude to segment number. */ 164 seg = search(pcm_val, seg_uend, 8); 165 166 /* 167 * Combine the sign, segment, quantization bits; 168 * and complement the code word. 169 */ 170 if (seg >= 8) /* out of range, return maximum value. */ 171 return (unsigned char) (0x7F ^ mask); 172 else { 173 uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF); 174 return (uval ^ mask); 175 } 176 177 } 178 179 static const int16_t _st_alaw2linear16[256] = { 180 -5504, -5248, -6016, -5760, -4480, -4224, -4992, 181 -4736, -7552, -7296, -8064, -7808, -6528, -6272, 182 -7040, -6784, -2752, -2624, -3008, -2880, -2240, 183 -2112, -2496, -2368, -3776, -3648, -4032, -3904, 184 -3264, -3136, -3520, -3392, -22016, -20992, -24064, 185 -23040, -17920, -16896, -19968, -18944, -30208, -29184, 186 -32256, -31232, -26112, -25088, -28160, -27136, -11008, 187 -10496, -12032, -11520, -8960, -8448, -9984, -9472, 188 -15104, -14592, -16128, -15616, -13056, -12544, -14080, 189 -13568, -344, -328, -376, -360, -280, -264, 190 -312, -296, -472, -456, -504, -488, -408, 191 -392, -440, -424, -88, -72, -120, -104, 192 -24, -8, -56, -40, -216, -200, -248, 193 -232, -152, -136, -184, -168, -1376, -1312, 194 -1504, -1440, -1120, -1056, -1248, -1184, -1888, 195 -1824, -2016, -1952, -1632, -1568, -1760, -1696, 196 -688, -656, -752, -720, -560, -528, -624, 197 -592, -944, -912, -1008, -976, -816, -784, 198 -880, -848, 5504, 5248, 6016, 5760, 4480, 199 4224, 4992, 4736, 7552, 7296, 8064, 7808, 200 6528, 6272, 7040, 6784, 2752, 2624, 3008, 201 2880, 2240, 2112, 2496, 2368, 3776, 3648, 202 4032, 3904, 3264, 3136, 3520, 3392, 22016, 203 20992, 24064, 23040, 17920, 16896, 19968, 18944, 204 30208, 29184, 32256, 31232, 26112, 25088, 28160, 205 27136, 11008, 10496, 12032, 11520, 8960, 8448, 206 9984, 9472, 15104, 14592, 16128, 15616, 13056, 207 12544, 14080, 13568, 344, 328, 376, 360, 208 280, 264, 312, 296, 472, 456, 504, 209 488, 408, 392, 440, 424, 88, 72, 210 120, 104, 24, 8, 56, 40, 216, 211 200, 248, 232, 152, 136, 184, 168, 212 1376, 1312, 1504, 1440, 1120, 1056, 1248, 213 1184, 1888, 1824, 2016, 1952, 1632, 1568, 214 1760, 1696, 688, 656, 752, 720, 560, 215 528, 624, 592, 944, 912, 1008, 976, 216 816, 784, 880, 848 217 }; 218 219 /* 220 * linear2alaw() accepts a 13-bit signed integer and encodes it as A-law data 221 * stored in an unsigned char. This function should only be called with 222 * the data shifted such that it only contains information in the lower 223 * 13-bits. 224 * 225 * Linear Input Code Compressed Code 226 * ------------------------ --------------- 227 * 0000000wxyza 000wxyz 228 * 0000001wxyza 001wxyz 229 * 000001wxyzab 010wxyz 230 * 00001wxyzabc 011wxyz 231 * 0001wxyzabcd 100wxyz 232 * 001wxyzabcde 101wxyz 233 * 01wxyzabcdef 110wxyz 234 * 1wxyzabcdefg 111wxyz 235 * 236 * For further information see John C. Bellamy's Digital Telephony, 1982, 237 * John Wiley & Sons, pps 98-111 and 472-476. 238 */ 239 static unsigned char 240 st_linear2alaw(int16_t pcm_val) /* 2's complement (13-bit range) */ 241 { 242 int16_t mask; 243 int16_t seg; 244 unsigned char aval; 245 246 /* A-law using even bit inversion */ 247 if (pcm_val >= 0) { 248 mask = 0xD5; /* sign (7th) bit = 1 */ 249 } else { 250 mask = 0x55; /* sign bit = 0 */ 251 pcm_val = -pcm_val - 1; 252 } 253 254 /* Convert the scaled magnitude to segment number. */ 255 seg = search(pcm_val, seg_aend, 8); 256 257 /* Combine the sign, segment, and quantization bits. */ 258 259 if (seg >= 8) /* out of range, return maximum value. */ 260 return (unsigned char) (0x7F ^ mask); 261 else { 262 aval = (unsigned char) seg << SEG_SHIFT; 263 if (seg < 2) 264 aval |= (pcm_val >> 1) & QUANT_MASK; 265 else 266 aval |= (pcm_val >> seg) & QUANT_MASK; 267 return (aval ^ mask); 268 } 269 } 270 /* End of code taken from sox */ 271 272 /* Intel ADPCM step variation table */ 273 static const int indexTable[16] = { 274 -1, -1, -1, -1, 2, 4, 6, 8, 275 -1, -1, -1, -1, 2, 4, 6, 8, 276 }; 277 278 static const int stepsizeTable[89] = { 279 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 280 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 281 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 282 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 283 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 284 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 285 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 286 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 287 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 288 }; 289 290 #define GETINTX(T, cp, i) (*(T *)((unsigned char *)(cp) + (i))) 291 #define SETINTX(T, cp, i, val) do { \ 292 *(T *)((unsigned char *)(cp) + (i)) = (T)(val); \ 293 } while (0) 294 295 296 #define GETINT8(cp, i) GETINTX(signed char, (cp), (i)) 297 #define GETINT16(cp, i) GETINTX(int16_t, (cp), (i)) 298 #define GETINT32(cp, i) GETINTX(int32_t, (cp), (i)) 299 300 #if WORDS_BIGENDIAN 301 #define GETINT24(cp, i) ( \ 302 ((unsigned char *)(cp) + (i))[2] + \ 303 (((unsigned char *)(cp) + (i))[1] << 8) + \ 304 (((signed char *)(cp) + (i))[0] << 16) ) 305 #else 306 #define GETINT24(cp, i) ( \ 307 ((unsigned char *)(cp) + (i))[0] + \ 308 (((unsigned char *)(cp) + (i))[1] << 8) + \ 309 (((signed char *)(cp) + (i))[2] << 16) ) 310 #endif 311 312 313 #define SETINT8(cp, i, val) SETINTX(signed char, (cp), (i), (val)) 314 #define SETINT16(cp, i, val) SETINTX(int16_t, (cp), (i), (val)) 315 #define SETINT32(cp, i, val) SETINTX(int32_t, (cp), (i), (val)) 316 317 #if WORDS_BIGENDIAN 318 #define SETINT24(cp, i, val) do { \ 319 ((unsigned char *)(cp) + (i))[2] = (int)(val); \ 320 ((unsigned char *)(cp) + (i))[1] = (int)(val) >> 8; \ 321 ((signed char *)(cp) + (i))[0] = (int)(val) >> 16; \ 322 } while (0) 323 #else 324 #define SETINT24(cp, i, val) do { \ 325 ((unsigned char *)(cp) + (i))[0] = (int)(val); \ 326 ((unsigned char *)(cp) + (i))[1] = (int)(val) >> 8; \ 327 ((signed char *)(cp) + (i))[2] = (int)(val) >> 16; \ 328 } while (0) 329 #endif 330 331 332 #define GETRAWSAMPLE(size, cp, i) ( \ 333 (size == 1) ? (int)GETINT8((cp), (i)) : \ 334 (size == 2) ? (int)GETINT16((cp), (i)) : \ 335 (size == 3) ? (int)GETINT24((cp), (i)) : \ 336 (int)GETINT32((cp), (i))) 337 338 #define SETRAWSAMPLE(size, cp, i, val) do { \ 339 if (size == 1) \ 340 SETINT8((cp), (i), (val)); \ 341 else if (size == 2) \ 342 SETINT16((cp), (i), (val)); \ 343 else if (size == 3) \ 344 SETINT24((cp), (i), (val)); \ 345 else \ 346 SETINT32((cp), (i), (val)); \ 347 } while(0) 348 349 350 #define GETSAMPLE32(size, cp, i) ( \ 351 (size == 1) ? (int)GETINT8((cp), (i)) << 24 : \ 352 (size == 2) ? (int)GETINT16((cp), (i)) << 16 : \ 353 (size == 3) ? (int)GETINT24((cp), (i)) << 8 : \ 354 (int)GETINT32((cp), (i))) 355 356 #define SETSAMPLE32(size, cp, i, val) do { \ 357 if (size == 1) \ 358 SETINT8((cp), (i), (val) >> 24); \ 359 else if (size == 2) \ 360 SETINT16((cp), (i), (val) >> 16); \ 361 else if (size == 3) \ 362 SETINT24((cp), (i), (val) >> 8); \ 363 else \ 364 SETINT32((cp), (i), (val)); \ 365 } while(0) 366 367 368 static PyObject *AudioopError; 369 370 static int 371 audioop_check_size(int size) 372 { 373 if (size < 1 || size > 4) { 374 PyErr_SetString(AudioopError, "Size should be 1, 2, 3 or 4"); 375 return 0; 376 } 377 else 378 return 1; 379 } 380 381 static int 382 audioop_check_parameters(Py_ssize_t len, int size) 383 { 384 if (!audioop_check_size(size)) 385 return 0; 386 if (len % size != 0) { 387 PyErr_SetString(AudioopError, "not a whole number of frames"); 388 return 0; 389 } 390 return 1; 391 } 392 393 /*[clinic input] 394 module audioop 395 [clinic start generated code]*/ 396 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=8fa8f6611be3591a]*/ 397 398 /*[clinic input] 399 audioop.getsample 400 401 fragment: Py_buffer 402 width: int 403 index: Py_ssize_t 404 / 405 406 Return the value of sample index from the fragment. 407 [clinic start generated code]*/ 408 409 static PyObject * 410 audioop_getsample_impl(PyObject *module, Py_buffer *fragment, int width, 411 Py_ssize_t index) 412 /*[clinic end generated code: output=8fe1b1775134f39a input=88edbe2871393549]*/ 413 { 414 int val; 415 416 if (!audioop_check_parameters(fragment->len, width)) 417 return NULL; 418 if (index < 0 || index >= fragment->len/width) { 419 PyErr_SetString(AudioopError, "Index out of range"); 420 return NULL; 421 } 422 val = GETRAWSAMPLE(width, fragment->buf, index*width); 423 return PyLong_FromLong(val); 424 } 425 426 /*[clinic input] 427 audioop.max 428 429 fragment: Py_buffer 430 width: int 431 / 432 433 Return the maximum of the absolute value of all samples in a fragment. 434 [clinic start generated code]*/ 435 436 static PyObject * 437 audioop_max_impl(PyObject *module, Py_buffer *fragment, int width) 438 /*[clinic end generated code: output=e6c5952714f1c3f0 input=32bea5ea0ac8c223]*/ 439 { 440 Py_ssize_t i; 441 unsigned int absval, max = 0; 442 443 if (!audioop_check_parameters(fragment->len, width)) 444 return NULL; 445 for (i = 0; i < fragment->len; i += width) { 446 int val = GETRAWSAMPLE(width, fragment->buf, i); 447 /* Cast to unsigned before negating. Unsigned overflow is well- 448 defined, but signed overflow is not. */ 449 if (val < 0) absval = (unsigned int)-(int64_t)val; 450 else absval = val; 451 if (absval > max) max = absval; 452 } 453 return PyLong_FromUnsignedLong(max); 454 } 455 456 /*[clinic input] 457 audioop.minmax 458 459 fragment: Py_buffer 460 width: int 461 / 462 463 Return the minimum and maximum values of all samples in the sound fragment. 464 [clinic start generated code]*/ 465 466 static PyObject * 467 audioop_minmax_impl(PyObject *module, Py_buffer *fragment, int width) 468 /*[clinic end generated code: output=473fda66b15c836e input=89848e9b927a0696]*/ 469 { 470 Py_ssize_t i; 471 /* -1 trick below is needed on Windows to support -0x80000000 without 472 a warning */ 473 int min = 0x7fffffff, max = -0x7FFFFFFF-1; 474 475 if (!audioop_check_parameters(fragment->len, width)) 476 return NULL; 477 for (i = 0; i < fragment->len; i += width) { 478 int val = GETRAWSAMPLE(width, fragment->buf, i); 479 if (val > max) max = val; 480 if (val < min) min = val; 481 } 482 return Py_BuildValue("(ii)", min, max); 483 } 484 485 /*[clinic input] 486 audioop.avg 487 488 fragment: Py_buffer 489 width: int 490 / 491 492 Return the average over all samples in the fragment. 493 [clinic start generated code]*/ 494 495 static PyObject * 496 audioop_avg_impl(PyObject *module, Py_buffer *fragment, int width) 497 /*[clinic end generated code: output=4410a4c12c3586e6 input=1114493c7611334d]*/ 498 { 499 Py_ssize_t i; 500 int avg; 501 double sum = 0.0; 502 503 if (!audioop_check_parameters(fragment->len, width)) 504 return NULL; 505 for (i = 0; i < fragment->len; i += width) 506 sum += GETRAWSAMPLE(width, fragment->buf, i); 507 if (fragment->len == 0) 508 avg = 0; 509 else 510 avg = (int)floor(sum / (double)(fragment->len/width)); 511 return PyLong_FromLong(avg); 512 } 513 514 /*[clinic input] 515 audioop.rms 516 517 fragment: Py_buffer 518 width: int 519 / 520 521 Return the root-mean-square of the fragment, i.e. sqrt(sum(S_i^2)/n). 522 [clinic start generated code]*/ 523 524 static PyObject * 525 audioop_rms_impl(PyObject *module, Py_buffer *fragment, int width) 526 /*[clinic end generated code: output=1e7871c826445698 input=4cc57c6c94219d78]*/ 527 { 528 Py_ssize_t i; 529 unsigned int res; 530 double sum_squares = 0.0; 531 532 if (!audioop_check_parameters(fragment->len, width)) 533 return NULL; 534 for (i = 0; i < fragment->len; i += width) { 535 double val = GETRAWSAMPLE(width, fragment->buf, i); 536 sum_squares += val*val; 537 } 538 if (fragment->len == 0) 539 res = 0; 540 else 541 res = (unsigned int)sqrt(sum_squares / (double)(fragment->len/width)); 542 return PyLong_FromUnsignedLong(res); 543 } 544 545 static double _sum2(const int16_t *a, const int16_t *b, Py_ssize_t len) 546 { 547 Py_ssize_t i; 548 double sum = 0.0; 549 550 for( i=0; i<len; i++) { 551 sum = sum + (double)a[i]*(double)b[i]; 552 } 553 return sum; 554 } 555 556 /* 557 ** Findfit tries to locate a sample within another sample. Its main use 558 ** is in echo-cancellation (to find the feedback of the output signal in 559 ** the input signal). 560 ** The method used is as follows: 561 ** 562 ** let R be the reference signal (length n) and A the input signal (length N) 563 ** with N > n, and let all sums be over i from 0 to n-1. 564 ** 565 ** Now, for each j in {0..N-n} we compute a factor fj so that -fj*R matches A 566 ** as good as possible, i.e. sum( (A[j+i]+fj*R[i])^2 ) is minimal. This 567 ** equation gives fj = sum( A[j+i]R[i] ) / sum(R[i]^2). 568 ** 569 ** Next, we compute the relative distance between the original signal and 570 ** the modified signal and minimize that over j: 571 ** vj = sum( (A[j+i]-fj*R[i])^2 ) / sum( A[j+i]^2 ) => 572 ** vj = ( sum(A[j+i]^2)*sum(R[i]^2) - sum(A[j+i]R[i])^2 ) / sum( A[j+i]^2 ) 573 ** 574 ** In the code variables correspond as follows: 575 ** cp1 A 576 ** cp2 R 577 ** len1 N 578 ** len2 n 579 ** aj_m1 A[j-1] 580 ** aj_lm1 A[j+n-1] 581 ** sum_ri_2 sum(R[i]^2) 582 ** sum_aij_2 sum(A[i+j]^2) 583 ** sum_aij_ri sum(A[i+j]R[i]) 584 ** 585 ** sum_ri is calculated once, sum_aij_2 is updated each step and sum_aij_ri 586 ** is completely recalculated each step. 587 */ 588 /*[clinic input] 589 audioop.findfit 590 591 fragment: Py_buffer 592 reference: Py_buffer 593 / 594 595 Try to match reference as well as possible to a portion of fragment. 596 [clinic start generated code]*/ 597 598 static PyObject * 599 audioop_findfit_impl(PyObject *module, Py_buffer *fragment, 600 Py_buffer *reference) 601 /*[clinic end generated code: output=5752306d83cbbada input=62c305605e183c9a]*/ 602 { 603 const int16_t *cp1, *cp2; 604 Py_ssize_t len1, len2; 605 Py_ssize_t j, best_j; 606 double aj_m1, aj_lm1; 607 double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor; 608 609 if (fragment->len & 1 || reference->len & 1) { 610 PyErr_SetString(AudioopError, "Strings should be even-sized"); 611 return NULL; 612 } 613 cp1 = (const int16_t *)fragment->buf; 614 len1 = fragment->len >> 1; 615 cp2 = (const int16_t *)reference->buf; 616 len2 = reference->len >> 1; 617 618 if (len1 < len2) { 619 PyErr_SetString(AudioopError, "First sample should be longer"); 620 return NULL; 621 } 622 sum_ri_2 = _sum2(cp2, cp2, len2); 623 sum_aij_2 = _sum2(cp1, cp1, len2); 624 sum_aij_ri = _sum2(cp1, cp2, len2); 625 626 result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2; 627 628 best_result = result; 629 best_j = 0; 630 631 for ( j=1; j<=len1-len2; j++) { 632 aj_m1 = (double)cp1[j-1]; 633 aj_lm1 = (double)cp1[j+len2-1]; 634 635 sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1; 636 sum_aij_ri = _sum2(cp1+j, cp2, len2); 637 638 result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) 639 / sum_aij_2; 640 641 if ( result < best_result ) { 642 best_result = result; 643 best_j = j; 644 } 645 646 } 647 648 factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2; 649 650 return Py_BuildValue("(nf)", best_j, factor); 651 } 652 653 /* 654 ** findfactor finds a factor f so that the energy in A-fB is minimal. 655 ** See the comment for findfit for details. 656 */ 657 /*[clinic input] 658 audioop.findfactor 659 660 fragment: Py_buffer 661 reference: Py_buffer 662 / 663 664 Return a factor F such that rms(add(fragment, mul(reference, -F))) is minimal. 665 [clinic start generated code]*/ 666 667 static PyObject * 668 audioop_findfactor_impl(PyObject *module, Py_buffer *fragment, 669 Py_buffer *reference) 670 /*[clinic end generated code: output=14ea95652c1afcf8 input=816680301d012b21]*/ 671 { 672 const int16_t *cp1, *cp2; 673 Py_ssize_t len; 674 double sum_ri_2, sum_aij_ri, result; 675 676 if (fragment->len & 1 || reference->len & 1) { 677 PyErr_SetString(AudioopError, "Strings should be even-sized"); 678 return NULL; 679 } 680 if (fragment->len != reference->len) { 681 PyErr_SetString(AudioopError, "Samples should be same size"); 682 return NULL; 683 } 684 cp1 = (const int16_t *)fragment->buf; 685 cp2 = (const int16_t *)reference->buf; 686 len = fragment->len >> 1; 687 sum_ri_2 = _sum2(cp2, cp2, len); 688 sum_aij_ri = _sum2(cp1, cp2, len); 689 690 result = sum_aij_ri / sum_ri_2; 691 692 return PyFloat_FromDouble(result); 693 } 694 695 /* 696 ** findmax returns the index of the n-sized segment of the input sample 697 ** that contains the most energy. 698 */ 699 /*[clinic input] 700 audioop.findmax 701 702 fragment: Py_buffer 703 length: Py_ssize_t 704 / 705 706 Search fragment for a slice of specified number of samples with maximum energy. 707 [clinic start generated code]*/ 708 709 static PyObject * 710 audioop_findmax_impl(PyObject *module, Py_buffer *fragment, 711 Py_ssize_t length) 712 /*[clinic end generated code: output=f008128233523040 input=2f304801ed42383c]*/ 713 { 714 const int16_t *cp1; 715 Py_ssize_t len1; 716 Py_ssize_t j, best_j; 717 double aj_m1, aj_lm1; 718 double result, best_result; 719 720 if (fragment->len & 1) { 721 PyErr_SetString(AudioopError, "Strings should be even-sized"); 722 return NULL; 723 } 724 cp1 = (const int16_t *)fragment->buf; 725 len1 = fragment->len >> 1; 726 727 if (length < 0 || len1 < length) { 728 PyErr_SetString(AudioopError, "Input sample should be longer"); 729 return NULL; 730 } 731 732 result = _sum2(cp1, cp1, length); 733 734 best_result = result; 735 best_j = 0; 736 737 for ( j=1; j<=len1-length; j++) { 738 aj_m1 = (double)cp1[j-1]; 739 aj_lm1 = (double)cp1[j+length-1]; 740 741 result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1; 742 743 if ( result > best_result ) { 744 best_result = result; 745 best_j = j; 746 } 747 748 } 749 750 return PyLong_FromSsize_t(best_j); 751 } 752 753 /*[clinic input] 754 audioop.avgpp 755 756 fragment: Py_buffer 757 width: int 758 / 759 760 Return the average peak-peak value over all samples in the fragment. 761 [clinic start generated code]*/ 762 763 static PyObject * 764 audioop_avgpp_impl(PyObject *module, Py_buffer *fragment, int width) 765 /*[clinic end generated code: output=269596b0d5ae0b2b input=0b3cceeae420a7d9]*/ 766 { 767 Py_ssize_t i; 768 int prevval, prevextremevalid = 0, prevextreme = 0; 769 double sum = 0.0; 770 unsigned int avg; 771 int diff, prevdiff, nextreme = 0; 772 773 if (!audioop_check_parameters(fragment->len, width)) 774 return NULL; 775 if (fragment->len <= width) 776 return PyLong_FromLong(0); 777 prevval = GETRAWSAMPLE(width, fragment->buf, 0); 778 prevdiff = 17; /* Anything != 0, 1 */ 779 for (i = width; i < fragment->len; i += width) { 780 int val = GETRAWSAMPLE(width, fragment->buf, i); 781 if (val != prevval) { 782 diff = val < prevval; 783 if (prevdiff == !diff) { 784 /* Derivative changed sign. Compute difference to last 785 ** extreme value and remember. 786 */ 787 if (prevextremevalid) { 788 if (prevval < prevextreme) 789 sum += (double)((unsigned int)prevextreme - 790 (unsigned int)prevval); 791 else 792 sum += (double)((unsigned int)prevval - 793 (unsigned int)prevextreme); 794 nextreme++; 795 } 796 prevextremevalid = 1; 797 prevextreme = prevval; 798 } 799 prevval = val; 800 prevdiff = diff; 801 } 802 } 803 if ( nextreme == 0 ) 804 avg = 0; 805 else 806 avg = (unsigned int)(sum / (double)nextreme); 807 return PyLong_FromUnsignedLong(avg); 808 } 809 810 /*[clinic input] 811 audioop.maxpp 812 813 fragment: Py_buffer 814 width: int 815 / 816 817 Return the maximum peak-peak value in the sound fragment. 818 [clinic start generated code]*/ 819 820 static PyObject * 821 audioop_maxpp_impl(PyObject *module, Py_buffer *fragment, int width) 822 /*[clinic end generated code: output=5b918ed5dbbdb978 input=671a13e1518f80a1]*/ 823 { 824 Py_ssize_t i; 825 int prevval, prevextremevalid = 0, prevextreme = 0; 826 unsigned int max = 0, extremediff; 827 int diff, prevdiff; 828 829 if (!audioop_check_parameters(fragment->len, width)) 830 return NULL; 831 if (fragment->len <= width) 832 return PyLong_FromLong(0); 833 prevval = GETRAWSAMPLE(width, fragment->buf, 0); 834 prevdiff = 17; /* Anything != 0, 1 */ 835 for (i = width; i < fragment->len; i += width) { 836 int val = GETRAWSAMPLE(width, fragment->buf, i); 837 if (val != prevval) { 838 diff = val < prevval; 839 if (prevdiff == !diff) { 840 /* Derivative changed sign. Compute difference to 841 ** last extreme value and remember. 842 */ 843 if (prevextremevalid) { 844 if (prevval < prevextreme) 845 extremediff = (unsigned int)prevextreme - 846 (unsigned int)prevval; 847 else 848 extremediff = (unsigned int)prevval - 849 (unsigned int)prevextreme; 850 if ( extremediff > max ) 851 max = extremediff; 852 } 853 prevextremevalid = 1; 854 prevextreme = prevval; 855 } 856 prevval = val; 857 prevdiff = diff; 858 } 859 } 860 return PyLong_FromUnsignedLong(max); 861 } 862 863 /*[clinic input] 864 audioop.cross 865 866 fragment: Py_buffer 867 width: int 868 / 869 870 Return the number of zero crossings in the fragment passed as an argument. 871 [clinic start generated code]*/ 872 873 static PyObject * 874 audioop_cross_impl(PyObject *module, Py_buffer *fragment, int width) 875 /*[clinic end generated code: output=5938dcdd74a1f431 input=b1b3f15b83f6b41a]*/ 876 { 877 Py_ssize_t i; 878 int prevval; 879 Py_ssize_t ncross; 880 881 if (!audioop_check_parameters(fragment->len, width)) 882 return NULL; 883 ncross = -1; 884 prevval = 17; /* Anything <> 0,1 */ 885 for (i = 0; i < fragment->len; i += width) { 886 int val = GETRAWSAMPLE(width, fragment->buf, i) < 0; 887 if (val != prevval) ncross++; 888 prevval = val; 889 } 890 return PyLong_FromSsize_t(ncross); 891 } 892 893 /*[clinic input] 894 audioop.mul 895 896 fragment: Py_buffer 897 width: int 898 factor: double 899 / 900 901 Return a fragment that has all samples in the original fragment multiplied by the floating-point value factor. 902 [clinic start generated code]*/ 903 904 static PyObject * 905 audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width, 906 double factor) 907 /*[clinic end generated code: output=6cd48fe796da0ea4 input=c726667baa157d3c]*/ 908 { 909 signed char *ncp; 910 Py_ssize_t i; 911 double maxval, minval; 912 PyObject *rv; 913 914 if (!audioop_check_parameters(fragment->len, width)) 915 return NULL; 916 917 maxval = (double) maxvals[width]; 918 minval = (double) minvals[width]; 919 920 rv = PyBytes_FromStringAndSize(NULL, fragment->len); 921 if (rv == NULL) 922 return NULL; 923 ncp = (signed char *)PyBytes_AsString(rv); 924 925 for (i = 0; i < fragment->len; i += width) { 926 double val = GETRAWSAMPLE(width, fragment->buf, i); 927 val *= factor; 928 val = floor(fbound(val, minval, maxval)); 929 SETRAWSAMPLE(width, ncp, i, (int)val); 930 } 931 return rv; 932 } 933 934 /*[clinic input] 935 audioop.tomono 936 937 fragment: Py_buffer 938 width: int 939 lfactor: double 940 rfactor: double 941 / 942 943 Convert a stereo fragment to a mono fragment. 944 [clinic start generated code]*/ 945 946 static PyObject * 947 audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width, 948 double lfactor, double rfactor) 949 /*[clinic end generated code: output=235c8277216d4e4e input=c4ec949b3f4dddfa]*/ 950 { 951 signed char *cp, *ncp; 952 Py_ssize_t len, i; 953 double maxval, minval; 954 PyObject *rv; 955 956 cp = fragment->buf; 957 len = fragment->len; 958 if (!audioop_check_parameters(len, width)) 959 return NULL; 960 if (((len / width) & 1) != 0) { 961 PyErr_SetString(AudioopError, "not a whole number of frames"); 962 return NULL; 963 } 964 965 maxval = (double) maxvals[width]; 966 minval = (double) minvals[width]; 967 968 rv = PyBytes_FromStringAndSize(NULL, len/2); 969 if (rv == NULL) 970 return NULL; 971 ncp = (signed char *)PyBytes_AsString(rv); 972 973 for (i = 0; i < len; i += width*2) { 974 double val1 = GETRAWSAMPLE(width, cp, i); 975 double val2 = GETRAWSAMPLE(width, cp, i + width); 976 double val = val1*lfactor + val2*rfactor; 977 val = floor(fbound(val, minval, maxval)); 978 SETRAWSAMPLE(width, ncp, i/2, val); 979 } 980 return rv; 981 } 982 983 /*[clinic input] 984 audioop.tostereo 985 986 fragment: Py_buffer 987 width: int 988 lfactor: double 989 rfactor: double 990 / 991 992 Generate a stereo fragment from a mono fragment. 993 [clinic start generated code]*/ 994 995 static PyObject * 996 audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width, 997 double lfactor, double rfactor) 998 /*[clinic end generated code: output=046f13defa5f1595 input=27b6395ebfdff37a]*/ 999 { 1000 signed char *ncp; 1001 Py_ssize_t i; 1002 double maxval, minval; 1003 PyObject *rv; 1004 1005 if (!audioop_check_parameters(fragment->len, width)) 1006 return NULL; 1007 1008 maxval = (double) maxvals[width]; 1009 minval = (double) minvals[width]; 1010 1011 if (fragment->len > PY_SSIZE_T_MAX/2) { 1012 PyErr_SetString(PyExc_MemoryError, 1013 "not enough memory for output buffer"); 1014 return NULL; 1015 } 1016 1017 rv = PyBytes_FromStringAndSize(NULL, fragment->len*2); 1018 if (rv == NULL) 1019 return NULL; 1020 ncp = (signed char *)PyBytes_AsString(rv); 1021 1022 for (i = 0; i < fragment->len; i += width) { 1023 double val = GETRAWSAMPLE(width, fragment->buf, i); 1024 int val1 = (int)floor(fbound(val*lfactor, minval, maxval)); 1025 int val2 = (int)floor(fbound(val*rfactor, minval, maxval)); 1026 SETRAWSAMPLE(width, ncp, i*2, val1); 1027 SETRAWSAMPLE(width, ncp, i*2 + width, val2); 1028 } 1029 return rv; 1030 } 1031 1032 /*[clinic input] 1033 audioop.add 1034 1035 fragment1: Py_buffer 1036 fragment2: Py_buffer 1037 width: int 1038 / 1039 1040 Return a fragment which is the addition of the two samples passed as parameters. 1041 [clinic start generated code]*/ 1042 1043 static PyObject * 1044 audioop_add_impl(PyObject *module, Py_buffer *fragment1, 1045 Py_buffer *fragment2, int width) 1046 /*[clinic end generated code: output=60140af4d1aab6f2 input=4a8d4bae4c1605c7]*/ 1047 { 1048 signed char *ncp; 1049 Py_ssize_t i; 1050 int minval, maxval, newval; 1051 PyObject *rv; 1052 1053 if (!audioop_check_parameters(fragment1->len, width)) 1054 return NULL; 1055 if (fragment1->len != fragment2->len) { 1056 PyErr_SetString(AudioopError, "Lengths should be the same"); 1057 return NULL; 1058 } 1059 1060 maxval = maxvals[width]; 1061 minval = minvals[width]; 1062 1063 rv = PyBytes_FromStringAndSize(NULL, fragment1->len); 1064 if (rv == NULL) 1065 return NULL; 1066 ncp = (signed char *)PyBytes_AsString(rv); 1067 1068 for (i = 0; i < fragment1->len; i += width) { 1069 int val1 = GETRAWSAMPLE(width, fragment1->buf, i); 1070 int val2 = GETRAWSAMPLE(width, fragment2->buf, i); 1071 1072 if (width < 4) { 1073 newval = val1 + val2; 1074 /* truncate in case of overflow */ 1075 if (newval > maxval) 1076 newval = maxval; 1077 else if (newval < minval) 1078 newval = minval; 1079 } 1080 else { 1081 double fval = (double)val1 + (double)val2; 1082 /* truncate in case of overflow */ 1083 newval = (int)floor(fbound(fval, minval, maxval)); 1084 } 1085 1086 SETRAWSAMPLE(width, ncp, i, newval); 1087 } 1088 return rv; 1089 } 1090 1091 /*[clinic input] 1092 audioop.bias 1093 1094 fragment: Py_buffer 1095 width: int 1096 bias: int 1097 / 1098 1099 Return a fragment that is the original fragment with a bias added to each sample. 1100 [clinic start generated code]*/ 1101 1102 static PyObject * 1103 audioop_bias_impl(PyObject *module, Py_buffer *fragment, int width, int bias) 1104 /*[clinic end generated code: output=6e0aa8f68f045093 input=2b5cce5c3bb4838c]*/ 1105 { 1106 signed char *ncp; 1107 Py_ssize_t i; 1108 unsigned int val = 0, mask; 1109 PyObject *rv; 1110 1111 if (!audioop_check_parameters(fragment->len, width)) 1112 return NULL; 1113 1114 rv = PyBytes_FromStringAndSize(NULL, fragment->len); 1115 if (rv == NULL) 1116 return NULL; 1117 ncp = (signed char *)PyBytes_AsString(rv); 1118 1119 mask = masks[width]; 1120 1121 for (i = 0; i < fragment->len; i += width) { 1122 if (width == 1) 1123 val = GETINTX(unsigned char, fragment->buf, i); 1124 else if (width == 2) 1125 val = GETINTX(uint16_t, fragment->buf, i); 1126 else if (width == 3) 1127 val = ((unsigned int)GETINT24(fragment->buf, i)) & 0xffffffu; 1128 else { 1129 assert(width == 4); 1130 val = GETINTX(uint32_t, fragment->buf, i); 1131 } 1132 1133 val += (unsigned int)bias; 1134 /* wrap around in case of overflow */ 1135 val &= mask; 1136 1137 if (width == 1) 1138 SETINTX(unsigned char, ncp, i, val); 1139 else if (width == 2) 1140 SETINTX(uint16_t, ncp, i, val); 1141 else if (width == 3) 1142 SETINT24(ncp, i, (int)val); 1143 else { 1144 assert(width == 4); 1145 SETINTX(uint32_t, ncp, i, val); 1146 } 1147 } 1148 return rv; 1149 } 1150 1151 /*[clinic input] 1152 audioop.reverse 1153 1154 fragment: Py_buffer 1155 width: int 1156 / 1157 1158 Reverse the samples in a fragment and returns the modified fragment. 1159 [clinic start generated code]*/ 1160 1161 static PyObject * 1162 audioop_reverse_impl(PyObject *module, Py_buffer *fragment, int width) 1163 /*[clinic end generated code: output=b44135698418da14 input=668f890cf9f9d225]*/ 1164 { 1165 unsigned char *ncp; 1166 Py_ssize_t i; 1167 PyObject *rv; 1168 1169 if (!audioop_check_parameters(fragment->len, width)) 1170 return NULL; 1171 1172 rv = PyBytes_FromStringAndSize(NULL, fragment->len); 1173 if (rv == NULL) 1174 return NULL; 1175 ncp = (unsigned char *)PyBytes_AsString(rv); 1176 1177 for (i = 0; i < fragment->len; i += width) { 1178 int val = GETRAWSAMPLE(width, fragment->buf, i); 1179 SETRAWSAMPLE(width, ncp, fragment->len - i - width, val); 1180 } 1181 return rv; 1182 } 1183 1184 /*[clinic input] 1185 audioop.byteswap 1186 1187 fragment: Py_buffer 1188 width: int 1189 / 1190 1191 Convert big-endian samples to little-endian and vice versa. 1192 [clinic start generated code]*/ 1193 1194 static PyObject * 1195 audioop_byteswap_impl(PyObject *module, Py_buffer *fragment, int width) 1196 /*[clinic end generated code: output=50838a9e4b87cd4d input=fae7611ceffa5c82]*/ 1197 { 1198 unsigned char *ncp; 1199 Py_ssize_t i; 1200 PyObject *rv; 1201 1202 if (!audioop_check_parameters(fragment->len, width)) 1203 return NULL; 1204 1205 rv = PyBytes_FromStringAndSize(NULL, fragment->len); 1206 if (rv == NULL) 1207 return NULL; 1208 ncp = (unsigned char *)PyBytes_AsString(rv); 1209 1210 for (i = 0; i < fragment->len; i += width) { 1211 int j; 1212 for (j = 0; j < width; j++) 1213 ncp[i + width - 1 - j] = ((unsigned char *)fragment->buf)[i + j]; 1214 } 1215 return rv; 1216 } 1217 1218 /*[clinic input] 1219 audioop.lin2lin 1220 1221 fragment: Py_buffer 1222 width: int 1223 newwidth: int 1224 / 1225 1226 Convert samples between 1-, 2-, 3- and 4-byte formats. 1227 [clinic start generated code]*/ 1228 1229 static PyObject * 1230 audioop_lin2lin_impl(PyObject *module, Py_buffer *fragment, int width, 1231 int newwidth) 1232 /*[clinic end generated code: output=17b14109248f1d99 input=5ce08c8aa2f24d96]*/ 1233 { 1234 unsigned char *ncp; 1235 Py_ssize_t i, j; 1236 PyObject *rv; 1237 1238 if (!audioop_check_parameters(fragment->len, width)) 1239 return NULL; 1240 if (!audioop_check_size(newwidth)) 1241 return NULL; 1242 1243 if (fragment->len/width > PY_SSIZE_T_MAX/newwidth) { 1244 PyErr_SetString(PyExc_MemoryError, 1245 "not enough memory for output buffer"); 1246 return NULL; 1247 } 1248 rv = PyBytes_FromStringAndSize(NULL, (fragment->len/width)*newwidth); 1249 if (rv == NULL) 1250 return NULL; 1251 ncp = (unsigned char *)PyBytes_AsString(rv); 1252 1253 for (i = j = 0; i < fragment->len; i += width, j += newwidth) { 1254 int val = GETSAMPLE32(width, fragment->buf, i); 1255 SETSAMPLE32(newwidth, ncp, j, val); 1256 } 1257 return rv; 1258 } 1259 1260 static int 1261 gcd(int a, int b) 1262 { 1263 while (b > 0) { 1264 int tmp = a % b; 1265 a = b; 1266 b = tmp; 1267 } 1268 return a; 1269 } 1270 1271 /*[clinic input] 1272 audioop.ratecv 1273 1274 fragment: Py_buffer 1275 width: int 1276 nchannels: int 1277 inrate: int 1278 outrate: int 1279 state: object 1280 weightA: int = 1 1281 weightB: int = 0 1282 / 1283 1284 Convert the frame rate of the input fragment. 1285 [clinic start generated code]*/ 1286 1287 static PyObject * 1288 audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, 1289 int nchannels, int inrate, int outrate, PyObject *state, 1290 int weightA, int weightB) 1291 /*[clinic end generated code: output=624038e843243139 input=aff3acdc94476191]*/ 1292 { 1293 char *cp, *ncp; 1294 Py_ssize_t len; 1295 int chan, d, *prev_i, *cur_i, cur_o; 1296 PyObject *samps, *str, *rv = NULL; 1297 int bytes_per_frame; 1298 1299 if (!audioop_check_size(width)) 1300 return NULL; 1301 if (nchannels < 1) { 1302 PyErr_SetString(AudioopError, "# of channels should be >= 1"); 1303 return NULL; 1304 } 1305 if (width > INT_MAX / nchannels) { 1306 /* This overflow test is rigorously correct because 1307 both multiplicands are >= 1. Use the argument names 1308 from the docs for the error msg. */ 1309 PyErr_SetString(PyExc_OverflowError, 1310 "width * nchannels too big for a C int"); 1311 return NULL; 1312 } 1313 bytes_per_frame = width * nchannels; 1314 if (weightA < 1 || weightB < 0) { 1315 PyErr_SetString(AudioopError, 1316 "weightA should be >= 1, weightB should be >= 0"); 1317 return NULL; 1318 } 1319 assert(fragment->len >= 0); 1320 if (fragment->len % bytes_per_frame != 0) { 1321 PyErr_SetString(AudioopError, "not a whole number of frames"); 1322 return NULL; 1323 } 1324 if (inrate <= 0 || outrate <= 0) { 1325 PyErr_SetString(AudioopError, "sampling rate not > 0"); 1326 return NULL; 1327 } 1328 /* divide inrate and outrate by their greatest common divisor */ 1329 d = gcd(inrate, outrate); 1330 inrate /= d; 1331 outrate /= d; 1332 /* divide weightA and weightB by their greatest common divisor */ 1333 d = gcd(weightA, weightB); 1334 weightA /= d; 1335 weightB /= d; 1336 1337 if ((size_t)nchannels > SIZE_MAX/sizeof(int)) { 1338 PyErr_SetString(PyExc_MemoryError, 1339 "not enough memory for output buffer"); 1340 return NULL; 1341 } 1342 prev_i = (int *) PyMem_Malloc(nchannels * sizeof(int)); 1343 cur_i = (int *) PyMem_Malloc(nchannels * sizeof(int)); 1344 if (prev_i == NULL || cur_i == NULL) { 1345 (void) PyErr_NoMemory(); 1346 goto exit; 1347 } 1348 1349 len = fragment->len / bytes_per_frame; /* # of frames */ 1350 1351 if (state == Py_None) { 1352 d = -outrate; 1353 for (chan = 0; chan < nchannels; chan++) 1354 prev_i[chan] = cur_i[chan] = 0; 1355 } 1356 else { 1357 if (!PyArg_ParseTuple(state, 1358 "iO!;audioop.ratecv: illegal state argument", 1359 &d, &PyTuple_Type, &samps)) 1360 goto exit; 1361 if (PyTuple_Size(samps) != nchannels) { 1362 PyErr_SetString(AudioopError, 1363 "illegal state argument"); 1364 goto exit; 1365 } 1366 for (chan = 0; chan < nchannels; chan++) { 1367 if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan), 1368 "ii:ratecv", &prev_i[chan], 1369 &cur_i[chan])) 1370 goto exit; 1371 } 1372 } 1373 1374 /* str <- Space for the output buffer. */ 1375 if (len == 0) 1376 str = PyBytes_FromStringAndSize(NULL, 0); 1377 else { 1378 /* There are len input frames, so we need (mathematically) 1379 ceiling(len*outrate/inrate) output frames, and each frame 1380 requires bytes_per_frame bytes. Computing this 1381 without spurious overflow is the challenge; we can 1382 settle for a reasonable upper bound, though, in this 1383 case ceiling(len/inrate) * outrate. */ 1384 1385 /* compute ceiling(len/inrate) without overflow */ 1386 Py_ssize_t q = 1 + (len - 1) / inrate; 1387 if (outrate > PY_SSIZE_T_MAX / q / bytes_per_frame) 1388 str = NULL; 1389 else 1390 str = PyBytes_FromStringAndSize(NULL, 1391 q * outrate * bytes_per_frame); 1392 } 1393 if (str == NULL) { 1394 PyErr_SetString(PyExc_MemoryError, 1395 "not enough memory for output buffer"); 1396 goto exit; 1397 } 1398 ncp = PyBytes_AsString(str); 1399 cp = fragment->buf; 1400 1401 for (;;) { 1402 while (d < 0) { 1403 if (len == 0) { 1404 samps = PyTuple_New(nchannels); 1405 if (samps == NULL) 1406 goto exit; 1407 for (chan = 0; chan < nchannels; chan++) 1408 PyTuple_SetItem(samps, chan, 1409 Py_BuildValue("(ii)", 1410 prev_i[chan], 1411 cur_i[chan])); 1412 if (PyErr_Occurred()) 1413 goto exit; 1414 /* We have checked before that the length 1415 * of the string fits into int. */ 1416 len = (Py_ssize_t)(ncp - PyBytes_AsString(str)); 1417 rv = PyBytes_FromStringAndSize 1418 (PyBytes_AsString(str), len); 1419 Py_DECREF(str); 1420 str = rv; 1421 if (str == NULL) 1422 goto exit; 1423 rv = Py_BuildValue("(O(iO))", str, d, samps); 1424 Py_DECREF(samps); 1425 Py_DECREF(str); 1426 goto exit; /* return rv */ 1427 } 1428 for (chan = 0; chan < nchannels; chan++) { 1429 prev_i[chan] = cur_i[chan]; 1430 cur_i[chan] = GETSAMPLE32(width, cp, 0); 1431 cp += width; 1432 /* implements a simple digital filter */ 1433 cur_i[chan] = (int)( 1434 ((double)weightA * (double)cur_i[chan] + 1435 (double)weightB * (double)prev_i[chan]) / 1436 ((double)weightA + (double)weightB)); 1437 } 1438 len--; 1439 d += outrate; 1440 } 1441 while (d >= 0) { 1442 for (chan = 0; chan < nchannels; chan++) { 1443 cur_o = (int)(((double)prev_i[chan] * (double)d + 1444 (double)cur_i[chan] * (double)(outrate - d)) / 1445 (double)outrate); 1446 SETSAMPLE32(width, ncp, 0, cur_o); 1447 ncp += width; 1448 } 1449 d -= inrate; 1450 } 1451 } 1452 exit: 1453 PyMem_Free(prev_i); 1454 PyMem_Free(cur_i); 1455 return rv; 1456 } 1457 1458 /*[clinic input] 1459 audioop.lin2ulaw 1460 1461 fragment: Py_buffer 1462 width: int 1463 / 1464 1465 Convert samples in the audio fragment to u-LAW encoding. 1466 [clinic start generated code]*/ 1467 1468 static PyObject * 1469 audioop_lin2ulaw_impl(PyObject *module, Py_buffer *fragment, int width) 1470 /*[clinic end generated code: output=14fb62b16fe8ea8e input=2450d1b870b6bac2]*/ 1471 { 1472 unsigned char *ncp; 1473 Py_ssize_t i; 1474 PyObject *rv; 1475 1476 if (!audioop_check_parameters(fragment->len, width)) 1477 return NULL; 1478 1479 rv = PyBytes_FromStringAndSize(NULL, fragment->len/width); 1480 if (rv == NULL) 1481 return NULL; 1482 ncp = (unsigned char *)PyBytes_AsString(rv); 1483 1484 for (i = 0; i < fragment->len; i += width) { 1485 int val = GETSAMPLE32(width, fragment->buf, i); 1486 *ncp++ = st_14linear2ulaw(val >> 18); 1487 } 1488 return rv; 1489 } 1490 1491 /*[clinic input] 1492 audioop.ulaw2lin 1493 1494 fragment: Py_buffer 1495 width: int 1496 / 1497 1498 Convert sound fragments in u-LAW encoding to linearly encoded sound fragments. 1499 [clinic start generated code]*/ 1500 1501 static PyObject * 1502 audioop_ulaw2lin_impl(PyObject *module, Py_buffer *fragment, int width) 1503 /*[clinic end generated code: output=378356b047521ba2 input=45d53ddce5be7d06]*/ 1504 { 1505 unsigned char *cp; 1506 signed char *ncp; 1507 Py_ssize_t i; 1508 PyObject *rv; 1509 1510 if (!audioop_check_size(width)) 1511 return NULL; 1512 1513 if (fragment->len > PY_SSIZE_T_MAX/width) { 1514 PyErr_SetString(PyExc_MemoryError, 1515 "not enough memory for output buffer"); 1516 return NULL; 1517 } 1518 rv = PyBytes_FromStringAndSize(NULL, fragment->len*width); 1519 if (rv == NULL) 1520 return NULL; 1521 ncp = (signed char *)PyBytes_AsString(rv); 1522 1523 cp = fragment->buf; 1524 for (i = 0; i < fragment->len*width; i += width) { 1525 int val = st_ulaw2linear16(*cp++) << 16; 1526 SETSAMPLE32(width, ncp, i, val); 1527 } 1528 return rv; 1529 } 1530 1531 /*[clinic input] 1532 audioop.lin2alaw 1533 1534 fragment: Py_buffer 1535 width: int 1536 / 1537 1538 Convert samples in the audio fragment to a-LAW encoding. 1539 [clinic start generated code]*/ 1540 1541 static PyObject * 1542 audioop_lin2alaw_impl(PyObject *module, Py_buffer *fragment, int width) 1543 /*[clinic end generated code: output=d076f130121a82f0 input=ffb1ef8bb39da945]*/ 1544 { 1545 unsigned char *ncp; 1546 Py_ssize_t i; 1547 PyObject *rv; 1548 1549 if (!audioop_check_parameters(fragment->len, width)) 1550 return NULL; 1551 1552 rv = PyBytes_FromStringAndSize(NULL, fragment->len/width); 1553 if (rv == NULL) 1554 return NULL; 1555 ncp = (unsigned char *)PyBytes_AsString(rv); 1556 1557 for (i = 0; i < fragment->len; i += width) { 1558 int val = GETSAMPLE32(width, fragment->buf, i); 1559 *ncp++ = st_linear2alaw(val >> 19); 1560 } 1561 return rv; 1562 } 1563 1564 /*[clinic input] 1565 audioop.alaw2lin 1566 1567 fragment: Py_buffer 1568 width: int 1569 / 1570 1571 Convert sound fragments in a-LAW encoding to linearly encoded sound fragments. 1572 [clinic start generated code]*/ 1573 1574 static PyObject * 1575 audioop_alaw2lin_impl(PyObject *module, Py_buffer *fragment, int width) 1576 /*[clinic end generated code: output=85c365ec559df647 input=4140626046cd1772]*/ 1577 { 1578 unsigned char *cp; 1579 signed char *ncp; 1580 Py_ssize_t i; 1581 int val; 1582 PyObject *rv; 1583 1584 if (!audioop_check_size(width)) 1585 return NULL; 1586 1587 if (fragment->len > PY_SSIZE_T_MAX/width) { 1588 PyErr_SetString(PyExc_MemoryError, 1589 "not enough memory for output buffer"); 1590 return NULL; 1591 } 1592 rv = PyBytes_FromStringAndSize(NULL, fragment->len*width); 1593 if (rv == NULL) 1594 return NULL; 1595 ncp = (signed char *)PyBytes_AsString(rv); 1596 cp = fragment->buf; 1597 1598 for (i = 0; i < fragment->len*width; i += width) { 1599 val = st_alaw2linear16(*cp++) << 16; 1600 SETSAMPLE32(width, ncp, i, val); 1601 } 1602 return rv; 1603 } 1604 1605 /*[clinic input] 1606 audioop.lin2adpcm 1607 1608 fragment: Py_buffer 1609 width: int 1610 state: object 1611 / 1612 1613 Convert samples to 4 bit Intel/DVI ADPCM encoding. 1614 [clinic start generated code]*/ 1615 1616 static PyObject * 1617 audioop_lin2adpcm_impl(PyObject *module, Py_buffer *fragment, int width, 1618 PyObject *state) 1619 /*[clinic end generated code: output=cc19f159f16c6793 input=12919d549b90c90a]*/ 1620 { 1621 signed char *ncp; 1622 Py_ssize_t i; 1623 int step, valpred, delta, 1624 index, sign, vpdiff, diff; 1625 PyObject *rv = NULL, *str; 1626 int outputbuffer = 0, bufferstep; 1627 1628 if (!audioop_check_parameters(fragment->len, width)) 1629 return NULL; 1630 1631 /* Decode state, should have (value, step) */ 1632 if ( state == Py_None ) { 1633 /* First time, it seems. Set defaults */ 1634 valpred = 0; 1635 index = 0; 1636 } 1637 else if (!PyTuple_Check(state)) { 1638 PyErr_SetString(PyExc_TypeError, "state must be a tuple or None"); 1639 return NULL; 1640 } 1641 else if (!PyArg_ParseTuple(state, "ii", &valpred, &index)) { 1642 return NULL; 1643 } 1644 else if (valpred >= 0x8000 || valpred < -0x8000 || 1645 (size_t)index >= Py_ARRAY_LENGTH(stepsizeTable)) { 1646 PyErr_SetString(PyExc_ValueError, "bad state"); 1647 return NULL; 1648 } 1649 1650 str = PyBytes_FromStringAndSize(NULL, fragment->len/(width*2)); 1651 if (str == NULL) 1652 return NULL; 1653 ncp = (signed char *)PyBytes_AsString(str); 1654 1655 step = stepsizeTable[index]; 1656 bufferstep = 1; 1657 1658 for (i = 0; i < fragment->len; i += width) { 1659 int val = GETSAMPLE32(width, fragment->buf, i) >> 16; 1660 1661 /* Step 1 - compute difference with previous value */ 1662 if (val < valpred) { 1663 diff = valpred - val; 1664 sign = 8; 1665 } 1666 else { 1667 diff = val - valpred; 1668 sign = 0; 1669 } 1670 1671 /* Step 2 - Divide and clamp */ 1672 /* Note: 1673 ** This code *approximately* computes: 1674 ** delta = diff*4/step; 1675 ** vpdiff = (delta+0.5)*step/4; 1676 ** but in shift step bits are dropped. The net result of this 1677 ** is that even if you have fast mul/div hardware you cannot 1678 ** put it to good use since the fixup would be too expensive. 1679 */ 1680 delta = 0; 1681 vpdiff = (step >> 3); 1682 1683 if ( diff >= step ) { 1684 delta = 4; 1685 diff -= step; 1686 vpdiff += step; 1687 } 1688 step >>= 1; 1689 if ( diff >= step ) { 1690 delta |= 2; 1691 diff -= step; 1692 vpdiff += step; 1693 } 1694 step >>= 1; 1695 if ( diff >= step ) { 1696 delta |= 1; 1697 vpdiff += step; 1698 } 1699 1700 /* Step 3 - Update previous value */ 1701 if ( sign ) 1702 valpred -= vpdiff; 1703 else 1704 valpred += vpdiff; 1705 1706 /* Step 4 - Clamp previous value to 16 bits */ 1707 if ( valpred > 32767 ) 1708 valpred = 32767; 1709 else if ( valpred < -32768 ) 1710 valpred = -32768; 1711 1712 /* Step 5 - Assemble value, update index and step values */ 1713 delta |= sign; 1714 1715 index += indexTable[delta]; 1716 if ( index < 0 ) index = 0; 1717 if ( index > 88 ) index = 88; 1718 step = stepsizeTable[index]; 1719 1720 /* Step 6 - Output value */ 1721 if ( bufferstep ) { 1722 outputbuffer = (delta << 4) & 0xf0; 1723 } else { 1724 *ncp++ = (delta & 0x0f) | outputbuffer; 1725 } 1726 bufferstep = !bufferstep; 1727 } 1728 rv = Py_BuildValue("(O(ii))", str, valpred, index); 1729 Py_DECREF(str); 1730 return rv; 1731 } 1732 1733 /*[clinic input] 1734 audioop.adpcm2lin 1735 1736 fragment: Py_buffer 1737 width: int 1738 state: object 1739 / 1740 1741 Decode an Intel/DVI ADPCM coded fragment to a linear fragment. 1742 [clinic start generated code]*/ 1743 1744 static PyObject * 1745 audioop_adpcm2lin_impl(PyObject *module, Py_buffer *fragment, int width, 1746 PyObject *state) 1747 /*[clinic end generated code: output=3440ea105acb3456 input=f5221144f5ca9ef0]*/ 1748 { 1749 signed char *cp; 1750 signed char *ncp; 1751 Py_ssize_t i, outlen; 1752 int valpred, step, delta, index, sign, vpdiff; 1753 PyObject *rv, *str; 1754 int inputbuffer = 0, bufferstep; 1755 1756 if (!audioop_check_size(width)) 1757 return NULL; 1758 1759 /* Decode state, should have (value, step) */ 1760 if ( state == Py_None ) { 1761 /* First time, it seems. Set defaults */ 1762 valpred = 0; 1763 index = 0; 1764 } 1765 else if (!PyTuple_Check(state)) { 1766 PyErr_SetString(PyExc_TypeError, "state must be a tuple or None"); 1767 return NULL; 1768 } 1769 else if (!PyArg_ParseTuple(state, "ii", &valpred, &index)) { 1770 return NULL; 1771 } 1772 else if (valpred >= 0x8000 || valpred < -0x8000 || 1773 (size_t)index >= Py_ARRAY_LENGTH(stepsizeTable)) { 1774 PyErr_SetString(PyExc_ValueError, "bad state"); 1775 return NULL; 1776 } 1777 1778 if (fragment->len > (PY_SSIZE_T_MAX/2)/width) { 1779 PyErr_SetString(PyExc_MemoryError, 1780 "not enough memory for output buffer"); 1781 return NULL; 1782 } 1783 outlen = fragment->len*width*2; 1784 str = PyBytes_FromStringAndSize(NULL, outlen); 1785 if (str == NULL) 1786 return NULL; 1787 ncp = (signed char *)PyBytes_AsString(str); 1788 cp = fragment->buf; 1789 1790 step = stepsizeTable[index]; 1791 bufferstep = 0; 1792 1793 for (i = 0; i < outlen; i += width) { 1794 /* Step 1 - get the delta value and compute next index */ 1795 if ( bufferstep ) { 1796 delta = inputbuffer & 0xf; 1797 } else { 1798 inputbuffer = *cp++; 1799 delta = (inputbuffer >> 4) & 0xf; 1800 } 1801 1802 bufferstep = !bufferstep; 1803 1804 /* Step 2 - Find new index value (for later) */ 1805 index += indexTable[delta]; 1806 if ( index < 0 ) index = 0; 1807 if ( index > 88 ) index = 88; 1808 1809 /* Step 3 - Separate sign and magnitude */ 1810 sign = delta & 8; 1811 delta = delta & 7; 1812 1813 /* Step 4 - Compute difference and new predicted value */ 1814 /* 1815 ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment 1816 ** in adpcm_coder. 1817 */ 1818 vpdiff = step >> 3; 1819 if ( delta & 4 ) vpdiff += step; 1820 if ( delta & 2 ) vpdiff += step>>1; 1821 if ( delta & 1 ) vpdiff += step>>2; 1822 1823 if ( sign ) 1824 valpred -= vpdiff; 1825 else 1826 valpred += vpdiff; 1827 1828 /* Step 5 - clamp output value */ 1829 if ( valpred > 32767 ) 1830 valpred = 32767; 1831 else if ( valpred < -32768 ) 1832 valpred = -32768; 1833 1834 /* Step 6 - Update step value */ 1835 step = stepsizeTable[index]; 1836 1837 /* Step 6 - Output value */ 1838 SETSAMPLE32(width, ncp, i, valpred << 16); 1839 } 1840 1841 rv = Py_BuildValue("(O(ii))", str, valpred, index); 1842 Py_DECREF(str); 1843 return rv; 1844 } 1845 1846 #include "clinic/audioop.c.h" 1847 1848 static PyMethodDef audioop_methods[] = { 1849 AUDIOOP_MAX_METHODDEF 1850 AUDIOOP_MINMAX_METHODDEF 1851 AUDIOOP_AVG_METHODDEF 1852 AUDIOOP_MAXPP_METHODDEF 1853 AUDIOOP_AVGPP_METHODDEF 1854 AUDIOOP_RMS_METHODDEF 1855 AUDIOOP_FINDFIT_METHODDEF 1856 AUDIOOP_FINDMAX_METHODDEF 1857 AUDIOOP_FINDFACTOR_METHODDEF 1858 AUDIOOP_CROSS_METHODDEF 1859 AUDIOOP_MUL_METHODDEF 1860 AUDIOOP_ADD_METHODDEF 1861 AUDIOOP_BIAS_METHODDEF 1862 AUDIOOP_ULAW2LIN_METHODDEF 1863 AUDIOOP_LIN2ULAW_METHODDEF 1864 AUDIOOP_ALAW2LIN_METHODDEF 1865 AUDIOOP_LIN2ALAW_METHODDEF 1866 AUDIOOP_LIN2LIN_METHODDEF 1867 AUDIOOP_ADPCM2LIN_METHODDEF 1868 AUDIOOP_LIN2ADPCM_METHODDEF 1869 AUDIOOP_TOMONO_METHODDEF 1870 AUDIOOP_TOSTEREO_METHODDEF 1871 AUDIOOP_GETSAMPLE_METHODDEF 1872 AUDIOOP_REVERSE_METHODDEF 1873 AUDIOOP_BYTESWAP_METHODDEF 1874 AUDIOOP_RATECV_METHODDEF 1875 { 0, 0 } 1876 }; 1877 1878 1879 static struct PyModuleDef audioopmodule = { 1880 PyModuleDef_HEAD_INIT, 1881 "audioop", 1882 NULL, 1883 -1, 1884 audioop_methods, 1885 NULL, 1886 NULL, 1887 NULL, 1888 NULL 1889 }; 1890 1891 PyMODINIT_FUNC 1892 PyInit_audioop(void) 1893 { 1894 PyObject *m, *d; 1895 m = PyModule_Create(&audioopmodule); 1896 if (m == NULL) 1897 return NULL; 1898 d = PyModule_GetDict(m); 1899 if (d == NULL) 1900 return NULL; 1901 AudioopError = PyErr_NewException("audioop.error", NULL, NULL); 1902 if (AudioopError != NULL) 1903 PyDict_SetItemString(d,"error",AudioopError); 1904 return m; 1905 } 1906