From a056a90c61ce95c85ece4dde01e13f62247887d3 Mon Sep 17 00:00:00 2001 From: Julian Porter Date: Fri, 6 Mar 2020 19:59:04 +0000 Subject: [PATCH] modified version of pyalsaaudio module --- py/CHANGES | 12 +++ py/alsaaudio.c | 225 +++++++++++++++++++++++++++++++++++++++++++++++++ py/setup.py | 2 +- tests/params | Bin 17656 -> 18408 bytes tests/params.c | 11 ++- 5 files changed, 245 insertions(+), 5 deletions(-) diff --git a/py/CHANGES b/py/CHANGES index ce66143..5a6f61c 100644 --- a/py/CHANGES +++ b/py/CHANGES @@ -1,3 +1,15 @@ +Version 0.8.6: +- Added four methods to the 'PCM' class to allow users to get detailed information about the device: + + - 'getformats()' returns a dictionary of name / value pairs, one for each of the card's + supported formats - e.g. '{"U8": 1, "S16_LE": 2}', + - 'getchannels()' returns a list of the supported channel numbers, e.g. '[1, 2]', + - 'getrates()' returns supported sample rates for the device, e.g. '[48000]', + - 'getratebounds()' returns the device's official minimum and maximum supported + sample rates as a tuple, e.g. '(4000, 48000)'. + + (contributed by @jdstmporter) + Version 0.8.5: - Return an empty string/bytestring when 'read()' detects an overrun. Previously the returned data was undefined (contributed by @jcea) diff --git a/py/alsaaudio.c b/py/alsaaudio.c index 624a808..71e017d 100644 --- a/py/alsaaudio.c +++ b/py/alsaaudio.c @@ -29,6 +29,64 @@ #include #include +#define ARRAY_SIZE(a) (sizeof(a) / sizeof *(a)) +static const snd_pcm_format_t ALSAFormats[] = { + SND_PCM_FORMAT_S8, + SND_PCM_FORMAT_U8, + SND_PCM_FORMAT_S16_LE, + SND_PCM_FORMAT_S16_BE, + SND_PCM_FORMAT_U16_LE, + SND_PCM_FORMAT_U16_BE, + SND_PCM_FORMAT_S24_LE, + SND_PCM_FORMAT_S24_BE, + SND_PCM_FORMAT_U24_LE, + SND_PCM_FORMAT_U24_BE, + SND_PCM_FORMAT_S32_LE, + SND_PCM_FORMAT_S32_BE, + SND_PCM_FORMAT_U32_LE, + SND_PCM_FORMAT_U32_BE, + SND_PCM_FORMAT_FLOAT_LE, + SND_PCM_FORMAT_FLOAT_BE, + SND_PCM_FORMAT_FLOAT64_LE, + SND_PCM_FORMAT_FLOAT64_BE, + SND_PCM_FORMAT_IEC958_SUBFRAME_LE, + SND_PCM_FORMAT_IEC958_SUBFRAME_BE, + SND_PCM_FORMAT_MU_LAW, + SND_PCM_FORMAT_A_LAW, + SND_PCM_FORMAT_IMA_ADPCM, + SND_PCM_FORMAT_MPEG, + SND_PCM_FORMAT_GSM, + SND_PCM_FORMAT_SPECIAL, + SND_PCM_FORMAT_S24_3LE, + SND_PCM_FORMAT_S24_3BE, + SND_PCM_FORMAT_U24_3LE, + SND_PCM_FORMAT_U24_3BE, + SND_PCM_FORMAT_S20_3LE, + SND_PCM_FORMAT_S20_3BE, + SND_PCM_FORMAT_U20_3LE, + SND_PCM_FORMAT_U20_3BE, + SND_PCM_FORMAT_S18_3LE, + SND_PCM_FORMAT_S18_3BE, + SND_PCM_FORMAT_U18_3LE, + SND_PCM_FORMAT_U18_3BE +}; +static const unsigned ALSARates[] = { + 4000, + 5512, + 8000, + 11025, + 16000, + 22050, + 32000, + 44100, + 48000, + 64000, + 88200, + 96000, + 176400, + 192000 +}; + PyDoc_STRVAR(alsaaudio_module_doc, "This modules provides support for the ALSA audio API.\n" "\n" @@ -572,6 +630,169 @@ alsapcm_dumpinfo(alsapcm_t *self, PyObject *args) return Py_None; } +// auxiliary function + + +static PyObject * +alsapcm_getformats(alsapcm_t *self, PyObject *args) { + snd_pcm_t *pcm = self->handle; + if (!pcm) { + PyErr_SetString(ALSAAudioError, "PCM device is closed"); + return NULL; + } + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + int err = snd_pcm_hw_params_any(pcm, params); + if (err < 0) { + PyErr_SetString(ALSAAudioError, "Cannot get hardware parameters"); + return NULL; + } + + PyObject *fmts = PyDict_New(); + for (int i = 0; i < ARRAY_SIZE(ALSAFormats); ++i) { + snd_pcm_format_t format = ALSAFormats[i]; + if (!snd_pcm_hw_params_test_format(pcm, params, format)) { + const char *name = snd_pcm_format_name(format); + PyObject *pname=PyUnicode_FromString(name); + PyObject *value=PyLong_FromLong((long)format); + PyDict_SetItem(fmts,pname,value); + } + } + return fmts; +} + +PyDoc_STRVAR(getformats_doc, +"getformats() -> [str:int]\n\ +\n\ +Returns dictionary of supported format codes keyed by their standard ALSA names."); + +static PyObject * +alsapcm_getratemaxmin(alsapcm_t *self, PyObject *args) { + snd_pcm_t *pcm = self->handle; + if (!pcm) { + PyErr_SetString(ALSAAudioError, "PCM device is closed"); + return NULL; + } + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + int err = snd_pcm_hw_params_any(pcm, params); + if (err < 0) { + PyErr_SetString(ALSAAudioError, "Cannot get hardware parameters"); + return NULL; + } + unsigned min,max; + if(snd_pcm_hw_params_get_rate_min(params, &min,NULL)<0) { + PyErr_SetString(ALSAAudioError, "Cannot get minimum supported bitrate"); + return NULL; + } + if(snd_pcm_hw_params_get_rate_max(params, &max,NULL)<0) { + PyErr_SetString(ALSAAudioError, "Cannot get maximum supported bitrate"); + return NULL; + } + PyObject *minp=PyLong_FromLong(min); + PyObject *maxp=PyLong_FromLong(max); + return PyTuple_Pack(2,minp,maxp); +} + +PyDoc_STRVAR(getratebounds_doc, +"getratebounds() -> (int,int)\n\ +\n\ +Returns the card's minimum and maximum supported sample rates as a tuple."); + +static PyObject * +alsapcm_getrates(alsapcm_t *self, PyObject *args) { + snd_pcm_t *pcm = self->handle; + if (!pcm) { + PyErr_SetString(ALSAAudioError, "PCM device is closed"); + return NULL; + } + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + int err = snd_pcm_hw_params_any(pcm, params); + if (err < 0) { + PyErr_SetString(ALSAAudioError, "Cannot get hardware parameters"); + return NULL; + } + unsigned min,max; + if(snd_pcm_hw_params_get_rate_min(params, &min,NULL)<0) { + PyErr_SetString(ALSAAudioError, "Cannot get minimum supported bitrate"); + return NULL; + } + if(snd_pcm_hw_params_get_rate_max(params, &max,NULL)<0) { + PyErr_SetString(ALSAAudioError, "Cannot get maximum supported bitrate"); + return NULL; + } + if(min==max) { + return PyLong_FromLong(min); + } + else if(!snd_pcm_hw_params_test_rate(pcm, params, min + 1, 0)) { + PyObject *minp=PyLong_FromLong(min); + PyObject *maxp=PyLong_FromLong(max); + return PyTuple_Pack(2,minp,maxp); + } + else { + PyObject *rates=PyList_New(0); + for(int i=0;i obj\n\ +\n\ +Returns the sample rates supported by the device.\ +Returned value can be one of three types, depending on the card's properties.\ +There are three cases:\n\ +\n\ +- Card supports only a single rate: returns the rate\n\ +- Card supports a continuous range of rates: returns a tuple of the range's lower and upper bounds (inclusive)\n\ +- Card supports a collection of well-known rates: returns a list of the supported rates"); + +static PyObject * +alsapcm_getchannels(alsapcm_t *self,PyObject *args) { + snd_pcm_t *pcm = self->handle; + if (!pcm) { + PyErr_SetString(ALSAAudioError, "PCM device is closed"); + return NULL; + } + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + int err = snd_pcm_hw_params_any(pcm, params); + if (err < 0) { + PyErr_SetString(ALSAAudioError, "Cannot get hardware parameters"); + return NULL; + } + unsigned min,max; + if(snd_pcm_hw_params_get_channels_min(params, &min)<0) { + PyErr_SetString(ALSAAudioError, "Cannot get minimum supported number of channels"); + return NULL; + } + if(snd_pcm_hw_params_get_channels_max(params, &max)<0) { + PyErr_SetString(ALSAAudioError, "Cannot get maximum supported number of channels"); + return NULL; + } + + PyObject *out=PyList_New(0); + + for(unsigned ch=min;ch<=max;++ch) { + if (!snd_pcm_hw_params_test_channels(pcm, params, ch)) { + PyObject *pch=PyLong_FromLong(ch); + PyList_Append(out,pch); + } + } + return out; +} +PyDoc_STRVAR(getchannels_doc, +"getchannels() -> [int]\n\ +\n\ +Returns list of supported channel numbers."); + static PyObject * alsapcm_pcmtype(alsapcm_t *self, PyObject *args) { @@ -1101,6 +1322,10 @@ static PyMethodDef alsapcm_methods[] = { {"setperiodsize", (PyCFunction)alsapcm_setperiodsize, METH_VARARGS, setperiodsize_doc}, {"dumpinfo", (PyCFunction)alsapcm_dumpinfo, METH_VARARGS}, + {"getformats", (PyCFunction)alsapcm_getformats, METH_VARARGS, getformats_doc}, + {"getratebounds", (PyCFunction)alsapcm_getratemaxmin, METH_VARARGS, getratebounds_doc}, + {"getrates", (PyCFunction)alsapcm_getrates, METH_VARARGS, getrates_doc}, + {"getchannels", (PyCFunction)alsapcm_getchannels, METH_VARARGS, getchannels_doc}, {"read", (PyCFunction)alsapcm_read, METH_VARARGS, read_doc}, {"write", (PyCFunction)alsapcm_write, METH_VARARGS, write_doc}, {"pause", (PyCFunction)alsapcm_pause, METH_VARARGS, pause_doc}, diff --git a/py/setup.py b/py/setup.py index e2af146..cd683c3 100755 --- a/py/setup.py +++ b/py/setup.py @@ -8,7 +8,7 @@ from setuptools import setup from setuptools.extension import Extension from sys import version -pyalsa_version = '0.8.5' +pyalsa_version = '0.8.6' if __name__ == '__main__': setup( diff --git a/tests/params b/tests/params index 00cbc1f3d29d38b22d9a90be3c579415b647cae9..412c9c41b4b9ac81fce8638f2239b4737ca7257b 100755 GIT binary patch literal 18408 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 delta 3206 zcmZuz4@_If8NYiEgZ;3BZE$R-G%*Ger3%K70HI)b1`IDLS(#e5s+wgi>#D39?WQJ8 zqGbibNaMb`g?+7x)GVUYv^G_>CGobTYSR!p1sY|DM65;8q-7P|9F?rJp%ZO7-oAV9 zo#!mOr@Qa&`}4c+?z`{arC*>+2|DC+hh0Q3vO&nc$nagimL_e+aMCt>B_vhk8Ka6k zaMO?^i^fnEVJi+N1!FiXz(IP*JyT)~|4U(&aHa9p2fU|xmu`BV*}Ls8Liy3u<*wzm z%&-V6#hS~kXg_NO#`9pk^u4K``p?y3hzdU151)x%=oZ6pyw(C=h=njF`oNmwqmMBO zeOYfibgdEOihA#Ajt{0SKKd{C4(hz4w^#Jmsq1gl+dkG>4x=AIoU2gUk3ARhlTjIh zx$nUKye9Y{?_RjaS`MeI_kqV&-ivPH$9BS~B2tm$U}by(*TgCzPOM?9MbaN|7jwul zWHR3Vb$hWVl2c3x3&pS7l(F%iRo}-L2xQEZ&qf%R5UW81;)K81y#8r3d?T{KH^pQG zTvDN5-&8|Dt~MJT#o8A; zF6@H-d@tun$vfg&X3FMCC+x-Pu+#kutfSo5NoI#CwwCl^_y5V|$Y3fMX=G>Fc zAnm;zBIMB_!-$Zo>su0+b|{IDl!3X0uKPQamMiF)l5{+&lL*ZrMDrX%o5g}PZA=oW zuVlnh%}D*yZjYi`9!I${IJVoST`gGC$FScsDeBvF{ThLh^~(@-uWYL^^{v{~M|D`P z-WR!qBC@A4t_(z0vaXW&c(+|qBX8g!U7=}OdKWh5Eyv&$ceK5GS<@1+xq+X~k^Qx5 zY%Vd8?m?E4IEP-fvRTylX(d_n<_d;1ahkc7eg!p7vommQ2Gb>NUxr}e-M!QQW_II> z8k>HXsiAuMImT1t)5x4v5+5+uL&)MYHW@RX=a!Zu6=;{NsmPvfNylLJ6X^}uH)bx! znb}lIGJa7+8G}zgqVoL)$pFUln zsDrvlm931gBww0lnrdt*6Pli{nQ25sQzNQ-ztXgc*dm+$6Fdrw%$wefJC9*zsyPBK zA%HF^iSuZC372TtHlpo7Y>}$5EgYCKU;_s1cQdMIQFS6VufvwAv3X?#A!j&b zT}JO^1{s@2M7A6CvH1g+4a6xFn7eGIUG%{%i4UU>K*wr_m#iZst|TiMy{~iq$I8IG zHC^~+>IbV|qN&lczPyuxx2YH?e-hp;S=mJI5F2E4h21Be|J1bS82wb!eus2B((Op2 z3z~KjY5xsPV{XqcYMLG6+W7_SEL}^NAW>RrIelHz2%IS`T{VO-{1QcNQjC?s^n40m zm97pZKi9NJSUN^mI1dS}j$HBE)ShQ0c-xR8SZ8m*-DT~T1)PkghRZr^DW_vQbvfNA z!@{p?3a$=sklpvJ*bQR*7_g6LUN2={2!?h9Wp@2y;kS9%{QvU%`yz#3hMKB(nP~h1 zXPd%`*C3?ZTo&ga#=m)GQ+TsE#<)MhG%?rpg4?E#?WP>VrjKE`st}xxo}Y(@GQWWl zxE4OUlly4`=tRWWaD-d=R>Eh#m2V@5xrbQ-kw~}zkgD5h0KQr6rD1G6IRymw=wNkd z6@P7Hnc&aWO?*MPQ2jg|g6Kw%h(B~j;n2qFt=;C2lN;bIh)Z8VhW>|NV)A+9xPBdW zC_WKhmqFMRqE4vV^cro16V-(to8qu zVF^BbKA9jU`2>DkSKNjI{#xPU06N7MH@4E?e9IKDlkU{tVO-Oojcl9fPQ86m-?Bix zHF{jWRqG^L8?QKn&(r$6j(WR$e_}}Pk4#_U>;;PD5ti87;@QCI2H4V4>EgM- zX%{3~DkYu?n5yF~wQiolobE!z)~De^*$MTn1@Ky{%N8(?Zvf7<)@2^|VUzor1*Eo+ z#Lo-nPD@+6Fhk*4i+;1!6vf+ diff --git a/tests/params.c b/tests/params.c index 48f161c..1e72d87 100644 --- a/tests/params.c +++ b/tests/params.c @@ -59,6 +59,7 @@ static const snd_pcm_format_t formats[] = { }; static const unsigned int rates[] = { + 4000, 5512, 8000, 11025, @@ -164,7 +165,7 @@ int main(int argc, char *argv[]) printf("Formats:"); for (int i = 0; i < info.nFormats; ++i) { - printf(" %s", snd_pcm_format_name(formats[i])); + printf("%s ", snd_pcm_format_name(info.formats[i])); } putchar('\n'); printf("Rates:"); @@ -178,7 +179,7 @@ int main(int argc, char *argv[]) printf(" %u", info.channels[i]); } putchar('\n'); - /* + err = snd_pcm_open(&pcm, device_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); if (err < 0) { @@ -205,8 +206,10 @@ int main(int argc, char *argv[]) printf("Formats:"); for (i = 0; i < ARRAY_SIZE(formats); ++i) { - if (!snd_pcm_hw_params_test_format(pcm, hw_params, formats[i])) + if (!snd_pcm_hw_params_test_format(pcm, hw_params, formats[i])) { printf(" %s", snd_pcm_format_name(formats[i])); + } + } putchar('\n'); @@ -289,7 +292,7 @@ int main(int argc, char *argv[]) snd_pcm_close(pcm); - */ + return 0; }