⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 almodule.c

📁 python s60 1.4.5版本的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:

#define OLD_INTERFACE		/* define for pre-Irix 6 interface */

#include "Python.h"
#include "stringobject.h"
#include <audio.h>
#include <stdarg.h>

#ifndef AL_NO_ELEM
#ifndef OLD_INTERFACE
#define OLD_INTERFACE
#endif /* OLD_INTERFACE */
#endif /* AL_NO_ELEM */

static PyObject *ErrorObject;

/* ----------------------------------------------------- */

/* Declarations for objects of type port */

typedef struct {
	PyObject_HEAD
	/* XXXX Add your own stuff here */
	ALport port;
} alpobject;

staticforward PyTypeObject Alptype;



/* ---------------------------------------------------------------- */

/* Declarations for objects of type config */

typedef struct {
	PyObject_HEAD
	/* XXXX Add your own stuff here */
	ALconfig config;
} alcobject;

staticforward PyTypeObject Alctype;


static void
ErrorHandler(long code, const char *fmt, ...)
{
	va_list args;
	char buf[128];

	va_start(args, fmt);
	vsprintf(buf, fmt, args);
	va_end(args);
	PyErr_SetString(ErrorObject, buf);
}

#ifdef AL_NO_ELEM		/* IRIX 6 */

static PyObject *
param2python(int resource, int param, ALvalue value, ALparamInfo *pinfo)
{
	ALparamInfo info;
	PyObject *v;

	if (pinfo == NULL) {
		pinfo = &info;
		if (alGetParamInfo(resource, param, &info) < 0)
			return NULL;
	}
	switch (pinfo->elementType) {
	case AL_PTR_ELEM:
		/* XXXX don't know how to handle this */
	case AL_NO_ELEM:
		Py_INCREF(Py_None);
		return Py_None;
	case AL_INT32_ELEM:
	case AL_RESOURCE_ELEM:
	case AL_ENUM_ELEM:
		return PyInt_FromLong((long) value.i);
	case AL_INT64_ELEM:
		return PyLong_FromLongLong(value.ll);
	case AL_FIXED_ELEM:
		return PyFloat_FromDouble(alFixedToDouble(value.ll));
	case AL_CHAR_ELEM:
		if (value.ptr == NULL) {
			Py_INCREF(Py_None);
			return Py_None;
		}
		return PyString_FromString((char *) value.ptr);
	default:
		PyErr_SetString(ErrorObject, "unknown element type");
		return NULL;
	}
}

static int
python2elem(PyObject *item, void *ptr, int elementType)
{
	switch (elementType) {
	case AL_INT32_ELEM:
	case AL_RESOURCE_ELEM:
	case AL_ENUM_ELEM:
		if (!PyInt_Check(item)) {
			PyErr_BadArgument();
			return -1;
		}
		*((int *) ptr) = PyInt_AsLong(item);
		break;
	case AL_INT64_ELEM:
		if (PyInt_Check(item))
			*((long long *) ptr) = PyInt_AsLong(item);
		else if (PyLong_Check(item))
			*((long long *) ptr) = PyLong_AsLongLong(item);
		else {
			PyErr_BadArgument();
			return -1;
		}
		break;
	case AL_FIXED_ELEM:
		if (PyInt_Check(item))
			*((long long *) ptr) = alDoubleToFixed((double) PyInt_AsLong(item));
		else if (PyFloat_Check(item))
			*((long long *) ptr) = alDoubleToFixed(PyFloat_AsDouble(item));
		else {
			PyErr_BadArgument();
			return -1;
		}
		break;
	default:
		PyErr_SetString(ErrorObject, "unknown element type");
		return -1;
	}
	return 0;
}

