From ea46caca724cba0b4e401e35ce9b9d5a7fb6c8ab Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 12 Sep 2007 11:11:23 +0200 Subject: [PATCH] alsacontrol - add hwdepDevices(), pcmDevices(), rawmidiDevices() --- pyalsa/alsacontrol.c | 60 +++++++++++++++++++++++++++++++++++++++++--- setup.py | 2 +- test/ctltest1.py | 22 ++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100755 test/ctltest1.py diff --git a/pyalsa/alsacontrol.c b/pyalsa/alsacontrol.c index 9bbde53..f5e7994 100644 --- a/pyalsa/alsacontrol.c +++ b/pyalsa/alsacontrol.c @@ -80,9 +80,7 @@ pyalsacontrol_cardinfo(struct pyalsacontrol *self, PyObject *args) if (err < 0) { PyErr_Format(PyExc_IOError, "Control card info error: %s", strerror(-err)); - Py_RETURN_NONE; - } else { - + return NULL; } d = PyDict_New(); if (d) { @@ -97,6 +95,59 @@ pyalsacontrol_cardinfo(struct pyalsacontrol *self, PyObject *args) return d; } +static PyObject * +devices(struct pyalsacontrol *self, PyObject *args, + int (*fcn)(snd_ctl_t *, int *)) +{ + int dev, err, size = 0; + PyObject *t; + + dev = -1; + t = PyTuple_New(size); + do { + err = fcn(self->handle, &dev); + if (err < 0) { + PyErr_Format(PyExc_IOError, + "Control hwdep_next_device error: %s", strerror(-err)); + Py_DECREF(t); + return NULL; + } + if (dev >= 0) { + _PyTuple_Resize(&t, ++size); + if (t) + PyTuple_SetItem(t, size-1, PyInt_FromLong(dev)); + } + } while (dev >= 0); + return t; +} + +PyDoc_STRVAR(hwdepdevices__doc__, +"hwdepDevices() -- Return a tuple with available hwdep devices."); + +static PyObject * +pyalsacontrol_hwdepdevices(struct pyalsacontrol *self, PyObject *args) +{ + return devices(self, args, snd_ctl_hwdep_next_device); +} + +PyDoc_STRVAR(pcmdevices__doc__, +"pcmDevices() -- Return a tuple with available PCM devices."); + +static PyObject * +pyalsacontrol_pcmdevices(struct pyalsacontrol *self, PyObject *args) +{ + return devices(self, args, snd_ctl_pcm_next_device); +} + +PyDoc_STRVAR(rawmididevices__doc__, +"rawmidiDevices() -- Return a tuple with available RawMidi devices."); + +static PyObject * +pyalsacontrol_rawmididevices(struct pyalsacontrol *self, PyObject *args) +{ + return devices(self, args, snd_ctl_rawmidi_next_device); +} + PyDoc_STRVAR(alsacontrolinit__doc__, "Control([name='default'],[mode=0])\n" " -- Open an ALSA Control device.\n"); @@ -141,6 +192,9 @@ static PyGetSetDef pyalsacontrol_getseters[] = { static PyMethodDef pyalsacontrol_methods[] = { {"cardInfo", (PyCFunction)pyalsacontrol_cardinfo, METH_NOARGS, cardinfo__doc__}, + {"hwdepDevices",(PyCFunction)pyalsacontrol_hwdepdevices, METH_NOARGS, hwdepdevices__doc__}, + {"pcmDevices", (PyCFunction)pyalsacontrol_pcmdevices, METH_NOARGS, pcmdevices__doc__}, + {"rawmidiDevices",(PyCFunction)pyalsacontrol_rawmididevices, METH_NOARGS, rawmididevices__doc__}, {NULL} }; diff --git a/setup.py b/setup.py index 27e11fa..6b5fb49 100755 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ setup( uname = os.uname() a = 'build/lib.%s-%s-%s' % (uname[0].lower(), uname[4], sys.version[:3]) -for f in ['alsacard.so', 'alsahcontrol.so', 'alsamixer.so']: +for f in ['alsacard.so', 'alsacontrol.so', 'alsahcontrol.so', 'alsamixer.so']: if not os.path.exists('pyalsa/%s' % f): a = '../build/lib.%s-%s-%s/pyalsa/%s' % (uname[0].lower(), uname[4], sys.version[:3], f) diff --git a/test/ctltest1.py b/test/ctltest1.py new file mode 100755 index 0000000..9221bc6 --- /dev/null +++ b/test/ctltest1.py @@ -0,0 +1,22 @@ +#! /usr/bin/python +# -*- Python -*- + +import sys +sys.path.insert(0, '../pyalsa') +del sys +import alsacontrol + +ctl = alsacontrol.Control() +print 'Card info:', ctl.cardInfo() +try: + print 'Hwdep devices:', ctl.hwdepDevices() +except IOError, msg: + print 'No hwdep devices:', msg +try: + print 'PCM devices:', ctl.pcmDevices() +except IOError, msg: + print 'No PCM devices:', msg +try: + print 'Rawmidi devices:', ctl.rawmidiDevices() +except IOError, msg: + print 'No rawmidi devices:', msg -- 2.47.1