From be1b3e131d99f3aab741c350bbe0b86b64a5eee8 Mon Sep 17 00:00:00 2001 From: Julian Porter Date: Thu, 5 Mar 2020 00:50:30 +0000 Subject: [PATCH] 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; +} + +