@@ -375,15 +375,22 @@ static PyModuleDef audioopmodule;
375
375
376
376
typedef struct {
377
377
PyObject * AudioopError ;
378
- } _audioopstate ;
378
+ } audioop_state ;
379
379
380
- #define _audioopstate (o ) ((_audioopstate *)PyModule_GetState(o))
380
+ static inline audioop_state *
381
+ get_audioop_state (PyObject * module )
382
+ {
383
+ void * state = PyModule_GetState (module );
384
+ assert (state != NULL );
385
+ return (audioop_state * )state ;
386
+ }
381
387
382
388
static int
383
389
audioop_check_size (PyObject * module , int size )
384
390
{
385
391
if (size < 1 || size > 4 ) {
386
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Size should be 1, 2, 3 or 4" );
392
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
393
+ "Size should be 1, 2, 3 or 4" );
387
394
return 0 ;
388
395
}
389
396
else
@@ -396,7 +403,8 @@ audioop_check_parameters(PyObject *module, Py_ssize_t len, int size)
396
403
if (!audioop_check_size (module , size ))
397
404
return 0 ;
398
405
if (len % size != 0 ) {
399
- PyErr_SetString (_audioopstate (module )-> AudioopError , "not a whole number of frames" );
406
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
407
+ "not a whole number of frames" );
400
408
return 0 ;
401
409
}
402
410
return 1 ;
@@ -428,7 +436,8 @@ audioop_getsample_impl(PyObject *module, Py_buffer *fragment, int width,
428
436
if (!audioop_check_parameters (module , fragment -> len , width ))
429
437
return NULL ;
430
438
if (index < 0 || index >= fragment -> len /width ) {
431
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Index out of range" );
439
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
440
+ "Index out of range" );
432
441
return NULL ;
433
442
}
434
443
val = GETRAWSAMPLE (width , fragment -> buf , index * width );
@@ -619,7 +628,8 @@ audioop_findfit_impl(PyObject *module, Py_buffer *fragment,
619
628
double sum_ri_2 , sum_aij_2 , sum_aij_ri , result , best_result , factor ;
620
629
621
630
if (fragment -> len & 1 || reference -> len & 1 ) {
622
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Strings should be even-sized" );
631
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
632
+ "Strings should be even-sized" );
623
633
return NULL ;
624
634
}
625
635
cp1 = (const int16_t * )fragment -> buf ;
@@ -628,7 +638,8 @@ audioop_findfit_impl(PyObject *module, Py_buffer *fragment,
628
638
len2 = reference -> len >> 1 ;
629
639
630
640
if (len1 < len2 ) {
631
- PyErr_SetString (_audioopstate (module )-> AudioopError , "First sample should be longer" );
641
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
642
+ "First sample should be longer" );
632
643
return NULL ;
633
644
}
634
645
sum_ri_2 = _sum2 (cp2 , cp2 , len2 );
@@ -686,11 +697,13 @@ audioop_findfactor_impl(PyObject *module, Py_buffer *fragment,
686
697
double sum_ri_2 , sum_aij_ri , result ;
687
698
688
699
if (fragment -> len & 1 || reference -> len & 1 ) {
689
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Strings should be even-sized" );
700
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
701
+ "Strings should be even-sized" );
690
702
return NULL ;
691
703
}
692
704
if (fragment -> len != reference -> len ) {
693
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Samples should be same size" );
705
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
706
+ "Samples should be same size" );
694
707
return NULL ;
695
708
}
696
709
cp1 = (const int16_t * )fragment -> buf ;
@@ -730,14 +743,16 @@ audioop_findmax_impl(PyObject *module, Py_buffer *fragment,
730
743
double result , best_result ;
731
744
732
745
if (fragment -> len & 1 ) {
733
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Strings should be even-sized" );
746
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
747
+ "Strings should be even-sized" );
734
748
return NULL ;
735
749
}
736
750
cp1 = (const int16_t * )fragment -> buf ;
737
751
len1 = fragment -> len >> 1 ;
738
752
739
753
if (length < 0 || len1 < length ) {
740
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Input sample should be longer" );
754
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
755
+ "Input sample should be longer" );
741
756
return NULL ;
742
757
}
743
758
@@ -969,7 +984,8 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width,
969
984
if (!audioop_check_parameters (module , len , width ))
970
985
return NULL ;
971
986
if (((len / width ) & 1 ) != 0 ) {
972
- PyErr_SetString (_audioopstate (module )-> AudioopError , "not a whole number of frames" );
987
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
988
+ "not a whole number of frames" );
973
989
return NULL ;
974
990
}
975
991
@@ -1064,7 +1080,8 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1,
1064
1080
if (!audioop_check_parameters (module , fragment1 -> len , width ))
1065
1081
return NULL ;
1066
1082
if (fragment1 -> len != fragment2 -> len ) {
1067
- PyErr_SetString (_audioopstate (module )-> AudioopError , "Lengths should be the same" );
1083
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
1084
+ "Lengths should be the same" );
1068
1085
return NULL ;
1069
1086
}
1070
1087
@@ -1310,7 +1327,8 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width,
1310
1327
if (!audioop_check_size (module , width ))
1311
1328
return NULL ;
1312
1329
if (nchannels < 1 ) {
1313
- PyErr_SetString (_audioopstate (module )-> AudioopError , "# of channels should be >= 1" );
1330
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
1331
+ "# of channels should be >= 1" );
1314
1332
return NULL ;
1315
1333
}
1316
1334
if (width > INT_MAX / nchannels ) {
@@ -1323,17 +1341,19 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width,
1323
1341
}
1324
1342
bytes_per_frame = width * nchannels ;
1325
1343
if (weightA < 1 || weightB < 0 ) {
1326
- PyErr_SetString (_audioopstate (module )-> AudioopError ,
1344
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
1327
1345
"weightA should be >= 1, weightB should be >= 0" );
1328
1346
return NULL ;
1329
1347
}
1330
1348
assert (fragment -> len >= 0 );
1331
1349
if (fragment -> len % bytes_per_frame != 0 ) {
1332
- PyErr_SetString (_audioopstate (module )-> AudioopError , "not a whole number of frames" );
1350
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
1351
+ "not a whole number of frames" );
1333
1352
return NULL ;
1334
1353
}
1335
1354
if (inrate <= 0 || outrate <= 0 ) {
1336
- PyErr_SetString (_audioopstate (module )-> AudioopError , "sampling rate not > 0" );
1355
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
1356
+ "sampling rate not > 0" );
1337
1357
return NULL ;
1338
1358
}
1339
1359
/* divide inrate and outrate by their greatest common divisor */
@@ -1374,7 +1394,7 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width,
1374
1394
& d , & PyTuple_Type , & samps ))
1375
1395
goto exit ;
1376
1396
if (PyTuple_Size (samps ) != nchannels ) {
1377
- PyErr_SetString (_audioopstate (module )-> AudioopError ,
1397
+ PyErr_SetString (get_audioop_state (module )-> AudioopError ,
1378
1398
"illegal state argument" );
1379
1399
goto exit ;
1380
1400
}
@@ -1903,31 +1923,61 @@ static PyMethodDef audioop_methods[] = {
1903
1923
};
1904
1924
1905
1925
static int
1906
- audioop_traverse (PyObject * m , visitproc visit , void * arg ) {
1907
- _audioopstate * state = _audioopstate (m );
1908
- if (state != NULL )
1926
+ audioop_traverse (PyObject * module , visitproc visit , void * arg )
1927
+ {
1928
+ audioop_state * state = (audioop_state * )PyModule_GetState (module );
1929
+ if (state ) {
1909
1930
Py_VISIT (state -> AudioopError );
1931
+ }
1910
1932
return 0 ;
1911
1933
}
1934
+
1912
1935
static int
1913
- audioop_clear (PyObject * m ) {
1914
- _audioopstate * state = _audioopstate (m );
1915
- if (state != NULL )
1936
+ audioop_clear (PyObject * module )
1937
+ {
1938
+ audioop_state * state = (audioop_state * )PyModule_GetState (module );
1939
+ if (state ) {
1916
1940
Py_CLEAR (state -> AudioopError );
1941
+ }
1917
1942
return 0 ;
1918
1943
}
1944
+
1919
1945
static void
1920
- audioop_free (void * m ) {
1921
- audioop_clear ((PyObject * )m );
1946
+ audioop_free (void * module ) {
1947
+ audioop_clear ((PyObject * )module );
1922
1948
}
1923
1949
1950
+ static int
1951
+ audioop_exec (PyObject * module )
1952
+ {
1953
+ audioop_state * state = get_audioop_state (module );
1954
+
1955
+ state -> AudioopError = PyErr_NewException ("audioop.error" , NULL , NULL );
1956
+ if (state -> AudioopError == NULL ) {
1957
+ return -1 ;
1958
+ }
1959
+
1960
+ Py_INCREF (state -> AudioopError );
1961
+ if (PyModule_AddObject (module , "error" , state -> AudioopError ) < 0 ) {
1962
+ Py_DECREF (state -> AudioopError );
1963
+ return -1 ;
1964
+ }
1965
+
1966
+ return 0 ;
1967
+ }
1968
+
1969
+ static PyModuleDef_Slot audioop_slots [] = {
1970
+ {Py_mod_exec , audioop_exec },
1971
+ {0 , NULL }
1972
+ };
1973
+
1924
1974
static struct PyModuleDef audioopmodule = {
1925
1975
PyModuleDef_HEAD_INIT ,
1926
1976
"audioop" ,
1927
1977
NULL ,
1928
- sizeof (_audioopstate ),
1978
+ sizeof (audioop_state ),
1929
1979
audioop_methods ,
1930
- NULL ,
1980
+ audioop_slots ,
1931
1981
audioop_traverse ,
1932
1982
audioop_clear ,
1933
1983
audioop_free
@@ -1936,14 +1986,5 @@ static struct PyModuleDef audioopmodule = {
1936
1986
PyMODINIT_FUNC
1937
1987
PyInit_audioop (void )
1938
1988
{
1939
- PyObject * m = PyModule_Create (& audioopmodule );
1940
- if (m == NULL )
1941
- return NULL ;
1942
- PyObject * AudioopError = PyErr_NewException ("audioop.error" , NULL , NULL );
1943
- if (AudioopError == NULL )
1944
- return NULL ;
1945
- Py_INCREF (AudioopError );
1946
- PyModule_AddObject (m , "error" , AudioopError );
1947
- _audioopstate (m )-> AudioopError = AudioopError ;
1948
- return m ;
1989
+ return PyModuleDef_Init (& audioopmodule );
1949
1990
}
0 commit comments