static int
python2param(int resource, ALpv *param, PyObject *value, ALparamInfo *pinfo)
{
	ALparamInfo info;
	int i, stepsize;
	PyObject *item;

	if (pinfo == NULL) {
		pinfo = &info;
		if (alGetParamInfo(resource, param->param, &info) < 0)
			return -1;
	}
	switch (pinfo->valueType) {
	case AL_STRING_VAL:
		if (pinfo->elementType != AL_CHAR_ELEM) {
			PyErr_SetString(ErrorObject, "unknown element type");
			return -1;
		}
		if (!PyString_Check(value)) {
			PyErr_BadArgument();
			return -1;
		}
		param->value.ptr = PyString_AS_STRING(value);
		param->sizeIn = PyString_GET_SIZE(value)+1; /*account for NUL*/
		break;
	case AL_SET_VAL:
	case AL_VECTOR_VAL:
		if (!PyList_Check(value) && !PyTuple_Check(value)) {
			PyErr_BadArgument();
			return -1;
		}
		switch (pinfo->elementType) {
		case AL_INT32_ELEM:
		case AL_RESOURCE_ELEM:
		case AL_ENUM_ELEM:
			param->sizeIn = PySequence_Size(value);
			param->value.ptr = PyMem_NEW(int, param->sizeIn);
			stepsize = sizeof(int);
			break;
		case AL_INT64_ELEM:
		case AL_FIXED_ELEM:
			param->sizeIn = PySequence_Size(value);
			param->value.ptr = PyMem_NEW(long long, param->sizeIn);
			stepsize = sizeof(long long);
			break;
		}
		for (i = 0; i < param->sizeIn; i++) {
			item = PySequence_GetItem(value, i);
			if (python2elem(item, (void *) ((char *) param->value.ptr + i*stepsize), pinfo->elementType) < 0) {
				PyMem_DEL(param->value.ptr);
				return -1;
			}
		}
		break;
	case AL_SCALAR_VAL:
		switch (pinfo->elementType) {
		case AL_INT32_ELEM:
		case AL_RESOURCE_ELEM:
		case AL_ENUM_ELEM:
			return python2elem(value, (void *) &param->value.i,
					   pinfo->elementType);
		case AL_INT64_ELEM:
		case AL_FIXED_ELEM:
			return python2elem(value, (void *) &param->value.ll,
					   pinfo->elementType);
		default:
			PyErr_SetString(ErrorObject, "unknown element type");
			return -1;
		}
	}
	return 0;
}

static int
python2params(int resource1, int resource2, PyObject *list, ALpv **pvsp, ALparamInfo **pinfop)
{
	PyObject *item;
	ALpv *pvs;
	ALparamInfo *pinfo;
	int npvs, i;

	npvs = PyList_Size(list);
	pvs = PyMem_NEW(ALpv, npvs);
	pinfo = PyMem_NEW(ALparamInfo, npvs);
	for (i = 0; i < npvs; i++) {
		item = PyList_GetItem(list, i);
		if (!PyArg_ParseTuple(item, "iO", &pvs[i].param, &item))
			goto error;
		if (alGetParamInfo(resource1, pvs[i].param, &pinfo[i]) < 0 &&
		    alGetParamInfo(resource2, pvs[i].param, &pinfo[i]) < 0)
			goto error;
		if (python2param(resource1, &pvs[i], item, &pinfo[i]) < 0)
			goto error;
	}

	*pvsp = pvs;
	*pinfop = pinfo;
	return npvs;

  error:
	/* XXXX we should clean up everything */
	if (pvs)
		PyMem_DEL(pvs);
	if (pinfo)
		PyMem_DEL(pinfo);
	return -1;
}

/* -------------------------------------------------------- */


