From be1b3e131d99f3aab741c350bbe0b86b64a5eee8 Mon Sep 17 00:00:00 2001 From: Julian Porter Date: Thu, 5 Mar 2020 00:50:30 +0000 Subject: [PATCH 1/4] demo --- .gitignore | 9 - CHANGES => py/CHANGES | 0 LICENSE => py/LICENSE | 0 MANIFEST.in => py/MANIFEST.in | 0 NOTES.md => py/NOTES.md | 0 README.md => py/README.md | 0 TODO => py/TODO | 0 alsaaudio.c => py/alsaaudio.c | 0 {doc => py/doc}/Makefile | 0 {doc => py/doc}/README.md | 0 {doc => py/doc}/conf.py | 0 {doc => py/doc}/index.rst | 0 {doc => py/doc}/libalsaaudio.rst | 0 {doc => py/doc}/pyalsaaudio.rst | 0 {doc => py/doc}/terminology.rst | 0 isine.py => py/isine.py | 0 mixertest.py => py/mixertest.py | 0 play_rusage.py => py/play_rusage.py | 0 playbacktest.py => py/playbacktest.py | 0 playwav.py => py/playwav.py | 0 recordtest.py => py/recordtest.py | 0 setup.py => py/setup.py | 0 test.py => py/test.py | 0 tests/params | Bin 0 -> 17656 bytes tests/params.c | 296 ++++++++++++++++++++++++++ 25 files changed, 296 insertions(+), 9 deletions(-) delete mode 100644 .gitignore rename CHANGES => py/CHANGES (100%) rename LICENSE => py/LICENSE (100%) rename MANIFEST.in => py/MANIFEST.in (100%) rename NOTES.md => py/NOTES.md (100%) rename README.md => py/README.md (100%) rename TODO => py/TODO (100%) rename alsaaudio.c => py/alsaaudio.c (100%) rename {doc => py/doc}/Makefile (100%) rename {doc => py/doc}/README.md (100%) rename {doc => py/doc}/conf.py (100%) rename {doc => py/doc}/index.rst (100%) rename {doc => py/doc}/libalsaaudio.rst (100%) rename {doc => py/doc}/pyalsaaudio.rst (100%) rename {doc => py/doc}/terminology.rst (100%) rename isine.py => py/isine.py (100%) rename mixertest.py => py/mixertest.py (100%) rename play_rusage.py => py/play_rusage.py (100%) rename playbacktest.py => py/playbacktest.py (100%) rename playwav.py => py/playwav.py (100%) rename recordtest.py => py/recordtest.py (100%) rename setup.py => py/setup.py (100%) rename test.py => py/test.py (100%) create mode 100755 tests/params create mode 100644 tests/params.c diff --git a/.gitignore b/.gitignore deleted file mode 100644 index cc84b06..0000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.pyc -*.so -MANIFEST -doc/gh-pages/ -doc/html/ -doc/doctrees/ -gh-pages/ -build/ -dist/ \ No newline at end of file diff --git a/CHANGES b/py/CHANGES similarity index 100% rename from CHANGES rename to py/CHANGES diff --git a/LICENSE b/py/LICENSE similarity index 100% rename from LICENSE rename to py/LICENSE diff --git a/MANIFEST.in b/py/MANIFEST.in similarity index 100% rename from MANIFEST.in rename to py/MANIFEST.in diff --git a/NOTES.md b/py/NOTES.md similarity index 100% rename from NOTES.md rename to py/NOTES.md diff --git a/README.md b/py/README.md similarity index 100% rename from README.md rename to py/README.md diff --git a/TODO b/py/TODO similarity index 100% rename from TODO rename to py/TODO diff --git a/alsaaudio.c b/py/alsaaudio.c similarity index 100% rename from alsaaudio.c rename to py/alsaaudio.c diff --git a/doc/Makefile b/py/doc/Makefile similarity index 100% rename from doc/Makefile rename to py/doc/Makefile diff --git a/doc/README.md b/py/doc/README.md similarity index 100% rename from doc/README.md rename to py/doc/README.md diff --git a/doc/conf.py b/py/doc/conf.py similarity index 100% rename from doc/conf.py rename to py/doc/conf.py diff --git a/doc/index.rst b/py/doc/index.rst similarity index 100% rename from doc/index.rst rename to py/doc/index.rst diff --git a/doc/libalsaaudio.rst b/py/doc/libalsaaudio.rst similarity index 100% rename from doc/libalsaaudio.rst rename to py/doc/libalsaaudio.rst diff --git a/doc/pyalsaaudio.rst b/py/doc/pyalsaaudio.rst similarity index 100% rename from doc/pyalsaaudio.rst rename to py/doc/pyalsaaudio.rst diff --git a/doc/terminology.rst b/py/doc/terminology.rst similarity index 100% rename from doc/terminology.rst rename to py/doc/terminology.rst diff --git a/isine.py b/py/isine.py similarity index 100% rename from isine.py rename to py/isine.py diff --git a/mixertest.py b/py/mixertest.py similarity index 100% rename from mixertest.py rename to py/mixertest.py diff --git a/play_rusage.py b/py/play_rusage.py similarity index 100% rename from play_rusage.py rename to py/play_rusage.py diff --git a/playbacktest.py b/py/playbacktest.py similarity index 100% rename from playbacktest.py rename to py/playbacktest.py diff --git a/playwav.py b/py/playwav.py similarity index 100% rename from playwav.py rename to py/playwav.py diff --git a/recordtest.py b/py/recordtest.py similarity index 100% rename from recordtest.py rename to py/recordtest.py diff --git a/setup.py b/py/setup.py similarity index 100% rename from setup.py rename to py/setup.py diff --git a/test.py b/py/test.py similarity index 100% rename from test.py rename to py/test.py diff --git a/tests/params b/tests/params new file mode 100755 index 0000000000000000000000000000000000000000..00cbc1f3d29d38b22d9a90be3c579415b647cae9 GIT binary patch literal 17656 zcmeHP4RBo5b-ueR+XBQ&#y>GXtsg&%Ws26q*ha!O>`Geuxg&#OESgM!=k@N&5@>hT z{jntijX{`tyNGH!N$|9kahjQoVVDe|G;z{4$iUd9bv&|%rYcRRD&wT9SOg_;Tm_7` z-?{gm-M6dVCY{c7+L^tYx96Vko^$TG=iPVjyYIcLFZ#Q-I2{hb$tCU<#I-C|h*uX3 zZPpnOuV@ul;rF-2Z;6HAYb2)1y^5ezr9Njdt<|^-l=P11@=|((mSf5u5+%J#>Esov zgsEsyJn1c^#cyOj++U&?7&8)5Kxl zq3f#@mnQ8$Q{7y#W}tufhIMNOLd^sH(bQ1$Q0s=~4eLCKm}jkQH`yoIt@rjwm*})` zXvycLI0&QiuRidpZ+~&_<7I!iZ~G6OjW7P?+3w4qCRvgp8?s%FCy^6Q!j|DU6Fwbj z`+0`DBb61UC!u&v5u%tOkaGBQ74UckJJhOjcBtJ3j?(l<1v}4Iz_(VwSHiGSY8ZN(RPg7H3i$pC_(9+|p^nlt41BS;Rvh-K629&P`eh&y zOGQJfFIv`~NGxh4l7V>AvV^s5=XNU;j)(X3Cz9d#&g~rov1oW_VD~^+m6a_?L_^kK zFkan7MNI6#%{f~uXy%gRcMRtQ2OeGP4 zxQK)!i7?ztBCK)II~ebeCVPct1&0DwZ+|o}07bB*s82&AfPneB?)OYZp0%F!II&KQ5ib1Fh~bo+8Z`)|zZzLeB@TJ0>7)hHORxMEW{?{368Z^U zlf$d_A?Fg`#xErY{&wjy;#1f4W2SP7ab3>y0{5#1eX&gG@t^StJue^fk`*BsXMXY? zh0_>jAD^deIO~vP)`nlHRORoi4X?A|b2gmDMoxTP&>TzSC8rf$m80oZH&p_L4R
    -ZTK!5 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 literal 0 HcmV?d00001 diff --git a/tests/params.c b/tests/params.c new file mode 100644 index 0000000..48f161c --- /dev/null +++ b/tests/params.c @@ -0,0 +1,296 @@ +/* + * hw_params.c - print hardware capabilities + * + * compile with: gcc -o hw_params hw_params.c -lasound + */ + +#include +#include + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof *(a)) + +static const snd_pcm_access_t accesses[] = { + SND_PCM_ACCESS_MMAP_INTERLEAVED, + SND_PCM_ACCESS_MMAP_NONINTERLEAVED, + SND_PCM_ACCESS_MMAP_COMPLEX, + SND_PCM_ACCESS_RW_INTERLEAVED, + SND_PCM_ACCESS_RW_NONINTERLEAVED, +}; + +static const snd_pcm_format_t formats[] = { + 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 int rates[] = { + 5512, + 8000, + 11025, + 16000, + 22050, + 32000, + 44100, + 48000, + 64000, + 88200, + 96000, + 176400, + 192000, +}; + + +struct info_t { + int nChannels; + int channels[16]; + int nRates; + int rates[ARRAY_SIZE(formats)]; + int nFormats; + int formats[ARRAY_SIZE(rates)]; +}; + + +int checkPCM(const char *device_name,unsigned direction,struct info_t *info) { + + snd_pcm_t *pcm; + int err = snd_pcm_open(&pcm, device_name, direction, SND_PCM_NONBLOCK); + if (err < 0) { + fprintf(stderr, "cannot open device '%s': %s\n", device_name, snd_strerror(err)); + return 1; + } + + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + err = snd_pcm_hw_params_any(pcm, params); + if (err < 0) { + fprintf(stderr, "cannot get hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + + unsigned min,max; + err = snd_pcm_hw_params_get_channels_min(params, &min); + if (err < 0) { + fprintf(stderr, "cannot get minimum channels count: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + err = snd_pcm_hw_params_get_channels_max(params, &max); + if (err < 0) { + fprintf(stderr, "cannot get maximum channels count: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + + int nChannels=0; + for (int i = min; i <= max; ++i) { + if (!snd_pcm_hw_params_test_channels(pcm, params, i)) { + info->channels[nChannels++]=i; + } + } + info->nChannels=nChannels; + + int nFormats=0; + for (int i = 0; i < ARRAY_SIZE(formats); ++i) { + if (!snd_pcm_hw_params_test_format(pcm, params, formats[i])) { + info->formats[nFormats++]=formats[i]; + } + } + info->nFormats=nFormats; + + int nRates=0; + for (int i = 0; i < ARRAY_SIZE(rates); ++i) { + if (!snd_pcm_hw_params_test_rate(pcm, params, rates[i], 0)) { + info->rates[nRates++]=rates[i]; + } + } + info->nRates=nRates; + + + snd_pcm_close(pcm); + return 0; +} + +int main(int argc, char *argv[]) +{ + const char *device_name = "hw"; + snd_pcm_t *pcm; + snd_pcm_hw_params_t *hw_params; + unsigned int i; + unsigned int min, max; + int any_rate; + int err; + + if (argc > 1) + device_name = argv[1]; + + struct info_t info; + checkPCM(device_name,SND_PCM_STREAM_PLAYBACK,&info); + + printf("Formats:"); + for (int i = 0; i < info.nFormats; ++i) { + printf(" %s", snd_pcm_format_name(formats[i])); + } + putchar('\n'); + printf("Rates:"); + for (int i = 0; i < info.nRates; ++i) { + printf(" %u", info.rates[i]); + } + putchar('\n'); + + printf("Channels:"); + for (int i = 0; i < info.nChannels; ++i) { + printf(" %u", info.channels[i]); + } + putchar('\n'); + /* + + err = snd_pcm_open(&pcm, device_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); + if (err < 0) { + fprintf(stderr, "cannot open device '%s': %s\n", device_name, snd_strerror(err)); + return 1; + } + + snd_pcm_hw_params_alloca(&hw_params); + err = snd_pcm_hw_params_any(pcm, hw_params); + if (err < 0) { + fprintf(stderr, "cannot get hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + + printf("Device: %s (type: %s)\n", device_name, snd_pcm_type_name(snd_pcm_type(pcm))); + + printf("Access types:"); + for (i = 0; i < ARRAY_SIZE(accesses); ++i) { + if (!snd_pcm_hw_params_test_access(pcm, hw_params, accesses[i])) + printf(" %s", snd_pcm_access_name(accesses[i])); + } + putchar('\n'); + + printf("Formats:"); + for (i = 0; i < ARRAY_SIZE(formats); ++i) { + if (!snd_pcm_hw_params_test_format(pcm, hw_params, formats[i])) + printf(" %s", snd_pcm_format_name(formats[i])); + } + putchar('\n'); + + err = snd_pcm_hw_params_get_channels_min(hw_params, &min); + if (err < 0) { + fprintf(stderr, "cannot get minimum channels count: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + err = snd_pcm_hw_params_get_channels_max(hw_params, &max); + if (err < 0) { + fprintf(stderr, "cannot get maximum channels count: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + printf("Channels:"); + for (i = min; i <= max; ++i) { + if (!snd_pcm_hw_params_test_channels(pcm, hw_params, i)) + printf(" %u", i); + } + putchar('\n'); + + err = snd_pcm_hw_params_get_rate_min(hw_params, &min, NULL); + if (err < 0) { + fprintf(stderr, "cannot get minimum rate: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + err = snd_pcm_hw_params_get_rate_max(hw_params, &max, NULL); + if (err < 0) { + fprintf(stderr, "cannot get maximum rate: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + printf("Sample rates:"); + if (min == max) + printf(" %u", min); + else if (!snd_pcm_hw_params_test_rate(pcm, hw_params, min + 1, 0)) + printf(" %u-%u", min, max); + else { + any_rate = 0; + for (i = 0; i < ARRAY_SIZE(rates); ++i) { + if (!snd_pcm_hw_params_test_rate(pcm, hw_params, rates[i], 0)) { + any_rate = 1; + printf(" %u", rates[i]); + } + } + if (!any_rate) + printf(" %u-%u", min, max); + } + putchar('\n'); + + err = snd_pcm_hw_params_get_period_time_min(hw_params, &min, NULL); + if (err < 0) { + fprintf(stderr, "cannot get minimum period time: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + err = snd_pcm_hw_params_get_period_time_max(hw_params, &max, NULL); + if (err < 0) { + fprintf(stderr, "cannot get maximum period time: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + printf("Interrupt interval: %u-%u us\n", min, max); + + err = snd_pcm_hw_params_get_buffer_time_min(hw_params, &min, NULL); + if (err < 0) { + fprintf(stderr, "cannot get minimum buffer time: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + err = snd_pcm_hw_params_get_buffer_time_max(hw_params, &max, NULL); + if (err < 0) { + fprintf(stderr, "cannot get maximum buffer time: %s\n", snd_strerror(err)); + snd_pcm_close(pcm); + return 1; + } + printf("Buffer size: %u-%u us\n", min, max); + + snd_pcm_close(pcm); + + */ + return 0; +} + + From a056a90c61ce95c85ece4dde01e13f62247887d3 Mon Sep 17 00:00:00 2001 From: Julian Porter Date: Fri, 6 Mar 2020 19:59:04 +0000 Subject: [PATCH 2/4] 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; } From f244a70111c60b47cd49404fc10d0a97f9df3013 Mon Sep 17 00:00:00 2001 From: Julian Porter Date: Fri, 6 Mar 2020 20:06:59 +0000 Subject: [PATCH 3/4] tidied up --- py/CHANGES => CHANGES | 0 py/LICENSE => LICENSE | 0 py/MANIFEST.in => MANIFEST.in | 0 py/NOTES.md => NOTES.md | 0 py/README.md => README.md | 0 py/TODO => TODO | 0 py/alsaaudio.c => alsaaudio.c | 0 {py/doc => doc}/Makefile | 0 {py/doc => doc}/README.md | 0 {py/doc => doc}/conf.py | 0 {py/doc => doc}/index.rst | 0 {py/doc => doc}/libalsaaudio.rst | 0 {py/doc => doc}/pyalsaaudio.rst | 0 {py/doc => doc}/terminology.rst | 0 py/isine.py => isine.py | 0 py/mixertest.py => mixertest.py | 0 py/play_rusage.py => play_rusage.py | 0 py/playbacktest.py => playbacktest.py | 0 py/playwav.py => playwav.py | 0 py/recordtest.py => recordtest.py | 0 py/setup.py => setup.py | 0 py/test.py => test.py | 0 tests/params | Bin 18408 -> 0 bytes tests/params.c | 299 -------------------------- 24 files changed, 299 deletions(-) rename py/CHANGES => CHANGES (100%) rename py/LICENSE => LICENSE (100%) rename py/MANIFEST.in => MANIFEST.in (100%) rename py/NOTES.md => NOTES.md (100%) rename py/README.md => README.md (100%) rename py/TODO => TODO (100%) rename py/alsaaudio.c => alsaaudio.c (100%) rename {py/doc => doc}/Makefile (100%) rename {py/doc => doc}/README.md (100%) rename {py/doc => doc}/conf.py (100%) rename {py/doc => doc}/index.rst (100%) rename {py/doc => doc}/libalsaaudio.rst (100%) rename {py/doc => doc}/pyalsaaudio.rst (100%) rename {py/doc => doc}/terminology.rst (100%) rename py/isine.py => isine.py (100%) rename py/mixertest.py => mixertest.py (100%) rename py/play_rusage.py => play_rusage.py (100%) rename py/playbacktest.py => playbacktest.py (100%) rename py/playwav.py => playwav.py (100%) rename py/recordtest.py => recordtest.py (100%) rename py/setup.py => setup.py (100%) rename py/test.py => test.py (100%) delete mode 100755 tests/params delete mode 100644 tests/params.c diff --git a/py/CHANGES b/CHANGES similarity index 100% rename from py/CHANGES rename to CHANGES diff --git a/py/LICENSE b/LICENSE similarity index 100% rename from py/LICENSE rename to LICENSE diff --git a/py/MANIFEST.in b/MANIFEST.in similarity index 100% rename from py/MANIFEST.in rename to MANIFEST.in diff --git a/py/NOTES.md b/NOTES.md similarity index 100% rename from py/NOTES.md rename to NOTES.md diff --git a/py/README.md b/README.md similarity index 100% rename from py/README.md rename to README.md diff --git a/py/TODO b/TODO similarity index 100% rename from py/TODO rename to TODO diff --git a/py/alsaaudio.c b/alsaaudio.c similarity index 100% rename from py/alsaaudio.c rename to alsaaudio.c diff --git a/py/doc/Makefile b/doc/Makefile similarity index 100% rename from py/doc/Makefile rename to doc/Makefile diff --git a/py/doc/README.md b/doc/README.md similarity index 100% rename from py/doc/README.md rename to doc/README.md diff --git a/py/doc/conf.py b/doc/conf.py similarity index 100% rename from py/doc/conf.py rename to doc/conf.py diff --git a/py/doc/index.rst b/doc/index.rst similarity index 100% rename from py/doc/index.rst rename to doc/index.rst diff --git a/py/doc/libalsaaudio.rst b/doc/libalsaaudio.rst similarity index 100% rename from py/doc/libalsaaudio.rst rename to doc/libalsaaudio.rst diff --git a/py/doc/pyalsaaudio.rst b/doc/pyalsaaudio.rst similarity index 100% rename from py/doc/pyalsaaudio.rst rename to doc/pyalsaaudio.rst diff --git a/py/doc/terminology.rst b/doc/terminology.rst similarity index 100% rename from py/doc/terminology.rst rename to doc/terminology.rst diff --git a/py/isine.py b/isine.py similarity index 100% rename from py/isine.py rename to isine.py diff --git a/py/mixertest.py b/mixertest.py similarity index 100% rename from py/mixertest.py rename to mixertest.py diff --git a/py/play_rusage.py b/play_rusage.py similarity index 100% rename from py/play_rusage.py rename to play_rusage.py diff --git a/py/playbacktest.py b/playbacktest.py similarity index 100% rename from py/playbacktest.py rename to playbacktest.py diff --git a/py/playwav.py b/playwav.py similarity index 100% rename from py/playwav.py rename to playwav.py diff --git a/py/recordtest.py b/recordtest.py similarity index 100% rename from py/recordtest.py rename to recordtest.py diff --git a/py/setup.py b/setup.py similarity index 100% rename from py/setup.py rename to setup.py diff --git a/py/test.py b/test.py similarity index 100% rename from py/test.py rename to test.py diff --git a/tests/params b/tests/params deleted file mode 100755 index 412c9c41b4b9ac81fce8638f2239b4737ca7257b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18408 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 diff --git a/tests/params.c b/tests/params.c deleted file mode 100644 index 1e72d87..0000000 --- a/tests/params.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * hw_params.c - print hardware capabilities - * - * compile with: gcc -o hw_params hw_params.c -lasound - */ - -#include -#include - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof *(a)) - -static const snd_pcm_access_t accesses[] = { - SND_PCM_ACCESS_MMAP_INTERLEAVED, - SND_PCM_ACCESS_MMAP_NONINTERLEAVED, - SND_PCM_ACCESS_MMAP_COMPLEX, - SND_PCM_ACCESS_RW_INTERLEAVED, - SND_PCM_ACCESS_RW_NONINTERLEAVED, -}; - -static const snd_pcm_format_t formats[] = { - 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 int rates[] = { - 4000, - 5512, - 8000, - 11025, - 16000, - 22050, - 32000, - 44100, - 48000, - 64000, - 88200, - 96000, - 176400, - 192000, -}; - - -struct info_t { - int nChannels; - int channels[16]; - int nRates; - int rates[ARRAY_SIZE(formats)]; - int nFormats; - int formats[ARRAY_SIZE(rates)]; -}; - - -int checkPCM(const char *device_name,unsigned direction,struct info_t *info) { - - snd_pcm_t *pcm; - int err = snd_pcm_open(&pcm, device_name, direction, SND_PCM_NONBLOCK); - if (err < 0) { - fprintf(stderr, "cannot open device '%s': %s\n", device_name, snd_strerror(err)); - return 1; - } - - snd_pcm_hw_params_t *params; - snd_pcm_hw_params_alloca(¶ms); - err = snd_pcm_hw_params_any(pcm, params); - if (err < 0) { - fprintf(stderr, "cannot get hardware parameters: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - - unsigned min,max; - err = snd_pcm_hw_params_get_channels_min(params, &min); - if (err < 0) { - fprintf(stderr, "cannot get minimum channels count: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - err = snd_pcm_hw_params_get_channels_max(params, &max); - if (err < 0) { - fprintf(stderr, "cannot get maximum channels count: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - - int nChannels=0; - for (int i = min; i <= max; ++i) { - if (!snd_pcm_hw_params_test_channels(pcm, params, i)) { - info->channels[nChannels++]=i; - } - } - info->nChannels=nChannels; - - int nFormats=0; - for (int i = 0; i < ARRAY_SIZE(formats); ++i) { - if (!snd_pcm_hw_params_test_format(pcm, params, formats[i])) { - info->formats[nFormats++]=formats[i]; - } - } - info->nFormats=nFormats; - - int nRates=0; - for (int i = 0; i < ARRAY_SIZE(rates); ++i) { - if (!snd_pcm_hw_params_test_rate(pcm, params, rates[i], 0)) { - info->rates[nRates++]=rates[i]; - } - } - info->nRates=nRates; - - - snd_pcm_close(pcm); - return 0; -} - -int main(int argc, char *argv[]) -{ - const char *device_name = "hw"; - snd_pcm_t *pcm; - snd_pcm_hw_params_t *hw_params; - unsigned int i; - unsigned int min, max; - int any_rate; - int err; - - if (argc > 1) - device_name = argv[1]; - - struct info_t info; - checkPCM(device_name,SND_PCM_STREAM_PLAYBACK,&info); - - printf("Formats:"); - for (int i = 0; i < info.nFormats; ++i) { - printf("%s ", snd_pcm_format_name(info.formats[i])); - } - putchar('\n'); - printf("Rates:"); - for (int i = 0; i < info.nRates; ++i) { - printf(" %u", info.rates[i]); - } - putchar('\n'); - - printf("Channels:"); - for (int i = 0; i < info.nChannels; ++i) { - printf(" %u", info.channels[i]); - } - putchar('\n'); - - - err = snd_pcm_open(&pcm, device_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); - if (err < 0) { - fprintf(stderr, "cannot open device '%s': %s\n", device_name, snd_strerror(err)); - return 1; - } - - snd_pcm_hw_params_alloca(&hw_params); - err = snd_pcm_hw_params_any(pcm, hw_params); - if (err < 0) { - fprintf(stderr, "cannot get hardware parameters: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - - printf("Device: %s (type: %s)\n", device_name, snd_pcm_type_name(snd_pcm_type(pcm))); - - printf("Access types:"); - for (i = 0; i < ARRAY_SIZE(accesses); ++i) { - if (!snd_pcm_hw_params_test_access(pcm, hw_params, accesses[i])) - printf(" %s", snd_pcm_access_name(accesses[i])); - } - putchar('\n'); - - printf("Formats:"); - for (i = 0; i < ARRAY_SIZE(formats); ++i) { - if (!snd_pcm_hw_params_test_format(pcm, hw_params, formats[i])) { - printf(" %s", snd_pcm_format_name(formats[i])); - } - - } - putchar('\n'); - - err = snd_pcm_hw_params_get_channels_min(hw_params, &min); - if (err < 0) { - fprintf(stderr, "cannot get minimum channels count: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - err = snd_pcm_hw_params_get_channels_max(hw_params, &max); - if (err < 0) { - fprintf(stderr, "cannot get maximum channels count: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - printf("Channels:"); - for (i = min; i <= max; ++i) { - if (!snd_pcm_hw_params_test_channels(pcm, hw_params, i)) - printf(" %u", i); - } - putchar('\n'); - - err = snd_pcm_hw_params_get_rate_min(hw_params, &min, NULL); - if (err < 0) { - fprintf(stderr, "cannot get minimum rate: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - err = snd_pcm_hw_params_get_rate_max(hw_params, &max, NULL); - if (err < 0) { - fprintf(stderr, "cannot get maximum rate: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - printf("Sample rates:"); - if (min == max) - printf(" %u", min); - else if (!snd_pcm_hw_params_test_rate(pcm, hw_params, min + 1, 0)) - printf(" %u-%u", min, max); - else { - any_rate = 0; - for (i = 0; i < ARRAY_SIZE(rates); ++i) { - if (!snd_pcm_hw_params_test_rate(pcm, hw_params, rates[i], 0)) { - any_rate = 1; - printf(" %u", rates[i]); - } - } - if (!any_rate) - printf(" %u-%u", min, max); - } - putchar('\n'); - - err = snd_pcm_hw_params_get_period_time_min(hw_params, &min, NULL); - if (err < 0) { - fprintf(stderr, "cannot get minimum period time: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - err = snd_pcm_hw_params_get_period_time_max(hw_params, &max, NULL); - if (err < 0) { - fprintf(stderr, "cannot get maximum period time: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - printf("Interrupt interval: %u-%u us\n", min, max); - - err = snd_pcm_hw_params_get_buffer_time_min(hw_params, &min, NULL); - if (err < 0) { - fprintf(stderr, "cannot get minimum buffer time: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - err = snd_pcm_hw_params_get_buffer_time_max(hw_params, &max, NULL); - if (err < 0) { - fprintf(stderr, "cannot get maximum buffer time: %s\n", snd_strerror(err)); - snd_pcm_close(pcm); - return 1; - } - printf("Buffer size: %u-%u us\n", min, max); - - snd_pcm_close(pcm); - - - return 0; -} - - From fc011b5ea6c089989df4cb77fa8dd808f654e169 Mon Sep 17 00:00:00 2001 From: Julian Porter Date: Fri, 6 Mar 2020 20:21:47 +0000 Subject: [PATCH 4/4] restored gitignore! --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cc84b06 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.pyc +*.so +MANIFEST +doc/gh-pages/ +doc/html/ +doc/doctrees/ +gh-pages/ +build/ +dist/ \ No newline at end of file