1 /*********************************************************** 2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, 3 The Netherlands. 4 5 All Rights Reserved 6 7 Permission to use, copy, modify, and distribute this software and its 8 documentation for any purpose and without fee is hereby granted, 9 provided that the above copyright notice appear in all copies and that 10 both that copyright notice and this permission notice appear in 11 supporting documentation, and that the names of Stichting Mathematisch 12 Centrum or CWI or Corporation for National Research Initiatives or 13 CNRI not be used in advertising or publicity pertaining to 14 distribution of the software without specific, written prior 15 permission. 16 17 While CWI is the initial source for this software, a modified version 18 is made available by the Corporation for National Research Initiatives 19 (CNRI) at the Internet address ftp://ftp.python.org. 20 21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH 22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH 24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 28 PERFORMANCE OF THIS SOFTWARE. 29 30 ******************************************************************/ 31 32 #include "Python.h" 33 #include "pymactoolbox.h" 34 #include <Sound.h> 35 36 #pragma options align=mac68k 37 struct SampleRateAvailable_arg { 38 short numrates; 39 Handle rates; 40 }; 41 42 struct SampleSizeAvailable_arg { 43 short numsizes; 44 Handle sizes; 45 }; 46 47 #pragma options align=reset 48 49 static PyObject *ErrorObject; 50 51 52 /* Convert Python object to unsigned Fixed */ 53 static int 54 PyMac_GetUFixed(PyObject *v, Fixed *f) 55 { 56 double d; 57 unsigned long uns; 58 59 if( !PyArg_Parse(v, "d", &d)) 60 return 0; 61 uns = (unsigned long)(d * 0x10000); 62 *f = (Fixed)uns; 63 return 1; 64 } 65 66 /* Convert a Point to a Python object */ 67 static PyObject * 68 PyMac_BuildUFixed(Fixed f) 69 { 70 double d; 71 unsigned long funs; 72 73 funs = (unsigned long)f; 74 75 d = funs; 76 d = d / 0x10000; 77 return Py_BuildValue("d", d); 78 } 79 80 81 /* ----------------------------------------------------- */ 82 83 static char sndih_getChannelAvailable__doc__[] = 84 "" 85 ; 86 87 static PyObject * 88 sndih_getChannelAvailable(self, args) 89 PyObject *self; /* Not used */ 90 PyObject *args; 91 { 92 long inRefNum; 93 short nchannel; 94 OSErr err; 95 96 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 97 return NULL; 98 99 if( (err=SPBGetDeviceInfo(inRefNum, siChannelAvailable, (Ptr)&nchannel)) != noErr ) 100 return PyMac_Error(err); 101 return Py_BuildValue("h", nchannel); 102 } 103 104 static char sndih_getNumberChannels__doc__[] = 105 "" 106 ; 107 108 static PyObject * 109 sndih_getNumberChannels(self, args) 110 PyObject *self; /* Not used */ 111 PyObject *args; 112 { 113 long inRefNum; 114 short nchannel; 115 OSErr err; 116 117 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 118 return NULL; 119 120 if( (err=SPBGetDeviceInfo(inRefNum, siNumberChannels, (Ptr)&nchannel)) != noErr ) 121 return PyMac_Error(err); 122 return Py_BuildValue("h", nchannel); 123 } 124 125 static char sndih_setNumberChannels__doc__[] = 126 "" 127 ; 128 129 static PyObject * 130 sndih_setNumberChannels(self, args) 131 PyObject *self; /* Not used */ 132 PyObject *args; 133 { 134 long inRefNum; 135 short nchannel; 136 OSErr err; 137 138 if (!PyArg_ParseTuple(args, "lh", &inRefNum, &nchannel)) 139 return NULL; 140 141 if( (err=SPBSetDeviceInfo(inRefNum, siNumberChannels, (Ptr)&nchannel)) != noErr ) 142 return PyMac_Error(err); 143 Py_INCREF(Py_None); 144 return Py_None; 145 } 146 147 static char sndih_getContinuous__doc__[] = 148 "" 149 ; 150 151 static PyObject * 152 sndih_getContinuous(self, args) 153 PyObject *self; /* Not used */ 154 PyObject *args; 155 { 156 long inRefNum; 157 short onoff; 158 OSErr err; 159 160 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 161 return NULL; 162 163 if( (err=SPBGetDeviceInfo(inRefNum, siContinuous, (Ptr)&onoff)) != noErr ) 164 return PyMac_Error(err); 165 return Py_BuildValue("h", onoff); 166 } 167 168 static char sndih_setContinuous__doc__[] = 169 "" 170 ; 171 172 static PyObject * 173 sndih_setContinuous(self, args) 174 PyObject *self; /* Not used */ 175 PyObject *args; 176 { 177 long inRefNum; 178 short onoff; 179 OSErr err; 180 181 if (!PyArg_ParseTuple(args, "lh", &inRefNum, &onoff)) 182 return NULL; 183 184 if( (err=SPBSetDeviceInfo(inRefNum, siContinuous, (Ptr)&onoff)) != noErr ) 185 return PyMac_Error(err); 186 Py_INCREF(Py_None); 187 return Py_None; 188 } 189 190 static char sndih_getInputSourceNames__doc__[] = 191 "" 192 ; 193 194 static PyObject * 195 sndih_getInputSourceNames(self, args) 196 PyObject *self; /* Not used */ 197 PyObject *args; 198 { 199 long inRefNum; 200 Handle names; 201 OSErr err; 202 203 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 204 return NULL; 205 206 if( (err=SPBGetDeviceInfo(inRefNum, siInputSourceNames, (Ptr)&names)) != noErr ) 207 return PyMac_Error(err); 208 return Py_BuildValue("O&", ResObj_New, names); 209 } 210 211 static char sndih_getInputSource__doc__[] = 212 "" 213 ; 214 215 static PyObject * 216 sndih_getInputSource(self, args) 217 PyObject *self; /* Not used */ 218 PyObject *args; 219 { 220 long inRefNum; 221 short source; 222 OSErr err; 223 224 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 225 return NULL; 226 227 if( (err=SPBGetDeviceInfo(inRefNum, siInputSource, (Ptr)&source)) != noErr ) 228 return PyMac_Error(err); 229 return Py_BuildValue("h", source); 230 } 231 232 static char sndih_setInputSource__doc__[] = 233 "" 234 ; 235 236 static PyObject * 237 sndih_setInputSource(self, args) 238 PyObject *self; /* Not used */ 239 PyObject *args; 240 { 241 long inRefNum; 242 short source; 243 OSErr err; 244 245 if (!PyArg_ParseTuple(args, "lh", &inRefNum, &source)) 246 return NULL; 247 248 if( (err=SPBSetDeviceInfo(inRefNum, siInputSource, (Ptr)&source)) != noErr ) 249 return PyMac_Error(err); 250 Py_INCREF(Py_None); 251 return Py_None; 252 } 253 254 static char sndih_getPlayThruOnOff__doc__[] = 255 "" 256 ; 257 258 static PyObject * 259 sndih_getPlayThruOnOff(self, args) 260 PyObject *self; /* Not used */ 261 PyObject *args; 262 { 263 long inRefNum; 264 short onoff; 265 OSErr err; 266 267 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 268 return NULL; 269 270 if( (err=SPBGetDeviceInfo(inRefNum, siPlayThruOnOff, (Ptr)&onoff)) != noErr ) 271 return PyMac_Error(err); 272 return Py_BuildValue("h", onoff); 273 } 274 275 static char sndih_setPlayThruOnOff__doc__[] = 276 "" 277 ; 278 279 static PyObject * 280 sndih_setPlayThruOnOff(self, args) 281 PyObject *self; /* Not used */ 282 PyObject *args; 283 { 284 long inRefNum; 285 short onoff; 286 OSErr err; 287 288 if (!PyArg_ParseTuple(args, "lh", &inRefNum, &onoff)) 289 return NULL; 290 291 if( (err=SPBSetDeviceInfo(inRefNum, siPlayThruOnOff, (Ptr)&onoff)) != noErr ) 292 return PyMac_Error(err); 293 Py_INCREF(Py_None); 294 return Py_None; 295 } 296 297 static char sndih_getSampleRate__doc__[] = 298 "" 299 ; 300 301 static PyObject * 302 sndih_getSampleRate(self, args) 303 PyObject *self; /* Not used */ 304 PyObject *args; 305 { 306 long inRefNum; 307 Fixed sample_rate; 308 OSErr err; 309 310 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 311 return NULL; 312 313 if( (err=SPBGetDeviceInfo(inRefNum, siSampleRate, (Ptr)&sample_rate)) != noErr ) 314 return PyMac_Error(err); 315 return Py_BuildValue("O&", PyMac_BuildUFixed, sample_rate); 316 } 317 318 static char sndih_setSampleRate__doc__[] = 319 "" 320 ; 321 322 static PyObject * 323 sndih_setSampleRate(self, args) 324 PyObject *self; /* Not used */ 325 PyObject *args; 326 { 327 long inRefNum; 328 Fixed sample_rate; 329 OSErr err; 330 331 if (!PyArg_ParseTuple(args, "lO&", &inRefNum, PyMac_GetUFixed, &sample_rate)) 332 return NULL; 333 334 if( (err=SPBSetDeviceInfo(inRefNum, siSampleRate, (Ptr)&sample_rate)) != noErr ) 335 return PyMac_Error(err); 336 Py_INCREF(Py_None); 337 return Py_None; 338 } 339 340 static char sndih_getSampleSize__doc__[] = 341 "" 342 ; 343 344 static PyObject * 345 sndih_getSampleSize(self, args) 346 PyObject *self; /* Not used */ 347 PyObject *args; 348 { 349 long inRefNum; 350 short bits; 351 OSErr err; 352 353 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 354 return NULL; 355 356 if( (err=SPBGetDeviceInfo(inRefNum, siSampleSize, (Ptr)&bits)) != noErr ) 357 return PyMac_Error(err); 358 return Py_BuildValue("h", bits); 359 } 360 361 static char sndih_setSampleSize__doc__[] = 362 "" 363 ; 364 365 static PyObject * 366 sndih_setSampleSize(self, args) 367 PyObject *self; /* Not used */ 368 PyObject *args; 369 { 370 long inRefNum; 371 short size; 372 OSErr err; 373 374 if (!PyArg_ParseTuple(args, "lh", &inRefNum, &size)) 375 return NULL; 376 377 if( (err=SPBSetDeviceInfo(inRefNum, siSampleSize, (Ptr)&size)) != noErr ) 378 return PyMac_Error(err); 379 Py_INCREF(Py_None); 380 return Py_None; 381 } 382 383 static char sndih_getSampleSizeAvailable__doc__[] = 384 "" 385 ; 386 387 static PyObject * 388 sndih_getSampleSizeAvailable(self, args) 389 PyObject *self; /* Not used */ 390 PyObject *args; 391 { 392 long inRefNum; 393 struct SampleSizeAvailable_arg arg; 394 OSErr err; 395 PyObject *rsizes; 396 short *fsizes; 397 int i; 398 399 arg.sizes = NULL; 400 rsizes = NULL; 401 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 402 return NULL; 403 404 if( (err=SPBGetDeviceInfo(inRefNum, siSampleSizeAvailable, (Ptr)&arg)) != noErr ) { 405 return PyMac_Error(err); 406 } 407 fsizes = (short *)*(arg.sizes); 408 /* Handle contains a list of rates */ 409 if( (rsizes = PyTuple_New(arg.numsizes)) == NULL) 410 return NULL; 411 for( i=0; i<arg.numsizes; i++ ) 412 PyTuple_SetItem(rsizes, i, PyInt_FromLong((long)fsizes[i])); 413 return rsizes; 414 } 415 416 static char sndih_getSampleRateAvailable__doc__[] = 417 "" 418 ; 419 420 static PyObject * 421 sndih_getSampleRateAvailable(self, args) 422 PyObject *self; /* Not used */ 423 PyObject *args; 424 { 425 long inRefNum; 426 struct SampleRateAvailable_arg arg; 427 OSErr err; 428 PyObject *rrates, *obj; 429 Fixed *frates; 430 int i; 431 432 arg.rates = NULL; 433 rrates = NULL; 434 if (!PyArg_ParseTuple(args, "l", &inRefNum)) 435 return NULL; 436 437 if( (err=SPBGetDeviceInfo(inRefNum, siSampleRateAvailable, (Ptr)&arg)) != noErr ) { 438 return PyMac_Error(err); 439 } 440 frates = (Fixed *)*(arg.rates); 441 if( arg.numrates == 0 ) { 442 /* The handle contains upper and lowerbound */ 443 rrates = Py_BuildValue("O&O&", frates[0], frates[1]); 444 if (rrates == NULL) return NULL; 445 } else { 446 /* Handle contains a list of rates */ 447 if( (rrates = PyTuple_New(arg.numrates)) == NULL) 448 return NULL; 449 for( i=0; i<arg.numrates; i++ ) { 450 if( (obj = Py_BuildValue("O&", PyMac_BuildUFixed, frates[i]))==NULL) 451 goto out; 452 PyTuple_SetItem(rrates, i, obj); 453 } 454 } 455 return Py_BuildValue("hO", arg.numrates, rrates); 456 out: 457 Py_XDECREF(rrates); 458 return NULL; 459 } 460 461 /* List of methods defined in the module */ 462 463 static struct PyMethodDef sndih_methods[] = { 464 {"getChannelAvailable", (PyCFunction)sndih_getChannelAvailable, METH_VARARGS, sndih_getChannelAvailable__doc__}, 465 {"getNumberChannels", (PyCFunction)sndih_getNumberChannels, METH_VARARGS, sndih_getNumberChannels__doc__}, 466 {"setNumberChannels", (PyCFunction)sndih_setNumberChannels, METH_VARARGS, sndih_setNumberChannels__doc__}, 467 {"getContinuous", (PyCFunction)sndih_getContinuous, METH_VARARGS, sndih_getContinuous__doc__}, 468 {"setContinuous", (PyCFunction)sndih_setContinuous, METH_VARARGS, sndih_setContinuous__doc__}, 469 {"getInputSourceNames", (PyCFunction)sndih_getInputSourceNames, METH_VARARGS, sndih_getInputSourceNames__doc__}, 470 {"getInputSource", (PyCFunction)sndih_getInputSource, METH_VARARGS, sndih_getInputSource__doc__}, 471 {"setInputSource", (PyCFunction)sndih_setInputSource, METH_VARARGS, sndih_setInputSource__doc__}, 472 {"getPlayThruOnOff", (PyCFunction)sndih_getPlayThruOnOff, METH_VARARGS, sndih_getPlayThruOnOff__doc__}, 473 {"setPlayThruOnOff", (PyCFunction)sndih_setPlayThruOnOff, METH_VARARGS, sndih_setPlayThruOnOff__doc__}, 474 {"getSampleRate", (PyCFunction)sndih_getSampleRate, METH_VARARGS, sndih_getSampleRate__doc__}, 475 {"setSampleRate", (PyCFunction)sndih_setSampleRate, METH_VARARGS, sndih_setSampleRate__doc__}, 476 {"getSampleSize", (PyCFunction)sndih_getSampleSize, METH_VARARGS, sndih_getSampleSize__doc__}, 477 {"setSampleSize", (PyCFunction)sndih_setSampleSize, METH_VARARGS, sndih_setSampleSize__doc__}, 478 {"getSampleSizeAvailable", (PyCFunction)sndih_getSampleSizeAvailable, METH_VARARGS, sndih_getSampleSizeAvailable__doc__}, 479 {"getSampleRateAvailable", (PyCFunction)sndih_getSampleRateAvailable, METH_VARARGS, sndih_getSampleRateAvailable__doc__}, 480 481 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */ 482 }; 483 484 485 /* Initialization function for the module (*must* be called initSndihooks) */ 486 487 static char Sndihooks_module_documentation[] = 488 "" 489 ; 490 491 void 492 init_Sndihooks() 493 { 494 PyObject *m, *d; 495 496 /* Create the module and add the functions */ 497 m = Py_InitModule4("_Sndihooks", sndih_methods, 498 Sndihooks_module_documentation, 499 (PyObject*)NULL,PYTHON_API_VERSION); 500 501 /* Add some symbolic constants to the module */ 502 d = PyModule_GetDict(m); 503 ErrorObject = PyString_FromString("Sndihooks.error"); 504 PyDict_SetItemString(d, "error", ErrorObject); 505 506 /* XXXX Add constants here */ 507 508 /* Check for errors */ 509 if (PyErr_Occurred()) 510 Py_FatalError("can't initialize module Sndihooks"); 511 } 512 513