static PyObject *
SetConfig(alcobject *self, PyObject *args, int (*func)(ALconfig, int))
{
	int par;

	if (!PyArg_ParseTuple(args, "i:SetConfig", &par))
		return NULL;

	if ((*func)(self->config, par) == -1)
		return NULL;

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
GetConfig(alcobject *self, PyObject *args, int (*func)(ALconfig))
{	
	int par;

	if (!PyArg_ParseTuple(args, ":GetConfig"))
		return NULL;
	
	if ((par = (*func)(self->config)) == -1)
		return NULL;

	return PyInt_FromLong((long) par);
}

static char alc_SetWidth__doc__[] = 
"alSetWidth: set the wordsize for integer audio data."
;

static PyObject *
alc_SetWidth(alcobject *self, PyObject *args)
{
	return SetConfig(self, args, alSetWidth);
}


static char alc_GetWidth__doc__[] = 
"alGetWidth: get the wordsize for integer audio data."
;

static PyObject *
alc_GetWidth(alcobject *self, PyObject *args)
{
	return GetConfig(self, args, alGetWidth);
}


static char alc_SetSampFmt__doc__[] = 
"alSetSampFmt: set the sample format setting in an audio ALconfig structure."
;

static PyObject *
alc_SetSampFmt(alcobject *self, PyObject *args)
{
	return SetConfig(self, args, alSetSampFmt);
}


static char alc_GetSampFmt__doc__[] = 
"alGetSampFmt: get the sample format setting in an audio ALconfig structure."
;

static PyObject *
alc_GetSampFmt(alcobject *self, PyObject *args)
{
	return GetConfig(self, args, alGetSampFmt);
}


static char alc_SetChannels__doc__[] = 
"alSetChannels: set the channel settings in an audio ALconfig."
;

static PyObject *
alc_SetChannels(alcobject *self, PyObject *args)
{
	return SetConfig(self, args, alSetChannels);
}


static char alc_GetChannels__doc__[] = 
"alGetChannels: get the channel settings in an audio ALconfig."
;

static PyObject *
alc_GetChannels(alcobject *self, PyObject *args)
{
	return GetConfig(self, args, alGetChannels);
}


static char alc_SetFloatMax__doc__[] = 
"alSetFloatMax: set the maximum value of floating point sample data."
;

static PyObject *
alc_SetFloatMax(alcobject *self, PyObject *args)
{
	double maximum_value;

	if (!PyArg_ParseTuple(args, "d:SetFloatMax", &maximum_value))
		return NULL;
	if (alSetFloatMax(self->config, maximum_value) < 0)
		return NULL;
	Py_INCREF(Py_None);
	return Py_None;
}


static char alc_GetFloatMax__doc__[] = 
"alGetFloatMax: get the maximum value of floating point sample data."
;

static PyObject *
alc_GetFloatMax(alcobject *self, PyObject *args)
{
	double maximum_value;

	if (!PyArg_ParseTuple(args, ":GetFloatMax"))
		return NULL;
	if ((maximum_value = alGetFloatMax(self->config)) == 0)
		return NULL;
	return PyFloat_FromDouble(maximum_value);
}


static char alc_SetDevice__doc__[] = 
"alSetDevice: set the device setting in an audio ALconfig structure."
;

static PyObject *
alc_SetDevice(alcobject *self, PyObject *args)
{
	return SetConfig(self, args, alSetDevice);
}


static char alc_GetDevice__doc__[] = 
"alGetDevice: get the device setting in an audio ALconfig structure."
;

static PyObject *
alc_GetDevice(alcobject *self, PyObject *args)
{
	return GetConfig(self, args, alGetDevice);
}


static char alc_SetQueueSize__doc__[] = 
"alSetQueueSize: set audio port buffer size."
;

static PyObject *
alc_SetQueueSize(alcobject *self, PyObject *args)
{
	return SetConfig(self, args, alSetQueueSize);
}


static char alc_GetQueueSize__doc__[] = 
"alGetQueueSize: get audio port buffer size."
;

static PyObject *
alc_GetQueueSize(alcobject *self, PyObject *args)
{
	return GetConfig(self, args, alGetQueueSize);
}

#endif /* AL_NO_ELEM */

static PyObject *
setconfig(alcobject *self, PyObject *args, int (*func)(ALconfig, long))
{
	long par;

	if (!PyArg_ParseTuple(args, "l:SetConfig", &par))
		return NULL;

	if ((*func)(self->config, par) == -1)
		return NULL;

	Py_INCREF(Py_None);
	return Py_None;
}

static PyObject *
getconfig(alcobject *self, PyObject *args, long (*func)(ALconfig))
{	
	long par;

	if (!PyArg_ParseTuple(args, ":GetConfig"))
		return NULL;
	
	if ((par = (*func)(self->config)) == -1)
		return NULL;

	return PyInt_FromLong((long) par);
}

static PyObject *
alc_setqueuesize (alcobject *self, PyObject *args)
{
	return setconfig(self, args, ALsetqueuesize);
}

static PyObject *
alc_getqueuesize (alcobject *self, PyObject *args)
{
	return getconfig(self, args, ALgetqueuesize);
}

static PyObject *
alc_setwidth (alcobject *self, PyObject *args)
{
	return setconfig(self, args, ALsetwidth);
}

static PyObject *
alc_getwidth (alcobject *self, PyObject *args)
{
	return getconfig(self, args, ALgetwidth);	
}

static PyObject *
alc_getchannels (alcobject *self, PyObject *args)
{
	return getconfig(self, args, ALgetchannels);	
}

static PyObject *
alc_setchannels (alcobject *self, PyObject *args)
{
	return setconfig(self, args, ALsetchannels);
}

#ifdef AL_405

static PyObject *
alc_getsampfmt (alcobject *self, PyObject *args)
{
	return getconfig(self, args, ALgetsampfmt);	
}

static PyObject *
alc_setsampfmt (alcobject *self, PyObject *args)
{
	return setconfig(self, args, ALsetsampfmt);
}

static PyObject *
alc_getfloatmax(alcobject *self, PyObject *args)
{
	double arg;

	if (!PyArg_ParseTuple(args, ":GetFloatMax"))
		return 0;
	if ((arg = ALgetfloatmax(self->config)) == 0)
		return NULL;
	return PyFloat_FromDouble(arg);
}

static PyObject *
alc_setfloatmax(alcobject *self, PyObject *args)
{
	double arg;

	if (!PyArg_ParseTuple(args, "d:SetFloatMax", &arg))
		return 0;
	if (ALsetfloatmax(self->config, arg) == -1)
		return NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -