From: Jaroslav Kysela Date: Mon, 21 Apr 2008 09:45:02 +0000 (+0200) Subject: added ask_volume_dB and ask_dB_volume for mixer element X-Git-Tag: v1.0.17rc1~3 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=757de2ea783fa054f84720e3fa70edbd1b657aa7;p=alsa-python.git added ask_volume_dB and ask_dB_volume for mixer element --- diff --git a/pyalsa/alsamixer.c b/pyalsa/alsamixer.c index 316d86d..53825cc 100644 --- a/pyalsa/alsamixer.c +++ b/pyalsa/alsamixer.c @@ -433,6 +433,52 @@ pyalsamixerelement_hasswitch(struct pyalsamixerelement *pyelem, PyObject *args) } } +PyDoc_STRVAR(askvoldB__doc__, +"ask_volume_dB(value, [capture=False]]) -- Convert integer volume to dB value."); + +static PyObject * +pyalsamixerelement_askvoldB(struct pyalsamixerelement *pyelem, PyObject *args) +{ + int res, dir = 0; + long volume, val; + + if (!PyArg_ParseTuple(args, "|LI", &volume, &dir)) + return NULL; + + if (dir == 0) + res = snd_mixer_selem_ask_playback_vol_dB(pyelem->elem, volume, &val); + else + res = snd_mixer_selem_ask_capture_vol_dB(pyelem->elem, volume, &val); + if (res < 0) { + PyErr_Format(PyExc_RuntimeError, "Cannot convert mixer volume (capture=%s, value=%li): %s", dir ? "True" : "False", volume, snd_strerror(-res)); + Py_RETURN_NONE; + } + return PyInt_FromLong(val); +} + +PyDoc_STRVAR(askdBvol__doc__, +"ask_dB_volume(dBvalue, [[direction=-1], [capture=False]]) -- Convert integer volume to dB value."); + +static PyObject * +pyalsamixerelement_askdBvol(struct pyalsamixerelement *pyelem, PyObject *args) +{ + int res, xdir = -1, dir = 0; + long dBvolume, val; + + if (!PyArg_ParseTuple(args, "|LII", &dBvolume, &xdir, &dir)) + return NULL; + + if (dir == 0) + res = snd_mixer_selem_ask_playback_dB_vol(pyelem->elem, dBvolume, xdir, &val); + else + res = snd_mixer_selem_ask_capture_dB_vol(pyelem->elem, dBvolume, xdir, &val); + if (res < 0) { + PyErr_Format(PyExc_RuntimeError, "Cannot convert mixer volume (capture=%s, dBvalue=%li, direction=%i): %s", dir ? "True" : "False", dBvolume, xdir, snd_strerror(-res)); + Py_RETURN_NONE; + } + return PyInt_FromLong(val); +} + PyDoc_STRVAR(getvolume__doc__, "get_volume([channel=ChannelId['MONO'], [capture=False]]) -- Get volume."); @@ -453,7 +499,7 @@ pyalsamixerelement_getvolume(struct pyalsamixerelement *pyelem, PyObject *args) PyErr_Format(PyExc_RuntimeError, "Cannot get mixer volume (capture=%s, channel=%i): %s", dir ? "True" : "False", chn, snd_strerror(-res)); Py_RETURN_NONE; } - return Py_BuildValue("i", res); + return PyInt_FromLong(val); } PyDoc_STRVAR(getvolumetuple__doc__, @@ -1107,6 +1153,9 @@ static PyGetSetDef pyalsamixerelement_getseters[] = { static PyMethodDef pyalsamixerelement_methods[] = { + {"ask_volume_dB",(PyCFunction)pyalsamixerelement_askvoldB, METH_VARARGS, askvoldB__doc__}, + {"ask_dB_volume",(PyCFunction)pyalsamixerelement_askdBvol, METH_VARARGS, askdBvol__doc__}, + {"get_volume", (PyCFunction)pyalsamixerelement_getvolume, METH_VARARGS, getvolume__doc__}, {"get_volume", (PyCFunction)pyalsamixerelement_getvolume, METH_VARARGS, getvolume__doc__}, {"get_volume_tuple", (PyCFunction)pyalsamixerelement_getvolumetuple, METH_VARARGS,getvolumetuple__doc__}, {"get_volume_array", (PyCFunction)pyalsamixerelement_getvolumearray, METH_VARARGS,getvolumearray__doc__}, diff --git a/test/mixertest1.py b/test/mixertest1.py index 4c4f664..1618a44 100755 --- a/test/mixertest1.py +++ b/test/mixertest1.py @@ -26,6 +26,14 @@ def print_elem(e): print ' get_%s_volume_range_dB: %s' % (direction[capture], e.get_volume_range_dB(capture)) print ' get_%s_volume_tuple: %s' % (direction[capture], e.get_volume_tuple(capture)) print ' get_%s_volume_array: %s' % (direction[capture], e.get_volume_array(capture)) + vrange = e.get_volume_range(capture) + if vrange: + for vol in range(vrange[0], vrange[1]+1): + print ' vol %i == %idB' % (vol, e.ask_volume_dB(vol, capture)) + dbrange = e.get_volume_range_dB(capture) + if dbrange: + for vol in range(dbrange[0], dbrange[1]+1): + print ' dBvol %i == %i' % (vol, e.ask_dB_volume(vol, -1, capture)) print ' has_%s_switch: %s' % (direction[capture], e.has_switch(capture)) if e.has_switch(capture): print ' get_%s_switch_tuple: %s' % (direction[capture], e.get_switch_tuple(capture))