symbian-qemu-0.9.1-12/python-2.6.1/Mac/Modules/snd/_Sndihooks.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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