From 6fd2f50b7d967c17313ffadfb20b2f371f271628 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:28:32 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- ABOUT-NLS | 1111 ++++ COPYING | 340 ++ ChangeLog | 43 + INSTALL | 46 + Makefile.am | 45 + Makefile.in | 745 +++ README | 20 + TODO | 4 + acinclude.m4 | 12 + aclocal.m4 | 1271 +++++ alsa-utils.manifest | 16 + alsaconf/Makefile.am | 37 + alsaconf/Makefile.in | 684 +++ alsaconf/alsaconf.8 | 102 + alsaconf/alsaconf.fr.8 | 111 + alsaconf/alsaconf.in | 1451 +++++ alsaconf/po/Makefile.in | 91 + alsaconf/po/ja.po | 362 ++ alsaconf/po/ru.po | 373 ++ alsactl/90-alsa-restore.rules | 2 + alsactl/90-alsa-restore.rules.in | 2 + alsactl/Makefile.am | 59 + alsactl/Makefile.in | 930 ++++ alsactl/alsa-restore.service.in | 11 + alsactl/alsa-store.service.in | 9 + alsactl/alsactl.1 | 118 + alsactl/alsactl.c | 195 + alsactl/alsactl.h | 94 + alsactl/alsactl_init.xml | 625 +++ alsactl/init/00main | 49 + alsactl/init/Makefile.am | 7 + alsactl/init/Makefile.in | 417 ++ alsactl/init/default | 211 + alsactl/init/hda | 39 + alsactl/init/help | 8 + alsactl/init/info | 22 + alsactl/init/test | 270 + alsactl/init_parse.c | 1777 ++++++ alsactl/init_sysdeps.c | 63 + alsactl/init_sysfs.c | 158 + alsactl/init_utils_run.c | 247 + alsactl/init_utils_string.c | 183 + alsactl/list.h | 289 + alsactl/state.c | 1670 ++++++ alsactl/utils.c | 102 + alsaloop/Makefile.am | 14 + alsaloop/Makefile.in | 590 ++ alsaloop/alsaloop.1 | 206 + alsaloop/alsaloop.c | 923 ++++ alsaloop/alsaloop.h | 218 + alsaloop/control.c | 424 ++ alsaloop/pcmjob.c | 1925 +++++++ alsamixer/Makefile.am | 25 + alsamixer/Makefile.in | 619 +++ alsamixer/alsamixer.1 | 178 + alsamixer/card_select.c | 268 + alsamixer/card_select.h | 7 + alsamixer/cli.c | 135 + alsamixer/colors.c | 119 + alsamixer/colors.h | 33 + alsamixer/device_name.c | 197 + alsamixer/device_name.h | 6 + alsamixer/die.c | 39 + alsamixer/die.h | 7 + alsamixer/mainloop.c | 135 + alsamixer/mainloop.h | 10 + alsamixer/mem.c | 68 + alsamixer/mem.h | 11 + alsamixer/mixer_controls.c | 521 ++ alsamixer/mixer_controls.h | 37 + alsamixer/mixer_display.c | 743 +++ alsamixer/mixer_display.h | 10 + alsamixer/mixer_widget.c | 650 +++ alsamixer/mixer_widget.h | 36 + alsamixer/proc_files.c | 169 + alsamixer/proc_files.h | 6 + alsamixer/textbox.c | 397 ++ alsamixer/textbox.h | 10 + alsamixer/utils.c | 111 + alsamixer/utils.h | 10 + alsamixer/volume_mapping.c | 180 + alsamixer/volume_mapping.h | 19 + alsamixer/widget.c | 140 + alsamixer/widget.h | 33 + alsaucm/Makefile.am | 13 + alsaucm/Makefile.in | 503 ++ alsaucm/go.sh | 7 + alsaucm/usecase.c | 505 ++ amidi/Makefile.am | 5 + amidi/Makefile.in | 578 ++ amidi/amidi.1 | 155 + amidi/amidi.c | 620 +++ amixer/Makefile.am | 10 + amixer/Makefile.in | 585 ++ amixer/amixer.1 | 141 + amixer/amixer.c | 2036 +++++++ amixer/amixer.h | 21 + aplay/Makefile.am | 31 + aplay/Makefile.in | 604 ++ aplay/aplay.1 | 237 + aplay/aplay.c | 2963 ++++++++++ aplay/arecord.1 | 237 + aplay/formats.h | 127 + config.guess | 1501 +++++ config.rpath | 614 +++ config.sub | 1705 ++++++ configure | 9722 +++++++++++++++++++++++++++++++++ configure.in | 312 ++ debian/alsa-utils.install | 4 + debian/alsa-utils.install.in | 4 + debian/changelog | 73 + debian/compat | 1 + debian/control | 13 + debian/copyright | 5 + debian/dirs | 2 + debian/docs | 2 + debian/rules | 115 + depcomp | 630 +++ gitcompile | 25 + iecset/Makefile.am | 9 + iecset/Makefile.in | 582 ++ iecset/iecbits.c | 259 + iecset/iecset.1 | 104 + iecset/iecset.c | 432 ++ include/Makefile.am | 25 + include/Makefile.in | 457 ++ include/aconfig.h.in | 140 + include/gettext.h | 22 + include/gettext_curses.h | 2 + include/version.h | 12 + install-sh | 520 ++ m4/Makefile.am | 1 + m4/Makefile.in | 363 ++ m4/codeset.m4 | 21 + m4/gettext.m4 | 631 +++ m4/glibc2.m4 | 30 + m4/glibc21.m4 | 30 + m4/iconv.m4 | 101 + m4/intdiv0.m4 | 70 + m4/intmax.m4 | 30 + m4/inttypes-h.m4 | 25 + m4/inttypes-pri.m4 | 30 + m4/inttypes_h.m4 | 26 + m4/lcmessage.m4 | 30 + m4/lib-ld.m4 | 110 + m4/lib-link.m4 | 630 +++ m4/lib-prefix.m4 | 185 + m4/lock.m4 | 289 + m4/longdouble.m4 | 31 + m4/longlong.m4 | 23 + m4/nls.m4 | 31 + m4/po.m4 | 428 ++ m4/printf-posix.m4 | 44 + m4/progtest.m4 | 92 + m4/signed.m4 | 17 + m4/size_max.m4 | 60 + m4/stdint_h.m4 | 26 + m4/uintmax_t.m4 | 30 + m4/ulonglong.m4 | 23 + m4/visibility.m4 | 52 + m4/wchar_t.m4 | 20 + m4/wint_t.m4 | 20 + m4/xsize.m4 | 13 + missing | 376 ++ packaging/alsa-utils.spec | 73 + po/LINGUAS | 1 + po/Makefile.in.in | 393 ++ po/Makevars | 41 + po/POTFILES.in | 12 + po/Rules-quot | 47 + po/alsa-utils.pot | 1496 +++++ po/boldquot.sed | 10 + po/de.gmo | Bin 0 -> 30841 bytes po/de.po | 1577 ++++++ po/en@boldquot.header | 25 + po/en@quot.header | 22 + po/fr.gmo | Bin 0 -> 30067 bytes po/fr.po | 1589 ++++++ po/insert-header.sin | 23 + po/ja.gmo | Bin 0 -> 24675 bytes po/ja.po | 1561 ++++++ po/quot.sed | 6 + po/remove-potcdate.sin | 19 + po/stamp-po | 1 + seq/Makefile.am | 1 + seq/Makefile.in | 565 ++ seq/aconnect/Makefile.am | 7 + seq/aconnect/Makefile.in | 582 ++ seq/aconnect/README.aconnect | 46 + seq/aconnect/aconnect.1 | 145 + seq/aconnect/aconnect.c | 392 ++ seq/aplaymidi/Makefile.am | 5 + seq/aplaymidi/Makefile.in | 585 ++ seq/aplaymidi/aplaymidi.1 | 55 + seq/aplaymidi/aplaymidi.c | 932 ++++ seq/aplaymidi/arecordmidi.1 | 82 + seq/aplaymidi/arecordmidi.c | 880 +++ seq/aseqdump/Makefile.am | 5 + seq/aseqdump/Makefile.in | 578 ++ seq/aseqdump/aseqdump.1 | 39 + seq/aseqdump/aseqdump.c | 438 ++ seq/aseqnet/Makefile.am | 7 + seq/aseqnet/Makefile.in | 581 ++ seq/aseqnet/README.aseqnet | 53 + seq/aseqnet/aseqnet.1 | 81 + seq/aseqnet/aseqnet.c | 609 +++ speaker-test/Makefile.am | 9 + speaker-test/Makefile.in | 737 +++ speaker-test/pink.c | 96 + speaker-test/pink.h | 15 + speaker-test/readme.txt | 12 + speaker-test/samples/Front_Center.wav | Bin 0 -> 137134 bytes speaker-test/samples/Front_Left.wav | Bin 0 -> 142128 bytes speaker-test/samples/Front_Right.wav | Bin 0 -> 146990 bytes speaker-test/samples/Makefile.am | 20 + speaker-test/samples/Makefile.in | 450 ++ speaker-test/samples/Noise.wav | Bin 0 -> 135202 bytes speaker-test/samples/Rear_Center.wav | Bin 0 -> 130096 bytes speaker-test/samples/Rear_Left.wav | Bin 0 -> 126064 bytes speaker-test/samples/Rear_Right.wav | Bin 0 -> 146480 bytes speaker-test/samples/Side_Left.wav | Bin 0 -> 134868 bytes speaker-test/samples/Side_Right.wav | Bin 0 -> 129966 bytes speaker-test/samples/sample_map.csv | 2 + speaker-test/speaker-test.1 | 125 + speaker-test/speaker-test.c | 1087 ++++ utils/Makefile.am | 4 + utils/Makefile.in | 369 ++ utils/alsa-utils.spec.in | 76 + utils/buildrpm | 44 + 229 files changed, 70818 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 README create mode 100644 TODO create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100755 alsa-utils.manifest create mode 100644 alsaconf/Makefile.am create mode 100644 alsaconf/Makefile.in create mode 100644 alsaconf/alsaconf.8 create mode 100644 alsaconf/alsaconf.fr.8 create mode 100644 alsaconf/alsaconf.in create mode 100644 alsaconf/po/Makefile.in create mode 100644 alsaconf/po/ja.po create mode 100644 alsaconf/po/ru.po create mode 100644 alsactl/90-alsa-restore.rules create mode 100644 alsactl/90-alsa-restore.rules.in create mode 100644 alsactl/Makefile.am create mode 100644 alsactl/Makefile.in create mode 100644 alsactl/alsa-restore.service.in create mode 100644 alsactl/alsa-store.service.in create mode 100644 alsactl/alsactl.1 create mode 100644 alsactl/alsactl.c create mode 100644 alsactl/alsactl.h create mode 100644 alsactl/alsactl_init.xml create mode 100644 alsactl/init/00main create mode 100644 alsactl/init/Makefile.am create mode 100644 alsactl/init/Makefile.in create mode 100644 alsactl/init/default create mode 100644 alsactl/init/hda create mode 100644 alsactl/init/help create mode 100644 alsactl/init/info create mode 100644 alsactl/init/test create mode 100644 alsactl/init_parse.c create mode 100644 alsactl/init_sysdeps.c create mode 100644 alsactl/init_sysfs.c create mode 100644 alsactl/init_utils_run.c create mode 100644 alsactl/init_utils_string.c create mode 100644 alsactl/list.h create mode 100644 alsactl/state.c create mode 100644 alsactl/utils.c create mode 100644 alsaloop/Makefile.am create mode 100644 alsaloop/Makefile.in create mode 100644 alsaloop/alsaloop.1 create mode 100644 alsaloop/alsaloop.c create mode 100644 alsaloop/alsaloop.h create mode 100644 alsaloop/control.c create mode 100644 alsaloop/pcmjob.c create mode 100644 alsamixer/Makefile.am create mode 100644 alsamixer/Makefile.in create mode 100644 alsamixer/alsamixer.1 create mode 100644 alsamixer/card_select.c create mode 100644 alsamixer/card_select.h create mode 100644 alsamixer/cli.c create mode 100644 alsamixer/colors.c create mode 100644 alsamixer/colors.h create mode 100644 alsamixer/device_name.c create mode 100644 alsamixer/device_name.h create mode 100644 alsamixer/die.c create mode 100644 alsamixer/die.h create mode 100644 alsamixer/mainloop.c create mode 100644 alsamixer/mainloop.h create mode 100644 alsamixer/mem.c create mode 100644 alsamixer/mem.h create mode 100644 alsamixer/mixer_controls.c create mode 100644 alsamixer/mixer_controls.h create mode 100644 alsamixer/mixer_display.c create mode 100644 alsamixer/mixer_display.h create mode 100644 alsamixer/mixer_widget.c create mode 100644 alsamixer/mixer_widget.h create mode 100644 alsamixer/proc_files.c create mode 100644 alsamixer/proc_files.h create mode 100644 alsamixer/textbox.c create mode 100644 alsamixer/textbox.h create mode 100644 alsamixer/utils.c create mode 100644 alsamixer/utils.h create mode 100644 alsamixer/volume_mapping.c create mode 100644 alsamixer/volume_mapping.h create mode 100644 alsamixer/widget.c create mode 100644 alsamixer/widget.h create mode 100644 alsaucm/Makefile.am create mode 100644 alsaucm/Makefile.in create mode 100755 alsaucm/go.sh create mode 100644 alsaucm/usecase.c create mode 100644 amidi/Makefile.am create mode 100644 amidi/Makefile.in create mode 100644 amidi/amidi.1 create mode 100644 amidi/amidi.c create mode 100644 amixer/Makefile.am create mode 100644 amixer/Makefile.in create mode 100644 amixer/amixer.1 create mode 100644 amixer/amixer.c create mode 100644 amixer/amixer.h create mode 100644 aplay/Makefile.am create mode 100644 aplay/Makefile.in create mode 100644 aplay/aplay.1 create mode 100644 aplay/aplay.c create mode 100644 aplay/arecord.1 create mode 100644 aplay/formats.h create mode 100755 config.guess create mode 100755 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 debian/alsa-utils.install create mode 100644 debian/alsa-utils.install.in create mode 100755 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/dirs create mode 100644 debian/docs create mode 100755 debian/rules create mode 100755 depcomp create mode 100755 gitcompile create mode 100644 iecset/Makefile.am create mode 100644 iecset/Makefile.in create mode 100644 iecset/iecbits.c create mode 100644 iecset/iecset.1 create mode 100644 iecset/iecset.c create mode 100644 include/Makefile.am create mode 100644 include/Makefile.in create mode 100644 include/aconfig.h.in create mode 100644 include/gettext.h create mode 100644 include/gettext_curses.h create mode 100644 include/version.h create mode 100755 install-sh create mode 100644 m4/Makefile.am create mode 100644 m4/Makefile.in create mode 100644 m4/codeset.m4 create mode 100644 m4/gettext.m4 create mode 100644 m4/glibc2.m4 create mode 100644 m4/glibc21.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/intdiv0.m4 create mode 100644 m4/intmax.m4 create mode 100644 m4/inttypes-h.m4 create mode 100644 m4/inttypes-pri.m4 create mode 100644 m4/inttypes_h.m4 create mode 100644 m4/lcmessage.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/lock.m4 create mode 100644 m4/longdouble.m4 create mode 100644 m4/longlong.m4 create mode 100644 m4/nls.m4 create mode 100644 m4/po.m4 create mode 100644 m4/printf-posix.m4 create mode 100644 m4/progtest.m4 create mode 100644 m4/signed.m4 create mode 100644 m4/size_max.m4 create mode 100644 m4/stdint_h.m4 create mode 100644 m4/uintmax_t.m4 create mode 100644 m4/ulonglong.m4 create mode 100644 m4/visibility.m4 create mode 100644 m4/wchar_t.m4 create mode 100644 m4/wint_t.m4 create mode 100644 m4/xsize.m4 create mode 100755 missing create mode 100644 packaging/alsa-utils.spec create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/Makevars create mode 100644 po/POTFILES.in create mode 100644 po/Rules-quot create mode 100644 po/alsa-utils.pot create mode 100644 po/boldquot.sed create mode 100644 po/de.gmo create mode 100644 po/de.po create mode 100644 po/en@boldquot.header create mode 100644 po/en@quot.header create mode 100644 po/fr.gmo create mode 100644 po/fr.po create mode 100644 po/insert-header.sin create mode 100644 po/ja.gmo create mode 100644 po/ja.po create mode 100644 po/quot.sed create mode 100644 po/remove-potcdate.sin create mode 100644 po/stamp-po create mode 100644 seq/Makefile.am create mode 100644 seq/Makefile.in create mode 100644 seq/aconnect/Makefile.am create mode 100644 seq/aconnect/Makefile.in create mode 100644 seq/aconnect/README.aconnect create mode 100644 seq/aconnect/aconnect.1 create mode 100644 seq/aconnect/aconnect.c create mode 100644 seq/aplaymidi/Makefile.am create mode 100644 seq/aplaymidi/Makefile.in create mode 100644 seq/aplaymidi/aplaymidi.1 create mode 100644 seq/aplaymidi/aplaymidi.c create mode 100644 seq/aplaymidi/arecordmidi.1 create mode 100644 seq/aplaymidi/arecordmidi.c create mode 100644 seq/aseqdump/Makefile.am create mode 100644 seq/aseqdump/Makefile.in create mode 100644 seq/aseqdump/aseqdump.1 create mode 100644 seq/aseqdump/aseqdump.c create mode 100644 seq/aseqnet/Makefile.am create mode 100644 seq/aseqnet/Makefile.in create mode 100644 seq/aseqnet/README.aseqnet create mode 100644 seq/aseqnet/aseqnet.1 create mode 100644 seq/aseqnet/aseqnet.c create mode 100644 speaker-test/Makefile.am create mode 100644 speaker-test/Makefile.in create mode 100644 speaker-test/pink.c create mode 100644 speaker-test/pink.h create mode 100644 speaker-test/readme.txt create mode 100644 speaker-test/samples/Front_Center.wav create mode 100644 speaker-test/samples/Front_Left.wav create mode 100644 speaker-test/samples/Front_Right.wav create mode 100644 speaker-test/samples/Makefile.am create mode 100644 speaker-test/samples/Makefile.in create mode 100644 speaker-test/samples/Noise.wav create mode 100644 speaker-test/samples/Rear_Center.wav create mode 100644 speaker-test/samples/Rear_Left.wav create mode 100644 speaker-test/samples/Rear_Right.wav create mode 100644 speaker-test/samples/Side_Left.wav create mode 100644 speaker-test/samples/Side_Right.wav create mode 100644 speaker-test/samples/sample_map.csv create mode 100644 speaker-test/speaker-test.1 create mode 100644 speaker-test/speaker-test.c create mode 100644 utils/Makefile.am create mode 100644 utils/Makefile.in create mode 100644 utils/alsa-utils.spec.in create mode 100644 utils/buildrpm diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..3575535 --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,1111 @@ +1 Notes on the Free Translation Project +*************************************** + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that free software will gradually become able to speak many +languages. A few packages already provide translations for their +messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work on translations can contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +1.1 Quick configuration advice +============================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +1.2 INSTALL Matters +=================== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the included GNU +`gettext' library will be used. This library is wholly contained +within this package, usually in the `intl/' subdirectory, so prior +installation of the GNU `gettext' package is _not_ required. +Installers may use special options at configuration time for changing +the default behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will, respectively, bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might not be desirable. You should use +the more recent version of the GNU `gettext' library. I.e. if the file +`intl/VERSION' shows that the library which comes with this package is +more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages usually have many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +1.3 Using This Package +====================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your language by running the +command `locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +1.4 Translating Teams +===================== + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +1.5 Available Packages +====================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of July +2006. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo + +----------------------------------------------------+ + GNUnet | [] | + a2ps | [] [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | [] | + ap-utils | | + aspell | [] [] [] [] | + bash | [] [] [] | + batchelor | [] | + bfd | | + bibshelf | [] | + binutils | [] | + bison | [] [] | + bison-runtime | [] | + bluez-pin | [] [] [] [] [] | + cflow | [] | + clisp | [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | | + cpplib | [] [] [] | + cryptonit | [] | + darkstat | [] () [] | + dialog | [] [] [] [] [] [] | + diffutils | [] [] [] [] [] [] | + doodle | [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] | + error | [] [] [] [] | + fetchmail | [] [] () [] | + fileutils | [] [] | + findutils | [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | | + gawk | [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] | + gimp-print | [] [] [] [] | + gip | [] | + gliv | [] | + glunarclock | [] | + gmult | [] [] | + gnubiff | () | + gnucash | () () [] | + gnucash-glossary | [] () | + gnuedu | | + gnulib | [] [] [] [] [] [] | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | [] [] | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | | + gpe-edit | [] | + gpe-filemanager | | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-package | | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | | + gphoto2 | [] [] [] [] | + gprof | [] [] | + gpsdrive | () () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] | + gretl | | + gsasl | | + gss | | + gst-plugins | [] [] [] [] | + gst-plugins-base | [] [] [] | + gst-plugins-good | [] [] [] [] [] [] [] | + gstreamer | [] [] [] [] [] [] [] | + gtick | [] () | + gtkam | [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] | + id-utils | [] [] | + impost | | + indent | [] [] [] | + iso_3166 | [] [] | + iso_3166_1 | [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] | + iso_639 | [] [] | + jpilot | [] | + jtag | | + jwhois | | + kbd | [] [] [] [] | + keytouch | | + keytouch-editor | | + keytouch-keyboa... | | + latrine | () | + ld | [] | + leafpad | [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] | + libgpg-error | [] | + libgphoto2 | [] [] | + libgphoto2_port | [] [] | + libgsasl | | + libiconv | [] [] | + libidn | [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | [] | + make | [] [] | + man-db | [] () [] [] | + minicom | [] [] [] | + mysecretdiary | [] [] | + nano | [] [] () [] | + nano_1_0 | [] () [] [] | + opcodes | [] | + parted | | + pilot-qof | [] | + psmisc | [] | + pwdutils | | + python | | + qof | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] [] | + sed | [] [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] [] | + sharutils | [] [] [] [] [] [] | + shishi | | + silky | | + skencil | [] () | + sketch | [] () | + solfege | | + soundtracker | [] [] | + sp | [] | + stardict | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] | + texinfo | [] [] [] | + textutils | [] [] [] | + tin | () () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] | + xchat | [] [] [] [] [] | + xkeyboard-config | | + xpad | [] [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs cy da de el en en_GB eo + 11 0 1 2 8 21 1 42 43 2 62 99 18 1 16 16 + + es et eu fa fi fr ga gl gu he hi hr hu id is it + +--------------------------------------------------+ + GNUnet | | + a2ps | [] [] [] () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] [] | + aspell | [] [] [] | + bash | [] [] [] | + batchelor | [] [] | + bfd | [] | + bibshelf | [] [] [] | + binutils | [] [] [] | + bison | [] [] [] [] [] [] | + bison-runtime | [] [] [] [] [] | + bluez-pin | [] [] [] [] [] | + cflow | | + clisp | [] [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] | + cpplib | [] [] | + cryptonit | [] | + darkstat | [] () [] [] [] | + dialog | [] [] [] [] [] [] [] [] | + diffutils | [] [] [] [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] | + error | [] [] [] [] [] | + fetchmail | [] | + fileutils | [] [] [] [] [] [] | + findutils | [] [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | [] [] | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] [] | + gcc | [] | + gettext-examples | [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] | + gip | [] [] [] | + gliv | () | + glunarclock | [] [] [] | + gmult | [] [] [] | + gnubiff | () () | + gnucash | () () () | + gnucash-glossary | [] [] | + gnuedu | [] | + gnulib | [] [] [] [] [] [] [] [] | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] [] | + gpe-beam | [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] [] [] | + gpe-filemanager | [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] | + gpe-ownerinfo | [] [] [] [] [] | + gpe-package | [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] [] | + gpsdrive | () () [] () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] [] [] [] [] | + gretl | [] [] [] | + gsasl | [] | + gss | [] | + gst-plugins | [] [] [] | + gst-plugins-base | [] [] | + gst-plugins-good | [] [] [] | + gstreamer | [] [] [] | + gtick | [] [] [] [] [] | + gtkam | [] [] [] [] | + gtkorphan | [] [] | + gtkspell | [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] [] | + impost | [] [] | + indent | [] [] [] [] [] [] [] [] [] [] | + iso_3166 | [] [] [] | + iso_3166_1 | [] [] [] [] [] [] [] | + iso_3166_2 | [] | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] | + iso_639 | [] [] [] [] [] | + jpilot | [] [] | + jtag | [] | + jwhois | [] [] [] [] [] | + kbd | [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | [] [] [] | + ld | [] [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] | + libgpewidget | [] [] [] [] [] | + libgpg-error | | + libgphoto2 | [] [] [] | + libgphoto2_port | [] [] | + libgsasl | [] [] | + libiconv | [] | + libidn | [] [] | + lifelines | () | + lilypond | [] | + lingoteach | [] [] [] | + lynx | [] [] [] | + m4 | [] [] [] [] | + mailutils | [] [] | + make | [] [] [] [] [] [] [] [] | + man-db | () | + minicom | [] [] [] [] | + mysecretdiary | [] [] [] | + nano | [] () [] [] [] [] | + nano_1_0 | [] [] [] [] [] | + opcodes | [] [] [] [] | + parted | [] [] [] [] | + pilot-qof | | + psmisc | [] [] [] | + pwdutils | | + python | | + qof | | + radius | [] [] | + recode | [] [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] | + sed | [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] [] [] | + shishi | | + silky | [] | + skencil | [] [] | + sketch | [] [] | + solfege | [] | + soundtracker | [] [] [] | + sp | [] | + stardict | [] | + system-tools-ba... | [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] [] | + texinfo | [] [] | + textutils | [] [] [] [] [] | + tin | [] () | + tp-robot | [] [] [] [] | + tuxpaint | [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] [] [] [] | + vorbis-tools | [] [] | + wastesedge | () | + wdiff | [] [] [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] | + xchat | [] [] [] [] [] [] [] [] | + xkeyboard-config | [] [] [] [] | + xpad | [] [] [] | + +--------------------------------------------------+ + es et eu fa fi fr ga gl gu he hi hr hu id is it + 89 21 16 2 41 119 61 14 1 8 1 6 61 30 0 53 + + ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no + +--------------------------------------------------+ + GNUnet | | + a2ps | () [] [] () | + aegis | () | + ant-phone | [] | + anubis | [] [] [] | + ap-utils | [] | + aspell | [] [] | + bash | [] | + batchelor | [] [] | + bfd | | + bibshelf | [] | + binutils | | + bison | [] [] [] | + bison-runtime | [] [] [] | + bluez-pin | [] [] [] | + cflow | | + clisp | [] | + console-tools | | + coreutils | [] | + cpio | | + cpplib | [] | + cryptonit | [] | + darkstat | [] [] | + dialog | [] [] | + diffutils | [] [] [] | + doodle | | + e2fsprogs | [] | + enscript | [] | + error | [] | + fetchmail | [] [] | + fileutils | [] [] | + findutils | [] | + flex | [] [] | + fslint | [] [] | + gas | | + gawk | [] [] | + gbiff | [] | + gcal | | + gcc | | + gettext-examples | [] [] | + gettext-runtime | [] [] [] | + gettext-tools | [] [] | + gimp-print | [] [] | + gip | [] [] | + gliv | [] | + glunarclock | [] [] | + gmult | [] [] | + gnubiff | | + gnucash | () () | + gnucash-glossary | [] | + gnuedu | | + gnulib | [] [] [] [] | + gnunet-gtk | | + gnutls | | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | [] | + gpe-edit | [] [] | + gpe-filemanager | [] | + gpe-go | [] [] | + gpe-login | [] [] | + gpe-ownerinfo | [] | + gpe-package | [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] [] | + gpe-timesheet | [] | + gpe-today | [] | + gpe-todo | | + gphoto2 | [] [] | + gprof | | + gpsdrive | () () () | + gramadoir | () | + grep | [] [] [] | + gretl | | + gsasl | [] | + gss | | + gst-plugins | [] | + gst-plugins-base | | + gst-plugins-good | [] | + gstreamer | [] | + gtick | [] | + gtkam | [] | + gtkorphan | [] | + gtkspell | [] [] | + gutenprint | | + hello | [] [] [] [] [] [] [] [] | + id-utils | [] | + impost | | + indent | [] [] | + iso_3166 | [] | + iso_3166_1 | [] [] | + iso_3166_2 | [] | + iso_3166_3 | [] | + iso_4217 | [] [] [] | + iso_639 | [] [] | + jpilot | () () () | + jtag | | + jwhois | [] | + kbd | [] | + keytouch | [] | + keytouch-editor | | + keytouch-keyboa... | | + latrine | [] | + ld | | + leafpad | [] [] | + libc | [] [] [] [] [] | + libexif | | + libextractor | | + libgpewidget | [] | + libgpg-error | | + libgphoto2 | [] | + libgphoto2_port | [] | + libgsasl | [] | + libiconv | | + libidn | [] [] | + lifelines | [] | + lilypond | | + lingoteach | [] | + lynx | [] [] | + m4 | [] [] | + mailutils | | + make | [] [] [] | + man-db | () | + minicom | [] | + mysecretdiary | [] | + nano | [] [] [] | + nano_1_0 | [] [] [] | + opcodes | [] | + parted | [] [] | + pilot-qof | | + psmisc | [] [] [] | + pwdutils | | + python | | + qof | | + radius | | + recode | [] | + rpm | [] [] | + screem | [] | + scrollkeeper | [] [] [] [] | + sed | [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] [] [] [] | + sharutils | [] [] | + shishi | | + silky | [] | + skencil | | + sketch | | + solfege | | + soundtracker | | + sp | () | + stardict | [] [] | + system-tools-ba... | [] [] [] [] | + tar | [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] | + tin | | + tp-robot | [] | + tuxpaint | [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] | + vorbis-tools | [] | + wastesedge | [] | + wdiff | [] [] | + wget | [] [] | + xchat | [] [] [] [] | + xkeyboard-config | [] | + xpad | [] [] [] | + +--------------------------------------------------+ + ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no + 40 24 2 1 1 3 1 2 3 21 0 15 1 101 5 3 + + nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + +------------------------------------------------------+ + GNUnet | | + a2ps | () [] [] [] [] [] [] | + aegis | () () | + ant-phone | [] [] | + anubis | [] [] [] | + ap-utils | () | + aspell | [] [] | + bash | [] [] [] | + batchelor | [] [] | + bfd | | + bibshelf | [] | + binutils | [] [] | + bison | [] [] [] [] [] | + bison-runtime | [] [] [] [] | + bluez-pin | [] [] [] [] [] [] [] [] [] | + cflow | [] | + clisp | [] | + console-tools | [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + cpplib | [] | + cryptonit | [] [] | + darkstat | [] [] [] [] [] [] | + dialog | [] [] [] [] [] [] [] [] [] | + diffutils | [] [] [] [] [] [] | + doodle | [] [] | + e2fsprogs | [] [] | + enscript | [] [] [] [] [] | + error | [] [] [] [] | + fetchmail | [] [] [] | + fileutils | [] [] [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] [] [] [] [] | + fslint | [] [] [] [] | + gas | | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext-examples | [] [] [] [] [] [] [] [] | + gettext-runtime | [] [] [] [] [] [] [] [] | + gettext-tools | [] [] [] [] [] [] [] | + gimp-print | [] [] | + gip | [] [] [] [] | + gliv | [] [] [] [] | + glunarclock | [] [] [] [] [] [] | + gmult | [] [] [] [] | + gnubiff | () | + gnucash | () [] | + gnucash-glossary | [] [] [] | + gnuedu | | + gnulib | [] [] [] [] [] | + gnunet-gtk | [] | + gnutls | [] [] | + gpe-aerial | [] [] [] [] [] [] [] | + gpe-beam | [] [] [] [] [] [] [] | + gpe-calendar | [] [] [] [] [] [] [] [] | + gpe-clock | [] [] [] [] [] [] [] [] | + gpe-conf | [] [] [] [] [] [] [] | + gpe-contacts | [] [] [] [] [] | + gpe-edit | [] [] [] [] [] [] [] [] | + gpe-filemanager | [] [] | + gpe-go | [] [] [] [] [] [] | + gpe-login | [] [] [] [] [] [] [] [] | + gpe-ownerinfo | [] [] [] [] [] [] [] [] | + gpe-package | [] [] | + gpe-sketchbook | [] [] [] [] [] [] [] [] | + gpe-su | [] [] [] [] [] [] [] [] | + gpe-taskmanager | [] [] [] [] [] [] [] [] | + gpe-timesheet | [] [] [] [] [] [] [] [] | + gpe-today | [] [] [] [] [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] [] [] [] [] | + gprof | [] [] [] | + gpsdrive | [] [] [] | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] | + gretl | [] | + gsasl | [] [] | + gss | [] [] [] | + gst-plugins | [] [] [] [] | + gst-plugins-base | [] | + gst-plugins-good | [] [] [] [] | + gstreamer | [] [] [] | + gtick | [] [] [] | + gtkam | [] [] [] [] | + gtkorphan | [] | + gtkspell | [] [] [] [] [] [] [] [] | + gutenprint | [] | + hello | [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + impost | [] | + indent | [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | [] [] [] [] | + iso_4217 | [] [] [] [] | + iso_639 | [] [] [] [] | + jpilot | | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] [] [] | + keytouch | [] | + keytouch-editor | [] | + keytouch-keyboa... | [] | + latrine | [] [] | + ld | [] | + leafpad | [] [] [] [] [] [] | + libc | [] [] [] [] [] | + libexif | [] | + libextractor | [] [] | + libgpewidget | [] [] [] [] [] [] [] | + libgpg-error | [] [] | + libgphoto2 | [] | + libgphoto2_port | [] [] [] | + libgsasl | [] [] [] [] | + libiconv | | + libidn | [] [] () | + lifelines | [] [] | + lilypond | | + lingoteach | [] | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailutils | [] [] [] [] | + make | [] [] [] [] | + man-db | [] [] | + minicom | [] [] [] [] [] | + mysecretdiary | [] [] [] [] | + nano | [] [] | + nano_1_0 | [] [] [] [] | + opcodes | [] [] | + parted | [] | + pilot-qof | [] | + psmisc | [] [] | + pwdutils | [] [] | + python | | + qof | [] | + radius | [] [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] | + shared-mime-info | [] [] [] [] [] | + sharutils | [] [] [] [] | + shishi | [] | + silky | [] | + skencil | [] [] [] | + sketch | [] [] [] | + solfege | [] | + soundtracker | [] [] | + sp | | + stardict | [] [] [] | + system-tools-ba... | [] [] [] [] [] [] [] [] [] | + tar | [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] [] | + tin | () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] | + vorbis-tools | [] [] | + wastesedge | | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] | + xchat | [] [] [] [] [] [] [] | + xkeyboard-config | [] [] | + xpad | [] [] [] | + +------------------------------------------------------+ + nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta + 0 2 3 58 31 53 5 76 72 5 42 48 12 51 130 2 + + tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + +---------------------------------------------------+ + GNUnet | [] | 2 + a2ps | [] [] [] | 19 + aegis | | 0 + ant-phone | [] [] | 6 + anubis | [] [] [] | 11 + ap-utils | () [] | 4 + aspell | [] [] [] | 14 + bash | [] | 11 + batchelor | [] [] | 9 + bfd | | 1 + bibshelf | [] | 7 + binutils | [] [] [] | 9 + bison | [] [] [] | 19 + bison-runtime | [] [] [] | 16 + bluez-pin | [] [] [] [] [] [] | 28 + cflow | [] [] | 4 + clisp | | 6 + console-tools | [] [] | 5 + coreutils | [] [] | 17 + cpio | [] [] [] | 9 + cpplib | [] [] [] [] | 11 + cryptonit | | 5 + darkstat | [] () () | 15 + dialog | [] [] [] [] [] | 30 + diffutils | [] [] [] [] | 28 + doodle | [] | 6 + e2fsprogs | [] [] | 10 + enscript | [] [] [] | 16 + error | [] [] [] [] | 18 + fetchmail | [] [] | 12 + fileutils | [] [] [] | 18 + findutils | [] [] [] | 17 + flex | [] [] | 15 + fslint | [] | 9 + gas | [] | 3 + gawk | [] [] | 15 + gbiff | [] | 5 + gcal | [] | 5 + gcc | [] [] [] | 6 + gettext-examples | [] [] [] [] [] [] | 26 + gettext-runtime | [] [] [] [] [] [] | 28 + gettext-tools | [] [] [] [] [] | 19 + gimp-print | [] [] | 12 + gip | [] [] | 12 + gliv | [] [] | 8 + glunarclock | [] [] [] | 15 + gmult | [] [] [] [] | 15 + gnubiff | [] | 1 + gnucash | () | 2 + gnucash-glossary | [] [] | 9 + gnuedu | [] | 2 + gnulib | [] [] [] [] [] | 28 + gnunet-gtk | | 1 + gnutls | | 2 + gpe-aerial | [] [] | 14 + gpe-beam | [] [] | 14 + gpe-calendar | [] [] [] [] | 19 + gpe-clock | [] [] [] [] | 20 + gpe-conf | [] [] | 14 + gpe-contacts | [] [] | 10 + gpe-edit | [] [] [] [] | 19 + gpe-filemanager | [] | 5 + gpe-go | [] [] | 14 + gpe-login | [] [] [] [] [] | 20 + gpe-ownerinfo | [] [] [] [] | 20 + gpe-package | [] | 5 + gpe-sketchbook | [] [] | 16 + gpe-su | [] [] [] | 19 + gpe-taskmanager | [] [] [] | 19 + gpe-timesheet | [] [] [] [] | 18 + gpe-today | [] [] [] [] [] | 20 + gpe-todo | [] | 6 + gphoto2 | [] [] [] [] | 20 + gprof | [] [] | 11 + gpsdrive | | 4 + gramadoir | [] | 7 + grep | [] [] [] [] | 33 + gretl | | 4 + gsasl | [] [] | 6 + gss | [] | 5 + gst-plugins | [] [] [] | 15 + gst-plugins-base | [] [] [] | 9 + gst-plugins-good | [] [] [] | 18 + gstreamer | [] [] [] | 17 + gtick | [] | 11 + gtkam | [] | 13 + gtkorphan | [] | 7 + gtkspell | [] [] [] [] [] [] | 26 + gutenprint | | 3 + hello | [] [] [] [] [] | 39 + id-utils | [] [] | 14 + impost | [] | 4 + indent | [] [] [] [] | 25 + iso_3166 | [] [] [] | 15 + iso_3166_1 | [] [] | 20 + iso_3166_2 | | 2 + iso_3166_3 | [] [] | 9 + iso_4217 | [] [] | 14 + iso_639 | [] | 14 + jpilot | [] [] [] [] | 7 + jtag | [] | 3 + jwhois | [] [] [] | 13 + kbd | [] [] | 12 + keytouch | [] | 4 + keytouch-editor | | 2 + keytouch-keyboa... | | 2 + latrine | [] [] | 8 + ld | [] [] [] [] | 8 + leafpad | [] [] [] [] | 23 + libc | [] [] [] | 23 + libexif | [] | 4 + libextractor | [] | 5 + libgpewidget | [] [] [] | 19 + libgpg-error | [] | 4 + libgphoto2 | [] | 8 + libgphoto2_port | [] [] [] | 11 + libgsasl | [] | 8 + libiconv | [] | 4 + libidn | [] [] | 10 + lifelines | | 4 + lilypond | | 2 + lingoteach | [] | 6 + lynx | [] [] [] | 15 + m4 | [] [] [] | 18 + mailutils | [] | 8 + make | [] [] [] | 20 + man-db | [] | 6 + minicom | [] | 14 + mysecretdiary | [] [] | 12 + nano | [] [] | 15 + nano_1_0 | [] [] [] | 18 + opcodes | [] [] | 10 + parted | [] [] [] | 10 + pilot-qof | [] | 3 + psmisc | [] | 10 + pwdutils | [] | 3 + python | | 0 + qof | [] | 2 + radius | [] | 6 + recode | [] [] [] | 25 + rpm | [] [] [] [] | 14 + screem | [] | 2 + scrollkeeper | [] [] [] [] | 26 + sed | [] [] [] | 22 + sh-utils | [] | 15 + shared-mime-info | [] [] [] [] | 23 + sharutils | [] [] [] | 23 + shishi | | 1 + silky | [] | 4 + skencil | [] | 7 + sketch | | 6 + solfege | | 2 + soundtracker | [] [] | 9 + sp | [] | 3 + stardict | [] [] [] [] | 11 + system-tools-ba... | [] [] [] [] [] [] [] | 37 + tar | [] [] [] [] | 19 + texinfo | [] [] [] | 15 + textutils | [] [] [] | 17 + tin | | 1 + tp-robot | [] [] [] | 10 + tuxpaint | [] [] [] | 16 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] [] | 20 + vorbis-tools | [] [] | 11 + wastesedge | | 1 + wdiff | [] [] | 22 + wget | [] [] [] | 19 + xchat | [] [] [] [] | 28 + xkeyboard-config | [] [] [] [] | 11 + xpad | [] [] [] | 14 + +---------------------------------------------------+ + 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu + 172 domains 0 1 1 78 39 0 135 13 1 50 3 54 0 2054 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If July 2006 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +1.6 Using `gettext' in new packages +=================================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..5b6e7c6 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..06849ec --- /dev/null +++ b/ChangeLog @@ -0,0 +1,43 @@ +2005-08-13 gettextize + + * Makefile.am (EXTRA_DIST): Add config.rpath, mkinstalldirs. + * configure.in (AM_GNU_GETTEXT_VERSION): Bump to 0.14.4. + +0.0.7 -> 0.2.0 + +* removed error message from alsamixer +* fixes in alsactl program +* version is now compatible with driver + +0.0.6 -> 0.0.7 + +* added alsactl control program +* updated alsamixer by Carl van Schaik + - stereo record source select + - left/right route support + +0.0.5 -> 0.0.6 + +* updates for new alsa-lib +* fixed compilation problems with config.h header file +* updated output 'aplay -l' + +0.0.3 -> 0.0.4 + +* added check for alsa-lib package +* added spec file for RPM + +0.0.2 -> 0.0.3 + +* included great ncurses alsamixer from Tim Janik +* enhanced Mixer from Andy Lo A Foe renamed to amixer + +0.0.1 -> 0.0.2 + +* fixed small bug in aplay in command line parsing +* fixed fragment size allocation for low rate files in aplay +* a little bit corrected output from Mixer + +0.0.1 + +* initial release (aplay, broken Mixer) diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..202c491 --- /dev/null +++ b/INSTALL @@ -0,0 +1,46 @@ + + ALSA utils installation + ======================= + +Requirements +------------ + +alsamixer requires the ncurses library. Some systems need to install +the develop package additionally to link with this library. + +alsaconf requires dialog or whiptail program to run properly. + +Installation +------------ + +For installation you can use these commands: + + ./configure + make install + +If ./configure command complain that alsa-lib package isn't installed, +please, check if --prefix option is same for alsa-lib and alsa-utils +package. The configure script from alsa-utils package probably cannot find +header file asoundlib.h in $prefix/include/alsa directory (usually in +/usr/include/alsa directory). + +Compilation from HG sources +--------------------------- + +You need also GNU packages autoconf and automake installed in your system +to compile HG (Mercurial) sources of alsa-utils package. + +For compilation you can use these commands: + + aclocal + gettextize + autoheader + automake --foreign --copy --add-missing + autoconf + ./configure + make + +The included hgcompile script does this job for you. + +Note: Some automake packages have missing aclocal program. Use newer version + in the case. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..5d5c38e --- /dev/null +++ b/Makefile.am @@ -0,0 +1,45 @@ +INCLUDES=-I$(top_srcdir)/include + +SUBDIRS = include alsactl alsaucm utils m4 po +if ALSAMIXER +SUBDIRS += alsamixer +endif +if HAVE_MIXER +SUBDIRS += amixer +endif +if HAVE_RAWMIDI +SUBDIRS += amidi +endif +if ALSACONF +SUBDIRS += alsaconf +endif +if HAVE_PCM +SUBDIRS += aplay iecset speaker-test +if ALSALOOP +SUBDIRS += alsaloop +endif +endif +if HAVE_SEQ +SUBDIRS += seq +endif + +EXTRA_DIST= config.rpath TODO gitcompile +AUTOMAKE_OPTIONS=foreign +ACLOCAL_AMFLAGS = -I m4 + +rpm: dist + $(MAKE) -C $@ + +dist-hook: + -chmod -R a+r $(distdir) + @if ! test -z "$(AMTAR)"; then \ + $(AMTAR) --create --verbose --file=- $(distdir) | bzip2 -c -9 > $(distdir).tar.bz2 ; \ + else \ + $(TAR) --create --verbose --file=- $(distdir) | bzip2 -c -9 > $(distdir).tar.bz2 ; \ + fi + +install-data-hook: + $(MKDIR_P) -m 0755 $(DESTDIR)$(ASOUND_STATE_DIR) + +DISTCHECK_CONFIGURE_FLAGS = \ + --with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir) diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..7f2bf91 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,745 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@ALSAMIXER_TRUE@am__append_1 = alsamixer +@HAVE_MIXER_TRUE@am__append_2 = amixer +@HAVE_RAWMIDI_TRUE@am__append_3 = amidi +@ALSACONF_TRUE@am__append_4 = alsaconf +@HAVE_PCM_TRUE@am__append_5 = aplay iecset speaker-test +@ALSALOOP_TRUE@@HAVE_PCM_TRUE@am__append_6 = alsaloop +@HAVE_SEQ_TRUE@am__append_7 = seq +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(top_srcdir)/alsaconf/po/Makefile.in \ + $(top_srcdir)/configure ABOUT-NLS COPYING ChangeLog INSTALL \ + TODO config.guess config.rpath config.sub depcomp install-sh \ + missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = alsaconf/po/Makefile +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = include alsactl alsaucm utils m4 po alsamixer amixer \ + amidi alsaconf aplay iecset speaker-test alsaloop seq +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +SUBDIRS = include alsactl alsaucm utils m4 po $(am__append_1) \ + $(am__append_2) $(am__append_3) $(am__append_4) \ + $(am__append_5) $(am__append_6) $(am__append_7) +EXTRA_DIST = config.rpath TODO gitcompile +AUTOMAKE_OPTIONS = foreign +ACLOCAL_AMFLAGS = -I m4 +DISTCHECK_CONFIGURE_FLAGS = \ + --with-systemdsystemunitdir=$$dc_install_base/$(systemdsystemunitdir) + +all: all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +alsaconf/po/Makefile: $(top_builddir)/config.status $(top_srcdir)/alsaconf/po/Makefile.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-data-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-hook dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-hook install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +rpm: dist + $(MAKE) -C $@ + +dist-hook: + -chmod -R a+r $(distdir) + @if ! test -z "$(AMTAR)"; then \ + $(AMTAR) --create --verbose --file=- $(distdir) | bzip2 -c -9 > $(distdir).tar.bz2 ; \ + else \ + $(TAR) --create --verbose --file=- $(distdir) | bzip2 -c -9 > $(distdir).tar.bz2 ; \ + fi + +install-data-hook: + $(MKDIR_P) -m 0755 $(DESTDIR)$(ASOUND_STATE_DIR) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/README b/README new file mode 100644 index 0000000..c7e0681 --- /dev/null +++ b/README @@ -0,0 +1,20 @@ + + Advanced Linux Sound Architecture - Utilities + ============================================= + +This package contains the command line utilities for the ALSA project. +The package can be compiled only with the installed ALSA driver and +the ALSA C library. + +alsaconf - the ALSA driver configurator script +alsactl - an utility for soundcard settings management +aplay/arecord - an utility for the playback / capture of .wav,.voc,.au files +amixer - a command line mixer +alsamixer - a ncurses mixer +amidi - a utility to send/receive sysex dumps or other MIDI data +iecset - a utility to show/set the IEC958 status bits + +You may give a look for more information about the ALSA project to URL +http://www.alsa-project.org. + + Jaroslav Kysela diff --git a/TODO b/TODO new file mode 100644 index 0000000..a1d880f --- /dev/null +++ b/TODO @@ -0,0 +1,4 @@ +H add options to aplay to avoid xrun using arecord | aplay +M Rewrite aplay/arecord tool and separate the experimental stuff +M Write a *good* mixer +L Add support for OSS setups to alsactl diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..49550f1 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,12 @@ +AC_DEFUN([SAVE_UTIL_VERSION], [ +SND_UTIL_VERSION=$VERSION +echo $VERSION > $srcdir/version +AC_DEFINE_UNQUOTED(VERSION, "$SND_UTIL_VERSION", [ALSA util version]) +AC_SUBST(SND_UTIL_VERSION) +SND_UTIL_MAJOR=`echo $VERSION | cut -d . -f 1` +AC_SUBST(SND_UTIL_MAJOR) +SND_UTIL_MINOR=`echo $VERSION | cut -d . -f 2` +AC_SUBST(SND_UTIL_MINOR) +SND_UTIL_SUBMINOR=`echo $VERSION | cut -d . -f 3 | sed -e 's/pre[[0-9]]*//g'` +AC_SUBST(SND_UTIL_SUBMINOR) +]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..90ac756 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1271 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, +[m4_warning([this file was generated for autoconf 2.68. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +dnl Configure Paths for Alsa +dnl Some modifications by Richard Boulton +dnl Christopher Lansdown +dnl Jaroslav Kysela +dnl Last modification: $Id: alsa.m4,v 1.24 2004/09/15 18:48:07 tiwai Exp $ +dnl AM_PATH_ALSA([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for libasound, and define ALSA_CFLAGS and ALSA_LIBS as appropriate. +dnl enables arguments --with-alsa-prefix= +dnl --with-alsa-enc-prefix= +dnl --disable-alsatest +dnl +dnl For backwards compatibility, if ACTION_IF_NOT_FOUND is not specified, +dnl and the alsa libraries are not found, a fatal AC_MSG_ERROR() will result. +dnl +AC_DEFUN([AM_PATH_ALSA], +[dnl Save the original CFLAGS, LDFLAGS, and LIBS +alsa_save_CFLAGS="$CFLAGS" +alsa_save_LDFLAGS="$LDFLAGS" +alsa_save_LIBS="$LIBS" +alsa_found=yes + +dnl +dnl Get the cflags and libraries for alsa +dnl +AC_ARG_WITH(alsa-prefix, +[ --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional)], +[alsa_prefix="$withval"], [alsa_prefix=""]) + +AC_ARG_WITH(alsa-inc-prefix, +[ --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional)], +[alsa_inc_prefix="$withval"], [alsa_inc_prefix=""]) + +dnl FIXME: this is not yet implemented +AC_ARG_ENABLE(alsatest, +[ --disable-alsatest Do not try to compile and run a test Alsa program], +[enable_alsatest="$enableval"], +[enable_alsatest=yes]) + +dnl Add any special include directories +AC_MSG_CHECKING(for ALSA CFLAGS) +if test "$alsa_inc_prefix" != "" ; then + ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" + CFLAGS="$CFLAGS -I$alsa_inc_prefix" +fi +AC_MSG_RESULT($ALSA_CFLAGS) + +dnl add any special lib dirs +AC_MSG_CHECKING(for ALSA LDFLAGS) +if test "$alsa_prefix" != "" ; then + ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" + LDFLAGS="$LDFLAGS $ALSA_LIBS" +fi + +dnl add the alsa library +ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" +LIBS="$ALSA_LIBS $LIBS" +AC_MSG_RESULT($ALSA_LIBS) + +dnl Check for a working version of libasound that is of the right version. +min_alsa_version=ifelse([$1], ,0.1.1,$1) +AC_MSG_CHECKING(for libasound headers version >= $min_alsa_version) +no_alsa="" + alsa_min_major_version=`echo $min_alsa_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + alsa_min_minor_version=`echo $min_alsa_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + alsa_min_micro_version=`echo $min_alsa_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + +AC_LANG_SAVE +AC_LANG_C +AC_TRY_COMPILE([ +#include +], [ +/* ensure backward compatibility */ +#if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) +#define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR +#endif +#if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) +#define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR +#endif +#if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) +#define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR +#endif + +# if(SND_LIB_MAJOR > $alsa_min_major_version) + exit(0); +# else +# if(SND_LIB_MAJOR < $alsa_min_major_version) +# error not present +# endif + +# if(SND_LIB_MINOR > $alsa_min_minor_version) + exit(0); +# else +# if(SND_LIB_MINOR < $alsa_min_minor_version) +# error not present +# endif + +# if(SND_LIB_SUBMINOR < $alsa_min_micro_version) +# error not present +# endif +# endif +# endif +exit(0); +], + [AC_MSG_RESULT(found.)], + [AC_MSG_RESULT(not present.) + ifelse([$3], , [AC_MSG_ERROR(Sufficiently new version of libasound not found.)]) + alsa_found=no] +) +AC_LANG_RESTORE + +dnl Now that we know that we have the right version, let's see if we have the library and not just the headers. +if test "x$enable_alsatest" = "xyes"; then +AC_CHECK_LIB([asound], [snd_ctl_open],, + [ifelse([$3], , [AC_MSG_ERROR(No linkable libasound was found.)]) + alsa_found=no] +) +fi + +if test "x$alsa_found" = "xyes" ; then + ifelse([$2], , :, [$2]) + LIBS=`echo $LIBS | sed 's/-lasound//g'` + LIBS=`echo $LIBS | sed 's/ //'` + LIBS="-lasound $LIBS" +fi +if test "x$alsa_found" = "xno" ; then + ifelse([$3], , :, [$3]) + CFLAGS="$alsa_save_CFLAGS" + LDFLAGS="$alsa_save_LDFLAGS" + LIBS="$alsa_save_LIBS" + ALSA_CFLAGS="" + ALSA_LIBS="" +fi + +dnl That should be it. Now just export out symbols: +AC_SUBST(ALSA_CFLAGS) +AC_SUBST(ALSA_LIBS) +]) + + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# Copyright © 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi + +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# +# Similar to PKG_CHECK_MODULES, make sure that the first instance of +# this or PKG_CHECK_MODULES is called, or make sure to call +# PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_ifval([$2], [$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$PKG_CONFIG"; then + if test -n "$$1"; then + pkg_cv_[]$1="$$1" + else + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + fi +else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT +])], + [$4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MODULES + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/gettext.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/nls.m4]) +m4_include([m4/po.m4]) +m4_include([m4/progtest.m4]) +m4_include([acinclude.m4]) diff --git a/alsa-utils.manifest b/alsa-utils.manifest new file mode 100755 index 0000000..932f74b --- /dev/null +++ b/alsa-utils.manifest @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/alsaconf/Makefile.am b/alsaconf/Makefile.am new file mode 100644 index 0000000..a11ecc5 --- /dev/null +++ b/alsaconf/Makefile.am @@ -0,0 +1,37 @@ +sbin_SCRIPTS = alsaconf +man_MANS = alsaconf.8 alsaconf.fr.8 +EXTRA_DIST = $(man_MANS) +SUBDIRS = po + +install-man8: + @for i in $(man_MANS); do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[^.]*$$//'`; \ + case $$inst in \ + *.[a-za-z]*)\ + loc=`echo $$inst | sed -e 's/^.*\\.//'`; \ + loc="/$$loc"; \ + inst=`echo $$inst | sed -e 's/\\.[^.]*$$//'`;; \ + *)\ + loc="";; \ + esac; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)$$loc/man$$ext; \ + echo " $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext"; \ + $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext; \ + done + +uninstall-man8: + @for i in $(man_MANS); do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[^.]*$$//'`; \ + case $$inst in \ + *.[a-za-z]*)\ + loc=`echo $$inst | sed -e 's/^.*\\.//'`; \ + loc="/$$loc"; \ + inst=`echo $$inst | sed -e 's/\\.[^.]*$$//'`;; \ + *)\ + loc="";; \ + esac; \ + echo " rm -f $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext"; \ + rm -f $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext; \ + done diff --git a/alsaconf/Makefile.in b/alsaconf/Makefile.in new file mode 100644 index 0000000..e452efb --- /dev/null +++ b/alsaconf/Makefile.in @@ -0,0 +1,684 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = alsaconf +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/alsaconf.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = alsaconf +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" +SCRIPTS = $(sbin_SCRIPTS) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(man_MANS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +sbin_SCRIPTS = alsaconf +man_MANS = alsaconf.8 alsaconf.fr.8 +EXTRA_DIST = $(man_MANS) +SUBDIRS = po +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alsaconf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign alsaconf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +alsaconf: $(top_builddir)/config.status $(srcdir)/alsaconf.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-sbinSCRIPTS: $(sbin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" + @list='$(sbin_SCRIPTS)'; test -n "$(sbindir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-sbinSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(sbin_SCRIPTS)'; test -n "$(sbindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(sbindir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(SCRIPTS) $(MANS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-sbinSCRIPTS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man8 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-man uninstall-sbinSCRIPTS + +uninstall-man: uninstall-man8 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic ctags \ + ctags-recursive distclean distclean-generic distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man8 install-pdf install-pdf-am install-ps \ + install-ps-am install-sbinSCRIPTS install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-man uninstall-man8 uninstall-sbinSCRIPTS + + +install-man8: + @for i in $(man_MANS); do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[^.]*$$//'`; \ + case $$inst in \ + *.[a-za-z]*)\ + loc=`echo $$inst | sed -e 's/^.*\\.//'`; \ + loc="/$$loc"; \ + inst=`echo $$inst | sed -e 's/\\.[^.]*$$//'`;; \ + *)\ + loc="";; \ + esac; \ + $(mkinstalldirs) $(DESTDIR)$(mandir)$$loc/man$$ext; \ + echo " $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext"; \ + $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext; \ + done + +uninstall-man8: + @for i in $(man_MANS); do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[^.]*$$//'`; \ + case $$inst in \ + *.[a-za-z]*)\ + loc=`echo $$inst | sed -e 's/^.*\\.//'`; \ + loc="/$$loc"; \ + inst=`echo $$inst | sed -e 's/\\.[^.]*$$//'`;; \ + *)\ + loc="";; \ + esac; \ + echo " rm -f $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext"; \ + rm -f $(DESTDIR)$(mandir)$$loc/man$$ext/$$inst.$$ext; \ + done + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alsaconf/alsaconf.8 b/alsaconf/alsaconf.8 new file mode 100644 index 0000000..a3e1296 --- /dev/null +++ b/alsaconf/alsaconf.8 @@ -0,0 +1,102 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" alsaconf.8 is copyright 2003 by Jordi Mallach +.\" +.\" This is free documentation, see the latest version of the GNU +.\" General Public License for copying conditions. There is NO warranty. +.TH ALSACONF 8 "February 23, 2003" + +.SH NAME +alsaconf \- configuration tool for the Advanced Linux Sound Architecture + +.SH SYNOPSIS +.B alsaconf +.RI [ options ] + +.SH DESCRIPTION +This manual page documents briefly the +.B alsaconf +command. +This manual page was written for the Debian distribution because the +original program does not have a manual page. +.PP +\fBAlsaconf\fP is a simple shell script which tries to detect the sound cards +on your system and writes a suitable configuration file for ALSA. It will try +to guess what GNU/Linux distribution you're running, and will act accordingly +to the standards of that distribution, if specific support is available. +.PP +Alsaconf will write a module-init-tools (or modutils) snippet which can be then used by module-init-tools (or modutils) +to load the correct parameters for your sound card. + +.SH OPTIONS +Alsaconf accepts the following options: +.TP +.B \-c, \-\-config file +Specify the module config file. +As default, +.B alsaconf +probes the available config file automatically. +.TP +.B \-d, \-\-devmode mode +Set the device mode for the ALSA devices (default = 0666). +This option is obsolete in the recent ALSA version. +.TP +.B \-g, \-\-gid gid +Set the gid for the ALSA devices (default = 0). +This option is obsolete in the recent ALSA version. +.TP +.B \-h, \-\-help +Displays this help text. +.TP +.B \-L, \-\-log file +Logging on the given file. The log is appended to the file. +This option is for debugging purpose only. +.TP +.B \-l, \-\-legacy +Check only for legacy non-isapnp cards. +.TP +.B \-m, \-\-modinfo +Read module descriptions instead of reading a card database. +.TP +.B \-P, \-\-listprobe +List the supported legacy card modules. +.TP +.B \-p, \-\-probe card-name +Probe a legacy non-isapnp card and print module options. +.TP +.B \-r, \-\-strict +Set strict device mode (equiv. with \-g 17 \-d 0660). +This option is obsolete in the recent ALSA version. +.TP +.B \-s, \-\-sound\-wav\-file +Use the specified wav file as a test sound. +.TP +.B \-u, \-\-uid uid +Set the uid for the ALSA devices (default = 0). +This option is obsolete in the recent ALSA version. + +.SH DEBIAN SPECIFIC +In Debian, the default gid of the device files is 29 (corresponding to the +audio group) and the default device mode is 0660. + +For the ALSA base package, see also +.I /usr/share/doc/alsa\-base/ + +.SH SEE ALSO +\fB +alsamixer(1), +amixer(1), +aplay(1), +arecord(1) +\fP + +.SH HOMEPAGE +http://www.alsa\-project.org/ + +.SH AUTHOR +The alsaconf script was written by +Takashi Iwai , +Bernd Kaindl and +Jan Ondrej (SAL) + +This manual page was written by Jordi Mallach , +for the Debian system (but may be used by others). diff --git a/alsaconf/alsaconf.fr.8 b/alsaconf/alsaconf.fr.8 new file mode 100644 index 0000000..14bbea8 --- /dev/null +++ b/alsaconf/alsaconf.fr.8 @@ -0,0 +1,111 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" alsaconf.8 is copyright 2003 by Jordi Mallach +.\" +.\" This is free documentation, see the latest version of the GNU +.\" General Public License for copying conditions. There is NO warranty. +.TH ALSACONF 8 "15 mars 2005" + +.SH NOM +alsaconf \- outil de configuration pour ALSA (architecture de son avancée de Linux) +.\" configuration tool for the Advanced Linux Sound Architecture + +.SH SYNOPSIS +.B alsaconf +.RI [ options ] + +.SH DESCRIPTION +Cette page de manuel documente brièvement la commande +.B alsaconf. + +.PP +\fBAlsaconf\fP +est un simple script shell qui essaye de détecter les cartes son sur votre +système et écrit un fichier de configuration adéquat pour ALSA. Il va +essayer de deviner quelle distribution GNU/Linux vous utilisez, et agira +conformément aux standards de cette distribution, si un support spécifique +est disponible. + +.PP +Alsaconf va écrire un fragment de code modutils qui peut être ensuite +utilisé par modutils pour charger les paramètres corrects de votre carte +son. + +.SH OPTIONS +Alsaconf accepte les options suivantes\ : + +.TP +.B \-l, \-\-legacy +Cherche seulement les anciennes cartes non-isapnp + +.TP +.B \-m, \-\-modinfo +Lit les descriptions de modules au lieu de lire une base de données de +carte + +.TP +.B \-s, \-\-sound\-wav\-file +Utilise le fichier wav spécifié comme son de test + +.TP +.B \-u, \-\-uid uid +Choisit l'uid pour les périphériques ALSA (valeur par défaut\ = 0) + +.TP +.B \-g, \-\-gid gid +Choisit le gid pour les périphériques ALSA (valeur par défaut\ = 0) + +.TP +.B \-d, \-\-devmode mode +Choisit le mode du périphérique pour les périphériques ALSA (valeur par +défaut\ : 0666) + +.TP +.B \-r, \-\-strict +Choisit le mode de périphérique strict (équivaut à -g\ 17 -d\ 0660) + +.TP +.B \-L, \-\-log +Mise en journal dans /tmp/alsaconf.log + +.TP +.B \-p, \-\-probe card-name +Teste une ancienne carte non-isapnp et affiche les options du module + +.TP +.B \-h, \-\-help +Affiche ce message d'aide + + +.SH POUR DEBIAN EXCLUSIVEMENT +Sous Debian, le gid par défaut des fichiers de périphériques est 29 (qui +correspond au groupe audio) et le mode par défaut des périphériques est +0660. + +Pour le paquetage de base ALSA, voir aussi +.I /usr/share/doc/alsa-base/ + +.SH VOIR AUSSI +\fB +alsamixer(1), +amixer(1), +aplay(1), +arecord(1) +\fP + +.SH PAGE D'ACCUEIL +http://www.alsa-project.org/ + +.SH AUTEUR +Le script alsaconf fut écrit par +Takashi Iwai , +Bernd Kaindl et +Jan Ondrej (SAL) + +Cette page de manuel fut écrite par Jordi Mallach , pour +le système Debian (mais elle peut être utilisée par d'autres). + +.SH TRADUCTION +Baptiste Mélès 2005. + +N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute +erreur dans cette page de manuel. diff --git a/alsaconf/alsaconf.in b/alsaconf/alsaconf.in new file mode 100644 index 0000000..5c23787 --- /dev/null +++ b/alsaconf/alsaconf.in @@ -0,0 +1,1451 @@ +#!/bin/bash +# +# ALSA Configurator +# +# Copyright (c) 1999-2002 SuSE GmbH +# Jan ONDREJ +# +# written by Takashi Iwai +# Bernd Kaindl +# Jan ONDREJ (SAL) +# +# based on the original version of Jan ONDREJ's alsaconf for ALSA 0.4. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# + +export TEXTDOMAIN=alsaconf + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +sbindir=@sbindir@ +version=@VERSION@ +USE_NLS=@USE_NLS@ + +# Useful for debugging +PROCFS="/proc" +SYSFS="/sys" + +# i18n stuff +if test "$USE_NLS" = "yes" && type -p gettext > /dev/null; then + xecho() { + gettext -s "$*" + } +else + xecho() { + echo "$*" + } + gettext() { + echo -n "$*" + } +fi +xmsg() { + msg=$(gettext "$1") + shift + printf "$msg" $* +} + +# Check for GNU/Linux distributions +if [ -f /etc/SuSE-release ]; then + distribution="suse" + suse_version=$(grep 'VERSION = ' /etc/SuSE-release | sed -e s/'VERSION = '//) +elif [ -f /etc/UnitedLinux-release ]; then + distribution="suse" +elif [ -f /etc/gentoo-release ]; then + distribution="gentoo" +elif [ -f /etc/debian_version ]; then + distribution="debian" +elif [ -f /etc/mandrake-release ]; then + distribution="mandrake" +elif test -f /etc/redhat-release && grep -q "Red Hat" /etc/redhat-release; then + distribution="redhat" +elif test -f /etc/fedora-release && grep -q "Fedora" /etc/fedora-release; then + distribution="fedora" +elif [ -f /etc/slackware-version -o -f /etc/slamd64-version ]; then + distribution="slackware" +else + distribution="unknown" +fi + +for prog in lspci lsmod; do + for path in /sbin /usr/sbin /bin /usr/bin;do + test -x $path/$prog && eval $prog=$path/$prog + done +done +unset prog path + +usage() { + xecho "ALSA configurator" + echo " version $version" + xecho "usage: alsaconf [options] + -l|--legacy check only legacy non-isapnp cards + -m|--modinfo read module descriptions instead of reading card db + -s|--sound wav-file + use the specified wav file as a test sound + -u|--uid uid set the uid for the ALSA devices (default = 0) [obsoleted] + -g|--gid gid set the gid for the ALSA devices (default = 0) [obsoleted] + -d|--devmode mode + set the permission for ALSA devices (default = 0666) [obs.] + -r|--strict set strict device mode (equiv. with -g 17 -d 0660) [obsoleted] + -L|--log file logging on the specified file (for debugging purpose only) + -p|--probe card-name + probe a legacy non-isapnp card and print module options + -P|--listprobe list the supported legacy card modules + -c|--config file + specify the module config file + -R|--resources list available DMA and IRQ resources with debug for legacy + -h|--help what you're reading" +} + +OPTS=`getopt -o lmL:hp:Pu:g:d:rs:c:R --long legacy,modinfo,log:,help,probe:,listprobe,uid:,gid:,devmode:,strict,sound:,config:,resources -n alsaconf -- "$@"` || exit 1 +eval set -- "$OPTS" + +do_legacy_only=0 +use_modinfo_db=0 +alsa_uid=0 +alsa_gid=0 +alsa_mode=0666 +legacy_probe_card="" +LOGFILE="" +TESTSOUND="@TESTSOUND@" +try_all_combination=0 +resources="false" + +# legacy support +LEGACY_CARDS="opl3sa2 cs4236 cs4232 cs4231 es18xx es1688 sb16 sb8" + +while true ; do + case "$1" in + -l|--legacy) + do_legacy_only=1; shift ;; + -m|--modinfo) + use_modinfo_db=1; shift ;; + -s|--sound) + TESTSOUND=$2; shift 2;; + -h|--help) + usage; exit 0 ;; + -L|--log) + LOGFILE="$2"; shift 2;; + -p|--probe) + legacy_probe_card="$2"; shift 2;; + -P|--listprobe) + echo "$LEGACY_CARDS"; exit 0;; + -u|--uid) + alsa_uid="$2"; shift 2;; + -g|--gid) + alsa_gid="$2"; shift 2;; + -d|--devmode) + alsa_mode="$2"; shift 2;; + -r|--strict) + alsa_uid=0; alsa_gid=17; alsa_mode=0660; shift;; + -c|--config) + cfgfile="$2"; shift 2;; + -R|--resources) + resources="true"; shift;; + --) shift ; break ;; + *) usage ; exit 1 ;; + esac +done + +# +# probe legacy ISA cards +# + +check_dma_avail () { + list="" + if [ -d $SYSFS/bus/pnp/devices ]; then + for dma in $*; do + ok="true" + for i in $SYSFS/bus/pnp/devices/??:* ; do + if grep -q "state = active" $i/resources ; then + if grep -q '^dma '$dma'$' $i/resources; then + ok="false" + fi + fi + done + if [ -r $PROCFS/dma ]; then + if grep -q '^ *'$dma': ' $PROCFS/dma ; then + ok="false" + fi + fi + if [ "$ok" = "true" ]; then + list="$list $dma" + fi + done + else + if [ -r $PROCFS/dma ]; then + for dma in $*; do + grep -q '^ *'$dma': ' $PROCFS/dma || list="$list $dma" + done + fi + fi + if [ ! -z "$list" ]; then + echo $list + fi +} + +check_irq_avail () { + list="" + if [ -d $SYSFS/bus/pnp/devices ]; then + for irq in $*; do + ok="true" + for i in $SYSFS/bus/pnp/devices/??:* ; do + if grep -q "state = active" $i/resources ; then + if grep -q '^irq '$irq'$' $i/resources; then + ok="false" + fi + fi + done + if [ -r $PROCFS/interrupts ]; then + if grep -q '^ *'$irq': ' $PROCFS/interrupts ; then + ok="false" + fi + fi + if [ "$ok" = "true" ]; then + list="$list $irq" + fi + done + else + if [ -r $PROCFS/interrupts ]; then + for irq in $*; do + grep -q '^ *'$irq': ' $PROCFS/interrupts || list="$list $irq" + done + fi + fi + if [ ! -z "$list" ]; then + echo $list + fi +} + +# +# +# + +if [ "$resources" = "true" ]; then + if [ -d $SYSFS/bus/pnp/devices ]; then + for i in $SYSFS/bus/pnp/devices/??:* ; do + if [ "$resources" = "true" ]; then + echo ">>>>> PnP file: $i/resources" + cat $i/resources + fi + done + fi + if [ -r $PROCFS/dma ]; then + echo ">>>>> Allocated dma channels:" + cat $PROCFS/dma + fi + if [ -r $PROCFS/interrupts ]; then + echo ">>>>> Allocated interrupt channels:" + cat $PROCFS/interrupts + fi + echo -n "Valid DMA channels: " + check_dma_avail 0 1 2 3 4 5 6 7 + echo -n "Valid IRQ channels: " + check_irq_avail 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + exit 0 +fi + +# Check for root privileges +if [ `id -u` -ne 0 ]; then + xecho "You must be root to use this script." + exit 1 +fi + +# +# check the snd_ prefix for ALSA module options +# snd_ prefix is obsoleted since 0.9.0rc4. +# +if /sbin/modinfo -p snd | grep -q snd_ ; then + mpfx="snd_" +else + mpfx="" +fi + +alsa_device_opts="" +if /sbin/modinfo -p snd | grep -q uid ; then + if [ x"$alsa_uid" != x0 ]; then + alsa_device_opts="$alsa_device_opts ${mpfx}device_uid=$alsa_uid" + fi + if [ x"$alsa_gid" != x0 ]; then + alsa_device_opts="$alsa_device_opts ${mpfx}device_gid=$alsa_gid" + fi +fi +if /sbin/modinfo -p snd | grep -q device_mode ; then + if [ x"$alsa_mode" != x0 ]; then + alsa_device_opts="$alsa_device_opts ${mpfx}device_mode=$alsa_mode" + fi +fi + +case `uname -r` in +2.6.*) + kernel="new" + ;; +*) + kernel="old" + ;; +esac + +# cfgfile = base config file to remove/update the sound setting +# cfgout = new config file to write the sound setting (if different from $cfgfile) +cfgout="" +cfgoldout="" +if [ -n "$cfgfile" ]; then + if [ ! -r "$cfgfile" ]; then + xecho "ERROR: The config file doesn't exist: " + echo $cfgfile + exit 1 + fi +else +if [ "$distribution" = "gentoo" ]; then + cfgfile="/etc/modules.d/alsa" +elif [ "$kernel" = "new" ]; then + cfgfile="/etc/modprobe.conf" + if [ -d /etc/modprobe.d ]; then + cfgout="/etc/modprobe.d/50-sound.conf" + cfgoldout="/etc/modprobe.d/sound" + if [ ! -f $cfgout ]; then + modver=$(modprobe -V | sed -e's/^module-init-tools version //') + case "$modver" in + 3.[789]*) + ;; + *) + cfgout="/etc/modprobe.d/sound" + cfgoldout="" + ;; + esac + fi + fi +elif [ "$distribution" = "debian" ]; then + cfgfile="/etc/modutils/sound" +elif [ -e /etc/modules.conf ]; then + cfgfile="/etc/modules.conf" +elif [ -e /etc/conf.modules ]; then + cfgfile="/etc/conf.modules" +else + cfgfile="/etc/modules.conf" + touch /etc/modules.conf +fi +fi + +# Check for dialog, whiptail, gdialog, awk, ... ? +if type -p dialog > /dev/null; then + DIALOG=dialog +else + if type -p whiptail > /dev/null; then + whiptail_wrapper() { + X1="$1" + X2="$2" + if [ $1 = --yesno ]; then + X3=`expr $3 + 2` + else + X3=$3 + fi + shift 3 + whiptail "$X1" "$X2" $X3 "$@" + } + DIALOG=whiptail_wrapper + else + xecho "Error, dialog or whiptail not found." + exit 1 + fi +fi +if type -p awk > /dev/null; then : +else + xecho "Error, awk not found. Can't continue." + exit 1 +fi + +# +# remove entries by yast2 sound configurator +# +remove_y2_block() { + awk ' + /^alias sound-slot-[0-9]/ { next } + /^alias char-major-116 / { next } + /^alias char-major-14 / { next } + /^alias snd-card-[0-9] / { next } + /^options snd / { next } + /^options snd-/ { next } + /^options off / { next } + /^alias sound-service-[0-9]/ { next } + /^# YaST2: sound / { next } + { print }' +} + +# +# remove entries by sndconfig sound configurator +# +# found strings to search for in WriteConfModules, +# from sndconfig 0.68-4 (rawhide version) + +remove_sndconfig_block() { + awk ' + /^alias sound-slot-0/ { modulename = $3 ; next } + /^alias sound-slot-[0-9]/ { next } + /^post-install sound-slot-[0-9] / { next } + /^pre-remove sound-slot-[0-9] / { next } + /^options sound / { next } + /^alias synth0 opl3/ { next } + /^options opl3 / { next } + /^alias midi / { mididev = $3 ; next } + /^options / { if ($2 == mididev) next } + /^pre-install / { if ($2 == mididev) next } + /^alias synth0 / { synth = $3 ; next } + /^post-install / { if ($2 == synth) next } + /^options sb / { next } + /^post-install .+ \/bin\/modprobe "aci"/ { if ($2 == modulename) next } + /^options adlib_card / { next } + /^options .+ isapnp=1/ { if ($2 == modulename) next } + /^options i810_audio / { next } + /^options / {if ($2 == modulename) next } + { print }' +} + +# +# remove the previous configuration by alsaconf +# +remove_ac_block() { + awk '/^'"$ACB"'$/,/^'"$ACE"'$/ { next } { print }' +} + +# +# set default mixer volumes +# +set_mixers() { + amixer -s -q </dev/null 2>&1 + $rcalsasound unload >/dev/null 2>&1 + /sbin/rmmod dmasound dmasound_awacs 2>/dev/null +fi + + +cleanup () { + killall -9 aplay arecord >/dev/null 2>&1 + /sbin/modprobe -r isapnp >/dev/null 2>&1 + /sbin/modprobe -r isa-pnp >/dev/null 2>&1 + rm -f "$TMP" "$addcfg" "$FOUND" "$DUMP" +} +trap cleanup 0 + +TMP=`mktemp -q /tmp/alsaconf.XXXXXX` +if [ $? -ne 0 ]; then + xecho "Can't create temp file, exiting..." + exit 1 +fi +addcfg=`mktemp -q /tmp/alsaconf.XXXXXX` +if [ $? -ne 0 ]; then + xecho "Can't create temp file, exiting..." + exit 1 +fi +FOUND=`mktemp -q /tmp/alsaconf.XXXXXX` +if [ $? -ne 0 ]; then + xecho "Can't create temp file, exiting..." + exit 1 +fi +DUMP=`mktemp -q /tmp/alsaconf.XXXXXX` +if [ $? -ne 0 ]; then + xecho "Can't create temp file, exiting..." + exit 1 +fi + +# convert ISA PnP id number to string 'ABC' +convert_isapnp_id () { + if [ -z "$1" ]; then + echo "XXXX" + return + fi + let a='('$1'>>2) & 0x3f' + let b='(('$1' & 0x03) << 3) | (('$1' >> 13) & 0x07)' + let c='('$1'>> 8) & 0x1f' + strs='@ABCDEFGHIJKLMNOPQRSTUVWXYZ' + echo ${strs:$a:1}${strs:$b:1}${strs:$c:1} +} + +# swap high & low bytes +swap_number () { + if [ -z "$1" ]; then + echo "0000" + return + fi + let v='(('$1'>>8)&0xff)|(('$1'&0xff)<<8)' + printf "%04x" $v +} + +# build card database +# build_card_db filename +build_card_db () { + MODDIR=/lib/modules/`uname -r` + last_driver="" + echo -n > $1 + + # list pci cards + while read driver vendor device dummy; do + if expr $driver : 'snd-.*' >/dev/null ; then + if [ "$last_driver" != "$driver" ]; then + echo $driver.o + last_driver=$driver + fi + id1=`printf '0x%04x' $vendor` + id2=`printf '0x%04x' $device` + echo "PCI: $id1=$id2" + fi + done < $MODDIR/modules.pcimap >> $1 + + # list isapnp cards + while read driver cardvendor carddevice data vendor func; do + if expr $driver : 'snd-.*' >/dev/null ; then + if [ "$last_driver" != "$driver" ]; then + echo $driver.o + last_driver=$driver + fi + id1=`convert_isapnp_id $cardvendor` + dev1=`swap_number $carddevice` + id2=`convert_isapnp_id $vendor` + dev2=`swap_number $func` + echo "ISAPNP: $id1$dev1=$id2$dev2" + fi + done < $MODDIR/modules.isapnpmap >> $1 +} + +# +# probe cards +# +probe_cards () { + found="0" + test -r $PROCFS/isapnp || /sbin/modprobe isapnp >/dev/null 2>&1 + test -r $PROCFS/isapnp || /sbin/modprobe isa-pnp >/dev/null 2>&1 + if [ -r $PROCFS/isapnp ]; then + cat $PROCFS/isapnp >"$DUMP" + found="1" + elif [ -d $SYSFS/bus/pnp/devices ]; then + # use 2.6 kernel's sysfs output + # fake the isapnp dump + index=0 + bindex=0 + for d1 in $SYSFS/devices/pnp* ; do + for d2 in $d1/*:* ; do + if [ -r $d2/card_id ]; then + id=`cat $d2/card_id` + name=`cat $d2/name` + echo "Card $index '$id:$name' " >> "$DUMP" + index=$[$index+1] + found="1" + else if [ -r $d2/id ]; then + # FIXME: multiple id might be present (separated with new-line) + id=`head -n 1 $d2/id` + echo "BIOS $bindex '$id' " >> "$DUMP" + bindex=$[$bindex+1] + found="1" + fi + fi + done + done + fi + if [ "$found" = "0" ]; then + echo -n >"$DUMP" + fi + CARDID_DB=/var/tmp/alsaconf.cards + if [ ! -r $CARDID_DB ]; then + use_modinfo_db=1 + fi + if [ $use_modinfo_db != 1 ]; then + if [ $CARDID_DB -ot /lib/modules/`uname -r`/modules.dep ]; then + use_modinfo_db=1 + fi + fi + if [ $use_modinfo_db = 1 ]; then + xecho "Building card database.." + build_card_db $CARDID_DB + fi + if [ ! -r $CARDID_DB ]; then + xecho "No card database is found.." + exit 1 + fi + ncards=`grep '^snd-.*\.o$' $CARDID_DB | wc -w` + + msg=$(gettext "Searching sound cards") + awk ' +BEGIN { + format="%-40s %s\n"; + ncards='"$ncards"'; + idx=0; +} +/^snd-.*\.o$/{ + sub(/.o$/, ""); + driver=$0; + perc=(idx * 100) / (ncards + 1); + print int(perc); + idx++; +} +/^[]*PCI: /{ + gsub(/0x/, ""); + gsub(/=/, ":"); + x = sprintf ("'$lspci' -n 2>/dev/null| grep '"' 04..: '"' | grep %s", $2); + if (system (x) == 0) + printf "%s %s\n", $2, driver >>"'"$FOUND"'" +} +/^[]*ISAPNP: /{ + id2 = substr($0, index($0, "=")+1); + gsub(/=.*/, ""); + x = sprintf ("grep '\''^Card [0-9] .%s:'\'' '"$DUMP"'", $2); + if (system (x) == 0) + printf "%s %s\n", $2, driver >>"'"$FOUND"'" + else if (index($2, "ffff") > 0) { + x = sprintf ("grep '\''^BIOS [0-9]* .%s.'\'' '"$DUMP"'", id2); + if (system (x) == 0) + printf "%s %s\n", id2, driver >>"'"$FOUND"'" + } +}' < $CARDID_DB |\ + $DIALOG --gauge "$msg" 6 40 0 + + # + # PowerMac + # + if grep -q MacRISC $PROCFS/cpuinfo; then + MODDIR=/lib/modules/`uname -r` + find $MODDIR -name 'snd-powermac*' -print | \ + while read i; do + i=${i##*/} + i=${i%%.o} + i=${i%%.ko} + echo "PowerMac $i" >> $FOUND + done + fi + + # + # Sparc + # + if grep -q Sparc $PROCFS/cpuinfo; then + test -r $PROCFS/openprom/name || /bin/mount -t openpromfs none $PROCFS/openprom >/dev/null 2>&1 + # Check for an "audio" device + audio= + compat= + if test -r $PROCFS/openprom; then + audio=`find $PROCFS/openprom -follow -type d -name "audio*" -print` + fi + if test -n "$audio"; then + compat=`cat $audio/compatible` + compat=${compat#\'} + compat=${compat%\'} + compat=${compat#SUNW,} + fi + # Go through all cards we have + MODDIR=/lib/modules/`uname -r` + find $MODDIR -name 'snd-sun-*' -print | \ + while read i; do + i=${i##*/} + i=${i%%.o} + i=${i%%.ko} + sdev=`echo ${i#snd-sun-} | tr "[a-z]" "[A-Z]"` + + if test "$sdev" = "$compat"; then + echo "$sdev $i" >> $FOUND + elif test -r $PROCFS/openprom; then + find $PROCFS/openprom -follow -type d -name "SUNW,${sdev}*" \ + -exec echo "$sdev $i" \; 2>/dev/null >> $FOUND + else + echo "$sdev $i" >> $FOUND + fi + done + fi +} + +# +# look for a descriptive device name from the given device id +# +find_device_name () { + if expr "$1" : '[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then + $lspci -d $1 2>/dev/null| sed -e 's/^.*:..\.. [^:]*: //g' + return + elif expr "$1" : '[A-Z@][A-Z@][A-Z@][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then + cardname=`grep '^Card [0-9]\+ .'$1':' $DUMP | head -n 1 | sed -e 's/^Card [0-9]\+ '\''.*:\(.*\)'\'' .*$/\1/'` + echo $cardname + else + echo $1 + fi +} + +# get hwcfg file type from the given driver name +get_hwcfg_type () { + while read dev driver; do + if [ "$driver" = "$1" ]; then + case "$dev" in + *:*) + # FIXME: need to look around /sys/bus/pci/* (or use vpid-* ?) + devid=`$lspci -d "$dev" | head -n 1 | sed -e 's/ .*$//'` + case "$devid" in + *:*:*.*) ;; + *) devid="0000:$devid" ;; + esac + echo bus-pci-$devid + ;; + *) + echo $driver + ;; + esac + break + fi + done +} + +# clean up all hwcfg-* files containing ALSA modules +# alsaconf sets up exclusively +cleanup_hwcfg () { + for i in /etc/sysconfig/hardware/hwcfg-*; do + grep -q "MODULE='snd-" $i && rm -f $i + done +} + +# +# set up /etc/sysconfig/hardware/hwcfg-* stuff +# +setup_hwcfg () { + card=$1 + cleanup_hwcfg + cfg=`echo "$devs_olist" | get_hwcfg_type $card` + echo "MODULE='$card'" > /etc/sysconfig/hardware/hwcfg-$cfg + echo "STARTMODE='auto'" >> /etc/sysconfig/hardware/hwcfg-$cfg +} + + +# +# configure and try test sound +# +ac_config_card () { + + CARD_DRIVER=snd-$1 + CARD_OPTS="${*:2}" + + if [ -n "$cfgout" ]; then + msg=$(xmsg " +Configuring %s +Do you want to modify %s (and %s if present)?" $CARD_DRIVER $cfgout $cfgfile) + $DIALOG --yesno "$msg" 10 50 || acex 0 + else + msg=$(xmsg " +Configuring %s +Do you want to modify %s?" $CARD_DRIVER $cfgfile) + $DIALOG --yesno "$msg" 8 50 || acex 0 + fi + clear + + # Copy conf.modules and make changes. + ACB="# --- BEGIN: Generated by ALSACONF, do not edit. ---" + ACE="# --- END: Generated by ALSACONF, do not edit. ---" + + # Detect 2.2.X kernel + KVER=`uname -r | tr ".-" " "` + KVER1=`echo $KVER | cut -d" " -f1` + KVER2=`echo $KVER | cut -d" " -f2` + if [ $KVER1 -ge 2 ] && [ $KVER2 -ge 2 ]; then + SOUND_CORE="soundcore" + else + SOUND_CORE="snd" + fi + + if [ -r $cfgfile ] ; then + if [ "$distribution" = "redhat" -o "$distribution" = "fedora" ] ; then + remove_ac_block < $cfgfile | remove_sndconfig_block | uniq > $TMP + else + remove_ac_block < $cfgfile | remove_y2_block | uniq > $TMP + fi + fi + + if [ -z "$have_alias" -a "$kernel" = "new" ]; then + if grep -q char-major-116 /lib/modules/`uname -r`/modules.alias; then + have_alias="yes" + fi + fi + if [ -z "$have_alias" ]; then +echo "alias char-major-116 snd +alias char-major-14 $SOUND_CORE +alias sound-service-0-0 snd-mixer-oss +alias sound-service-0-1 snd-seq-oss +alias sound-service-0-3 snd-pcm-oss +alias sound-service-0-8 snd-seq-oss +alias sound-service-0-12 snd-pcm-oss" >> $addcfg + fi + if [ -n "$alsa_device_opts" ]; then + echo "options snd $alsa_device_opts" >> $addcfg + fi +echo "alias snd-card-0 $CARD_DRIVER +alias sound-slot-0 $CARD_DRIVER" >> $addcfg + if [ -n "$CARD_OPTS" ]; then + echo "options $CARD_DRIVER $CARD_OPTS" >> $addcfg + fi + + if [ -n "$cfgout" ]; then + [ ! -r "$cfgfile" ] || cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile" + cmp -s "$addcfg" "$cfgout" || cat "$addcfg" > "$cfgout" + test -n "$cfgoldout" && rm -f "$cfgoldout" + else + echo "$ACB +# --- ALSACONF version $version ---" >> $TMP + cat "$addcfg" >> "$TMP" + echo "$ACE +" >> $TMP + cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile" + fi + + /sbin/depmod -a 2>/dev/null + + # remove yast2 entries (- only for suse distro) + if [ -f /var/lib/YaST/unique.inf ]; then + awk ' +BEGIN { in_sound=0; } +/^\[sound\]$/ { print; in_sound=1; next; } +/^\[.+\]$/ { print; in_sound=0; next; } +{ if (in_sound == 0) { print; } } +' < /var/lib/YaST/unique.inf > $TMP + cp -f $TMP /var/lib/YaST/unique.inf + fi + + # set up /etc/sysconfig/hardware/* + if [ "$distribution" = "suse" ]; then + case "$suse_version" in + 10.[012]*|10) + setup_hwcfg $CARD_DRIVER + ;; + esac + fi + + farewell + clear + case "$distribution" in + gentoo | debian) + xecho "Running update-modules..." + update-modules + ;; + esac + if [ -x $rcalsasound ] ; then + echo Loading driver... + $rcalsasound restart + fi + echo Setting default volumes... + if [ -x $bindir/set_default_volume ]; then + $bindir/set_default_volume -f + else + set_mixers + fi + if [ -f $TESTSOUND ]; then + msg=$(gettext " + The mixer is set up now for for playing. + Shall I try to play a sound sample now? + + NOTE: +If you have a big amplifier, lower your volumes or say no. + Otherwise check that your speaker volume is open, + and look if you can hear test sound. +") + if $DIALOG --yesno "$msg" 13 65 + then + clear + echo + aplay -N $TESTSOUND + fi + fi + mkdir -p -m 0755 @ASOUND_STATE_DIR@ + if [ ! -r @ASOUND_STATE_DIR@/asound.state ]; then + xecho "Saving the mixer setup used for this in @ASOUND_STATE_DIR@/asound.state." + $sbindir/alsactl store + fi + clear + xecho " +=============================================================================== + + Now ALSA is ready to use. + For adjustment of volumes, use your favorite mixer. + + Have a lot of fun! + +" +} + +# check playback +# return 0 - OK, 1 - NG, 2 - not working (irq/dma problem) +ac_try_load () { + test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE" + /sbin/modprobe snd-$1 ${*:2} >/dev/null 2>&1 + if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then + : ; + else + /sbin/modprobe -r snd-$1 >/dev/null 2>&1 + return 1 + fi + + # mute mixers + amixer set Master 0% mute >/dev/null 2>&1 + amixer set PCM 0% mute >/dev/null 2>&1 + + # output 0.5 sec + head -c 4000 < /dev/zero | aplay -N -r8000 -fS16_LE -traw -c1 > /dev/null 2>&1 & + # remember pid + pp=$! + # sleep for 2 seconds (to be sure -- 1 sec would be enough) + sleep 2 + # kill the child process if still exists. + kill -9 $pp > /dev/null 2>&1 + st=$? + ac_cardname=`head -n 1 $PROCFS/asound/cards | sed -e 's/^[0-9].* - \(.*\)$/\1/'` + /sbin/modprobe -r snd-$1 >/dev/null 2>&1 + if [ $st = 0 ]; then + # irq problem? + test -n "$LOGFILE" && echo "no playback return" >> "$LOGFILE" + return 2 + else + # seems ok! + test -n "$LOGFILE" && echo "playback OK" >> "$LOGFILE" + return 0 + fi +} + +# check capture +# return 0 - OK, 1 - NG, 2 - not working (irq/dma problem) +# ac_try_capture card duplex opts +ac_try_capture () { + test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE" + /sbin/modprobe snd-$1 ${*:3} >/dev/null 2>&1 + if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then + : ; + else + /sbin/modprobe -r snd-$1 >/dev/null 2>&1 + return 1 + fi + + # mute mixers + amixer set Master 0% mute >/dev/null 2>&1 + amixer set PCM 0% mute >/dev/null 2>&1 + + play_pid=0 + if [ $2 = yes ]; then + # try duplex - start dummy playing + aplay -N -r8000 -fS16_LE -traw -c1 < /dev/zero > /dev/null 2>&1 & + play_pid=$! + fi + # record 1sec + arecord -N -d1 > /dev/null 2>&1 & + # remember pid + pp=$! + # sleep for 2 seconds + sleep 2 + # kill the child process if still exists. + kill -9 $pp > /dev/null 2>&1 + st=$? + # kill playback process if any + test $play_pid != 0 && kill -9 $play_pid + /sbin/modprobe -r snd-$1 >/dev/null 2>&1 + if [ $st = 0 ]; then + test -n "$LOGFILE" && echo "capture no return" >> "$LOGFILE" + return 2 + else + test -n "$LOGFILE" && echo "capture OK" >> "$LOGFILE" + return 0 + fi +} + +get_dma_pair () { + case $1 in + 0) + echo 1 3 5;; + 1) + echo 0 3 5;; + 3) + echo 1 0 5;; + 5) + echo 3 1 0;; + esac +} + +# +# check playback on specified irqs +# +# ac_try_irq card opts irqs... +# return 0 - OK, 1 - NG, 2 - not working (dma problem?) +# +ac_try_irq () { + card=$1 + opts="$2 ${mpfx}irq=$3" + ac_try_load $card $opts >/dev/null 2>&1 + result=$? + case $result in + 0) + ac_opts="$opts" + return 0 + ;; + 2) + for irq in ${*:4}; do + opts="$2 ${mpfx}irq=$irq" + ac_try_load $card $opts >/dev/null 2>&1 + if [ $? = 0 ]; then + ac_opts="$opts" + return 0 + fi + done + return 2 + ;; + esac + return 1 +} + +# +# check playback/capture on dma1 & dma2 & specified irqs +# +# ac_try_dmas card opts irqs... +# return 0 - OK, 1 - NG +# +ac_try_dmas () { + dma_list=`check_dma_avail 1 0 3 5` + for irq in ${*:3}; do + for dma1 in $dma_list; do + for dma2 in `get_dma_pair $dma1`; do + opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq" + ac_try_load $1 $opts >/dev/null 2>&1 + result=$? + if [ $result = 1 ]; then + if [ $try_all_combination = 1 ]; then + continue + else + return 1 + fi + elif [ $result = 0 ]; then + test -n "$LOGFILE" && echo "Now checking capture..." >> "$LOGFILE" + ac_opts="$opts" + ac_try_capture $1 yes $opts >/dev/null 2>&1 && return 0 + for d in yes no; do + for dma2 in $dma_list; do + if [ $dma1 != $dma2 ]; then + opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq" + ac_opts="$opts" + ac_try_capture $1 $d $opts >/dev/null 2>&1 && return 0 + fi + done + done + return 0 + fi + done + done + done + return 1 +} + +# check if the option $2 exists in card $1: set value $3 +ac_check_option () { + if /sbin/modinfo -p snd-$1 | grep -q $2; then + echo "$2=$3" + fi +} + +ac_try_card_sb8 () { + card=sb8 + irq_list=`check_irq_avail 5 3 9 10 7` + for dma8 in `check_dma_avail 1 3`; do + opts="${mpfx}dma8=$dma8" + ac_try_irq $card "$opts" $irq_list && return 0 + done + return 1 +} + +ac_try_card_sb16 () { + card=sb16 + isapnp=`ac_check_option $card ${mpfx}isapnp 0` + opts="$isapnp" + irq_list=`check_irq_avail 5 9 10 7 3` + dma_list=`check_dma_avail 0 1 3` + dma16_list=`check_dma_avail 5 6 7` + # at first try auto-probing by driver itself + ac_try_load $card $opts >/dev/null 2>&1 + result=$? + case $result in + 0) + ac_opts="$opts" + ac_try_capture $card yes $opts >/dev/null 2>&1 && return 0 + for d in yes no; do + for dma8 in $dma_list; do + for irq in $irq_list; do + opts="${mpfx}dma8=$dma8 ${mpfx}irq=$irq $isapnp" + ac_try_capture $card $d $opts >/dev/null 2>&1 && return 0 + done + done + done + return 0 + ;; + 2) + for dma16 in $dma16_list; do + opts="${mpfx}dma16=$dma16 $isapnp" + if ac_try_irq $card "$opts" $irq_list ; then + ac_try_capture $card yes $ac_opts >/dev/null 2>&1 && return 0 + ac_opts_saved="$ac_opts" + for d in yes no; do + for dma8 in $dma_list; do + ac_opts="$ac_opts_saved ${mpfx}dma8=$dma8" + ac_try_capture $card $d $ac_opts >/dev/null 2>&1 && return 0 + done + done + # return anyway here.. + return 0 + fi + done + ;; + esac + return 1 +} + +ac_try_card_es1688 () { + card=es1688 + opts="" + irq_list=`check_irq_avail 5 9 10 7` + for dma8 in `check_dma_avail 1 3 0`; do + opts="${mpfx}dma8=$dma8 ${mpfx}mpu_irq=-1" + ac_try_irq $card "$opts" $irq_list && return 0 + done + return 1 +} + +ac_try_card_es18xx () { + card=es18xx + opts=`ac_check_option $card ${mpfx}isapnp 0` + ac_try_dmas $card "$opts" `check_irq_avail 5 9 10 7` && return 0 + return 1 +} + +ac_try_card_cs4236 () { + card=cs4236 + irq_list=`check_irq_avail 5 7 9 11 12 15` + isapnp=`ac_check_option $card ${mpfx}isapnp 0` + for cport in 0x538 0x210 0xf00; do + for port in 0x530 0x534; do + opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp" + ac_try_dmas $card "$opts" $irq_list && return 0 + done + done + return 1 +} + +ac_try_card_cs4232 () { + card=cs4232 + irq_list=`check_irq_avail 5 7 9 11 12 15` + isapnp=`ac_check_option $card ${mpfx}isapnp 0` + for cport in 0x538 0x210 0xf00; do + for port in 0x530 0x534; do + opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp" + ac_try_dmas $card "$opts" $irq_list && return 0 + done + done + return 1 +} + +ac_try_card_cs4231 () { + card=cs4231 + irq_list=`check_irq_avail 5 7 9 11 12 15` + for port in 0x530 0x534; do + opts="${mpfx}port=$port" + ac_try_dmas $card "$opts" $irq_list && return 0 + done + return 1 +} + +ac_try_card_opl3sa2 () { + card=opl3sa2 + irq_list=`check_irq_avail 5 9 3 1 11 12 15 0` + isapnp=`ac_check_option $card ${mpfx}isapnp 0` + for port in 0x370 0x538 0xf86 0x100; do + for wss_port in 0x530 0xe80 0xf40 0x604; do + opts="${mpfx}fm_port=-1 ${mpfx}midi_port=-1 ${mpfx}port=$port ${mpfx}wss_port=$wss_port $isapnp" + ac_try_dmas $card "$opts" $irq_list && return 0 + done + done + return 1 +} + +ac_config_legacy () { + title=$(gettext "WARNING") + msg=$(gettext " + Probing legacy ISA cards might make + your system unstable. + + Do you want to proceed? + +") + $DIALOG --title "$title" --yesno "$msg" 10 50 || acex 0 + + if [ x"$1" = x ]; then + probe_list="$LEGACY_CARDS" + else + probe_list=$* + fi + menu_args=() + + for card in $probe_list; do + cardname=`/sbin/modinfo -d snd-$card | sed -e 's/^\"\(.*\)\"$/\1/g'` + if [ x"$cardname" != x ]; then + menu_args=("${menu_args[@]}" "$card" "$cardname" "on") + fi + done + if [ x$menu_args = x ]; then + msg=$(gettext "No legacy drivers are available + for your machine") + $DIALOG --msgbox "$msg" 5 50 + return 1 + fi + title=$(gettext "Driver Selection") + msg=$(gettext " Probing legacy ISA cards + + Please select the drivers to probe:") + $DIALOG --title "$title" --checklist "$msg" \ + 17 64 8 "${menu_args[@]}" 2> $FOUND || acex 0 + + if [ $try_all_combination != 1 ]; then + msg=$(gettext " + Shall I try all possible DMA and IRQ combinations? + With this option, some unconventional configuration + might be found, but it will take much longer time.") + if $DIALOG --yesno "$msg" 10 60 + then + try_all_combination=1 + fi + fi + + xecho "Probing legacy cards.. This may take a few minutes.." + echo -n $(gettext "Probing: ") + cards=`cat $FOUND | tr -d \"` + for card in $cards; do + echo -n " $card" + ac_opts="" + if eval ac_try_card_$card ; then + xecho " : FOUND!!" + ac_config_card $card $ac_opts + return 0 + fi + done + echo + title=$(gettext "Result") + msg=$(gettext "No legacy cards found") + $DIALOG --title "$title" --msgbox "$msg" 5 50 + return 1 +} + +# +# main part continued.. +# + +if test -n "$LOGFILE" ; then + touch "$LOGFILE" + echo -n "Starting alsaconf: " >> "$LOGFILE" + date >> "$LOGFILE" +fi + +if [ x"$legacy_probe_card" != x ]; then + ac_opts="" + if eval ac_try_card_$legacy_probe_card >/dev/null 2>&1; then + echo "$ac_opts" + echo "$ac_cardname" + exit 0 + else + echo "FAILED" + exit 1 + fi +fi + +intro + +if [ $do_legacy_only = 1 ]; then + ac_config_legacy + exit 0 +fi + +probe_cards + +devs_found=() +devs_olist="" + +if [ -s "$FOUND" ]; then + while read dev card ; do + MODDIR=/lib/modules/`uname -r` + find $MODDIR -type f | grep -q -E $card'\.(o|ko)' || continue + cardname=`find_device_name $dev | cut -c 1-64` + if [ -z "$cardname" ]; then + cardname="$card" + fi + card=${card##snd-} + devs_found=("${devs_found[@]}" "$card" "$cardname") + devs_devs=("${devs_devs[@]}" "$card" "$dev") + done <"$FOUND" + devs_olist=`cat $FOUND` +fi +if [ x$devs_found != x ]; then + # + # check for TP600E + # + if [ ${devs_found[0]} = cs46xx ]; then + if $lspci -nv 2>/dev/null| grep -q "Subsystem: 1014:1010"; then + msg=$(gettext " + Looks like you having a Thinkpad 600E or 770 notebook. + On this notebook, CS4236 driver should be used + although CS46xx chip is detected. + + Shall I try to snd-cs4236 driver and probe + the legacy ISA configuration?") + if $DIALOG --yesno "$msg" 13 60 + then + try_all_combination=1 + ac_config_legacy cs4236 + exit 0 + fi + elif $lspci -nv 2>/dev/null| grep -q "Subsystem: 8086:8080"; then + msg=$(gettext " + Looks like you having a Dell Dimension machine. + On this machine, CS4232 driver should be used + although CS46xx chip is detected. + + Shall I try to snd-cs4232 driver and probe + the legacy ISA configuration?") + if $DIALOG --yesno "$msg" 13 60 + then + try_all_combination=1 + ac_config_legacy cs4232 + exit 0 + fi + fi + fi + + devs_found=("${devs_found[@]}" "legacy" "Probe legacy ISA (non-PnP) chips") + title=$(gettext "Soundcard Selection") + msg=$(gettext " + Following card(s) are found on your system. + Choose a soundcard to configure: +") + $DIALOG --title "$title" --menu "$msg" 17 76 8 "${devs_found[@]}" --output-fd 3 3> $FOUND || acex 0 + card=`head -n 1 $FOUND` + if [ "$card" = "legacy" ]; then + ac_config_legacy + else + ac_config_card "$card" + fi + exit 0 +else + msg=$(gettext " + No supported PnP or PCI card found. + + Would you like to probe legacy ISA sound cards/chips? + +") + if $DIALOG --yesno "$msg" 9 60 ; then + ac_config_legacy + exit 0 + fi +fi + +rm -f "$FOUND" "$DUMP" +exit 0 diff --git a/alsaconf/po/Makefile.in b/alsaconf/po/Makefile.in new file mode 100644 index 0000000..f1fa9aa --- /dev/null +++ b/alsaconf/po/Makefile.in @@ -0,0 +1,91 @@ +POFILES = ja.po ru.po + +DOMAIN = alsaconf +GETTEXT_SRC = ../alsaconf.in + +XGETTEXT_OPTIONS = -kxmsg -kxecho + +top_builddir = ../.. + +srcdir = @srcdir@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +prefix = @prefix@ +localedir = $(datadir)/locale + +USE_NLS = @USE_NLS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +# mkdir_p = @mkdir_p@ +mkdir_p = mkdir -p -- +XGETTEXT = @XGETTEXT@ +MSGFMT = @MSGFMT@ +GMSGFMT = @GMSGFMT@ +MSGMERGE = @MSGMERGE@ +MSGMERGE_UPDATE = @MSGMERGE@ --update + +DISTFILES = $(POFILES) Makefile.in +CATALOGS = $(POFILES:.po=.gmo) + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +.SUFFIXES: .po .gmo .mo + +%.mo : $(srcdir)/%.po + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +%.gmo : $(srcdir)/%.po + @lang=`echo $(srcdir)/$* | sed -e 's,.*/,,'`; \ + rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $(srcdir)/$${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +$(DOMAIN).pot: $(GETTEXT_SRC) + $(XGETTEXT) -o$@ --default-domain=$(DOMAIN) \ + --add-comments=TRANSLATORS: --language=Shell \ + $(XGETTEXT_OPTIONS) $< + +check check_recursive: + +clean: + rm -f $(CATALOGS) $(POFILES:.po=.mo) $(DOMAIN).pot + +update-po: $(DOMAIN).pot + @for po in $(POFILES); do \ + $(MSGMERGE_UPDATE) $(srcdir)/$$po $(DOMAIN).pot; \ + done + +install-data-no: +install-data-yes: all + $(mkdir_p) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + $(INSTALL_DATA) $$cat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + done + +install-data: install-data-@USE_NLS@ +install: install-data + +uninstall-data-no: +uninstall-data-yes: + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo; \ + done + +uninstall-data: uninstall-data-@USE_NLS@ +uninstall: uninstall-data + +dist distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + cp -p $$file $(distdir); \ + done + +distclean: clean + rm -f Makefile *~ diff --git a/alsaconf/po/ja.po b/alsaconf/po/ja.po new file mode 100644 index 0000000..170f708 --- /dev/null +++ b/alsaconf/po/ja.po @@ -0,0 +1,362 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: alsaconf\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 12:37+0100\n" +"PO-Revision-Date: 2005-12-02 12:39+0100\n" +"Last-Translator: Takashi Iwai \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../alsaconf.in:36 +msgid "-s" +msgstr "" + +#: ../alsaconf.in:80 +msgid "ALSA configurator" +msgstr "ALSA 設定ツール" + +#: ../alsaconf.in:82 +msgid "" +"usage: alsaconf [options]\n" +" -l|--legacy check only legacy non-isapnp cards\n" +" -m|--modinfo read module descriptions instead of reading card db\n" +" -s|--sound wav-file\n" +" use the specified wav file as a test sound\n" +" -u|--uid uid set the uid for the ALSA devices (default = 0) [obsoleted]\n" +" -g|--gid gid set the gid for the ALSA devices (default = 0) [obsoleted]\n" +" -d|--devmode mode\n" +" set the permission for ALSA devices (default = 0666) " +"[obs.]\n" +" -r|--strict set strict device mode (equiv. with -g 17 -d 0660) " +"[obsoleted]\n" +" -L|--log file logging on the specified file (for debugging purpose only)\n" +" -p|--probe card-name\n" +" probe a legacy non-isapnp card and print module options\n" +" -P|--listprobe list the supported legacy card modules\n" +" -c|--config file\n" +" specify the module config file\n" +" -R|--resources list available DMA and IRQ resources with debug for legacy\n" +" -h|--help what you're reading" +msgstr "" +"使用法: alsaconf [オプション]\n" +" -l|--legacy 非 ISAPnP カードのみチェックする\n" +" -m|--modinfo カード DB を読む代わりにモジュール記述を読み込み\n" +" -s|--sound WAVファイル\n" +" 指定の WAV ファイルをテスト音として用いる\n" +" -u|--uid uid ALSA デバイスの uid (デフォルト = 0) [旧オプション・無視されます]\n" +" -g|--gid gid ALSA デバイスの gid (デフォルト = 0) [旧]\\n\"\n" +" -d|--devmode モード\n" +" ALSA デバイスのパーミッション(デフォルト = 0666) [旧]\n" +" -r|--strict 厳格なモード (-g 17 -d 0660 と同等) [旧]\n" +" -L|--log file 指定のファイルにログを記録する (デバッグ用途)\n" +" -p|--probe カード名\n" +" 指定の 非IsaPnP カードを検索しモジュールオプションを表示する\n" +" -P|--listprobe サポートされている旧式の(非isapnp)カードのモジュール一覧表示\n" +" -c|--config ファイル\n" +" 指定のモジュール設定ファイルを用いる\n" +" -R|--resources レガシーデバイスのデバッグ用: 可能な DMA と IRQ を表示する\n" +" -h|--help 今見ています" + +#: ../alsaconf.in:252 +msgid "You must be root to use this script." +msgstr "ルートのみ実行可能です" + +#: ../alsaconf.in:294 +msgid "ERROR: The config file doesn't exist: " +msgstr "エラー: 設定ファイルが存在しません: " + +#: ../alsaconf.in:336 +msgid "Error, dialog or whiptail not found." +msgstr "エラー: dialog または whiptail が見つかりません" + +#: ../alsaconf.in:342 +msgid "Error, awk not found. Can't continue." +msgstr "エラー: awk が見つかりません" + +#: ../alsaconf.in:439 +msgid "" +"\n" +" ALSA CONFIGURATOR\n" +" version %s\n" +"\n" +" This script is a configurator for\n" +" Advanced Linux Sound Architecture (ALSA) driver.\n" +"\n" +"\n" +" If ALSA is already running, you should close all sound\n" +" apps now and stop the sound driver.\n" +" alsaconf will try to do this, but it's not 100%% sure." +msgstr "" +"\n" +" ALSA 設定ツール\n" +" バージョン %s\n" +"\n" +" このスクリプトは、Advanced Linux Sound Architecture\n" +" (ALSA) ドライバの設定を行うツールです。\n" +"\n" +"\n" +" もし既に ALSA が起動している場合は、実行前に\n" +" 全てのサウンドアプリケーションを閉じて、サウンド\n" +" ドライバを停止してください。\n" +" alsaconf の動作は 100%% 保証できません。" + +#: ../alsaconf.in:455 +msgid "" +"\n" +"\n" +" OK, sound driver is configured.\n" +"\n" +" ALSA CONFIGURATOR\n" +"\n" +" will prepare the card for playing now.\n" +"\n" +" Now I'll run alsasound init script, then I'll use\n" +" amixer to raise the default volumes.\n" +" You can change the volume later via a mixer\n" +" program such as alsamixer or gamix.\n" +" \n" +" " +msgstr "" +"\n" +"\n" +" サウンドドライバが設定されました。\n" +"\n" +" これからカードの再生の準備を行います。\n" +"\n" +"\n" +" alsasound スクリプトを実行し、その後 amixer で\n" +" デフォルトの音量に設定します。\n" +" 後で、alsamixer や gamix などのミキサープログラム\n" +" を用いて、音量を変更することが可能です。\n" +" " + +#: ../alsaconf.in:518 ../alsaconf.in:523 ../alsaconf.in:528 ../alsaconf.in:533 +msgid "Can't create temp file, exiting..." +msgstr "一時ファイルを作成できませんでした。中止します..." + +#: ../alsaconf.in:643 +msgid "Building card database.." +msgstr "カードデータベースを作成中..." + +#: ../alsaconf.in:647 +msgid "No card database is found.." +msgstr "カードが見つかりませんでした..." + +#: ../alsaconf.in:652 +msgid "Searching sound cards" +msgstr "サウンドカードを検索中" + +#: ../alsaconf.in:806 +msgid "" +"\n" +"Configuring %s\n" +"Do you want to modify %s (and %s if present)?" +msgstr "" +"\n" +"%s を設定します\n" +"%s (および %s) を変更しますか?" + +#: ../alsaconf.in:811 +msgid "" +"\n" +"Configuring %s\n" +"Do you want to modify %s?" +msgstr "" +"\n" +"%s を設定します\n" +"%s を変更しますか?" + +#: ../alsaconf.in:900 +msgid "Running modules-update..." +msgstr "modules-update を実行中..." + +#: ../alsaconf.in:903 +msgid "Running update-modules..." +msgstr "update-modules を実行中..." + +#: ../alsaconf.in:915 +msgid "" +"\n" +" The mixer is set up now for for playing.\n" +" Shall I try to play a sound sample now?\n" +"\n" +" NOTE:\n" +"If you have a big amplifier, lower your volumes or say no.\n" +" Otherwise check that your speaker volume is open,\n" +" and look if you can hear test sound.\n" +msgstr "" +"\n" +" 音量を再生用に準備し終えました。\n" +" サンプルのサウンドを再生しますか?\n" +"\n" +" 注意:\n" +" 大容量アンプの場合は、音量を下げておくか、ここで「いいえ」\n" +" を選択してください。スピーカーの音量をチェックして、\n" +" テスト音が聞こえるかどうか確認してください。\n" + +#: ../alsaconf.in:932 +msgid "Saving the mixer setup used for this in /etc/asound.state." +msgstr "ミキサーの設定を /etc/asound.state に保存します" + +#: ../alsaconf.in:936 +msgid "" +"\n" +"===============================================================================\n" +"\n" +" Now ALSA is ready to use.\n" +" For adjustment of volumes, use your favorite mixer.\n" +"\n" +" Have a lot of fun!\n" +"\n" +msgstr "" +"\n" +"===============================================================================\n" +"\n" +" これで ALSA が使用可能になりました。\n" +" 音量の調整には、ミキサープログラムをご使用下さい。\n" +"\n" + +#: ../alsaconf.in:1244 +msgid "WARNING" +msgstr "注意" + +#: ../alsaconf.in:1245 +msgid "" +"\n" +" Probing legacy ISA cards might make\n" +" your system unstable.\n" +"\n" +" Do you want to proceed?\n" +"\n" +msgstr "" +"\n" +" 旧式の ISA カードの検索を行うと\n" +" システムが不安定になる場合があります。\n" +"\n" +" このまま続けますか?\n" +"\n" + +#: ../alsaconf.in:1268 +msgid "" +"No legacy drivers are available\n" +" for your machine" +msgstr "" +"旧式の ISA カードは\n" +"検出されませんでした" + +#: ../alsaconf.in:1273 +msgid "Driver Selection" +msgstr "ドライバの選択" + +#: ../alsaconf.in:1274 +msgid "" +" Probing legacy ISA cards\n" +"\n" +" Please select the drivers to probe:" +msgstr "" +" 旧式の ISA カードの検出\n" +"\n" +" 検出するドライバを選択してください:" + +#: ../alsaconf.in:1281 +msgid "" +"\n" +" Shall I try all possible DMA and IRQ combinations?\n" +" With this option, some unconventional configuration\n" +" might be found, but it will take much longer time." +msgstr "" +"\n" +" 可能な DMA と IRQ の全ての組合せを試みますか?\n" +" このオプションでは、まれな設定も検出されることが\n" +" 可能ですが、より長い時間がかかります。" + +#: ../alsaconf.in:1291 +msgid "Probing legacy cards.. This may take a few minutes.." +msgstr "旧式カードの検出中... 長時間がかかることがあります..." + +#: ../alsaconf.in:1292 +msgid "Probing: " +msgstr "検出中: " + +#: ../alsaconf.in:1298 +msgid " : FOUND!!" +msgstr " : 発見!!" + +#: ../alsaconf.in:1304 +msgid "Result" +msgstr "結果" + +#: ../alsaconf.in:1305 +msgid "No legacy cards found" +msgstr "旧式カードが見つかりませんでした" + +#: ../alsaconf.in:1364 +msgid "" +"\n" +" Looks like you having a Thinkpad 600E or 770 notebook.\n" +" On this notebook, CS4236 driver should be used\n" +" although CS46xx chip is detected.\n" +"\n" +" Shall I try to snd-cs4236 driver and probe\n" +" the legacy ISA configuration?" +msgstr "" +"\n" +" Thinkpad 600E または 770 をご使用のようです。\n" +" このマシンでは、CS46xx チップが検出されますが\n" +" CS4236 ドライバを用いる必要があります。\n" +"\n" +" snd-cs4236 ドライバを試用して、旧式の ISA 設定\n" +" の検出を行いますか?" + +#: ../alsaconf.in:1378 +msgid "" +"\n" +" Looks like you having a Dell Dimension machine.\n" +" On this machine, CS4232 driver should be used\n" +" although CS46xx chip is detected.\n" +"\n" +" Shall I try to snd-cs4232 driver and probe\n" +" the legacy ISA configuration?" +msgstr "" +"\n" +" Dell Dimension マシンをご使用のようです。\n" +" このマシンでは、CS46xx チップが検出されますが\n" +" CS4232 ドライバを用いる必要があります。\n" +"\n" +" snd-cs4232 ドライバを試用して、旧式の ISA 設定\n" +" の検出を行いますか?" + +#: ../alsaconf.in:1395 +msgid "Soundcard Selection" +msgstr "サウンドカードの選択" + +#: ../alsaconf.in:1396 +msgid "" +"\n" +" Following card(s) are found on your system.\n" +" Choose a soundcard to configure:\n" +msgstr "" +"\n" +" 以下のカードがシステムから検出されました。\n" +" 設定するカードを選択してください:\n" + +#: ../alsaconf.in:1409 +msgid "" +"\n" +" No supported PnP or PCI card found.\n" +"\n" +" Would you like to probe legacy ISA sound cards/chips?\n" +"\n" +msgstr "" +"\n" +" PnP または PCI カードが検出されませんでした。\n" +"\n" +" 旧式の ISA サウンドカードの検出を行いますか?\n" diff --git a/alsaconf/po/ru.po b/alsaconf/po/ru.po new file mode 100644 index 0000000..af4fa0d --- /dev/null +++ b/alsaconf/po/ru.po @@ -0,0 +1,373 @@ +# Russian translations for alsa-utils package +# Английские переводы для пакета alsa-utils. +# Copyright (C) 2005 THE alsa-utils'S COPYRIGHT HOLDER +# This file is distributed under the same license as the alsa-utils package. +# , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: alsa-utils 1.0.9rc4a\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 12:37+0100\n" +"PO-Revision-Date: 2005-12-02 12:39+0100\n" +"Last-Translator: \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../alsaconf.in:36 +msgid "-s" +msgstr "" + +#: ../alsaconf.in:80 +msgid "ALSA configurator" +msgstr "Найстройщик ALSA" + +#: ../alsaconf.in:82 +#, fuzzy +msgid "" +"usage: alsaconf [options]\n" +" -l|--legacy check only legacy non-isapnp cards\n" +" -m|--modinfo read module descriptions instead of reading card db\n" +" -s|--sound wav-file\n" +" use the specified wav file as a test sound\n" +" -u|--uid uid set the uid for the ALSA devices (default = 0) [obsoleted]\n" +" -g|--gid gid set the gid for the ALSA devices (default = 0) [obsoleted]\n" +" -d|--devmode mode\n" +" set the permission for ALSA devices (default = 0666) " +"[obs.]\n" +" -r|--strict set strict device mode (equiv. with -g 17 -d 0660) " +"[obsoleted]\n" +" -L|--log file logging on the specified file (for debugging purpose only)\n" +" -p|--probe card-name\n" +" probe a legacy non-isapnp card and print module options\n" +" -P|--listprobe list the supported legacy card modules\n" +" -c|--config file\n" +" specify the module config file\n" +" -R|--resources list available DMA and IRQ resources with debug for legacy\n" +" -h|--help what you're reading" +msgstr "" +"использование: alsaconf [опции]\n" +" -l|--legacy проверять только не ISAPnP карты\n" +" -m|--modinfo читать описание модулей вместо чтения бызы данных карт\n" +" -s|--sound WAV файл\n" +" использовать указанный WAV файл в качестве тестового\n" +" -u|--uid uid устанавливает uid для ALSA(по умолчанию = 0) [устарело]\n" +" -g|--gid gid устанавливает gid для ALSA(по умолчанию = 0) [устарело]\n" +" -d|--devmode режим\n" +" устанавливает права доступа для ALSA (по умолчанию = 0666) " +"[уст.]\n" +" -r|--strict устанавливает строгие права для ALSA (экв. -g 17 -d 0660) " +"[уст.]\n" +" -L|--log файл записывать события в определенный файл (в целях отладки)\n" +" -p|--probe имя звуковой карты\n" +" проверить обычную не IsaPnP карту и вывести опции модуля\n" +" -P|--listprobe вывести список поддерживаемых не IsaPnP карт\n" +" -c|--config файл\n" +" указывает файл с настройками модуля\n" +" -h|--help вывести это сообщение" + +#: ../alsaconf.in:252 +msgid "You must be root to use this script." +msgstr "Вы должны быть суперпользователем, чтобы использовать этот скрипт." + +#: ../alsaconf.in:294 +msgid "ERROR: The config file doesn't exist: " +msgstr "ОШИБКА: Файл с настройками не существует: " + +#: ../alsaconf.in:336 +msgid "Error, dialog or whiptail not found." +msgstr "Ошибка, dialog или whiptail не найдены." + +#: ../alsaconf.in:342 +msgid "Error, awk not found. Can't continue." +msgstr "Ошибка, awk не найден. Не могу продолжить работу." + +#: ../alsaconf.in:439 +msgid "" +"\n" +" ALSA CONFIGURATOR\n" +" version %s\n" +"\n" +" This script is a configurator for\n" +" Advanced Linux Sound Architecture (ALSA) driver.\n" +"\n" +"\n" +" If ALSA is already running, you should close all sound\n" +" apps now and stop the sound driver.\n" +" alsaconf will try to do this, but it's not 100%% sure." +msgstr "" +"\n" +" Настройщик ALSA\n" +" версия %s\n" +"\n" +" Этот скрипт настраивает Advanced Linux Sound Architecture\n" +"\n" +"\n" +" Если какие-нибудь приложения входящие в пакет ALSA уже запущены,\n" +" вы должны закрыть все приложения работающие со звуком\n" +" и остановаить звуковой драйвер.\n" +" alsaconf попытается это сделать, но результат не гарантируется на все 100%" +"%." + +#: ../alsaconf.in:455 +msgid "" +"\n" +"\n" +" OK, sound driver is configured.\n" +"\n" +" ALSA CONFIGURATOR\n" +"\n" +" will prepare the card for playing now.\n" +"\n" +" Now I'll run alsasound init script, then I'll use\n" +" amixer to raise the default volumes.\n" +" You can change the volume later via a mixer\n" +" program such as alsamixer or gamix.\n" +" \n" +" " +msgstr "" +"\n" +"\n" +" Хорошо, драйвер звуковой карты настроен.\n" +"\n" +" Сейчас Настройщик ALSA\n" +"\n" +" подготовит звуковую карту для проигрования.\n" +"\n" +" Сейчас я запущу скрипт, инициализирующий alsasound, потом использую " +"amixer\n" +" для увеличения уровня громкости по умолчания.\n" +" Вы можете изменить уровень громкости по умолчания позже\n" +" с помощью таких программ как alsamixer или gamix.\n" +" " + +#: ../alsaconf.in:518 ../alsaconf.in:523 ../alsaconf.in:528 ../alsaconf.in:533 +msgid "Can't create temp file, exiting..." +msgstr "Не могу создать временный файл, прекращаю работу..." + +#: ../alsaconf.in:643 +msgid "Building card database.." +msgstr "Создаю базу данных с информацией о звуковых карточках.." + +#: ../alsaconf.in:647 +msgid "No card database is found.." +msgstr "База данных, содержащая информацию о звуковых карточках, не найдена.." + +#: ../alsaconf.in:652 +msgid "Searching sound cards" +msgstr "Ищем звуковые карточки" + +#: ../alsaconf.in:806 +msgid "" +"\n" +"Configuring %s\n" +"Do you want to modify %s (and %s if present)?" +msgstr "" +"\n" +"Настраиваем %s\n" +"Вы хотите изменить %s (и %s, если существует)?" + +#: ../alsaconf.in:811 +msgid "" +"\n" +"Configuring %s\n" +"Do you want to modify %s?" +msgstr "" +"\n" +"Настраиваем %s\n" +"Вы хотите изменить %s?" + +#: ../alsaconf.in:900 +msgid "Running modules-update..." +msgstr "Запускаем modules-update..." + +#: ../alsaconf.in:903 +msgid "Running update-modules..." +msgstr "Запускаем update-modules..." + +#: ../alsaconf.in:915 +msgid "" +"\n" +" The mixer is set up now for for playing.\n" +" Shall I try to play a sound sample now?\n" +"\n" +" NOTE:\n" +"If you have a big amplifier, lower your volumes or say no.\n" +" Otherwise check that your speaker volume is open,\n" +" and look if you can hear test sound.\n" +msgstr "" +"\n" +" Микшер настроен для проигровования.\n" +" Проиграть тестовый пример?\n" +"\n" +" Примечание:\n" +" Если у вас большой усилитель, уменьшите уровень громкости или скажите " +"нет.\n" +" В противном случае проверьте, что ваши колонки включены,\n" +" и удостоверьтесь что вы слышите тестовый пример.\n" + +#: ../alsaconf.in:932 +msgid "Saving the mixer setup used for this in /etc/asound.state." +msgstr "Сохраняем настройки микшера в /etc/asound.state." + +#: ../alsaconf.in:936 +msgid "" +"\n" +"===============================================================================\n" +"\n" +" Now ALSA is ready to use.\n" +" For adjustment of volumes, use your favorite mixer.\n" +"\n" +" Have a lot of fun!\n" +"\n" +msgstr "" +"\n" +"===============================================================================\n" +"\n" +" Теперь ALSA готова к использованию.\n" +" Для регулировки уровня громкости, используйте ваш любимый микшер.\n" +"\n" +" Оторвись по полной!\n" +"\n" + +#: ../alsaconf.in:1244 +msgid "WARNING" +msgstr "ПРЕДУПРЕЖДЕНИЕ" + +#: ../alsaconf.in:1245 +msgid "" +"\n" +" Probing legacy ISA cards might make\n" +" your system unstable.\n" +"\n" +" Do you want to proceed?\n" +"\n" +msgstr "" +"\n" +" Поиск ISA звуковых карточек может сделать\n" +" вашу систему нестабильной.\n" +"\n" +" Вы уверены?\n" +"\n" + +#: ../alsaconf.in:1268 +msgid "" +"No legacy drivers are available\n" +" for your machine" +msgstr "" +"Нету подходяшего драйвера для\n" +" вашей машины" + +#: ../alsaconf.in:1273 +msgid "Driver Selection" +msgstr "Выбор Драйвера" + +#: ../alsaconf.in:1274 +msgid "" +" Probing legacy ISA cards\n" +"\n" +" Please select the drivers to probe:" +msgstr "" +" Поиск ISA звуковых карт\n" +"\n" +" Пожалуйста, выберите драйверы для проверки:" + +#: ../alsaconf.in:1281 +msgid "" +"\n" +" Shall I try all possible DMA and IRQ combinations?\n" +" With this option, some unconventional configuration\n" +" might be found, but it will take much longer time." +msgstr "" +"\n" +" Попробовать все доступные DMA и IRQ комбинации?\n" +" С этой опцией, могут быть найдены некоторые нестандартные\n" +" конфигураии, но это займет намного больше времени." + +#: ../alsaconf.in:1291 +msgid "Probing legacy cards.. This may take a few minutes.." +msgstr "Поиск звуковых карточек.. Это может занять несколько минут.." + +#: ../alsaconf.in:1292 +msgid "Probing: " +msgstr "Проверка: " + +#: ../alsaconf.in:1298 +msgid " : FOUND!!" +msgstr " : НАШЕЛ!!" + +#: ../alsaconf.in:1304 +msgid "Result" +msgstr "Результат" + +#: ../alsaconf.in:1305 +msgid "No legacy cards found" +msgstr "Звуковых карточек не найдено" + +#: ../alsaconf.in:1364 +msgid "" +"\n" +" Looks like you having a Thinkpad 600E or 770 notebook.\n" +" On this notebook, CS4236 driver should be used\n" +" although CS46xx chip is detected.\n" +"\n" +" Shall I try to snd-cs4236 driver and probe\n" +" the legacy ISA configuration?" +msgstr "" +"\n" +" Кажется, мы имеем дело с ноутбуком Thinkpad 600E или 770.\n" +" На этом ноутбуке, драйвер CS4236 должен использоваться\n" +" хотя определяется CS46xx\n" +"\n" +" Использовать snd-cs4236 и проверить правильность ISA\n" +" конфигурации?" + +#: ../alsaconf.in:1378 +msgid "" +"\n" +" Looks like you having a Dell Dimension machine.\n" +" On this machine, CS4232 driver should be used\n" +" although CS46xx chip is detected.\n" +"\n" +" Shall I try to snd-cs4232 driver and probe\n" +" the legacy ISA configuration?" +msgstr "" +"\n" +" Похоже что вы имеем дело с машиной Dell Dimension.\n" +" На этой машине CS4232 драйвер должен исползьовать, チップが検出されますが\n" +" хотя чип звуковой карты определяется как CS46xx.\n" +"\n" +" Использовать snd-cs4232 и проверить ISA валидность\n" +" этой конфигурации?" + +#: ../alsaconf.in:1395 +msgid "Soundcard Selection" +msgstr "Выбор Звуковой карты" + +#: ../alsaconf.in:1396 +msgid "" +"\n" +" Following card(s) are found on your system.\n" +" Choose a soundcard to configure:\n" +msgstr "" +"\n" +" Следущее звуковая(ые) карта(ы) найдены в вашей системе.\n" +" Выберите звуковую карту для настройки:\n" + +#: ../alsaconf.in:1409 +msgid "" +"\n" +" No supported PnP or PCI card found.\n" +"\n" +" Would you like to probe legacy ISA sound cards/chips?\n" +"\n" +msgstr "" +"\n" +" Найдена не поддерживаемая PnP или PCI карта.\n" +"\n" +" Желаете проверить ISA звуковые карты/чипы?\n" +"\n" diff --git a/alsactl/90-alsa-restore.rules b/alsactl/90-alsa-restore.rules new file mode 100644 index 0000000..51ee299 --- /dev/null +++ b/alsactl/90-alsa-restore.rules @@ -0,0 +1,2 @@ +ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS=="card*", \ + RUN+="/usr/sbin/alsactl restore $attr{number}" diff --git a/alsactl/90-alsa-restore.rules.in b/alsactl/90-alsa-restore.rules.in new file mode 100644 index 0000000..0bcee5b --- /dev/null +++ b/alsactl/90-alsa-restore.rules.in @@ -0,0 +1,2 @@ +ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS=="card*", \ + RUN+="@sbindir@/alsactl restore $attr{number}" diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am new file mode 100644 index 0000000..5cfc415 --- /dev/null +++ b/alsactl/Makefile.am @@ -0,0 +1,59 @@ +SUBDIRS = init + +sbin_PROGRAMS=alsactl +man_MANS=alsactl.1 +if USE_XMLTO +man_MANS += alsactl_init.7 +endif +EXTRA_DIST=alsactl.1 alsactl_init.xml + +alsactl_SOURCES=alsactl.c state.c utils.c init_parse.c +alsactl_CFLAGS=$(AM_CFLAGS) -DSYS_ASOUNDRC=\"$(ASOUND_STATE_DIR)/asound.state\" +noinst_HEADERS=alsactl.h list.h init_sysdeps.c init_utils_string.c init_utils_run.c init_sysfs.c + +dist_udevrules_DATA = \ + 90-alsa-restore.rules + +if HAVE_SYSTEMD + +systemdsystemunit_DATA = \ + alsa-store.service \ + alsa-restore.service + +install-data-hook: + $(MKDIR_P) -m 0755 \ + $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants \ + $(DESTDIR)$(systemdsystemunitdir)/shutdown.target.wants + ( cd $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants && \ + rm -f alsa-restore.service && \ + $(LN_S) ../alsa-restore.service alsa-restore.service ) + ( cd $(DESTDIR)$(systemdsystemunitdir)/shutdown.target.wants && \ + rm -f alsa-store.service && \ + $(LN_S) ../alsa-store.service alsa-store.service ) + +endif + +edit = \ + sed $(SED) -r 's,@sbindir\@,$(sbindir),g' < $< > $@ || rm $@ + +alsa-store.service: alsa-store.service.in + $(edit) + +alsa-restore.service: alsa-restore.service.in + $(edit) + +90-alsa-restore.rules: 90-alsa-restore.rules.in + $(edit) + +EXTRA_DIST += \ + alsa-store.service.in \ + alsa-restore.service.in \ + 90-alsa-restore.rules.in + +CLEANFILES = \ + alsa-store.service \ + alsa-restore.service \ + 90-alsa-restore.rules + +%.7: %.xml + xmlto man $? diff --git a/alsactl/Makefile.in b/alsactl/Makefile.in new file mode 100644 index 0000000..71d41c7 --- /dev/null +++ b/alsactl/Makefile.in @@ -0,0 +1,930 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +sbin_PROGRAMS = alsactl$(EXEEXT) +@USE_XMLTO_TRUE@am__append_1 = alsactl_init.7 +subdir = alsactl +DIST_COMMON = $(dist_udevrules_DATA) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(udevrulesdir)" \ + "$(DESTDIR)$(systemdsystemunitdir)" +PROGRAMS = $(sbin_PROGRAMS) +am_alsactl_OBJECTS = alsactl-alsactl.$(OBJEXT) alsactl-state.$(OBJEXT) \ + alsactl-utils.$(OBJEXT) alsactl-init_parse.$(OBJEXT) +alsactl_OBJECTS = $(am_alsactl_OBJECTS) +alsactl_LDADD = $(LDADD) +alsactl_LINK = $(CCLD) $(alsactl_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(alsactl_SOURCES) +DIST_SOURCES = $(alsactl_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +man7dir = $(mandir)/man7 +NROFF = nroff +MANS = $(man_MANS) +DATA = $(dist_udevrules_DATA) $(systemdsystemunit_DATA) +HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +SUBDIRS = init +man_MANS = alsactl.1 $(am__append_1) +EXTRA_DIST = alsactl.1 alsactl_init.xml alsa-store.service.in \ + alsa-restore.service.in 90-alsa-restore.rules.in +alsactl_SOURCES = alsactl.c state.c utils.c init_parse.c +alsactl_CFLAGS = $(AM_CFLAGS) -DSYS_ASOUNDRC=\"$(ASOUND_STATE_DIR)/asound.state\" +noinst_HEADERS = alsactl.h list.h init_sysdeps.c init_utils_string.c init_utils_run.c init_sysfs.c +dist_udevrules_DATA = \ + 90-alsa-restore.rules + +@HAVE_SYSTEMD_TRUE@systemdsystemunit_DATA = \ +@HAVE_SYSTEMD_TRUE@ alsa-store.service \ +@HAVE_SYSTEMD_TRUE@ alsa-restore.service + +edit = \ + sed $(SED) -r 's,@sbindir\@,$(sbindir),g' < $< > $@ || rm $@ + +CLEANFILES = \ + alsa-store.service \ + alsa-restore.service \ + 90-alsa-restore.rules + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alsactl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign alsactl/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-sbinPROGRAMS: $(sbin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-sbinPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(sbindir)" && rm -f $$files + +clean-sbinPROGRAMS: + -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) +alsactl$(EXEEXT): $(alsactl_OBJECTS) $(alsactl_DEPENDENCIES) + @rm -f alsactl$(EXEEXT) + $(alsactl_LINK) $(alsactl_OBJECTS) $(alsactl_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alsactl-alsactl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alsactl-init_parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alsactl-state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alsactl-utils.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +alsactl-alsactl.o: alsactl.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-alsactl.o -MD -MP -MF $(DEPDIR)/alsactl-alsactl.Tpo -c -o alsactl-alsactl.o `test -f 'alsactl.c' || echo '$(srcdir)/'`alsactl.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-alsactl.Tpo $(DEPDIR)/alsactl-alsactl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='alsactl.c' object='alsactl-alsactl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-alsactl.o `test -f 'alsactl.c' || echo '$(srcdir)/'`alsactl.c + +alsactl-alsactl.obj: alsactl.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-alsactl.obj -MD -MP -MF $(DEPDIR)/alsactl-alsactl.Tpo -c -o alsactl-alsactl.obj `if test -f 'alsactl.c'; then $(CYGPATH_W) 'alsactl.c'; else $(CYGPATH_W) '$(srcdir)/alsactl.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-alsactl.Tpo $(DEPDIR)/alsactl-alsactl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='alsactl.c' object='alsactl-alsactl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-alsactl.obj `if test -f 'alsactl.c'; then $(CYGPATH_W) 'alsactl.c'; else $(CYGPATH_W) '$(srcdir)/alsactl.c'; fi` + +alsactl-state.o: state.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-state.o -MD -MP -MF $(DEPDIR)/alsactl-state.Tpo -c -o alsactl-state.o `test -f 'state.c' || echo '$(srcdir)/'`state.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-state.Tpo $(DEPDIR)/alsactl-state.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='state.c' object='alsactl-state.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-state.o `test -f 'state.c' || echo '$(srcdir)/'`state.c + +alsactl-state.obj: state.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-state.obj -MD -MP -MF $(DEPDIR)/alsactl-state.Tpo -c -o alsactl-state.obj `if test -f 'state.c'; then $(CYGPATH_W) 'state.c'; else $(CYGPATH_W) '$(srcdir)/state.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-state.Tpo $(DEPDIR)/alsactl-state.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='state.c' object='alsactl-state.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-state.obj `if test -f 'state.c'; then $(CYGPATH_W) 'state.c'; else $(CYGPATH_W) '$(srcdir)/state.c'; fi` + +alsactl-utils.o: utils.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-utils.o -MD -MP -MF $(DEPDIR)/alsactl-utils.Tpo -c -o alsactl-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-utils.Tpo $(DEPDIR)/alsactl-utils.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils.c' object='alsactl-utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c + +alsactl-utils.obj: utils.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-utils.obj -MD -MP -MF $(DEPDIR)/alsactl-utils.Tpo -c -o alsactl-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-utils.Tpo $(DEPDIR)/alsactl-utils.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='utils.c' object='alsactl-utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` + +alsactl-init_parse.o: init_parse.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-init_parse.o -MD -MP -MF $(DEPDIR)/alsactl-init_parse.Tpo -c -o alsactl-init_parse.o `test -f 'init_parse.c' || echo '$(srcdir)/'`init_parse.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-init_parse.Tpo $(DEPDIR)/alsactl-init_parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='init_parse.c' object='alsactl-init_parse.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-init_parse.o `test -f 'init_parse.c' || echo '$(srcdir)/'`init_parse.c + +alsactl-init_parse.obj: init_parse.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -MT alsactl-init_parse.obj -MD -MP -MF $(DEPDIR)/alsactl-init_parse.Tpo -c -o alsactl-init_parse.obj `if test -f 'init_parse.c'; then $(CYGPATH_W) 'init_parse.c'; else $(CYGPATH_W) '$(srcdir)/init_parse.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/alsactl-init_parse.Tpo $(DEPDIR)/alsactl-init_parse.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='init_parse.c' object='alsactl-init_parse.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsactl_CFLAGS) $(CFLAGS) -c -o alsactl-init_parse.obj `if test -f 'init_parse.c'; then $(CYGPATH_W) 'init_parse.c'; else $(CYGPATH_W) '$(srcdir)/init_parse.c'; fi` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +install-man7: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man7dir)" || $(MKDIR_P) "$(DESTDIR)$(man7dir)" + @list=''; test -n "$(man7dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.7[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man7dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man7dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man7dir)" || exit $$?; }; \ + done; } + +uninstall-man7: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man7dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.7[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man7dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man7dir)" && rm -f $$files; } +install-dist_udevrulesDATA: $(dist_udevrules_DATA) + @$(NORMAL_INSTALL) + test -z "$(udevrulesdir)" || $(MKDIR_P) "$(DESTDIR)$(udevrulesdir)" + @list='$(dist_udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(udevrulesdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(udevrulesdir)" || exit $$?; \ + done + +uninstall-dist_udevrulesDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(udevrulesdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(udevrulesdir)" && rm -f $$files +install-systemdsystemunitDATA: $(systemdsystemunit_DATA) + @$(NORMAL_INSTALL) + test -z "$(systemdsystemunitdir)" || $(MKDIR_P) "$(DESTDIR)$(systemdsystemunitdir)" + @list='$(systemdsystemunit_DATA)'; test -n "$(systemdsystemunitdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(systemdsystemunitdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(systemdsystemunitdir)" || exit $$?; \ + done + +uninstall-systemdsystemunitDATA: + @$(NORMAL_UNINSTALL) + @list='$(systemdsystemunit_DATA)'; test -n "$(systemdsystemunitdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(systemdsystemunitdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(systemdsystemunitdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(udevrulesdir)" "$(DESTDIR)$(systemdsystemunitdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@HAVE_SYSTEMD_FALSE@install-data-hook: +clean: clean-recursive + +clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_udevrulesDATA install-man \ + install-systemdsystemunitDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-sbinPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 install-man7 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_udevrulesDATA uninstall-man \ + uninstall-sbinPROGRAMS uninstall-systemdsystemunitDATA + +uninstall-man: uninstall-man1 uninstall-man7 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-data-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic \ + clean-sbinPROGRAMS ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook \ + install-dist_udevrulesDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-man7 install-pdf install-pdf-am install-ps \ + install-ps-am install-sbinPROGRAMS install-strip \ + install-systemdsystemunitDATA installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dist_udevrulesDATA \ + uninstall-man uninstall-man1 uninstall-man7 \ + uninstall-sbinPROGRAMS uninstall-systemdsystemunitDATA + + +@HAVE_SYSTEMD_TRUE@install-data-hook: +@HAVE_SYSTEMD_TRUE@ $(MKDIR_P) -m 0755 \ +@HAVE_SYSTEMD_TRUE@ $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants \ +@HAVE_SYSTEMD_TRUE@ $(DESTDIR)$(systemdsystemunitdir)/shutdown.target.wants +@HAVE_SYSTEMD_TRUE@ ( cd $(DESTDIR)$(systemdsystemunitdir)/basic.target.wants && \ +@HAVE_SYSTEMD_TRUE@ rm -f alsa-restore.service && \ +@HAVE_SYSTEMD_TRUE@ $(LN_S) ../alsa-restore.service alsa-restore.service ) +@HAVE_SYSTEMD_TRUE@ ( cd $(DESTDIR)$(systemdsystemunitdir)/shutdown.target.wants && \ +@HAVE_SYSTEMD_TRUE@ rm -f alsa-store.service && \ +@HAVE_SYSTEMD_TRUE@ $(LN_S) ../alsa-store.service alsa-store.service ) + +alsa-store.service: alsa-store.service.in + $(edit) + +alsa-restore.service: alsa-restore.service.in + $(edit) + +90-alsa-restore.rules: 90-alsa-restore.rules.in + $(edit) + +%.7: %.xml + xmlto man $? + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alsactl/alsa-restore.service.in b/alsactl/alsa-restore.service.in new file mode 100644 index 0000000..e97d196 --- /dev/null +++ b/alsactl/alsa-restore.service.in @@ -0,0 +1,11 @@ +[Unit] +Description=Restore Sound Card State +DefaultDependencies=no +After=sysinit.target +Before=shutdown.target +Conflicts=shutdown.target + +[Service] +Type=oneshot +ExecStart=-@sbindir@/alsactl restore +StandardOutput=syslog diff --git a/alsactl/alsa-store.service.in b/alsactl/alsa-store.service.in new file mode 100644 index 0000000..0e2823c --- /dev/null +++ b/alsactl/alsa-store.service.in @@ -0,0 +1,9 @@ +[Unit] +Description=Store Sound Card State +DefaultDependencies=no +Before=shutdown.target + +[Service] +Type=oneshot +ExecStart=@sbindir@/alsactl store +StandardOutput=syslog diff --git a/alsactl/alsactl.1 b/alsactl/alsactl.1 new file mode 100644 index 0000000..eb5968c --- /dev/null +++ b/alsactl/alsactl.1 @@ -0,0 +1,118 @@ +.TH ALSACTL 1 "15 May 2001" +.SH NAME +alsactl \- advanced controls for ALSA soundcard driver + +.SH SYNOPSIS + +\fBalsactl\fP [\fIoptions\fP] [\fIstore\fP|\fIrestore\fP|\fIinit\fP] + +.SH DESCRIPTION +\fBalsactl\fP is used to control advanced settings for the ALSA +soundcard drivers. It supports multiple soundcards. If your card has +features that you can't seem to control from a mixer application, +you have come to the right place. + +.SH COMMANDS + +\fIstore\fP saves the current driver state for the selected soundcard +to the configuration file. + +\fIrestore\fP loads driver state for the selected soundcard from the +configuration file. If restoring fails (eventually partly), the init +action is called. + +\fIinit\fP tries to initialize all devices to a default state. If device +is not known, error code 99 is returned. + +If no soundcards are specified, setup for all cards will be saved or +loaded. + +.SH OPTIONS + +.TP +\fI\-h, \-\-help\fP +Help: show available flags and commands. + +.TP +\fI\-d, \-\-debug\fP +Use debug mode: a bit more verbose. + +.TP +\fI\-v, \-\-version\fP +Print alsactl version number. + +.TP +\fI\-f, \-\-file\fP +Select the configuration file to use. The default is /var/lib/alsa/asound.state. + +.TP +\fI\-F, \-\-force\fP +Used with restore command. Try to restore the matching control elements +as much as possible. This option is set as default now. + +.TP +\fI\-g, \-\-ignore\fP +Used with store and restore commands. Do not show 'No soundcards found' +and do not set an error exit code when soundcards are not installed. + +.TP +\fI\-P, \-\-pedantic\fP +Used with restore command. Don't restore mismatching control elements. +This option was the old default behavior. + +.TP +\fI\-I, \-\-no\-init\-fallback\fP +Don't initialize cards if restore fails. Since version 1.0.18, +\fBalsactl\fP tries to initialize the card with the restore operation +as default. But this can cause incompatibility with the older version. +The caller may expect that the state won't be touched if no state file +exists. This option takes the restore behavior back to the older +version by suppressing the initialization. + +.TP +\fI\-r, \-\-runstate\fP +Save restore and init state to this file. The file will contain only errors. +Errors are appended with the soundcard id to the end of file. + +.TP +\fI\-R, \-\-remove\fP +Remove runstate file at first. + +.TP +\fI\-E, \-\-env\fP #=# +Set environment variable (useful for init action or you may override +ALSA_CONFIG_PATH to read different or optimized configuration - may be +useful for "boot" scripts). + +.TP +\fI\-i, \-\-initfile\fP #=# +The configuration file for init. By default, PREFIX/share/alsa/init/00main +is used. + +.SH FILES +\fI/var/lib/alsa/asound.state\fP (or whatever file you specify with the +\fB\-f\fP flag) is used to store current settings for your +soundcards. The settings include all the usual soundcard mixer +settings. More importantly, alsactl is +capable of controlling other card-specific features that mixer apps +usually don't know about. + +The configuration file is generated automatically by running +\fBalsactl store\fP. Editing the configuration file by hand may be +necessary for some soundcard features (e.g. enabling/disabling +automatic mic gain, digital output, joystick/game ports, some future MIDI +routing options, etc). + +.SH SEE ALSO +\fB +amixer(1), +alsamixer(1), +aplay(1) +\fP + +.SH BUGS +None known. + +.SH AUTHOR +\fBalsactl\fP is by Jaroslav Kysela and Abramo Bagnara +. This document is by Paul Winkler . diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c new file mode 100644 index 0000000..c2120bd --- /dev/null +++ b/alsactl/alsactl.c @@ -0,0 +1,195 @@ +/* + * Advanced Linux Sound Architecture Control Program + * Copyright (c) by Abramo Bagnara + * Jaroslav Kysela + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "aconfig.h" +#include "version.h" +#include +#include +#include +#include +#include +#include +#include "alsactl.h" + +#ifndef SYS_ASOUNDRC +#define SYS_ASOUNDRC "/var/lib/alsa/asound.state" +#endif + +int debugflag = 0; +int force_restore = 1; +int ignore_nocards = 0; +char *command; +char *statefile = NULL; + +static void help(void) +{ + printf("Usage: alsactl command\n"); + printf("\nAvailable global options:\n"); + printf(" -h,--help this help\n"); + printf(" -d,--debug debug mode\n"); + printf(" -v,--version print version of this program\n"); + printf("\nAvailable state options:\n"); + printf(" -f,--file # configuration file (default " SYS_ASOUNDRC ")\n"); + printf(" -F,--force try to restore the matching controls as much as possible\n"); + printf(" (default mode)\n"); + printf(" -g,--ignore ignore 'No soundcards found' error\n"); + printf(" -P,--pedantic do not restore mismatching controls (old default)\n"); + printf(" -I,--no-init-fallback\n" + " don't initialize even if restore fails\n"); + printf(" -r,--runstate # save restore and init state to this file (only errors)\n"); + printf(" default settings is 'no file set'\n"); + printf(" -R,--remove remove runstate file at first, otherwise append errors\n"); + printf("\nAvailable init options:\n"); + printf(" -E,--env #=# set environment variable for init phase (NAME=VALUE)\n"); + printf(" -i,--initfile # main configuation file for init phase (default " DATADIR "/init/00main)\n"); + printf("\n"); + printf("\nAvailable commands:\n"); + printf(" store save current driver setup for one or each soundcards\n"); + printf(" to configuration file\n"); + printf(" restore load current driver setup for one or each soundcards\n"); + printf(" from configuration file\n"); + printf(" init initialize driver to a default state\n"); + printf(" names dump information about all the known present (sub-)devices\n"); + printf(" into configuration file (DEPRECATED)\n"); +} + +int main(int argc, char *argv[]) +{ + static const struct option long_option[] = + { + {"help", 0, NULL, 'h'}, + {"file", 1, NULL, 'f'}, + {"env", 1, NULL, 'E'}, + {"initfile", 1, NULL, 'i'}, + {"no-init-fallback", 0, NULL, 'I'}, + {"force", 0, NULL, 'F'}, + {"ignore", 0, NULL, 'g'}, + {"pedantic", 0, NULL, 'P'}, + {"runstate", 0, NULL, 'r'}, + {"remove", 0, NULL, 'R'}, + {"debug", 0, NULL, 'd'}, + {"version", 0, NULL, 'v'}, + {NULL, 0, NULL, 0}, + }; + static const char *const devfiles[] = { + "/dev/snd/controlC", + "/dev/snd/pcmC", + "/dev/snd/midiC", + "/dev/snd/hwC", + NULL + }; + char *cfgfile = SYS_ASOUNDRC; + char *initfile = DATADIR "/init/00main"; + char *cardname, ncardname[16]; + const char *const *tmp; + int removestate = 0; + int init_fallback = 1; /* new default behavior */ + int res; + + command = argv[0]; + while (1) { + int c; + + if ((c = getopt_long(argc, argv, "hdvf:FgE:i:IPr:R", long_option, NULL)) < 0) + break; + switch (c) { + case 'h': + help(); + return EXIT_SUCCESS; + case 'f': + cfgfile = optarg; + break; + case 'F': + force_restore = 1; + break; + case 'g': + ignore_nocards = 1; + break; + case 'E': + if (putenv(optarg)) { + fprintf(stderr, "environment string '%s' is wrong\n", optarg); + return EXIT_FAILURE; + } + break; + case 'i': + initfile = optarg; + break; + case 'I': + init_fallback = 0; + break; + case 'r': + statefile = optarg; + break; + case 'R': + removestate = 1; + break; + case 'P': + force_restore = 0; + break; + case 'd': + debugflag = 1; + break; + case 'v': + printf("alsactl version " SND_UTIL_VERSION_STR "\n"); + return EXIT_SUCCESS; + case '?': // error msg already printed + help(); + return EXIT_FAILURE; + break; + default: // should never happen + fprintf(stderr, + "Invalid option '%c' (%d) not handled??\n", c, c); + } + } + if (argc - optind <= 0) { + fprintf(stderr, "alsactl: Specify command...\n"); + return 0; + } + + cardname = argc - optind > 1 ? argv[optind + 1] : NULL; + for (tmp = devfiles; cardname != NULL && *tmp != NULL; tmp++) { + int len = strlen(*tmp); + if (!strncmp(cardname, *tmp, len)) { + long l = strtol(cardname + len, NULL, 0); + sprintf(ncardname, "%li", l); + cardname = ncardname; + break; + } + } + + if (!strcmp(argv[optind], "init")) { + res = init(initfile, cardname); + } else if (!strcmp(argv[optind], "store")) { + res = save_state(cfgfile, cardname); + } else if (!strcmp(argv[optind], "restore")) { + if (removestate) + remove(statefile); + res = load_state(cfgfile, initfile, cardname, init_fallback); + } else { + fprintf(stderr, "alsactl: Unknown command '%s'...\n", + argv[optind]); + res = -ENODEV; + } + + snd_config_update_free_global(); + return res < 0 ? -res : 0; +} diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h new file mode 100644 index 0000000..be90efb --- /dev/null +++ b/alsactl/alsactl.h @@ -0,0 +1,94 @@ +extern int debugflag; +extern int force_restore; +extern int ignore_nocards; +extern char *command; +extern char *statefile; + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +#define info(...) do {\ + fprintf(stdout, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stdout, __VA_ARGS__); \ + putc('\n', stdout); \ +} while (0) +#else +#define info(args...) do {\ + fprintf(stdout, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stdout, ##args); \ + putc('\n', stdout); \ +} while (0) +#endif + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +#define error(...) do {\ + fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + putc('\n', stderr); \ +} while (0) +#else +#define error(args...) do {\ + fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, ##args); \ + putc('\n', stderr); \ +} while (0) +#endif + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +#define cerror(cond, ...) do {\ + if (cond || debugflag) { \ + fprintf(stderr, "%s%s: %s:%d: ", debugflag ? "WARNING: " : "", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + putc('\n', stderr); \ + } \ +} while (0) +#else +#define cerror(cond, args...) do {\ + if (cond || debugflag) { \ + fprintf(stderr, "%s%s: %s:%d: ", debugflag ? "WARNING: " : "", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, ##args); \ + putc('\n', stderr); \ + } \ +} while (0) +#endif + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +#define dbg(...) do {\ + if (!debugflag) break; \ + fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + putc('\n', stderr); \ +} while (0) +#else +#define dbg(args...) do {\ + if (!debugflag) break; \ + fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, ##args); \ + putc('\n', stderr); \ +} while (0) +#endif + +int init(const char *file, const char *cardname); +int save_state(const char *file, const char *cardname); +int load_state(const char *file, const char *initfile, const char *cardname, + int do_init); +int power(const char *argv[], int argc); +int generate_names(const char *cfgfile); + +/* utils */ + +int file_map(const char *filename, char **buf, size_t *bufsize); +void file_unmap(void *buf, size_t bufsize); +size_t line_width(const char *buf, size_t bufsize, size_t pos); +void initfailed(int cardnumber, const char *reason, int exitcode); + +static inline int hextodigit(int c) +{ + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'a' && c <= 'f') + c = c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + c = c - 'A' + 10; + else + return -1; + return c; +} diff --git a/alsactl/alsactl_init.xml b/alsactl/alsactl_init.xml new file mode 100644 index 0000000..eefe9ef --- /dev/null +++ b/alsactl/alsactl_init.xml @@ -0,0 +1,625 @@ + + + +
+
+ alsactl init + + + alsactl init + July 2008 + alsactl + + + + alsactl_init + 7 + + + + + alsactl init + alsa control management - initialization + + + DESCRIPTION + "alsactl init" provides soundcard specific initialization. + + + CONFIGURATION + All "alsactl init" configuration files are placed in + /usr/share/alsa/init/ directory. The top level + configuration file is /usr/share/alsa/init/00main. + The default top-level file can be also specified using -i or + --initfile parameter for the alsactl tool. + Every file consists of a set of lines of text. All empty lines or + lines beginning with '#' will be ignored. + + Rules files + The "alsactl init" rules are read from the files located + in the /usr/share/alsa/init/*. The top + level configuration file is /usr/share/alsa/init/00main. + Every line in the rules file contains at least one key value pair. + There are two kind of keys, match and assignment keys. If all match + keys are matching against its value, the rule gets applied and the + assign keys get the specified value assigned. + + A rule may consists of a list of one or more key value pairs + separated by a comma. Each key has a distinct operation, depending + on the used operator. Valid operators are: + + + + + Compare for equality. + + + + + + + Compare for non-equality. + + + + + + + Assign a value to a key. Keys that represent a list, + are reset and only this single value is assigned. + + + + + + + Add the value to a key that holds a list + of entries. + + + + + + + Assign a value to a key finally; disallow any + later changes, which may be used to prevent changes by + any later rules. + + + + + The following key names can be used to match against device + properties: + + + + + Match the card index of the ALSA driver. + + + + + + + Set or test universal control attribute. Possible + attributes: + + + + + Numeric control identification. + + + + , + + Control interface name (CARD, HWEDEP, MIXER, PCM, RAWMIDI, TIMER, SEQUENCER) + + + + , + + Subdevice number. + + + + + + Control name + + + + + + Control index + + + + + + Control type (BOOLEAN, INTEGER, INTEGER64, ENUMERATED, BYTES, IEC958) + + + + , + + Attributes (stored in a string - use match characters * and ?): + + + + + control is readable + + + + + + control is writable + + + + + + control is volatile + + + + + + control is inactive + + + + + + control is locked + + + + + + control is TLV readable + + + + + + control is TLV writable + + + + + + control is TLV commandable + + + + + + process is owner of this control + + + + + + control created in user space + + + + + + + + + Control owner process PID number + + + + + + Control count of values + + + + + + Value range - minimum value + + + + + + Value range - maximum value + + + + + + Value range - step value + + + + + + Value range - minimum dB value + + + + + + Value range - maximum dB value + + + + + + Enumerated value - number of text items + + + + + + Enumerated value - list of text names stored between '|' character + + + + + + Value of control stored to a string delimited by + comma (,). + + + + + + Search for a control. Value "1" is returned + if a control was found. The CTL{name} key might + contain match characters * and ?. An control index + might be specified as first argument starting from + zero (e.g. CTL{do_search 2}="1"). + + + + + + Search for a controls and return total count + of matched ones. The CTL{name} key might contain match + characters * and ?. + + + + + + + + + + The relative path to sysfs subsystem specifying + the root directory of a soundcard device. Usually, + it should be set to "/class/sound/card$cardinfo{card}/device". + + + + + + + + Match sysfs attribute values of the soundcard device. + The relative path to sysfs tree must be defined by + CONFIG{sysfs_device} key. Trailing whitespace in the attribute + values is ignored, if the specified match value does + not contain trailing whitespace itself. Depending on + the type of operator, this key is also used to set + the value of a sysfs attribute. + + + + + + + + Match against the value of an environment variable. Up + to five keys can be specified per rule. + Depending on the type of operator, this key is also used + to export a variable to the environment. + + + + + + + Execute external program. The key is true, if + the program returns without exit code zero. The whole event + environment is available to the executed program. The + program's output printed to stdout is available for + the RESULT key. + Several buildin commands are available: + + + + + Search for a control. The CTL{name} key might + contain match characters * and ?. An control index + might be specified as first argument starting from + zero (e.g. PROGRAM="__ctl_search 2"). + + + + + + Search for a controls and return total count + of matched ones. The CTL{name} key might contain match + characters * and ?. + + + + + + + + + + Match the returned string of the last PROGRAM call. + This key can be used in the same or in any later rule + after a PROGRAM call. + + + + + + Most of the fields support a shell style pattern matching. + The following pattern characters are supported: + + + + + Matches zero, or any number of characters. + + + + + + Matches any single character. + + + + + + Matches any single character specified within + the brackets. For example, the pattern string 'tty[SR]' + would match either 'ttyS' or 'ttyR'. Ranges are also + supported within this match with the '-' character. + For example, to match on the range of all digits, + the pattern [0-9] would be used. If the first character + following the '[' is a '!', any characters + not enclosed are matched. + + + + + The following keys can get values assigned: + + + , , + , , + , , + + + Select universal control element. + + + + + + Value is set (written) also to soundcard's control + device and RESULT key is set to errno code. The result of + set operation is always true (it means continue with + next key on line). + + + + + + Value is set (written) also to soundcard's control + device (all control values are set to specified value) and + RESULT key is set to errno code. The result of + set operation is always true (it means continue with + next key on line). + + + + + + Value is set (written) also to soundcard's control + device (all control values are set to specified value). + The result of set operation is true when operation + succeed (it means continue with next key on line). + + + + + + + Export a variable to the environment. Depending on the type of operator, + this key is also to match against an environment variable. + + + + + + + Set RESULT variable. Note that PROGRAM also sets + this variable, but setting this variable manually + might be useful to change code execution order (included + files). + + + + + + + Named label where a GOTO can jump to. + + + + + + + Jumps to the next LABEL with a matching name. + The goto cannot jump backward. + + + + + + + Include specified filename or all files in specified directory + + + + + + + Check if specified file or directory exists + + + + + + + The relative path to sysfs subsystem specifying + the root directory of a soundcard device. Usually, + it should be set to "/class/sound/card$cardinfo{card}/device". + + + + + + + + PRINT value to stdout. + + + + + + + PRINT value to stderr. + + + + + + + Exit immediately and set program exit code to value + (should be integer). If value is "return" string, + parser leaves current included file and returns to parent + configuration file. + + + + + + The , , + , + , , + , + fields support simple printf-like string substitutions. + It allows the use of the complete environment set by earlier matching + rules. For all other fields, substitutions are applied while the individual rule is + being processed. The available substitutions are: + + + , + + See CARDINFO{} for more details. + + + + + , + + See CTL{} for more details. + + + + + , + + The value of a sysfs attribute found at the device, where + all keys of the rule have matched. + If the attribute is a symlink, the last element of the symlink target is + returned as the value. + + + + + , + + The value of an environment variable. + + + + + , + + The string returned by the external program requested with PROGRAM. + A single part of the string, separated by a space character may be selected + by specifying the part number as an attribute: . + If the number is followed by the '+' char this part plus all remaining parts + of the result string are substituted: + + + + + , + + Root directory where sysfs file-system is mounted. + Ususally, this value is just "/sys". + + + + + , + + The value of a configuration variable. See CONFIG{} for more details. + + + + + + + The '%' character itself. + + + + + + + The '$' character itself. + + + + The count of characters to be substituted may be limited + by specifying the format length value. For example, '%3s{file}' + will only insert the first three characters of the sysfs + attribute + + + + AUTHOR + Written by Jaroslav Kysela perex@perex.cz + Some portions are written by Greg Kroah-Hartman greg@kroah.com and + Kay Sievers kay.sievers@vrfy.org. + + + + SEE ALSO + + alsactl1 + + + +
+
diff --git a/alsactl/init/00main b/alsactl/init/00main new file mode 100644 index 0000000..660df38 --- /dev/null +++ b/alsactl/init/00main @@ -0,0 +1,49 @@ +# This is toplevel configuration for for 'alsactl init'. +# See 'man alsactl_init' for syntax. + +# set root device directory in sysfs for soundcard for ATTR{} command +CONFIG{sysfs_device}="/class/sound/card$cardinfo{card}/device" +ACCESS!="$sysfsroot$config{sysfs_device}", \ + CONFIG{sysfs_device}="/class/sound/controlC$cardinfo{card}/device" + +# test for extra commands +ENV{CMD}=="help", INCLUDE="help", GOTO="00main_end" +ENV{CMD}=="info", INCLUDE="info", GOTO="00main_end" +ENV{CMD}=="default", INCLUDE="default", GOTO="00main_end" +ENV{CMD}=="test", INCLUDE="test", GOTO="00main_end" +ENV{CMD}=="*", ERROR="Unknown command '$env{CMD}'\n", GOTO="00main_end" + +# include files with real configuration +# +# steps are: +# 1) look for preinit subdirectory and parse all files in it +# 2) if RESULT=="skip", skip ALSA standard configuration files +# 3) do ALSA standard configuration +# 4) look for postinit subdirectory and parse all files in it +# 5) if RESULT!="true", initialize hardware using a guess method, +# print an error message and return with exit code 99 +# 6) return with exit code 0 (success) +# + +RESULT="unknown" +ACCESS=="preinit", INCLUDE="preinit" +RESULT=="skip", GOTO="init_end" + +# real ALSA configuration database +CARDINFO{driver}=="HDA-Intel", INCLUDE="hda", GOTO="init_end" +CARDINFO{driver}=="CA0106", INCLUDE="ca0106", GOTO="init_end" +CARDINFO{driver}=="Test", INCLUDE="test", GOTO="init_end" + +LABEL="init_end" +ACCESS=="postinit", INCLUDE="postinit" +RESULT=="true", GOTO="00_mainend" +ERROR="Found hardware: \"$cardinfo{driver}\" \"$cardinfo{mixername}\" \"$cardinfo{components}\" \"$attr{subsystem_vendor}\" \"$attr{subsystem_device}\"\n" +ERROR="Hardware is initialized using a generic method\n" +INCLUDE="default" +EXIT="99" + +# +# label identifying end of main file +# + +LABEL="00main_end" diff --git a/alsactl/init/Makefile.am b/alsactl/init/Makefile.am new file mode 100644 index 0000000..9e2b83d --- /dev/null +++ b/alsactl/init/Makefile.am @@ -0,0 +1,7 @@ + +init_files = \ + 00main default help info test \ + hda +EXTRA_DIST = $(init_files) +alsainitdir = $(datadir)/alsa/init +alsainit_DATA = $(init_files) diff --git a/alsactl/init/Makefile.in b/alsactl/init/Makefile.in new file mode 100644 index 0000000..e96d9bd --- /dev/null +++ b/alsactl/init/Makefile.in @@ -0,0 +1,417 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = alsactl/init +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(alsainitdir)" +DATA = $(alsainit_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +init_files = \ + 00main default help info test \ + hda + +EXTRA_DIST = $(init_files) +alsainitdir = $(datadir)/alsa/init +alsainit_DATA = $(init_files) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alsactl/init/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign alsactl/init/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-alsainitDATA: $(alsainit_DATA) + @$(NORMAL_INSTALL) + test -z "$(alsainitdir)" || $(MKDIR_P) "$(DESTDIR)$(alsainitdir)" + @list='$(alsainit_DATA)'; test -n "$(alsainitdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(alsainitdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(alsainitdir)" || exit $$?; \ + done + +uninstall-alsainitDATA: + @$(NORMAL_UNINSTALL) + @list='$(alsainit_DATA)'; test -n "$(alsainitdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(alsainitdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(alsainitdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(alsainitdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-alsainitDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-alsainitDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-alsainitDATA install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-alsainitDATA uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alsactl/init/default b/alsactl/init/default new file mode 100644 index 0000000..7f8ec4c --- /dev/null +++ b/alsactl/init/default @@ -0,0 +1,211 @@ +# +# Default ALSA volume levels and setting when initialization database fails. +# +# Basic rules are: +# - keep volumes at minimal level, but sound should be hearable +# - enable just main speakers for playback and main microphone for recording +# + +# ************************************************************************** +# playback +# ************************************************************************** + +ENV{ppercent}:="75%" +ENV{cpercent}:="75%" +ENV{pvolume}:="-20dB" +ENV{cvolume}:="12dB" +ENV{has_pmaster_vol}:="false" + +CTL{reset}="mixer" +CTL{name}="Playback Volume",CTL{do_search}=="1", \ + CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +CTL{name}="Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Master Playback Volume",CTL{do_search}=="1", \ + ENV{has_pmaster_vol}:="true", \ + CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +CTL{name}="Master Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Master Front Playback Volume",CTL{do_search}=="1", \ + ENV{has_pmaster_vol}:="true", \ + CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +CTL{name}="Master Front Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Master Digital Playback Volume",CTL{do_search}=="1", \ + CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +CTL{name}="Master Digital Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Front Playback Volume",PROGRAM!="__ctl_search",GOTO="" +# if master volume control is present, turn front volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +LABEL="" +CTL{name}="Front Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Headphone Playback Volume",PROGRAM!="__ctl_search",GOTO="" +# if master volume control is present, turn headphone volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +LABEL="" +CTL{name}="Headphone Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Headphone Playback Volume",CTL{index}="1",PROGRAM!="__ctl_search",\ + GOTO="" +# if master volume control is present, turn headphone volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +LABEL="" +CTL{name}="Headphone Playback Switch",CTL{index}="1",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Speaker Playback Volume",PROGRAM!="__ctl_search",GOTO="" +# if master volume control is present, turn speaker volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +LABEL="" +CTL{name}="Speaker Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="PC Speaker Playback Volume",CTL{do_search}=="1", \ + CTL{values}="$env{pvolume}",RESULT!="0",CTL{values}="$env{ppercent}" +CTL{name}="PC Speaker Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="PCM Playback Volume",PROGRAM!="__ctl_search", \ + CTL{name}="PCM Volume",PROGRAM!="__ctl_search", GOTO="" +# if master volume control is present, turn PCM volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +# exception - some HDA codecs have shifted dB range +CTL{dBmin}=="-34.50dB",CTL{dBmax}=="12.00dB",CTL{write}=="0dB",GOTO="" +CTL{dBmin}=="-30.00dB",CTL{dBmax}=="0dB",CTL{write}=="0dB",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="75%" +LABEL="" +CTL{name}="PCM Playback Switch",CTL{do_search}=="1", CTL{values}="on" +CTL{name}="PCM Switch",CTL{do_search}=="1",CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="PCM Playback Volume",CTL{index}="1",PROGRAM!="__ctl_search", \ + CTL{name}="PCM Volume",PROGRAM!="__ctl_search",GOTO="" +# if master volume control is present, turn PCM volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +# exception - some HDA codecs have shifted dB range +CTL{dBmin}=="-34.50dB",CTL{dBmax}=="12.00dB",CTL{write}=="0dB",GOTO="" +CTL{dBmin}=="-30.00dB",CTL{dBmax}=="0dB",CTL{write}=="0dB",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="75%" +LABEL="" +CTL{name}="PCM Playback Switch",CTL{index}="1",CTL{do_search}=="1", \ + CTL{values}="on" +CTL{name}="PCM Switch",CTL{index}="1",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="DAC Playback Volume",CTL{do_search}=="1", \ + CTL{values}="$env{pvolume}",RESULT!="0",CTL{values}="$env{ppercent}" +CTL{name}="DAC Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Synth Playback Volume",CTL{do_search}=="1", \ + CTL{values}="$env{pvolume}",RESULT!="0",CTL{values}="$env{ppercent}" +CTL{name}="Synth Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Wave Playback Volume",CTL{do_search}=="1", \ + CTL{values}="100%" +CTL{name}="Wave Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Music Playback Volume",CTL{do_search}=="1", \ + CTL{values}="100%" +CTL{name}="Music Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="CD Playback Volume",PROGRAM!="__ctl_search", GOTO="" +# if master volume control is present, turn CD volume to max +ENV{has_pmaster_vol}=="true",CTL{write}=="0dB",GOTO="" +ENV{has_pmaster_vol}=="true",CTL{write}=="100%",GOTO="" +# exception - some HDA codecs have shifted dB range +CTL{dBmin}=="-34.50dB",CTL{dBmax}=="12.00dB",CTL{write}=="0dB",GOTO="" +CTL{dBmin}=="-30.00dB",CTL{dBmax}=="0dB",CTL{write}=="0dB",GOTO="" +CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" +LABEL="" +CTL{name}="CD Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Mono Playback Volume",CTL{do_search}=="1", \ + CTL{values}="$env{pvolume}",RESULT!="0",CTL{values}="$env{ppercent}" +CTL{name}="Mono Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="Master Mono Playback Volume",CTL{do_search}=="1", \ + CTL{values}="$env{pvolume}",RESULT!="0",CTL{values}="$env{ppercent}" +CTL{name}="Master Mono Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{reset}="mixer" +CTL{name}="AC97 Playback Volume",CTL{do_search}=="1", \ + CTL{values}="100%" +CTL{name}="AC97 Playback Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +# +# Powermacs +# + +CTL{reset}="mixer" +CTL{name}="DRC Range",CTL{do_search}=="1", \ + CTL{write}!="$env{pvolume}",CTL{values}="$env{ppercent}" + +# ************************************************************************** +# capture +# ************************************************************************** + +CTL{reset}="mixer" +CTL{name}="Capture Volume",CTL{do_search}=="1", \ + CTL{write}!="$env{cvolume}",CTL{values}="$env{cpercent}" +CTL{name}="Capture Switch",CTL{do_search}=="1", \ + CTL{values}="on" + +CTL{name}="Capture Source",PROGRAM!="__ctl_search", GOTO="" +CTL{enums}=="*|Internal Mic|*",CTL{values}="Internal Mic", GOTO="" +CTL{enums}=="*|Mic|*",CTL{values}="Mic" +LABEL="" + +CTL{name}="Input Source",PROGRAM!="__ctl_search", GOTO="" +CTL{enums}=="*|Internal Mic|*",CTL{values}="Internal Mic", GOTO="" +CTL{enums}=="*|Mic|*",CTL{values}="Mic" +LABEL="" + +CTL{name}="Digital Input Source",PROGRAM!="__ctl_search", GOTO="" +CTL{enums}=="*|Digital Mic 1|*",CTL{values}="Digital Mic 1", GOTO="" +CTL{enums}=="*|Mic|*",CTL{values}="Mic" +LABEL="" + +CTL{name}="Mic Boost",CTL{do_search}=="1", CTL{values}="on" +CTL{name}="Internal Mic Boost",CTL{do_search}=="1", CTL{values}="on" diff --git a/alsactl/init/hda b/alsactl/init/hda new file mode 100644 index 0000000..a6919f1 --- /dev/null +++ b/alsactl/init/hda @@ -0,0 +1,39 @@ +# Configuration for HDA Intel driver (High Definition Audio - Azalia) + +CARDINFO{mixername}=="Realtek ALC880", \ + ATTR{subsystem_vendor}=="0x1025", ATTR{subsystem_device}=="0x0070", \ + GOTO="Acer Travelmate 8100" +CARDINFO{mixername}=="Analog Devices AD1984", \ + ATTR{subsystem_vendor}=="0x17aa", ATTR{subsystem_device}=="0x20ac", \ + GOTO="Lenovo T61" +RESULT="false", EXIT="return" + +LABEL="Acer Travelmate 8100" +# playback +CTL{reset}="mixer" +CTL{name}="Master Playback Volume", CTL{value}="-21dB" +CTL{name}="Master Playback Switch", CTL{value}="on" +CTL{name}="Headphone Playback Switch", CTL{value}="on,on" +CTL{name}="Front Playback Volume", CTL{value}="-29dB,-29dB" +CTL{name}="Front Playback Switch", CTL{value}="on,on" +CTL{name}="PCM Playback Volume", CTL{value}="0dB,0dB" +# capture +CTL{name}="Input Source", CTL{value}="Mic" +CTL{name}="Capture Volume", CTL{value}="20dB,20dB" +CTL{name}="Capture Switch", CTL{value}="on,on" +RESULT="true", EXIT="return" + +LABEL="Lenovo T61" +# playback +CTL{reset}="mixer" +CTL{name}="Master Playback Volume", CTL{value}="-13.5dB" +CTL{name}="Master Playback Switch", CTL{value}="on" +CTL{name}="Headphone Playback Switch", CTL{value}="on,on" +CTL{name}="Speaker Playback Switch", CTL{value}="on,on" +CTL{name}="PCM Playback Volume", CTL{value}="0dB,0dB" +# capture +CTL{name}="Input Source", CTL{value}="Internal Mic" +CTL{name}="Internal Mic Boost", CTL{value}="1" +CTL{name}="Capture Volume", CTL{value}="9dB,9dB" +CTL{name}="Capture Switch", CTL{value}="on,on" +RESULT="true", EXIT="return" diff --git a/alsactl/init/help b/alsactl/init/help new file mode 100644 index 0000000..4f0ba70 --- /dev/null +++ b/alsactl/init/help @@ -0,0 +1,8 @@ +# help page + +PRINT="Available commands (identified by the environment variable CMD):\n\n" +PRINT=" (not set) Do a soundcard initialization\n" +PRINT=" default Do a default (guess method) initialization\n" +PRINT=" help Show this information\n" +PRINT=" info Print all available hardware identification\n" +PRINT=" test Do alsactl utility parser tests\n" diff --git a/alsactl/init/info b/alsactl/init/info new file mode 100644 index 0000000..a4fea19 --- /dev/null +++ b/alsactl/init/info @@ -0,0 +1,22 @@ +# show information about card + +PRINT="CARDINFO:\n" +PRINT=" CARDINFO{id}=\"$CARDINFO{id}\"\n" +PRINT=" CARDINFO{card}=\"$CARDINFO{card}\"\n" +PRINT=" CARDINFO{driver}=\"$CARDINFO{driver}\"\n" +PRINT=" CARDINFO{name}=\"$CARDINFO{name}\"\n" +PRINT=" CARDINFO{longname}=\"$CARDINFO{longname}\"\n" +PRINT=" CARDINFO{mixername}=\"$CARDINFO{mixername}\"\n" +PRINT=" CARDINFO{components}=\"$CARDINFO{components}\"\n" + +# sysfs stuff +PRINT="sysfs:\n" +ATTR{bus}=="*", PRINT=" ATTR{bus}=\"$ATTR{bus}\"\n" +ATTR{class}=="*", PRINT=" ATTR{class}=\"$ATTR{class}\"\n" +ATTR{driver}=="*", PRINT=" ATTR{driver}=\"$ATTR{driver}\"\n" +ATTR{vendor}=="*", PRINT=" ATTR{vendor}=\"$ATTR{vendor}\"\n" +ATTR{device}=="*", PRINT=" ATTR{device}=\"$ATTR{device}\"\n" +ATTR{subsystem_vendor}=="*", \ + PRINT=" ATTR{subsystem_vendor}=\"$ATTR{subsystem_vendor}\"\n" +ATTR{subsystem_device}=="*", \ + PRINT=" ATTR{subsystem_device}=\"$ATTR{subsystem_device}\"\n" diff --git a/alsactl/init/test b/alsactl/init/test new file mode 100644 index 0000000..56659f8 --- /dev/null +++ b/alsactl/init/test @@ -0,0 +1,270 @@ +# Test code +# Just for debugging purposes + +PRINT="Default CTL:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" + +CTL{reset}="mixer" + +PRINT="After CTL{reset}=\"mixer\":\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" + +CTL{numid}="987" +CTL{iface}="sequencer" +CTL{device}="10" +CTL{subdevice}="20" +CTL{name}="Just Test" +CTL{index}="999" + +PRINT="After test sequence:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" + +ERROR="Ignore following error:\n " +PROGRAM="__just_test" + +PRINT="CTL{do_count} test:\n" +CTL{search}="mixer", CTL{name}="*Switch*", \ + PRINT=" *Switch* count result: $ctl{do_count}\n" + +PRINT="__ctl_search test:\n" +CTL{search}="mixer", CTL{name}="*Switch*", PROGRAM!="__ctl_search", GOTO="skip_switch_search" +PRINT=" *Switch 0* search result: $result\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +CTL{search}="mixer", CTL{name}="*Switch*", PROGRAM!="__ctl_search 1", GOTO="skip_switch_search" +PRINT=" *Switch 1* search result: $result\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" + +PRINT="First ten elements:\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 0}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #0:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 1}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #1:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 2}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #2:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 3}!="3", GOTO="skip_first_ten_search" +PRINT=" Element #3:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 4}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #4:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 5}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #5:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 6}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #6:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 7}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #7:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 8}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #8:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +CTL{search}="mixer", CTL{name}="*", CTL{do_search 9}!="1", GOTO="skip_first_ten_search" +PRINT=" Element #9:\n" +PRINT=" CTL{numid}=\"$ctl{numid}\"\n" +PRINT=" CTL{iface}=\"$ctl{iface}\"\n" +PRINT=" CTL{device}=\"$ctl{device}\"\n" +PRINT=" CTL{subdevice}=\"$ctl{subdevice}\"\n" +PRINT=" CTL{name}=\"$ctl{name}\"\n" +PRINT=" CTL{index}=\"$ctl{index}\"\n" +PRINT=" CTL{type}=\"$ctl{type}\"\n" +PRINT=" CTL{attr}=\"$ctl{attr}\"\n" +PRINT=" CTL{owner}=\"$ctl{owner}\"\n" +PRINT=" CTL{count}=\"$ctl{count}\"\n" +PRINT=" CTL{min}=\"$ctl{min}\"\n" +PRINT=" CTL{max}=\"$ctl{max}\"\n" +PRINT=" CTL{step}=\"$ctl{step}\"\n" +PRINT=" CTL{dBmin}=\"$ctl{dBmin}\"\n" +PRINT=" CTL{dBmax}=\"$ctl{dBmax}\"\n" +PRINT=" CTL{items}=\"$ctl{items}\"\n" +PRINT=" CTL{value}=\"$ctl{value}\"\n" +LABEL="skip_first_ten_search" + +PRINT="Elements write test #1:\n", \ + CTL{search}="mixer", CTL{name}="Front Playback Switch", \ + CTL{do_search}=="1", CTL{value}="on,on", \ + PRINT=" result=$result\n" +PRINT="Elements write test #2:\n", \ + CTL{search}="mixer", CTL{name}="Front Playback Volume", \ + CTL{do_search}=="1", CTL{value}="32,32", \ + PRINT=" result=$result\n" +PRINT="Elements write test #3:\n", \ + CTL{search}="mixer", CTL{name}="Front Playback Volume Error", \ + CTL{do_search}=="1", \ +PRINT=" result=$result\n" + +#CTL{reset}="mixer", CTL{name}="Input Source", PRINT="***$ctl{enums}\n" + +PRINT="\nAll tests done..\n" diff --git a/alsactl/init_parse.c b/alsactl/init_parse.c new file mode 100644 index 0000000..51b515c --- /dev/null +++ b/alsactl/init_parse.c @@ -0,0 +1,1777 @@ +/* + * Advanced Linux Sound Architecture Control Program - Parse initialization files + * Copyright (c) by Jaroslav Kysela , + * Greg Kroah-Hartman , + * Kay Sievers + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "alsactl.h" +#include "list.h" + +#define PATH_SIZE 512 +#define NAME_SIZE 128 +#define EJUSTRETURN 0x7fffffff + +enum key_op { + KEY_OP_UNSET, + KEY_OP_MATCH, + KEY_OP_NOMATCH, + KEY_OP_ADD, + KEY_OP_ASSIGN, + KEY_OP_ASSIGN_FINAL +}; + +struct pair { + char *key; + char *value; + struct pair *next; +}; + +struct space { + struct pair *pairs; + char *rootdir; + char *go_to; + char *program_result; + const char *filename; + int linenum; + int log_run; + int exit_code; + int quit; + unsigned int ctl_id_changed; + snd_hctl_t *ctl_handle; + snd_ctl_card_info_t *ctl_card_info; + snd_ctl_elem_id_t *ctl_id; + snd_ctl_elem_info_t *ctl_info; + snd_ctl_elem_value_t *ctl_value; +}; + +static void Perror(struct space *space, const char *fmt, ...) +{ + va_list arg; + va_start(arg, fmt); + fprintf(stderr, "%s:%i: ", space->filename, space->linenum); + vfprintf(stderr, fmt, arg); + putc('\n', stderr); + va_end(arg); +} + +#include "init_sysdeps.c" +#include "init_utils_string.c" +#include "init_utils_run.c" +#include "init_sysfs.c" + +static void free_space(struct space *space) +{ + struct pair *pair = space->pairs; + struct pair *next = pair; + + while (next) { + pair = next; + next = pair->next; + free(pair->value); + free(pair->key); + free(pair); + } + space->pairs = NULL; + if (space->ctl_value) { + snd_ctl_elem_value_free(space->ctl_value); + space->ctl_value = NULL; + } + if (space->ctl_info) { + snd_ctl_elem_info_free(space->ctl_info); + space->ctl_info = NULL; + } + if (space->ctl_id) { + snd_ctl_elem_id_free(space->ctl_id); + space->ctl_id = NULL; + } + if (space->ctl_card_info) { + snd_ctl_card_info_free(space->ctl_card_info); + space->ctl_card_info = NULL; + } + if (space->ctl_handle) { + snd_hctl_close(space->ctl_handle); + space->ctl_handle = NULL; + } + if (space->rootdir) + free(space->rootdir); + if (space->program_result) + free(space->program_result); + if (space->go_to) + free(space->go_to); + free(space); +} + +static struct pair *value_find(struct space *space, const char *key) +{ + struct pair *pair = space->pairs; + + while (pair && strcmp(pair->key, key) != 0) + pair = pair->next; + return pair; +} + +static int value_set(struct space *space, const char *key, const char *value) +{ + struct pair *pair; + + pair = value_find(space, key); + if (pair) { + free(pair->value); + pair->value = strdup(value); + if (pair->value == NULL) + return -ENOMEM; + } else { + pair = malloc(sizeof(struct pair)); + if (pair == NULL) + return -ENOMEM; + pair->key = strdup(key); + if (pair->key == NULL) { + free(pair); + return -ENOMEM; + } + pair->value = strdup(value); + if (pair->value == NULL) { + free(pair->key); + free(pair); + return -ENOMEM; + } + pair->next = space->pairs; + space->pairs = pair; + } + return 0; +} + +static int init_space(struct space **space, int card) +{ + struct space *res; + char device[16]; + int err; + + res = calloc(1, sizeof(struct space)); + if (res == NULL) + return -ENOMEM; + res->ctl_id_changed = ~0; + res->linenum = -1; + sprintf(device, "hw:%u", card); + err = snd_hctl_open(&res->ctl_handle, device, 0); + if (err < 0) + goto error; + err = snd_hctl_load(res->ctl_handle); + if (err < 0) + goto error; + err = snd_ctl_card_info_malloc(&res->ctl_card_info); + if (err < 0) + goto error; + err = snd_ctl_card_info(snd_hctl_ctl(res->ctl_handle), res->ctl_card_info); + if (err < 0) + goto error; + err = snd_ctl_elem_id_malloc(&res->ctl_id); + if (err < 0) + goto error; + err = snd_ctl_elem_info_malloc(&res->ctl_info); + if (err < 0) + goto error; + err = snd_ctl_elem_value_malloc(&res->ctl_value); + if (err < 0) + goto error; + *space = res; + return 0; + error: + free_space(res); + return err; +} + +static const char *cardinfo_get(struct space *space, const char *attr) +{ + if (strncasecmp(attr, "CARD", 4) == 0) { + static char res[16]; + sprintf(res, "%u", snd_ctl_card_info_get_card(space->ctl_card_info)); + return res; + } + if (strncasecmp(attr, "ID", 2) == 0) + return snd_ctl_card_info_get_id(space->ctl_card_info); + if (strncasecmp(attr, "DRIVER", 6) == 0) + return snd_ctl_card_info_get_driver(space->ctl_card_info); + if (strncasecmp(attr, "NAME", 4) == 0) + return snd_ctl_card_info_get_name(space->ctl_card_info); + if (strncasecmp(attr, "LONGNAME", 8) == 0) + return snd_ctl_card_info_get_longname(space->ctl_card_info); + if (strncasecmp(attr, "MIXERNAME", 9) == 0) + return snd_ctl_card_info_get_mixername(space->ctl_card_info); + if (strncasecmp(attr, "COMPONENTS", 10) == 0) + return snd_ctl_card_info_get_components(space->ctl_card_info); + Perror(space, "unknown cardinfo{} attribute '%s'", attr); + return NULL; +} + +static int check_id_changed(struct space *space, unsigned int what) +{ + snd_hctl_elem_t *elem; + int err; + + if ((space->ctl_id_changed & what & 1) != 0) { + snd_ctl_elem_id_set_numid(space->ctl_id, 0); + elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); + if (!elem) + return -ENOENT; + err = snd_hctl_elem_info(elem, space->ctl_info); + if (err == 0) + space->ctl_id_changed &= ~1; + return err; + } + if ((space->ctl_id_changed & what & 2) != 0) { + snd_ctl_elem_id_set_numid(space->ctl_id, 0); + elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); + if (!elem) + return -ENOENT; + err = snd_hctl_elem_read(elem, space->ctl_value); + if (err == 0) + space->ctl_id_changed &= ~2; + return err; + } + return 0; +} + +static const char *get_ctl_value(struct space *space) +{ + snd_ctl_elem_type_t type; + unsigned int idx, count; + static char res[1024], tmp[16]; + static const char hex[] = "0123456789abcdef"; + char *pos; + const char *pos1; + + type = snd_ctl_elem_info_get_type(space->ctl_info); + count = snd_ctl_elem_info_get_count(space->ctl_info); + res[0] = '\0'; + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + for (idx = 0; idx < count; idx++) { + if (idx > 0) + strlcat(res, ",", sizeof(res)); + strlcat(res, snd_ctl_elem_value_get_boolean(space->ctl_value, idx) ? "on" : "off", sizeof(res)); + } + break; + case SND_CTL_ELEM_TYPE_INTEGER: + for (idx = 0; idx < count; idx++) { + if (idx > 0) + strlcat(res, ",", sizeof(res)); + snprintf(tmp, sizeof(tmp), "%li", snd_ctl_elem_value_get_integer(space->ctl_value, idx)); + strlcat(res, tmp, sizeof(res)); + } + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + for (idx = 0; idx < count; idx++) { + if (idx > 0) + strlcat(res, ",", sizeof(res)); + snprintf(tmp, sizeof(tmp), "%lli", snd_ctl_elem_value_get_integer64(space->ctl_value, idx)); + strlcat(res, tmp, sizeof(res)); + } + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + for (idx = 0; idx < count; idx++) { + if (idx > 0) + strlcat(res, ",", sizeof(res)); + snprintf(tmp, sizeof(tmp), "%u", snd_ctl_elem_value_get_enumerated(space->ctl_value, idx)); + strlcat(res, tmp, sizeof(res)); + } + break; + case SND_CTL_ELEM_TYPE_BYTES: + case SND_CTL_ELEM_TYPE_IEC958: + if (type == SND_CTL_ELEM_TYPE_IEC958) + count = sizeof(snd_aes_iec958_t); + if (count > (sizeof(res)-1)/2) + count = (sizeof(res)-1/2); + pos = res; + pos1 = snd_ctl_elem_value_get_bytes(space->ctl_value); + while (count > 0) { + idx = *pos1++; + *pos++ = hex[idx >> 4]; + *pos++ = hex[idx & 0x0f]; + count++; + } + *pos++ = '\0'; + break; + default: + Perror(space, "unknown element type '%i'", type); + return NULL; + } + return res; +} + +/* Function to convert from percentage to volume. val = percentage */ +#define convert_prange1(val, min, max) \ + ceil((val) * ((max) - (min)) * 0.01 + (min)) + +static int set_ctl_value(struct space *space, const char *value, int all) +{ + snd_ctl_elem_type_t type; + unsigned int idx, idx2, count, items; + const char *pos, *pos2; + snd_hctl_elem_t *elem; + int val; + long lval; + + type = snd_ctl_elem_info_get_type(space->ctl_info); + count = snd_ctl_elem_info_get_count(space->ctl_info); + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + for (idx = 0; idx < count; idx++) { + while (*value == ' ') + value++; + if (*value == '\0') + goto missing; + val = strncasecmp(value, "true", 4) == 0 || + strncasecmp(value, "yes", 3) == 0 || + strncasecmp(value, "on", 2) == 0 || + strncasecmp(value, "1", 1) == 0; + snd_ctl_elem_value_set_boolean(space->ctl_value, idx, val); + if (all) + continue; + pos = strchr(value, ','); + value = pos ? pos + 1 : value + strlen(value) - 1; + } + break; + case SND_CTL_ELEM_TYPE_INTEGER: + for (idx = 0; idx < count; idx++) { + while (*value == ' ') + value++; + pos = strchr(value, ','); + if (pos) + *(char *)pos = '\0'; + remove_trailing_chars((char *)value, ' '); + items = pos ? pos - value : strlen(value); + if (items > 1 && value[items-1] == '%') { + val = convert_prange1(strtol(value, NULL, 0), snd_ctl_elem_info_get_min(space->ctl_info), snd_ctl_elem_info_get_max(space->ctl_info)); + snd_ctl_elem_value_set_integer(space->ctl_value, idx, val); + } else if (items > 2 && value[items-2] == 'd' && value[items-1] == 'B') { + val = strtol(value, NULL, 0) * 100; + if ((pos2 = strchr(value, '.')) != NULL) { + if (isdigit(*(pos2-1)) && isdigit(*(pos2-2))) { + if (val < 0) + val -= strtol(pos2 + 1, NULL, 0); + else + val += strtol(pos2 + 1, NULL, 0); + } else if (isdigit(*(pos2-1))) { + if (val < 0) + val -= strtol(pos2 + 1, NULL, 0) * 10; + else + val += strtol(pos2 + 1, NULL, 0) * 10; + } + } + val = snd_ctl_convert_from_dB(snd_hctl_ctl(space->ctl_handle), space->ctl_id, val, &lval, -1); + if (val < 0) { + dbg("unable to convert dB value '%s' to internal integer range", value); + return val; + } + snd_ctl_elem_value_set_integer(space->ctl_value, idx, lval); + } else { + snd_ctl_elem_value_set_integer(space->ctl_value, idx, strtol(value, NULL, 0)); + } + if (all) + continue; + value = pos ? pos + 1 : value + strlen(value) - 1; + } + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + for (idx = 0; idx < count; idx++) { + while (*value == ' ') + value++; + snd_ctl_elem_value_set_integer64(space->ctl_value, idx, strtoll(value, NULL, 0)); + if (all) + continue; + pos = strchr(value, ','); + value = pos ? pos + 1 : value + strlen(value) - 1; + } + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + for (idx = 0; idx < count; idx++) { + while (*value == ' ') + value++; + pos = strchr(value, ','); + if (isdigit(value[0]) || value[0] == '-') { + snd_ctl_elem_value_set_enumerated(space->ctl_value, idx, strtol(value, NULL, 0)); + } else { + if (pos) + *(char *)pos = '\0'; + remove_trailing_chars((char *)value, ' '); + items = snd_ctl_elem_info_get_items(space->ctl_info); + for (idx2 = 0; idx2 < items; idx2++) { + snd_ctl_elem_info_set_item(space->ctl_info, idx2); + elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); + if (elem == NULL) + return -ENOENT; + val = snd_hctl_elem_info(elem, space->ctl_info); + if (val < 0) + return val; + if (strcasecmp(snd_ctl_elem_info_get_item_name(space->ctl_info), value) == 0) { + snd_ctl_elem_value_set_enumerated(space->ctl_value, idx, idx2); + break; + } + } + if (idx2 >= items) { + Perror(space, "wrong enum identifier '%s'", value); + return -EINVAL; + } + } + if (all) + continue; + value = pos ? pos + 1 : value + strlen(value) - 1; + } + break; + case SND_CTL_ELEM_TYPE_BYTES: + case SND_CTL_ELEM_TYPE_IEC958: + if (type == SND_CTL_ELEM_TYPE_IEC958) + count = sizeof(snd_aes_iec958_t); + while (*value == ' ') + value++; + if (strlen(value) != count * 2) { + Perror(space, "bad ctl value hexa length (should be %u bytes)", count); + return -EINVAL; + } + for (idx = 0; idx < count; idx += 2) { + val = hextodigit(*(value++)) << 4; + val |= hextodigit(*(value++)); + if (val > 255) { + Perror(space, "bad ctl hexa value"); + return -EINVAL; + } + snd_ctl_elem_value_set_byte(space->ctl_value, idx, val); + } + break; + default: + Perror(space, "unknown element type '%i'", type); + return -EINVAL; + } + return 0; + missing: + printf("%i %i\n", type, count); + Perror(space, "missing some ctl values (line %i)", space->linenum); + return -EINVAL; +} + +static int do_match(const char *key, enum key_op op, + const char *key_value, const char *value) +{ + int match; + + if (value == NULL) + return 0; + dbg("match %s '%s' <-> '%s'", key, key_value, value); + match = fnmatch(key_value, value, 0) == 0; + if (match && op == KEY_OP_MATCH) { + dbg("%s is true (matching value)", key); + return 1; + } + if (!match && op == KEY_OP_NOMATCH) { + dbg("%s is true (non-matching value)", key); + return 1; + } + dbg("%s is false", key); + return 0; +} + +static int ctl_match(snd_ctl_elem_id_t *pattern, snd_ctl_elem_id_t *id) +{ + if (snd_ctl_elem_id_get_interface(pattern) != -1 && + snd_ctl_elem_id_get_interface(pattern) != snd_ctl_elem_id_get_interface(id)) + return 0; + if (snd_ctl_elem_id_get_device(pattern) != -1 && + snd_ctl_elem_id_get_device(pattern) != snd_ctl_elem_id_get_device(id)) + return 0; + if (snd_ctl_elem_id_get_subdevice(pattern) != -1 && + snd_ctl_elem_id_get_subdevice(pattern) != snd_ctl_elem_id_get_subdevice(id)) + return 0; + if (snd_ctl_elem_id_get_index(pattern) != -1 && + snd_ctl_elem_id_get_index(pattern) != snd_ctl_elem_id_get_index(id)) + return 0; + if (fnmatch(snd_ctl_elem_id_get_name(pattern), snd_ctl_elem_id_get_name(id), 0) != 0) + return 0; + return 1; +} + +static const char *elemid_get(struct space *space, const char *attr) +{ + long long val; + snd_ctl_elem_type_t type; + static char res[256]; + + if (strncasecmp(attr, "numid", 5) == 0) { + val = snd_ctl_elem_id_get_numid(space->ctl_id); + goto value; + } + if (strncasecmp(attr, "iface", 5) == 0 || + strncasecmp(attr, "interface", 9) == 0) + return snd_ctl_elem_iface_name(snd_ctl_elem_id_get_interface(space->ctl_id)); + if (strncasecmp(attr, "device", 6) == 0) { + val = snd_ctl_elem_id_get_device(space->ctl_id); + goto value; + } + if (strncasecmp(attr, "subdev", 6) == 0) { + val = snd_ctl_elem_id_get_subdevice(space->ctl_id); + goto value; + } + if (strncasecmp(attr, "name", 4) == 0) + return snd_ctl_elem_id_get_name(space->ctl_id); + if (strncasecmp(attr, "index", 5) == 0) { + val = snd_ctl_elem_id_get_index(space->ctl_id); + goto value; + } + if (strncasecmp(attr, "type", 4) == 0) { + if (check_id_changed(space, 1)) + return NULL; + return snd_ctl_elem_type_name(snd_ctl_elem_info_get_type(space->ctl_info)); + } + if (strncasecmp(attr, "attr", 4) == 0) { + if (check_id_changed(space, 1)) + return NULL; + res[0] = '\0'; + if (snd_ctl_elem_info_is_readable(space->ctl_info)) + strcat(res, "r"); + if (snd_ctl_elem_info_is_writable(space->ctl_info)) + strcat(res, "w"); + if (snd_ctl_elem_info_is_volatile(space->ctl_info)) + strcat(res, "v"); + if (snd_ctl_elem_info_is_inactive(space->ctl_info)) + strcat(res, "i"); + if (snd_ctl_elem_info_is_locked(space->ctl_info)) + strcat(res, "l"); + if (snd_ctl_elem_info_is_tlv_readable(space->ctl_info)) + strcat(res, "R"); + if (snd_ctl_elem_info_is_tlv_writable(space->ctl_info)) + strcat(res, "W"); + if (snd_ctl_elem_info_is_tlv_commandable(space->ctl_info)) + strcat(res, "C"); + if (snd_ctl_elem_info_is_owner(space->ctl_info)) + strcat(res, "o"); + if (snd_ctl_elem_info_is_user(space->ctl_info)) + strcat(res, "u"); + return res; + } + if (strncasecmp(attr, "owner", 5) == 0) { + if (check_id_changed(space, 1)) + return NULL; + val = snd_ctl_elem_info_get_owner(space->ctl_info); + goto value; + } + if (strncasecmp(attr, "count", 5) == 0) { + if (check_id_changed(space, 1)) + return NULL; + val = snd_ctl_elem_info_get_count(space->ctl_info); + goto value; + } + if (strncasecmp(attr, "min", 3) == 0) { + if (check_id_changed(space, 1)) + return NULL; + type = snd_ctl_elem_info_get_type(space->ctl_info); + if (type == SND_CTL_ELEM_TYPE_INTEGER64) + val = snd_ctl_elem_info_get_min64(space->ctl_info); + else if (type == SND_CTL_ELEM_TYPE_INTEGER) + val = snd_ctl_elem_info_get_min(space->ctl_info); + else + goto empty; + goto value; + } + if (strncasecmp(attr, "max", 3) == 0) { + if (check_id_changed(space, 1)) + return NULL; + type = snd_ctl_elem_info_get_type(space->ctl_info); + if (type == SND_CTL_ELEM_TYPE_INTEGER64) + val = snd_ctl_elem_info_get_max64(space->ctl_info); + else if (type == SND_CTL_ELEM_TYPE_INTEGER) + val = snd_ctl_elem_info_get_max(space->ctl_info); + else + goto empty; + goto value; + } + if (strncasecmp(attr, "step", 3) == 0) { + if (check_id_changed(space, 1)) + return NULL; + type = snd_ctl_elem_info_get_type(space->ctl_info); + if (type == SND_CTL_ELEM_TYPE_INTEGER64) + val = snd_ctl_elem_info_get_step64(space->ctl_info); + else if (type == SND_CTL_ELEM_TYPE_INTEGER) + val = snd_ctl_elem_info_get_step(space->ctl_info); + else + goto empty; + goto value; + } + if (strncasecmp(attr, "items", 5) == 0) { + if (check_id_changed(space, 1)) + return NULL; + if (snd_ctl_elem_info_get_type(space->ctl_info) == SND_CTL_ELEM_TYPE_ENUMERATED) + val = snd_ctl_elem_info_get_items(space->ctl_info); + else { + empty: + res[0] = '\0'; + return res; + } + goto value; + } + if (strncasecmp(attr, "value", 5) == 0) { + if (check_id_changed(space, 3)) + return NULL; + return get_ctl_value(space); + } + if (strncasecmp(attr, "dBmin", 5) == 0) { + long min, max; + if (check_id_changed(space, 1)) + return NULL; + if (snd_ctl_get_dB_range(snd_hctl_ctl(space->ctl_handle), space->ctl_id, &min, &max) < 0) + goto empty; + val = min; +dbvalue: + sprintf(res, "%li.%02idB", (long)(val / 100), (int)abs(val % 100)); + return res; + } + if (strncasecmp(attr, "dBmax", 5) == 0) { + long min, max; + if (check_id_changed(space, 1)) + return NULL; + if (snd_ctl_get_dB_range(snd_hctl_ctl(space->ctl_handle), space->ctl_id, &min, &max) < 0) + goto empty; + val = max; + goto dbvalue; + } + if (strncasecmp(attr, "enums", 5) == 0) { + unsigned int idx, items; + snd_hctl_elem_t *elem; + if (check_id_changed(space, 1)) + return NULL; + if (snd_ctl_elem_info_get_type(space->ctl_info) != SND_CTL_ELEM_TYPE_ENUMERATED) + goto empty; + items = snd_ctl_elem_info_get_items(space->ctl_info); + strcpy(res, "|"); + for (idx = 0; idx < items; idx++) { + snd_ctl_elem_info_set_item(space->ctl_info, idx); + elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); + if (elem == NULL) + break; + if (snd_hctl_elem_info(elem, space->ctl_info) < 0) + break; + strlcat(res, snd_ctl_elem_info_get_item_name(space->ctl_info), sizeof(res)); + strlcat(res, "|", sizeof(res)); + } + return res; + } + if (strncasecmp(attr, "do_search", 9) == 0) { + int err, index = 0; + snd_hctl_elem_t *elem; + snd_ctl_elem_id_t *id; + char *pos = strchr(attr, ' '); + if (pos) + index = strtol(pos, NULL, 0); + err = snd_ctl_elem_id_malloc(&id); + if (err < 0) + return NULL; + elem = snd_hctl_first_elem(space->ctl_handle); + while (elem) { + snd_hctl_elem_get_id(elem, id); + if (!ctl_match(space->ctl_id, id)) + goto next_search; + if (index > 0) { + index--; + goto next_search; + } + strcpy(res, "1"); + snd_ctl_elem_id_copy(space->ctl_id, id); + snd_ctl_elem_id_free(id); + dbg("do_ctl_search found a control"); + return res; + next_search: + elem = snd_hctl_elem_next(elem); + } + snd_ctl_elem_id_free(id); + strcpy(res, "0"); + return res; + } + if (strncasecmp(attr, "do_count", 8) == 0) { + int err, index = 0; + snd_hctl_elem_t *elem; + snd_ctl_elem_id_t *id; + err = snd_ctl_elem_id_malloc(&id); + if (err < 0) + return NULL; + elem = snd_hctl_first_elem(space->ctl_handle); + while (elem) { + snd_hctl_elem_get_id(elem, id); + if (ctl_match(space->ctl_id, id)) + index++; + elem = snd_hctl_elem_next(elem); + } + snd_ctl_elem_id_free(id); + sprintf(res, "%u", index); + dbg("do_ctl_count found %s controls", res); + return res; + } + Perror(space, "unknown ctl{} attribute '%s'", attr); + return NULL; + value: + sprintf(res, "%lli", val); + return res; +} + +static int elemid_set(struct space *space, const char *attr, const char *value) +{ + unsigned int val; + void (*fcn)(snd_ctl_elem_id_t *, unsigned int); + snd_ctl_elem_iface_t iface; + int err; + + if (strncasecmp(attr, "numid", 5) == 0) { + fcn = snd_ctl_elem_id_set_numid; + goto value; + } + if (strncasecmp(attr, "iface", 5) == 0 || + strncasecmp(attr, "interface", 9) == 0 || + strncasecmp(attr, "reset", 5) == 0 || + strncasecmp(attr, "search", 6) == 0) { + if (strlen(value) == 0 && strncasecmp(attr, "search", 6) == 0) { + iface = 0; + goto search; + } + for (iface = 0; iface <= SND_CTL_ELEM_IFACE_LAST; iface++) { + if (strcasecmp(value, snd_ctl_elem_iface_name(iface)) == 0) { + if (strncasecmp(attr, "reset", 5) == 0) + snd_ctl_elem_id_clear(space->ctl_id); + if (strncasecmp(attr, "search", 5) == 0) { + search: + snd_ctl_elem_id_clear(space->ctl_id); + /* -1 means all */ + snd_ctl_elem_id_set_interface(space->ctl_id, -1); + snd_ctl_elem_id_set_device(space->ctl_id, -1); + snd_ctl_elem_id_set_subdevice(space->ctl_id, -1); + snd_ctl_elem_id_set_name(space->ctl_id, "*"); + snd_ctl_elem_id_set_index(space->ctl_id, -1); + if (strlen(value) == 0) + return 0; + } + snd_ctl_elem_id_set_interface(space->ctl_id, iface); + space->ctl_id_changed = ~0; + return 0; + } + } + Perror(space, "unknown control interface name '%s'", value); + return -EINVAL; + } + if (strncasecmp(attr, "device", 6) == 0) { + fcn = snd_ctl_elem_id_set_device; + goto value; + } + if (strncasecmp(attr, "subdev", 6) == 0) { + fcn = snd_ctl_elem_id_set_subdevice; + goto value; + } + if (strncasecmp(attr, "name", 4) == 0) { + snd_ctl_elem_id_set_name(space->ctl_id, value); + space->ctl_id_changed = ~0; + return 0; + } + if (strncasecmp(attr, "index", 5) == 0) { + fcn = snd_ctl_elem_id_set_index; + goto value; + } + if (strncasecmp(attr, "values", 6) == 0 || + strncasecmp(attr, "value", 5) == 0) { + err = check_id_changed(space, 1); + if (err < 0) { + Perror(space, "control element not found"); + return err; + } + err = set_ctl_value(space, value, strncasecmp(attr, "values", 6) == 0); + if (err < 0) { + space->ctl_id_changed |= 2; + } else { + space->ctl_id_changed &= ~2; + snd_ctl_elem_value_set_id(space->ctl_value, space->ctl_id); + err = snd_ctl_elem_write(snd_hctl_ctl(space->ctl_handle), space->ctl_value); + if (err < 0) { + Perror(space, "value write error: %s", snd_strerror(err)); + return err; + } + } + return err; + } + Perror(space, "unknown CTL{} attribute '%s'", attr); + return -EINVAL; + value: + val = (unsigned int)strtol(value, NULL, 0); + fcn(space->ctl_id, val); + space->ctl_id_changed = ~0; + return 0; +} + +static int get_key(char **line, char **key, enum key_op *op, char **value) +{ + char *linepos; + char *temp; + + linepos = *line; + if (linepos == NULL && linepos[0] == '\0') + return -EINVAL; + + /* skip whitespace */ + while (isspace(linepos[0]) || linepos[0] == ',') + linepos++; + + /* get the key */ + if (linepos[0] == '\0') + return -EINVAL; + *key = linepos; + + while (1) { + linepos++; + if (linepos[0] == '\0') + return -1; + if (isspace(linepos[0])) + break; + if (linepos[0] == '=') + break; + if (linepos[0] == '+') + break; + if (linepos[0] == '!') + break; + if (linepos[0] == ':') + break; + } + + /* remember end of key */ + temp = linepos; + + /* skip whitespace after key */ + while (isspace(linepos[0])) + linepos++; + if (linepos[0] == '\0') + return -EINVAL; + + /* get operation type */ + if (linepos[0] == '=' && linepos[1] == '=') { + *op = KEY_OP_MATCH; + linepos += 2; + dbg("operator=match"); + } else if (linepos[0] == '!' && linepos[1] == '=') { + *op = KEY_OP_NOMATCH; + linepos += 2; + dbg("operator=nomatch"); + } else if (linepos[0] == '+' && linepos[1] == '=') { + *op = KEY_OP_ADD; + linepos += 2; + dbg("operator=add"); + } else if (linepos[0] == '=') { + *op = KEY_OP_ASSIGN; + linepos++; + dbg("operator=assign"); + } else if (linepos[0] == ':' && linepos[1] == '=') { + *op = KEY_OP_ASSIGN_FINAL; + linepos += 2; + dbg("operator=assign_final"); + } else + return -EINVAL; + + /* terminate key */ + temp[0] = '\0'; + dbg("key='%s'", *key); + + /* skip whitespace after operator */ + while (isspace(linepos[0])) + linepos++; + if (linepos[0] == '\0') + return -EINVAL; + + /* get the value*/ + if (linepos[0] != '"') + return -EINVAL; + linepos++; + *value = linepos; + + while (1) { + temp = strchr(linepos, '"'); + if (temp && temp[-1] == '\\') { + linepos = temp + 1; + continue; + } + break; + } + if (!temp) + return -EINVAL; + temp[0] = '\0'; + temp++; + dbg("value='%s'", *value); + + /* move line to next key */ + *line = temp; + + return 0; +} + +/* extract possible KEY{attr} */ +static char *get_key_attribute(struct space *space, char *str, char *res, size_t ressize) +{ + char *pos; + char *attr; + + attr = strchr(str, '{'); + if (attr != NULL) { + attr++; + pos = strchr(attr, '}'); + if (pos == NULL) { + Perror(space, "missing closing brace for format"); + return NULL; + } + pos[0] = '\0'; + strlcpy(res, attr, ressize); + pos[0] = '}'; + dbg("attribute='%s'", res); + return res; + } + + return NULL; +} + +/* extract possible {attr} and move str behind it */ +static char *get_format_attribute(struct space *space, char **str) +{ + char *pos; + char *attr = NULL; + + if (*str[0] == '{') { + pos = strchr(*str, '}'); + if (pos == NULL) { + Perror(space, "missing closing brace for format"); + return NULL; + } + pos[0] = '\0'; + attr = *str+1; + *str = pos+1; + dbg("attribute='%s', str='%s'", attr, *str); + } + return attr; +} + +/* extract possible format length and move str behind it*/ +static int get_format_len(struct space *space, char **str) +{ + int num; + char *tail; + + if (isdigit(*str[0])) { + num = (int) strtoul(*str, &tail, 10); + if (num > 0) { + *str = tail; + dbg("format length=%i", num); + return num; + } else { + Perror(space, "format parsing error '%s'", *str); + } + } + return -1; +} + +static void apply_format(struct space *space, char *string, size_t maxsize) +{ + char temp[PATH_SIZE]; + char temp2[PATH_SIZE]; + char *head, *tail, *pos, *cpos, *attr, *rest; + struct pair *pair; + int len; + int i; + int count; + enum subst_type { + SUBST_UNKNOWN, + SUBST_CARDINFO, + SUBST_CTL, + SUBST_RESULT, + SUBST_ATTR, + SUBST_SYSFSROOT, + SUBST_ENV, + SUBST_CONFIG, + }; + static const struct subst_map { + char *name; + char fmt; + enum subst_type type; + } map[] = { + { .name = "cardinfo", .fmt = 'i', .type = SUBST_CARDINFO }, + { .name = "ctl", .fmt = 'C', .type = SUBST_CTL }, + { .name = "result", .fmt = 'c', .type = SUBST_RESULT }, + { .name = "attr", .fmt = 's', .type = SUBST_ATTR }, + { .name = "sysfsroot", .fmt = 'r', .type = SUBST_SYSFSROOT }, + { .name = "env", .fmt = 'E', .type = SUBST_ENV }, + { .name = "config", .fmt = 'g', .type = SUBST_CONFIG }, + { NULL, '\0', 0 } + }; + enum subst_type type; + const struct subst_map *subst; + + head = string; + while (1) { + len = -1; + while (head[0] != '\0') { + if (head[0] == '$') { + /* substitute named variable */ + if (head[1] == '\0') + break; + if (head[1] == '$') { + strlcpy(temp, head+2, sizeof(temp)); + strlcpy(head+1, temp, maxsize); + head++; + continue; + } + head[0] = '\0'; + for (subst = map; subst->name; subst++) { + if (strncasecmp(&head[1], subst->name, strlen(subst->name)) == 0) { + type = subst->type; + tail = head + strlen(subst->name)+1; + dbg("will substitute format name '%s'", subst->name); + goto found; + } + } + } else if (head[0] == '%') { + /* substitute format char */ + if (head[1] == '\0') + break; + if (head[1] == '%') { + strlcpy(temp, head+2, sizeof(temp)); + strlcpy(head+1, temp, maxsize); + head++; + continue; + } + head[0] = '\0'; + tail = head+1; + len = get_format_len(space, &tail); + for (subst = map; subst->name; subst++) { + if (tail[0] == subst->fmt) { + type = subst->type; + tail++; + dbg("will substitute format char '%c'", subst->fmt); + goto found; + } + } + } + head++; + } + break; +found: + attr = get_format_attribute(space, &tail); + strlcpy(temp, tail, sizeof(temp)); + dbg("format=%i, string='%s', tail='%s'", type ,string, tail); + + switch (type) { + case SUBST_CARDINFO: + if (attr == NULL) + Perror(space, "missing identification parametr for cardinfo"); + else { + const char *value = cardinfo_get(space, attr); + if (value == NULL) + break; + strlcat(string, value, maxsize); + dbg("substitute cardinfo{%s} '%s'", attr, value); + } + break; + case SUBST_CTL: + if (attr == NULL) + Perror(space, "missing identification parametr for ctl"); + else { + const char *value = elemid_get(space, attr); + if (value == NULL) + break; + strlcat(string, value, maxsize); + dbg("substitute ctl{%s} '%s'", attr, value); + } + break; + case SUBST_RESULT: + if (space->program_result == NULL) + break; + /* get part part of the result string */ + i = 0; + if (attr != NULL) + i = strtoul(attr, &rest, 10); + if (i > 0) { + dbg("request part #%d of result string", i); + cpos = space->program_result; + while (--i) { + while (cpos[0] != '\0' && !isspace(cpos[0])) + cpos++; + while (isspace(cpos[0])) + cpos++; + } + if (i > 0) { + Perror(space, "requested part of result string not found"); + break; + } + strlcpy(temp2, cpos, sizeof(temp2)); + /* %{2+}c copies the whole string from the second part on */ + if (rest[0] != '+') { + cpos = strchr(temp2, ' '); + if (cpos) + cpos[0] = '\0'; + } + strlcat(string, temp2, maxsize); + dbg("substitute part of result string '%s'", temp2); + } else { + strlcat(string, space->program_result, maxsize); + dbg("substitute result string '%s'", space->program_result); + } + break; + case SUBST_ATTR: + if (attr == NULL) + Perror(space, "missing file parameter for attr"); + else { + const char *value = NULL; + size_t size; + + pair = value_find(space, "sysfs_device"); + if (pair == NULL) + break; + value = sysfs_attr_get_value(pair->value, attr); + + if (value == NULL) + break; + + /* strip trailing whitespace and replace untrusted characters of sysfs value */ + size = strlcpy(temp2, value, sizeof(temp2)); + if (size >= sizeof(temp2)) + size = sizeof(temp2)-1; + while (size > 0 && isspace(temp2[size-1])) + temp2[--size] = '\0'; + count = replace_untrusted_chars(temp2); + if (count > 0) + Perror(space, "%i untrusted character(s) replaced" , count); + strlcat(string, temp2, maxsize); + dbg("substitute sysfs value '%s'", temp2); + } + break; + case SUBST_SYSFSROOT: + strlcat(string, sysfs_path, maxsize); + dbg("substitute sysfs_path '%s'", sysfs_path); + break; + case SUBST_ENV: + if (attr == NULL) { + dbg("missing attribute"); + break; + } + pos = getenv(attr); + if (pos == NULL) { + dbg("env '%s' not available", attr); + break; + } + dbg("substitute env '%s=%s'", attr, pos); + strlcat(string, pos, maxsize); + break; + case SUBST_CONFIG: + if (attr == NULL) { + dbg("missing attribute"); + break; + } + pair = value_find(space, attr); + if (pair == NULL) + break; + strlcat(string, pair->value, maxsize); + break; + default: + Perror(space, "unknown substitution type=%i", type); + break; + } + /* possibly truncate to format-char specified length */ + if (len != -1) { + head[len] = '\0'; + dbg("truncate to %i chars, subtitution string becomes '%s'", len, head); + } + strlcat(string, temp, maxsize); + } + /* unescape strings */ + head = tail = string; + while (*head != '\0') { + if (*head == '\\') { + head++; + if (*head == '\0') + break; + switch (*head) { + case 'a': *tail++ = '\a'; break; + case 'b': *tail++ = '\b'; break; + case 'n': *tail++ = '\n'; break; + case 'r': *tail++ = '\r'; break; + case 't': *tail++ = '\t'; break; + case 'v': *tail++ = '\v'; break; + case '\\': *tail++ = '\\'; break; + default: *tail++ = *head; break; + } + head++; + continue; + } + if (*head) + *tail++ = *head++; + } + *tail = 0; +} + +static +int run_program1(struct space *space, + const char *command0, char *result, + size_t ressize, size_t *reslen, int log) +{ + if (strncmp(command0, "__ctl_search", 12) == 0) { + const char *res = elemid_get(space, "do_search"); + if (res == NULL || strcmp(res, "1") != 0) + return EXIT_FAILURE; + return EXIT_SUCCESS; + } + if (strncmp(command0, "__ctl_count", 11) == 0) { + const char *res = elemid_get(space, "do_count"); + if (res == NULL || strcmp(res, "0") == 0) + return EXIT_FAILURE; + strlcpy(result, res, ressize); + return EXIT_SUCCESS; + } + Perror(space, "unknown buildin command '%s'", command0); + return EXIT_FAILURE; +} + +static int parse(struct space *space, const char *filename); + +static char *new_root_dir(const char *filename) +{ + char *res, *tmp; + + res = strdup(filename); + if (res) { + tmp = strrchr(res, '/'); + if (tmp) + *tmp = '\0'; + } + dbg("new_root_dir '%s' '%s'", filename, res); + return res; +} + +static int parse_line(struct space *space, char *line, size_t linesize) +{ + char *linepos; + char *key, *value, *attr, *temp; + struct pair *pair; + enum key_op op; + int err = 0, count; + char string[PATH_SIZE]; + char result[PATH_SIZE]; + + linepos = line; + while (*linepos != '\0') { + op = KEY_OP_UNSET; + + err = get_key(&linepos, &key, &op, &value); + if (err < 0) + goto invalid; + + if (strncasecmp(key, "LABEL", 5) == 0) { + if (op != KEY_OP_ASSIGN) { + Perror(space, "invalid LABEL operation"); + goto invalid; + } + if (space->go_to && strcmp(space->go_to, value) == 0) { + free(space->go_to); + space->go_to = NULL; + } + continue; + } + + if (space->go_to) { + dbg("skip (GOTO '%s')", space->go_to); + break; /* not for us */ + } + + if (strncasecmp(key, "CTL{", 4) == 0) { + attr = get_key_attribute(space, key + 3, string, sizeof(string)); + if (attr == NULL) { + Perror(space, "error parsing CTL attribute"); + goto invalid; + } + if (op == KEY_OP_ASSIGN) { + strlcpy(result, value, sizeof(result)); + apply_format(space, result, sizeof(result)); + dbg("ctl assign: '%s' '%s'", value, attr); + err = elemid_set(space, attr, result); + if (space->program_result) { + free(space->program_result); + space->program_result = NULL; + } + snprintf(string, sizeof(string), "%i", err); + space->program_result = strdup(string); + err = 0; + if (space->program_result == NULL) + break; + } else if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + if (strncmp(attr, "write", 5) == 0) { + strlcpy(result, value, sizeof(result)); + apply_format(space, result, sizeof(result)); + dbg("ctl write: '%s' '%s'", value, attr); + err = elemid_set(space, "values", result); + if (err == 0 && op == KEY_OP_NOMATCH) + break; + if (err != 0 && op == KEY_OP_MATCH) + break; + } else { + temp = (char *)elemid_get(space, attr); + dbg("ctl match: '%s' '%s' '%s'", attr, value, temp); + if (!do_match(key, op, value, temp)) + break; + } + } else { + Perror(space, "invalid CTL{} operation"); + goto invalid; + } + continue; + } + if (strcasecmp(key, "RESULT") == 0) { + if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + if (!do_match(key, op, value, space->program_result)) + break; + } else if (op == KEY_OP_ASSIGN) { + if (space->program_result) { + free(space->program_result); + space->program_result = NULL; + } + strlcpy(string, value, sizeof(string)); + apply_format(space, string, sizeof(string)); + space->program_result = strdup(string); + if (space->program_result == NULL) + break; + } else { + Perror(space, "invalid RESULT operation"); + goto invalid; + } + continue; + } + if (strcasecmp(key, "PROGRAM") == 0) { + if (op == KEY_OP_UNSET) + continue; + strlcpy(string, value, sizeof(string)); + apply_format(space, string, sizeof(string)); + if (space->program_result) { + free(space->program_result); + space->program_result = NULL; + } + if (run_program(space, string, result, sizeof(result), NULL, space->log_run) != 0) { + dbg("PROGRAM '%s' is false", string); + if (op != KEY_OP_NOMATCH) + break; + } else { + remove_trailing_chars(result, '\n'); + count = replace_untrusted_chars(result); + if (count) + info("%i untrusted character(s) replaced", count); + dbg("PROGRAM '%s' result is '%s'", string, result); + space->program_result = strdup(result); + if (space->program_result == NULL) + break; + dbg("PROGRAM returned successful"); + if (op == KEY_OP_NOMATCH) + break; + } + dbg("PROGRAM key is true"); + continue; + } + if (strncasecmp(key, "CARDINFO{", 9) == 0) { + attr = get_key_attribute(space, key + 8, string, sizeof(string)); + if (attr == NULL) { + Perror(space, "error parsing CARDINFO attribute"); + goto invalid; + } + if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + dbg("cardinfo: '%s' '%s'", value, attr); + temp = (char *)cardinfo_get(space, attr); + if (!do_match(key, op, value, temp)) + break; + } else { + Perror(space, "invalid CARDINFO{} operation"); + goto invalid; + } + continue; + } + if (strncasecmp(key, "ATTR{", 5) == 0) { + attr = get_key_attribute(space, key + 4, string, sizeof(string)); + if (attr == NULL) { + Perror(space, "error parsing ATTR attribute"); + goto invalid; + } + if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + pair = value_find(space, "sysfs_device"); + if (pair == NULL) + break; + dbg("sysfs_attr: '%s' '%s'", pair->value, attr); + temp = sysfs_attr_get_value(pair->value, attr); + if (!do_match(key, op, value, temp)) + break; + } else { + Perror(space, "invalid ATTR{} operation"); + goto invalid; + } + continue; + } + if (strncasecmp(key, "ENV{", 4) == 0) { + attr = get_key_attribute(space, key + 3, string, sizeof(string)); + if (attr == NULL) { + Perror(space, "error parsing ENV attribute"); + goto invalid; + } + if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + temp = getenv(attr); + dbg("env: '%s' '%s'", attr, temp); + if (!do_match(key, op, value, temp)) + break; + } else if (op == KEY_OP_ASSIGN || + op == KEY_OP_ASSIGN_FINAL) { + strlcpy(result, value, sizeof(result)); + apply_format(space, result, sizeof(result)); + dbg("env set: '%s' '%s'", attr, result); + if (setenv(attr, result, op == KEY_OP_ASSIGN_FINAL)) + break; + } else { + Perror(space, "invalid ENV{} operation"); + goto invalid; + } + continue; + } + if (strcasecmp(key, "GOTO") == 0) { + if (op != KEY_OP_ASSIGN) { + Perror(space, "invalid GOTO operation"); + goto invalid; + } + space->go_to = strdup(value); + if (space->go_to == NULL) { + err = -ENOMEM; + break; + } + continue; + } + if (strcasecmp(key, "INCLUDE") == 0) { + char *rootdir, *go_to; + const char *filename; + struct dirent *dirent; + DIR *dir; + int linenum; + if (op != KEY_OP_ASSIGN) { + Perror(space, "invalid INCLUDE operation"); + goto invalid; + } + if (value[0] == '/') + strlcpy(string, value, sizeof(string)); + else { + strlcpy(string, space->rootdir, sizeof(string)); + strlcat(string, "/", sizeof(string)); + strlcat(string, value, sizeof(string)); + } + rootdir = space->rootdir; + go_to = space->go_to; + filename = space->filename; + linenum = space->linenum; + dir = opendir(string); + if (dir) { + count = strlen(string); + while ((dirent = readdir(dir)) != NULL) { + if (strcmp(dirent->d_name, ".") == 0 || + strcmp(dirent->d_name, "..") == 0) + continue; + string[count] = '\0'; + strlcat(string, "/", sizeof(string)); + strlcat(string, dirent->d_name, sizeof(string)); + space->go_to = NULL; + space->rootdir = new_root_dir(string); + if (space->rootdir) { + err = parse(space, string); + free(space->rootdir); + } else + err = -ENOMEM; + if (space->go_to) { + Perror(space, "unterminated GOTO '%s'", space->go_to); + free(space->go_to); + } + if (err) + break; + } + closedir(dir); + } else { + space->go_to = NULL; + space->rootdir = new_root_dir(string); + if (space->rootdir) { + err = parse(space, string); + free(space->rootdir); + } else + err = -ENOMEM; + if (space->go_to) { + Perror(space, "unterminated GOTO '%s'", space->go_to); + free(space->go_to); + } + } + space->go_to = go_to; + space->rootdir = rootdir; + space->filename = filename; + space->linenum = linenum; + if (space->quit) + break; + if (err) + break; + continue; + } + if (strncasecmp(key, "ACCESS", 6) == 0) { + if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + if (value[0] == '$') { + strlcpy(string, value, sizeof(string)); + apply_format(space, string, sizeof(string)); + if (string[0] == '/') + goto __access1; + } + if (value[0] != '/') { + strlcpy(string, space->rootdir, sizeof(string)); + strlcat(string, "/", sizeof(string)); + strlcat(string, value, sizeof(string)); + } else { + strlcpy(string, value, sizeof(string)); + } + apply_format(space, string, sizeof(string)); + __access1: + count = access(string, F_OK); + dbg("access(%s) = %i (%s)", string, count, value); + if (op == KEY_OP_MATCH && count != 0) + break; + if (op == KEY_OP_NOMATCH && count == 0) + break; + } else { + Perror(space, "invalid ACCESS operation"); + goto invalid; + } + continue; + } + if (strncasecmp(key, "PRINT", 5) == 0) { + if (op != KEY_OP_ASSIGN) { + Perror(space, "invalid PRINT operation"); + goto invalid; + } + strlcpy(string, value, sizeof(string)); + apply_format(space, string, sizeof(string)); + fwrite(string, strlen(string), 1, stdout); + continue; + } + if (strncasecmp(key, "ERROR", 5) == 0) { + if (op != KEY_OP_ASSIGN) { + Perror(space, "invalid ERROR operation"); + goto invalid; + } + strlcpy(string, value, sizeof(string)); + apply_format(space, string, sizeof(string)); + fwrite(string, strlen(string), 1, stderr); + continue; + } + if (strncasecmp(key, "EXIT", 4) == 0) { + if (op != KEY_OP_ASSIGN) { + Perror(space, "invalid EXIT operation"); + goto invalid; + } + strlcpy(string, value, sizeof(string)); + apply_format(space, string, sizeof(string)); + if (strcmp(string, "return") == 0) + return -EJUSTRETURN; + space->exit_code = strtol(string, NULL, 0); + space->quit = 1; + break; + } + if (strncasecmp(key, "CONFIG{", 7) == 0) { + attr = get_key_attribute(space, key + 6, string, sizeof(string)); + if (attr == NULL) { + Perror(space, "error parsing CONFIG attribute"); + goto invalid; + } + strlcpy(result, value, sizeof(result)); + apply_format(space, result, sizeof(result)); + if (op == KEY_OP_ASSIGN) { + err = value_set(space, attr, result); + dbg("CONFIG{%s}='%s'", attr, result); + break; + } else if (op == KEY_OP_MATCH || op == KEY_OP_NOMATCH) { + pair = value_find(space, attr); + if (pair == NULL) + break; + if (!do_match(key, op, result, pair->value)) + break; + } else { + Perror(space, "invalid CONFIG{} operation"); + goto invalid; + } + } + + Perror(space, "unknown key '%s'", key); + } + return err; + +invalid: + Perror(space, "invalid rule"); + return -EINVAL; +} + +static int parse(struct space *space, const char *filename) +{ + char *buf, *bufline, *line; + size_t bufsize, pos, count, linesize; + unsigned int linenum, i, j, linenum_adj; + int err; + + dbg("start of file '%s'", filename); + + if (file_map(filename, &buf, &bufsize) != 0) { + err = errno; + error("Unable to open file '%s': %s", filename, strerror(err)); + return -err; + } + + err = 0; + pos = 0; + linenum = 0; + linesize = 128; + line = malloc(linesize); + if (line == NULL) + return -ENOMEM; + space->filename = filename; + while (!err && pos < bufsize && !space->quit) { + count = line_width(buf, bufsize, pos); + bufline = buf + pos; + pos += count + 1; + linenum++; + + /* skip whitespaces */ + while (count > 0 && isspace(bufline[0])) { + bufline++; + count--; + } + if (count == 0) + continue; + + /* comment check */ + if (bufline[0] == '#') + continue; + + if (count > linesize - 1) { + free(line); + linesize = (count + 127 + 1) & ~127; + if (linesize > 2048) { + error("file %s, line %i too long", filename, linenum); + err = -EINVAL; + break; + } + line = malloc(linesize); + if (line == NULL) { + err = -EINVAL; + break; + } + } + + /* skip backslash and newline from multiline rules */ + linenum_adj = 0; + for (i = j = 0; i < count; i++) { + if (bufline[i] == '\\' && bufline[i+1] == '\n') { + linenum_adj++; + continue; + } + line[j++] = bufline[i]; + } + line[j] = '\0'; + + dbg("read (%i) '%s'", linenum, line); + space->linenum = linenum; + err = parse_line(space, line, linesize); + if (err == -EJUSTRETURN) { + err = 0; + break; + } + linenum += linenum_adj; + } + + free(line); + space->filename = NULL; + space->linenum = -1; + file_unmap(buf, bufsize); + dbg("end of file '%s'", filename); + return err ? err : -abs(space->exit_code); +} + +int init(const char *filename, const char *cardname) +{ + struct space *space; + int err = 0, card, first; + + sysfs_init(); + if (!cardname) { + first = 1; + card = -1; + while (1) { + if (snd_card_next(&card) < 0) + break; + if (card < 0) { + if (first) { + error("No soundcards found..."); + return -ENODEV; + } + break; + } + first = 0; + err = init_space(&space, card); + if (err == 0) { + space->rootdir = new_root_dir(filename); + if (space->rootdir != NULL) + err = parse(space, filename); + free_space(space); + } + if (err < 0) + break; + } + } else { + card = snd_card_get_index(cardname); + if (card < 0) { + error("Cannot find soundcard '%s'...", cardname); + goto error; + } + memset(&space, 0, sizeof(space)); + err = init_space(&space, card); + if (err == 0) { + space->rootdir = new_root_dir(filename); + if (space->rootdir != NULL) + err = parse(space, filename); + free_space(space); + } + } + error: + sysfs_cleanup(); + return err; +} diff --git a/alsactl/init_sysdeps.c b/alsactl/init_sysdeps.c new file mode 100644 index 0000000..3aca1b4 --- /dev/null +++ b/alsactl/init_sysdeps.c @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2003 Greg Kroah-Hartman + * Copyright (C) 2005-2006 Kay Sievers + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#if defined(__GLIBC__) && !(defined(__UCLIBC__) && defined(__USE_BSD)) +static size_t strlcpy(char *dst, const char *src, size_t size) +{ + size_t bytes = 0; + char *q = dst; + const char *p = src; + char ch; + + while ((ch = *p++)) { + if (bytes+1 < size) + *q++ = ch; + bytes++; + } + + /* If size == 0 there is no space for a final null... */ + if (size) + *q = '\0'; + return bytes; +} + +static size_t strlcat(char *dst, const char *src, size_t size) +{ + size_t bytes = 0; + char *q = dst; + const char *p = src; + char ch; + + while (bytes < size && *q) { + q++; + bytes++; + } + if (bytes == size) + return (bytes + strlen(src)); + + while ((ch = *p++)) { + if (bytes+1 < size) + *q++ = ch; + bytes++; + } + + *q = '\0'; + return bytes; +} +#endif /* __GLIBC__ */ diff --git a/alsactl/init_sysfs.c b/alsactl/init_sysfs.c new file mode 100644 index 0000000..0cbada2 --- /dev/null +++ b/alsactl/init_sysfs.c @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2005-2006 Kay Sievers + * 2008 Jaroslav Kysela + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + + +static char sysfs_path[PATH_SIZE]; + +/* attribute value cache */ +static LIST_HEAD(attr_list); +struct sysfs_attr { + struct list_head node; + char path[PATH_SIZE]; + char *value; /* points to value_local if value is cached */ + char value_local[NAME_SIZE]; +}; + +static int sysfs_init(void) +{ + const char *env; + char sysfs_test[PATH_SIZE]; + + env = getenv("SYSFS_PATH"); + if (env) { + strlcpy(sysfs_path, env, sizeof(sysfs_path)); + remove_trailing_chars(sysfs_path, '/'); + } else + strlcpy(sysfs_path, "/sys", sizeof(sysfs_path)); + dbg("sysfs_path='%s'", sysfs_path); + + strlcpy(sysfs_test, sysfs_path, sizeof(sysfs_test)); + strlcat(sysfs_test, "/kernel/uevent_helper", sizeof(sysfs_test)); + if (access(sysfs_test, F_OK)) { + error("sysfs path '%s' is invalid\n", sysfs_path); + return -errno; + } + + INIT_LIST_HEAD(&attr_list); + return 0; +} + +static void sysfs_cleanup(void) +{ + struct sysfs_attr *attr_loop; + struct sysfs_attr *attr_temp; + + list_for_each_entry_safe(attr_loop, attr_temp, &attr_list, node) { + list_del(&attr_loop->node); + free(attr_loop); + } +} + +static char *sysfs_attr_get_value(const char *devpath, const char *attr_name) +{ + char path_full[PATH_SIZE]; + const char *path; + char value[NAME_SIZE]; + struct sysfs_attr *attr_loop; + struct sysfs_attr *attr; + struct stat statbuf; + int fd; + ssize_t size; + size_t sysfs_len; + + dbg("open '%s'/'%s'", devpath, attr_name); + sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full)); + path = &path_full[sysfs_len]; + strlcat(path_full, devpath, sizeof(path_full)); + strlcat(path_full, "/", sizeof(path_full)); + strlcat(path_full, attr_name, sizeof(path_full)); + + /* look for attribute in cache */ + list_for_each_entry(attr_loop, &attr_list, node) { + if (strcmp(attr_loop->path, path) == 0) { + dbg("found in cache '%s'", attr_loop->path); + return attr_loop->value; + } + } + + /* store attribute in cache (also negatives are kept in cache) */ + dbg("new uncached attribute '%s'", path_full); + attr = malloc(sizeof(struct sysfs_attr)); + if (attr == NULL) + return NULL; + memset(attr, 0x00, sizeof(struct sysfs_attr)); + strlcpy(attr->path, path, sizeof(attr->path)); + dbg("add to cache '%s'", path_full); + list_add(&attr->node, &attr_list); + + if (lstat(path_full, &statbuf) != 0) { + dbg("stat '%s' failed: %s", path_full, strerror(errno)); + goto out; + } + + if (S_ISLNK(statbuf.st_mode)) { + /* links return the last element of the target path */ + char link_target[PATH_SIZE]; + int len; + const char *pos; + + len = readlink(path_full, link_target, sizeof(link_target)); + if (len > 0) { + link_target[len] = '\0'; + pos = strrchr(link_target, '/'); + if (pos != NULL) { + dbg("cache '%s' with link value '%s'", path_full, pos+1); + strlcpy(attr->value_local, &pos[1], sizeof(attr->value_local)); + attr->value = attr->value_local; + } + } + goto out; + } + + /* skip directories */ + if (S_ISDIR(statbuf.st_mode)) + goto out; + + /* skip non-readable files */ + if ((statbuf.st_mode & S_IRUSR) == 0) + goto out; + + /* read attribute value */ + fd = open(path_full, O_RDONLY); + if (fd < 0) { + dbg("attribute '%s' does not exist", path_full); + goto out; + } + size = read(fd, value, sizeof(value)); + close(fd); + if (size < 0) + goto out; + if (size == sizeof(value)) + goto out; + + /* got a valid value, store and return it */ + value[size] = '\0'; + remove_trailing_chars(value, '\n'); + dbg("cache '%s' with attribute value '%s'", path_full, value); + strlcpy(attr->value_local, value, sizeof(attr->value_local)); + attr->value = attr->value_local; + +out: + return attr->value; +} diff --git a/alsactl/init_utils_run.c b/alsactl/init_utils_run.c new file mode 100644 index 0000000..dde490b --- /dev/null +++ b/alsactl/init_utils_run.c @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2004-2005 Kay Sievers + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#define MY_MAX(a,b) ((a) > (b) ? (a) : (b)) + +#define READ_END 0 +#define WRITE_END 1 + +static +int run_program1(struct space *space, + const char *command0, char *result, + size_t ressize, size_t *reslen, int log); + +static +int run_program0(struct space *space, + const char *command0, char *result, + size_t ressize, size_t *reslen, int log) +{ + int retval = 0; + int status; + int outpipe[2] = {-1, -1}; + int errpipe[2] = {-1, -1}; + pid_t pid; + char arg[PATH_SIZE]; + char program[PATH_SIZE]; + char *argv[(sizeof(arg) / 2) + 1]; + int devnull; + int i; + + /* build argv from comand */ + strlcpy(arg, command0, sizeof(arg)); + i = 0; + if (strchr(arg, ' ') != NULL) { + char *pos = arg; + + while (pos != NULL) { + if (pos[0] == '\'') { + /* don't separate if in apostrophes */ + pos++; + argv[i] = strsep(&pos, "\'"); + while (pos != NULL && pos[0] == ' ') + pos++; + } else { + argv[i] = strsep(&pos, " "); + } + dbg("arg[%i] '%s'", i, argv[i]); + i++; + } + argv[i] = NULL; + } else { + argv[0] = arg; + argv[1] = NULL; + } + info("'%s'", command0); + + /* prepare pipes from child to parent */ + if (result || log) { + if (pipe(outpipe) != 0) { + Perror(space, "pipe failed: %s", strerror(errno)); + return -1; + } + } + if (log) { + if (pipe(errpipe) != 0) { + Perror(space, "pipe failed: %s", strerror(errno)); + return -1; + } + } + + /* allow programs in /lib/alsa called without the path */ + if (strchr(argv[0], '/') == NULL) { + strlcpy(program, "/lib/alsa/", sizeof(program)); + strlcat(program, argv[0], sizeof(program)); + argv[0] = program; + } + + pid = fork(); + switch(pid) { + case 0: + /* child closes parent ends of pipes */ + if (outpipe[READ_END] > 0) + close(outpipe[READ_END]); + if (errpipe[READ_END] > 0) + close(errpipe[READ_END]); + + /* discard child output or connect to pipe */ + devnull = open("/dev/null", O_RDWR); + if (devnull > 0) { + dup2(devnull, STDIN_FILENO); + if (outpipe[WRITE_END] < 0) + dup2(devnull, STDOUT_FILENO); + if (errpipe[WRITE_END] < 0) + dup2(devnull, STDERR_FILENO); + close(devnull); + } else + Perror(space, "open /dev/null failed: %s", strerror(errno)); + if (outpipe[WRITE_END] > 0) { + dup2(outpipe[WRITE_END], STDOUT_FILENO); + close(outpipe[WRITE_END]); + } + if (errpipe[WRITE_END] > 0) { + dup2(errpipe[WRITE_END], STDERR_FILENO); + close(errpipe[WRITE_END]); + } + execv(argv[0], argv); + + /* we should never reach this */ + Perror(space, "exec of program '%s' failed", argv[0]); + _exit(1); + case -1: + Perror(space, "fork of '%s' failed: %s", argv[0], strerror(errno)); + return -1; + default: + /* read from child if requested */ + if (outpipe[READ_END] > 0 || errpipe[READ_END] > 0) { + ssize_t count; + size_t respos = 0; + + /* parent closes child ends of pipes */ + if (outpipe[WRITE_END] > 0) + close(outpipe[WRITE_END]); + if (errpipe[WRITE_END] > 0) + close(errpipe[WRITE_END]); + + /* read child output */ + while (outpipe[READ_END] > 0 || errpipe[READ_END] > 0) { + int fdcount; + fd_set readfds; + + FD_ZERO(&readfds); + if (outpipe[READ_END] > 0) + FD_SET(outpipe[READ_END], &readfds); + if (errpipe[READ_END] > 0) + FD_SET(errpipe[READ_END], &readfds); + fdcount = select(MY_MAX(outpipe[READ_END], errpipe[READ_END])+1, &readfds, NULL, NULL, NULL); + if (fdcount < 0) { + if (errno == EINTR) + continue; + retval = -1; + break; + } + + /* get stdout */ + if (outpipe[READ_END] > 0 && FD_ISSET(outpipe[READ_END], &readfds)) { + char inbuf[1024]; + char *pos; + char *line; + + count = read(outpipe[READ_END], inbuf, sizeof(inbuf)-1); + if (count <= 0) { + close(outpipe[READ_END]); + outpipe[READ_END] = -1; + if (count < 0) { + Perror(space, "stdin read failed: %s", strerror(errno)); + retval = -1; + } + continue; + } + inbuf[count] = '\0'; + + /* store result for rule processing */ + if (result) { + if (respos + count < ressize) { + memcpy(&result[respos], inbuf, count); + respos += count; + } else { + Perror(space, "ressize %ld too short", (long)ressize); + retval = -1; + } + } + pos = inbuf; + while ((line = strsep(&pos, "\n"))) + if (pos || line[0] != '\0') + info("'%s' (stdout) '%s'", argv[0], line); + } + + /* get stderr */ + if (errpipe[READ_END] > 0 && FD_ISSET(errpipe[READ_END], &readfds)) { + char errbuf[1024]; + char *pos; + char *line; + + count = read(errpipe[READ_END], errbuf, sizeof(errbuf)-1); + if (count <= 0) { + close(errpipe[READ_END]); + errpipe[READ_END] = -1; + if (count < 0) + Perror(space, "stderr read failed: %s", strerror(errno)); + continue; + } + errbuf[count] = '\0'; + pos = errbuf; + while ((line = strsep(&pos, "\n"))) + if (pos || line[0] != '\0') + info("'%s' (stderr) '%s'", argv[0], line); + } + } + if (outpipe[READ_END] > 0) + close(outpipe[READ_END]); + if (errpipe[READ_END] > 0) + close(errpipe[READ_END]); + + /* return the childs stdout string */ + if (result) { + result[respos] = '\0'; + dbg("result='%s'", result); + if (reslen) + *reslen = respos; + } + } + waitpid(pid, &status, 0); + if (WIFEXITED(status)) { + info("'%s' returned with status %i", argv[0], WEXITSTATUS(status)); + if (WEXITSTATUS(status) != 0) + retval = -1; + } else { + Perror(space, "'%s' abnormal exit", argv[0]); + retval = -1; + } + } + + return retval; +} + +static +int run_program(struct space *space, const char *command0, char *result, + size_t ressize, size_t *reslen, int log) +{ + if (command0[0] == '_' && command0[1] == '_') + return run_program1(space, command0, result, ressize, reslen, log); + return run_program0(space, command0, result, ressize, reslen, log); +} diff --git a/alsactl/init_utils_string.c b/alsactl/init_utils_string.c new file mode 100644 index 0000000..01ea800 --- /dev/null +++ b/alsactl/init_utils_string.c @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2004-2005 Kay Sievers + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + + +static void remove_trailing_chars(char *path, char c) +{ + size_t len; + + len = strlen(path); + while (len > 0 && path[len-1] == c) + path[--len] = '\0'; +} + +/* count of characters used to encode one unicode char */ +static int utf8_encoded_expected_len(const char *str) +{ + unsigned char c = (unsigned char)str[0]; + + if (c < 0x80) + return 1; + if ((c & 0xe0) == 0xc0) + return 2; + if ((c & 0xf0) == 0xe0) + return 3; + if ((c & 0xf8) == 0xf0) + return 4; + if ((c & 0xfc) == 0xf8) + return 5; + if ((c & 0xfe) == 0xfc) + return 6; + return 0; +} + +/* decode one unicode char */ +static int utf8_encoded_to_unichar(const char *str) +{ + int unichar; + int len; + int i; + + len = utf8_encoded_expected_len(str); + switch (len) { + case 1: + return (int)str[0]; + case 2: + unichar = str[0] & 0x1f; + break; + case 3: + unichar = (int)str[0] & 0x0f; + break; + case 4: + unichar = (int)str[0] & 0x07; + break; + case 5: + unichar = (int)str[0] & 0x03; + break; + case 6: + unichar = (int)str[0] & 0x01; + break; + default: + return -1; + } + + for (i = 1; i < len; i++) { + if (((int)str[i] & 0xc0) != 0x80) + return -1; + unichar <<= 6; + unichar |= (int)str[i] & 0x3f; + } + + return unichar; +} + +/* expected size used to encode one unicode char */ +static int utf8_unichar_to_encoded_len(int unichar) +{ + if (unichar < 0x80) + return 1; + if (unichar < 0x800) + return 2; + if (unichar < 0x10000) + return 3; + if (unichar < 0x200000) + return 4; + if (unichar < 0x4000000) + return 5; + return 6; +} + +/* check if unicode char has a valid numeric range */ +static int utf8_unichar_valid_range(int unichar) +{ + if (unichar > 0x10ffff) + return 0; + if ((unichar & 0xfffff800) == 0xd800) + return 0; + if ((unichar > 0xfdcf) && (unichar < 0xfdf0)) + return 0; + if ((unichar & 0xffff) == 0xffff) + return 0; + return 1; +} + +/* validate one encoded unicode char and return its length */ +static int utf8_encoded_valid_unichar(const char *str) +{ + int len; + int unichar; + int i; + + len = utf8_encoded_expected_len(str); + if (len == 0) + return -1; + + /* ascii is valid */ + if (len == 1) + return 1; + + /* check if expected encoded chars are available */ + for (i = 0; i < len; i++) + if ((str[i] & 0x80) != 0x80) + return -1; + + unichar = utf8_encoded_to_unichar(str); + + /* check if encoded length matches encoded value */ + if (utf8_unichar_to_encoded_len(unichar) != len) + return -1; + + /* check if value has valid range */ + if (!utf8_unichar_valid_range(unichar)) + return -1; + + return len; +} + +/* replace everything but whitelisted plain ascii and valid utf8 */ +static int replace_untrusted_chars(char *str) +{ + size_t i = 0; + int replaced = 0; + + while (str[i] != '\0') { + int len; + + /* valid printable ascii char */ + if ((str[i] >= '0' && str[i] <= '9') || + (str[i] >= 'A' && str[i] <= 'Z') || + (str[i] >= 'a' && str[i] <= 'z') || + strchr(" #$%+-./:=?@_,", str[i])) { + i++; + continue; + } + /* valid utf8 is accepted */ + len = utf8_encoded_valid_unichar(&str[i]); + if (len > 1) { + i += len; + continue; + } + + /* everything else is garbage */ + str[i] = '_'; + i++; + replaced++; + } + + return replaced; +} diff --git a/alsactl/list.h b/alsactl/list.h new file mode 100644 index 0000000..8626630 --- /dev/null +++ b/alsactl/list.h @@ -0,0 +1,289 @@ +/* + * Copied from the Linux kernel source tree, version 2.6.0-test1. + * + * Licensed under the GPL v2 as per the whole kernel source tree. + * + */ + +#ifndef _LIST_H +#define _LIST_H + +/** + * container_of - cast a member of a structure out to the containing structure + * + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +/* + * These are non-NULL pointers that will result in page faults + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +#define LIST_POISON1 ((void *) 0x00100100) +#define LIST_POISON2 ((void *) 0x00200200) + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ +} while (0) + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +/** + * list_del_init - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static inline void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +/** + * list_move - delete from one list and add as another's head + * @list: the entry to move + * @head: the head that will precede our entry + */ +static inline void list_move(struct list_head *list, struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add(list, head); +} + +/** + * list_move_tail - delete from one list and add as another's tail + * @list: the entry to move + * @head: the head that will follow our entry + */ +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add_tail(list, head); +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(struct list_head *head) +{ + return head->next == head; +} + +static inline void __list_splice(struct list_head *list, + struct list_head *head) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; +} + +/** + * list_splice - join two lists + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head); +} + +/** + * list_splice_init - join two lists and reinitialise the emptied list. + * @list: the new list to add. + * @head: the place to add it in the first list. + * + * The list at @list is reinitialised + */ +static inline void list_splice_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head); + INIT_LIST_HEAD(list); + } +} + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); \ + pos = pos->next) + +/** + * __list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + * + * This variant differs from list_for_each() in that it's the + * simplest possible list iteration code. + * Use this for code that knows the list to be very short (empty + * or 1 entry) most of the time. + */ +#define __list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * list_for_each_prev - iterate over a list backwards + * @pos: the &struct list_head to use as a loop counter. + * @head: the head for your list. + */ +#define list_for_each_prev(pos, head) \ + for (pos = (head)->prev; pos != (head); pos = pos->prev) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop counter. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_reverse - iterate backwards over list of given type. + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_reverse(pos, head, member) \ + for (pos = list_entry((head)->prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = list_entry(pos->member.prev, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop counter. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +#endif /* _LIST_H */ diff --git a/alsactl/state.c b/alsactl/state.c new file mode 100644 index 0000000..7422deb --- /dev/null +++ b/alsactl/state.c @@ -0,0 +1,1670 @@ +/* + * Advanced Linux Sound Architecture Control Program + * Copyright (c) by Abramo Bagnara + * Jaroslav Kysela + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "aconfig.h" +#include "version.h" +#include +#include +#include +#include +#include +#include +#include "alsactl.h" + + +#define ARRAY_SIZE(a) (sizeof (a) / sizeof (a)[0]) + + +static char *id_str(snd_ctl_elem_id_t *id) +{ + static char str[128]; + assert(id); + sprintf(str, "%i,%i,%i,%s,%i", + snd_ctl_elem_id_get_interface(id), + snd_ctl_elem_id_get_device(id), + snd_ctl_elem_id_get_subdevice(id), + snd_ctl_elem_id_get_name(id), + snd_ctl_elem_id_get_index(id)); + return str; +} + +static char *num_str(long n) +{ + static char str[32]; + sprintf(str, "%ld", n); + return str; +} + +static int snd_config_integer_add(snd_config_t *father, char *id, long integer) +{ + int err; + snd_config_t *leaf; + err = snd_config_imake_integer(&leaf, id, integer); + if (err < 0) + return err; + err = snd_config_add(father, leaf); + if (err < 0) { + snd_config_delete(leaf); + return err; + } + return 0; +} + +static int snd_config_integer64_add(snd_config_t *father, char *id, long long integer) +{ + int err; + snd_config_t *leaf; + err = snd_config_imake_integer64(&leaf, id, integer); + if (err < 0) + return err; + err = snd_config_add(father, leaf); + if (err < 0) { + snd_config_delete(leaf); + return err; + } + return 0; +} + +static int snd_config_string_add(snd_config_t *father, const char *id, const char *string) +{ + int err; + snd_config_t *leaf; + err = snd_config_imake_string(&leaf, id, string); + if (err < 0) + return err; + err = snd_config_add(father, leaf); + if (err < 0) { + snd_config_delete(leaf); + return err; + } + return 0; +} + +static int snd_config_compound_add(snd_config_t *father, const char *id, int join, + snd_config_t **node) +{ + int err; + snd_config_t *leaf; + err = snd_config_make_compound(&leaf, id, join); + if (err < 0) + return err; + err = snd_config_add(father, leaf); + if (err < 0) { + snd_config_delete(leaf); + return err; + } + *node = leaf; + return 0; +} + +#define MAX_USER_TLV_SIZE 64 + +static char *tlv_to_str(unsigned int *tlv) +{ + int i, len = tlv[1] / 4 + 2; + char *s, *p; + + if (len >= MAX_USER_TLV_SIZE) + return NULL; + s = malloc(len * 8 + 1); + if (! s) + return NULL; + p = s; + for (i = 0; i < len; i++) { + sprintf(p, "%08x", tlv[i]); + p += 8; + } + return s; +} + +static unsigned int *str_to_tlv(const char *s) +{ + int i, j, c, len; + unsigned int *tlv; + + len = strlen(s); + if (len % 8) /* aligned to 4 bytes (= 8 letters) */ + return NULL; + len /= 8; + if (len > MAX_USER_TLV_SIZE) + return NULL; + tlv = malloc(sizeof(int) * len); + if (! tlv) + return NULL; + for (i = 0; i < len; i++) { + tlv[i] = 0; + for (j = 0; j < 8; j++) { + if ((c = hextodigit(*s++)) < 0) { + free(tlv); + return NULL; + } + tlv[i] = (tlv[i] << 4) | c; + } + } + return tlv; +} + +/* + * add the TLV string, dB ranges, and dB values to comment fields + */ +static int add_tlv_comments(snd_ctl_t *handle, snd_ctl_elem_id_t *id, + snd_ctl_elem_info_t *info, snd_ctl_elem_value_t *ctl, + snd_config_t *comment) +{ + unsigned int tlv[MAX_USER_TLV_SIZE]; + unsigned int *db; + long rangemin, rangemax; + long dbmin, dbmax, dbgain; + snd_config_t *value; + unsigned int i, count; + int err; + + if (snd_ctl_elem_tlv_read(handle, id, tlv, sizeof(tlv)) < 0) + return 0; /* ignore error */ + + if (snd_ctl_elem_info_is_tlv_writable(info)) { + char *s = tlv_to_str(tlv); + if (s) { + err = snd_config_string_add(comment, "tlv", s); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + free(s); + } + } + + err = snd_tlv_parse_dB_info(tlv, sizeof(tlv), &db); + if (err <= 0) + return 0; + + rangemin = snd_ctl_elem_info_get_min(info); + rangemax = snd_ctl_elem_info_get_max(info); + snd_tlv_get_dB_range(db, rangemin, rangemax, &dbmin, &dbmax); + if (err < 0) + return err; + snd_config_integer_add(comment, "dbmin", dbmin); + snd_config_integer_add(comment, "dbmax", dbmax); + + if (snd_ctl_elem_info_get_type(info) == SND_CTL_ELEM_TYPE_INTEGER) { + err = snd_config_compound_add(comment, "dbvalue", 1, &value); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + return err; + } + count = snd_ctl_elem_info_get_count(info); + for (i = 0; i < count; i++) { + err = snd_tlv_convert_to_dB(db, rangemin, rangemax, + snd_ctl_elem_value_get_integer(ctl, i), &dbgain); + if (err < 0) { + error("snd_tlv_convert_to_dB: %s", snd_strerror(err)); + return err; + } + err = snd_config_integer_add(value, num_str(i), dbgain); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + } + } + return 0; +} + +static int get_control(snd_ctl_t *handle, snd_ctl_elem_id_t *id, snd_config_t *top) +{ + snd_ctl_elem_value_t *ctl; + snd_ctl_elem_info_t *info; + snd_config_t *control, *comment, *item, *value; + const char *s; + char buf[256]; + unsigned int idx; + int err; + unsigned int device, subdevice, index; + const char *name; + snd_ctl_elem_type_t type; + unsigned int count; + snd_ctl_elem_value_alloca(&ctl); + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_info_set_id(info, id); + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + error("Cannot read control info '%s': %s", id_str(id), snd_strerror(err)); + return err; + } + + if (!snd_ctl_elem_info_is_readable(info)) + return 0; + snd_ctl_elem_value_set_id(ctl, id); + err = snd_ctl_elem_read(handle, ctl); + if (err < 0) { + error("Cannot read control '%s': %s", id_str(id), snd_strerror(err)); + return err; + } + + err = snd_config_compound_add(top, num_str(snd_ctl_elem_info_get_numid(info)), 0, &control); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + return err; + } + err = snd_config_make_compound(&comment, "comment", 0); + if (err < 0) { + error("snd_config_make_compound: %s", snd_strerror(err)); + return err; + } + + buf[0] = '\0'; + buf[1] = '\0'; + if (snd_ctl_elem_info_is_readable(info)) + strcat(buf, " read"); + if (snd_ctl_elem_info_is_writable(info)) + strcat(buf, " write"); + if (snd_ctl_elem_info_is_inactive(info)) + strcat(buf, " inactive"); + if (snd_ctl_elem_info_is_volatile(info)) + strcat(buf, " volatile"); + if (snd_ctl_elem_info_is_locked(info)) + strcat(buf, " locked"); + if (snd_ctl_elem_info_is_user(info)) + strcat(buf, " user"); + err = snd_config_string_add(comment, "access", buf + 1); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + + type = snd_ctl_elem_info_get_type(info); + device = snd_ctl_elem_info_get_device(info); + subdevice = snd_ctl_elem_info_get_subdevice(info); + index = snd_ctl_elem_info_get_index(info); + name = snd_ctl_elem_info_get_name(info); + count = snd_ctl_elem_info_get_count(info); + s = snd_ctl_elem_type_name(type); + err = snd_config_string_add(comment, "type", s); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + err = snd_config_integer_add(comment, "count", count); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + break; + case SND_CTL_ELEM_TYPE_INTEGER: + { + long min = snd_ctl_elem_info_get_min(info); + long max = snd_ctl_elem_info_get_max(info); + long step = snd_ctl_elem_info_get_step(info); + if (step) + sprintf(buf, "%li - %li (step %li)", min, max, step); + else + sprintf(buf, "%li - %li", min, max); + err = snd_config_string_add(comment, "range", buf); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + if (snd_ctl_elem_info_is_tlv_readable(info)) { + err = add_tlv_comments(handle, id, info, ctl, comment); + if (err < 0) + return err; + } + break; + } + case SND_CTL_ELEM_TYPE_INTEGER64: + { + long long min = snd_ctl_elem_info_get_min64(info); + long long max = snd_ctl_elem_info_get_max64(info); + long long step = snd_ctl_elem_info_get_step64(info); + if (step) + sprintf(buf, "%Li - %Li (step %Li)", min, max, step); + else + sprintf(buf, "%Li - %Li", min, max); + err = snd_config_string_add(comment, "range", buf); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + break; + } + case SND_CTL_ELEM_TYPE_ENUMERATED: + { + unsigned int items; + err = snd_config_compound_add(comment, "item", 1, &item); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + return err; + } + items = snd_ctl_elem_info_get_items(info); + for (idx = 0; idx < items; idx++) { + snd_ctl_elem_info_set_item(info, idx); + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + error("snd_ctl_card_info: %s", snd_strerror(err)); + return err; + } + err = snd_config_string_add(item, num_str(idx), snd_ctl_elem_info_get_item_name(info)); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + } + break; + } + default: + break; + } + s = snd_ctl_elem_iface_name(snd_ctl_elem_info_get_interface(info)); + err = snd_config_string_add(control, "iface", s); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + if (device != 0) { + err = snd_config_integer_add(control, "device", device); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + } + if (subdevice != 0) { + err = snd_config_integer_add(control, "subdevice", subdevice); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + } + err = snd_config_string_add(control, "name", name); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + if (index != 0) { + err = snd_config_integer_add(control, "index", index); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + } + + switch (type) { + case SND_CTL_ELEM_TYPE_BYTES: + case SND_CTL_ELEM_TYPE_IEC958: + { + size_t size = type == SND_CTL_ELEM_TYPE_BYTES ? + count : sizeof(snd_aes_iec958_t); + char buf[size * 2 + 1]; + char *p = buf; + char *hex = "0123456789abcdef"; + const unsigned char *bytes = + (const unsigned char *)snd_ctl_elem_value_get_bytes(ctl); + for (idx = 0; idx < size; idx++) { + int v = bytes[idx]; + *p++ = hex[v >> 4]; + *p++ = hex[v & 0x0f]; + } + *p = '\0'; + err = snd_config_string_add(control, "value", buf); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + goto finish; + } + default: + break; + } + + if (count == 1) { + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + err = snd_config_string_add(control, "value", snd_ctl_elem_value_get_boolean(ctl, 0) ? "true" : "false"); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + goto finish; + case SND_CTL_ELEM_TYPE_INTEGER: + err = snd_config_integer_add(control, "value", snd_ctl_elem_value_get_integer(ctl, 0)); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + goto finish; + case SND_CTL_ELEM_TYPE_INTEGER64: + err = snd_config_integer64_add(control, "value", snd_ctl_elem_value_get_integer64(ctl, 0)); + if (err < 0) { + error("snd_config_integer64_add: %s", snd_strerror(err)); + return err; + } + goto finish; + case SND_CTL_ELEM_TYPE_ENUMERATED: + { + unsigned int v = snd_ctl_elem_value_get_enumerated(ctl, 0); + snd_config_t *c; + err = snd_config_search(item, num_str(v), &c); + if (err == 0) { + err = snd_config_get_string(c, &s); + assert(err == 0); + err = snd_config_string_add(control, "value", s); + } else { + err = snd_config_integer_add(control, "value", v); + } + if (err < 0) + error("snd_config add: %s", snd_strerror(err)); + goto finish; + } + default: + error("Unknown control type: %d\n", type); + return -EINVAL; + } + } + + err = snd_config_compound_add(control, "value", 1, &value); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + return err; + } + + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + for (idx = 0; idx < count; idx++) { + err = snd_config_string_add(value, num_str(idx), snd_ctl_elem_value_get_boolean(ctl, idx) ? "true" : "false"); + if (err < 0) { + error("snd_config_string_add: %s", snd_strerror(err)); + return err; + } + } + break; + case SND_CTL_ELEM_TYPE_INTEGER: + for (idx = 0; idx < count; idx++) { + err = snd_config_integer_add(value, num_str(idx), snd_ctl_elem_value_get_integer(ctl, idx)); + if (err < 0) { + error("snd_config_integer_add: %s", snd_strerror(err)); + return err; + } + } + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + for (idx = 0; idx < count; idx++) { + err = snd_config_integer64_add(value, num_str(idx), snd_ctl_elem_value_get_integer64(ctl, idx)); + if (err < 0) { + error("snd_config_integer64_add: %s", snd_strerror(err)); + return err; + } + } + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + for (idx = 0; idx < count; idx++) { + unsigned int v = snd_ctl_elem_value_get_enumerated(ctl, idx); + snd_config_t *c; + err = snd_config_search(item, num_str(v), &c); + if (err == 0) { + err = snd_config_get_string(c, &s); + assert(err == 0); + err = snd_config_string_add(value, num_str(idx), s); + } else { + err = snd_config_integer_add(value, num_str(idx), v); + } + if (err < 0) { + error("snd_config add: %s", snd_strerror(err)); + return err; + } + } + break; + default: + error("Unknown control type: %d\n", type); + return -EINVAL; + } + +finish: + err = snd_config_add(control, comment); + if (err < 0) { + error("snd_config_add: %s", snd_strerror(err)); + return err; + } + return 0; +} + +static int get_controls(int cardno, snd_config_t *top) +{ + snd_ctl_t *handle; + snd_ctl_card_info_t *info; + snd_config_t *state, *card, *control; + snd_ctl_elem_list_t *list; + snd_ctl_elem_id_t *elem_id; + unsigned int idx; + int err; + char name[32]; + unsigned int count; + const char *id; + snd_ctl_card_info_alloca(&info); + snd_ctl_elem_list_alloca(&list); + snd_ctl_elem_id_alloca(&elem_id); + + sprintf(name, "hw:%d", cardno); + err = snd_ctl_open(&handle, name, SND_CTL_READONLY); + if (err < 0) { + error("snd_ctl_open error: %s", snd_strerror(err)); + return err; + } + err = snd_ctl_card_info(handle, info); + if (err < 0) { + error("snd_ctl_card_info error: %s", snd_strerror(err)); + goto _close; + } + id = snd_ctl_card_info_get_id(info); + err = snd_config_search(top, "state", &state); + if (err == 0 && + snd_config_get_type(state) != SND_CONFIG_TYPE_COMPOUND) { + error("config state node is not a compound"); + err = -EINVAL; + goto _close; + } + if (err < 0) { + err = snd_config_compound_add(top, "state", 1, &state); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + goto _close; + } + } + err = snd_config_search(state, id, &card); + if (err == 0 && + snd_config_get_type(card) != SND_CONFIG_TYPE_COMPOUND) { + error("config state.%s node is not a compound", id); + err = -EINVAL; + goto _close; + } + if (err < 0) { + err = snd_config_compound_add(state, id, 0, &card); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + goto _close; + } + } + err = snd_config_search(card, "control", &control); + if (err == 0) { + err = snd_config_delete(control); + if (err < 0) { + error("snd_config_delete: %s", snd_strerror(err)); + goto _close; + } + } + err = snd_ctl_elem_list(handle, list); + if (err < 0) { + error("Cannot determine controls: %s", snd_strerror(err)); + goto _close; + } + count = snd_ctl_elem_list_get_count(list); + err = snd_config_compound_add(card, "control", count > 0, &control); + if (err < 0) { + error("snd_config_compound_add: %s", snd_strerror(err)); + goto _close; + } + if (count == 0) { + err = 0; + goto _close; + } + snd_ctl_elem_list_set_offset(list, 0); + if (snd_ctl_elem_list_alloc_space(list, count) < 0) { + error("No enough memory..."); + goto _close; + } + if ((err = snd_ctl_elem_list(handle, list)) < 0) { + error("Cannot determine controls (2): %s", snd_strerror(err)); + goto _free; + } + for (idx = 0; idx < count; ++idx) { + snd_ctl_elem_list_get_id(list, idx, elem_id); + err = get_control(handle, elem_id, control); + if (err < 0) + goto _free; + } + + err = 0; + _free: + snd_ctl_elem_list_free_space(list); + _close: + snd_ctl_close(handle); + return err; +} + +static long config_iface(snd_config_t *n) +{ + long i; + long long li; + snd_ctl_elem_iface_t idx; + const char *str; + switch (snd_config_get_type(n)) { + case SND_CONFIG_TYPE_INTEGER: + snd_config_get_integer(n, &i); + return i; + case SND_CONFIG_TYPE_INTEGER64: + snd_config_get_integer64(n, &li); + return li; + case SND_CONFIG_TYPE_STRING: + snd_config_get_string(n, &str); + break; + default: + return -1; + } + for (idx = 0; idx <= SND_CTL_ELEM_IFACE_LAST; idx++) { + if (strcasecmp(snd_ctl_elem_iface_name(idx), str) == 0) + return idx; + } + return -1; +} + +static int config_bool(snd_config_t *n, int doit) +{ + const char *str; + long val; + long long lval; + + switch (snd_config_get_type(n)) { + case SND_CONFIG_TYPE_INTEGER: + snd_config_get_integer(n, &val); + if (val < 0 || val > 1) + return -1; + return val; + case SND_CONFIG_TYPE_INTEGER64: + snd_config_get_integer64(n, &lval); + if (lval < 0 || lval > 1) + return -1; + return (int) lval; + case SND_CONFIG_TYPE_STRING: + snd_config_get_string(n, &str); + break; + case SND_CONFIG_TYPE_COMPOUND: + if (!force_restore || !doit) + return -1; + n = snd_config_iterator_entry(snd_config_iterator_first(n)); + return config_bool(n, doit); + default: + return -1; + } + if (strcmp(str, "on") == 0 || strcmp(str, "true") == 0) + return 1; + if (strcmp(str, "off") == 0 || strcmp(str, "false") == 0) + return 0; + return -1; +} + +static int config_enumerated(snd_config_t *n, snd_ctl_t *handle, + snd_ctl_elem_info_t *info, int doit) +{ + const char *str; + long val; + long long lval; + unsigned int idx, items; + + switch (snd_config_get_type(n)) { + case SND_CONFIG_TYPE_INTEGER: + snd_config_get_integer(n, &val); + return val; + case SND_CONFIG_TYPE_INTEGER64: + snd_config_get_integer64(n, &lval); + return (int) lval; + case SND_CONFIG_TYPE_STRING: + snd_config_get_string(n, &str); + break; + case SND_CONFIG_TYPE_COMPOUND: + if (!force_restore || !doit) + return -1; + n = snd_config_iterator_entry(snd_config_iterator_first(n)); + return config_enumerated(n, handle, info, doit); + default: + return -1; + } + items = snd_ctl_elem_info_get_items(info); + for (idx = 0; idx < items; idx++) { + int err; + snd_ctl_elem_info_set_item(info, idx); + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + error("snd_ctl_elem_info: %s", snd_strerror(err)); + return err; + } + if (strcmp(str, snd_ctl_elem_info_get_item_name(info)) == 0) + return idx; + } + return -1; +} + +static int config_integer(snd_config_t *n, long *val, int doit) +{ + int err = snd_config_get_integer(n, val); + if (err < 0 && force_restore && doit) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) + return err; + n = snd_config_iterator_entry(snd_config_iterator_first(n)); + return config_integer(n, val, doit); + } + return err; +} + +static int config_integer64(snd_config_t *n, long long *val, int doit) +{ + int err = snd_config_get_integer64(n, val); + if (err < 0 && force_restore && doit) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) + return err; + n = snd_config_iterator_entry(snd_config_iterator_first(n)); + return config_integer64(n, val, doit); + } + return err; +} + +static int check_comment_access(snd_config_t *conf, const char *str) +{ + snd_config_iterator_t i, next; + + snd_config_for_each(i, next, conf) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *id, *s; + if (snd_config_get_id(n, &id) < 0) + continue; + if (strcmp(id, "access") == 0) { + if (snd_config_get_string(n, &s) < 0) + return 0; + if (strstr(s, str)) + return 1; + } + } + return 0; +} + +/* + * get the item type from the given comment config + */ +static int get_comment_type(snd_config_t *n) +{ + static const snd_ctl_elem_type_t types[] = { + SND_CTL_ELEM_TYPE_BOOLEAN, + SND_CTL_ELEM_TYPE_INTEGER, + SND_CTL_ELEM_TYPE_ENUMERATED, + SND_CTL_ELEM_TYPE_BYTES, + SND_CTL_ELEM_TYPE_IEC958, + SND_CTL_ELEM_TYPE_INTEGER64, + }; + const char *type; + unsigned int i; + + if (snd_config_get_string(n, &type) < 0) + return -EINVAL; + for (i = 0; i < ARRAY_SIZE(types); ++i) + if (strcmp(type, snd_ctl_elem_type_name(types[i])) == 0) + return types[i]; + return -EINVAL; +} + +/* + * get the value range from the given comment config + */ +static int get_comment_range(snd_config_t *n, int ctype, + long *imin, long *imax, long *istep) +{ + const char *s; + int err; + + if (snd_config_get_string(n, &s) < 0) + return -EINVAL; + switch (ctype) { + case SND_CTL_ELEM_TYPE_INTEGER: + err = sscanf(s, "%li - %li (step %li)", imin, imax, istep); + if (err != 3) { + istep = 0; + err = sscanf(s, "%li - %li", imin, imax); + if (err != 2) + return -EINVAL; + } + break; + default: + return -EINVAL; + } + return 0; +} + +static int add_user_control(snd_ctl_t *handle, snd_ctl_elem_info_t *info, snd_config_t *conf) +{ + snd_ctl_elem_id_t *id; + snd_config_iterator_t i, next; + long imin, imax, istep; + snd_ctl_elem_type_t ctype; + unsigned int count; + int err; + unsigned int *tlv; + + imin = imax = istep = 0; + count = 0; + ctype = SND_CTL_ELEM_TYPE_NONE; + tlv = NULL; + snd_config_for_each(i, next, conf) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *id; + if (snd_config_get_id(n, &id) < 0) + continue; + if (strcmp(id, "type") == 0) { + err = get_comment_type(n); + if (err < 0) + return err; + ctype = err; + continue; + } + if (strcmp(id, "range") == 0) { + err = get_comment_range(n, ctype, &imin, &imax, &istep); + if (err < 0) + return err; + continue; + } + if (strcmp(id, "count") == 0) { + long v; + if ((err = snd_config_get_integer(n, &v)) < 0) + return err; + count = v; + continue; + } + if (strcmp(id, "tlv") == 0) { + const char *s; + if ((err = snd_config_get_string(n, &s)) < 0) + return -EINVAL; + if (tlv) + free(tlv); + if ((tlv = str_to_tlv(s)) == NULL) + return -EINVAL; + continue; + } + } + + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_info_get_id(info, id); + if (count <= 0) + count = 1; + switch (ctype) { + case SND_CTL_ELEM_TYPE_INTEGER: + if (imin > imax || istep > imax - imin) + return -EINVAL; + err = snd_ctl_elem_add_integer(handle, id, count, imin, imax, istep); + if (err < 0) + goto error; + if (tlv) + snd_ctl_elem_tlv_write(handle, id, tlv); + break; + case SND_CTL_ELEM_TYPE_BOOLEAN: + err = snd_ctl_elem_add_boolean(handle, id, count); + break; + case SND_CTL_ELEM_TYPE_IEC958: + err = snd_ctl_elem_add_iec958(handle, id); + break; + default: + err = -EINVAL; + break; + } + + error: + free(tlv); + if (err < 0) + return err; + return snd_ctl_elem_info(handle, info); +} + +/* + * check whether the config item has the same of compatible type + */ +static int check_comment_type(snd_config_t *conf, int type) +{ + snd_config_t *n; + int ctype; + + if (snd_config_search(conf, "type", &n) < 0) + return 0; /* not defined */ + ctype = get_comment_type(n); + if (ctype == type) + return 0; + if ((ctype == SND_CTL_ELEM_TYPE_BOOLEAN || + ctype == SND_CTL_ELEM_TYPE_INTEGER || + ctype == SND_CTL_ELEM_TYPE_INTEGER64 || + ctype == SND_CTL_ELEM_TYPE_ENUMERATED) && + (type == SND_CTL_ELEM_TYPE_BOOLEAN || + type == SND_CTL_ELEM_TYPE_INTEGER || + type == SND_CTL_ELEM_TYPE_INTEGER64 || + type == SND_CTL_ELEM_TYPE_ENUMERATED)) + return 0; /* OK, compatible */ + return -EINVAL; +} + +/* + * convert from an old value to a new value with the same dB level + */ +static int convert_to_new_db(snd_config_t *value, long omin, long omax, + long nmin, long nmax, + long odbmin, long odbmax, + snd_config_t *comment, const char *index, + snd_ctl_t *device, snd_ctl_elem_id_t *id, + int doit) +{ + snd_config_t *db_node; + long db, val; + int err; + + if (snd_config_searchv(comment, &db_node, "dbvalue", index, NULL) < 0 || + snd_config_get_integer(db_node, &db) < 0) { + err = config_integer(value, &val, doit); + if (err < 0) + return err; + if (val < omin || val > omax) + return -EINVAL; + db = ((val - omin) * (odbmax - odbmin)) / (omax - omin) + odbmin; + } + + err = snd_ctl_convert_from_dB(device, id, db, &val, db > 0); + if (err < 0) + return err; + if (val < nmin) + val = nmin; + else if (val > nmax) + val = nmax; + return snd_config_set_integer(value, val); +} + +/* + * compare the current value range with the old range in comments. + * also, if dB information is available, try to compare them. + * if any change occurs, try to keep the same dB level. + */ +static int check_comment_range(snd_ctl_t *handle, snd_config_t *conf, + snd_ctl_elem_info_t *info, snd_config_t *value, + int doit) +{ + snd_config_t *n; + long omin, omax, ostep; + long nmin, nmax; + long odbmin, odbmax; + long ndbmin, ndbmax; + snd_ctl_elem_id_t *id; + + if (snd_config_search(conf, "range", &n) < 0) + return 0; + if (get_comment_range(n, SND_CTL_ELEM_TYPE_INTEGER, + &omin, &omax, &ostep) < 0) + return 0; + nmin = snd_ctl_elem_info_get_min(info); + nmax = snd_ctl_elem_info_get_max(info); + if (omin != nmin && omax != nmax) { + /* Hey, the range mismatches */ + if (!force_restore || !doit) + return -EINVAL; + } + if (omin >= omax || nmin >= nmax) + return 0; /* invalid values */ + + if (snd_config_search(conf, "dbmin", &n) < 0) + return 0; + if (config_integer(n, &odbmin, doit) < 0) + return 0; + if (snd_config_search(conf, "dbmax", &n) < 0) + return 0; + if (config_integer(n, &odbmax, doit) < 0) + return 0; + if (odbmin >= odbmax) + return 0; /* invalid values */ + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_info_get_id(info, id); + if (snd_ctl_get_dB_range(handle, id, &ndbmin, &ndbmax) < 0) + return 0; + if (ndbmin >= ndbmax) + return 0; /* invalid values */ + if (omin == nmin && omax == nmax && + odbmin == ndbmin && odbmax == ndbmax) + return 0; /* OK, identical one */ + + /* Let's guess the current value from dB range */ + if (snd_config_get_type(value) == SND_CONFIG_TYPE_COMPOUND) { + snd_config_iterator_t i, next; + snd_config_for_each(i, next, value) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *idxstr; + if (snd_config_get_id(n, &idxstr) < 0) + continue; + convert_to_new_db(n, omin, omax, nmin, nmax, + odbmin, odbmax, conf, idxstr, + handle, id, doit); + } + } else + convert_to_new_db(value, omin, omax, nmin, nmax, + odbmin, odbmax, conf, "0", + handle, id, doit); + return 0; +} + +static int restore_config_value(snd_ctl_t *handle, snd_ctl_elem_info_t *info, + snd_ctl_elem_iface_t type, + snd_config_t *value, + snd_ctl_elem_value_t *ctl, int idx, + int doit) +{ + long val; + long long lval; + int err; + + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + val = config_bool(value, doit); + if (val >= 0) { + snd_ctl_elem_value_set_boolean(ctl, idx, val); + return 1; + } + break; + case SND_CTL_ELEM_TYPE_INTEGER: + err = config_integer(value, &val, doit); + if (err == 0) { + snd_ctl_elem_value_set_integer(ctl, idx, val); + return 1; + } + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + err = config_integer64(value, &lval, doit); + if (err == 0) { + snd_ctl_elem_value_set_integer64(ctl, idx, lval); + return 1; + } + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + val = config_enumerated(value, handle, info, doit); + if (val >= 0) { + snd_ctl_elem_value_set_enumerated(ctl, idx, val); + return 1; + } + break; + case SND_CTL_ELEM_TYPE_BYTES: + case SND_CTL_ELEM_TYPE_IEC958: + break; + default: + cerror(doit, "Unknow control type: %d", type); + return -EINVAL; + } + return 0; +} + +static int restore_config_value2(snd_ctl_t *handle, snd_ctl_elem_info_t *info, + snd_ctl_elem_iface_t type, + snd_config_t *value, + snd_ctl_elem_value_t *ctl, int idx, + unsigned int numid, int doit) +{ + int err = restore_config_value(handle, info, type, value, ctl, idx, doit); + long val; + + if (err != 0) + return err; + switch (type) { + case SND_CTL_ELEM_TYPE_BYTES: + case SND_CTL_ELEM_TYPE_IEC958: + err = snd_config_get_integer(value, &val); + if (err < 0 || val < 0 || val > 255) { + cerror(doit, "bad control.%d.value.%d content", numid, idx); + return force_restore && doit ? 0 : -EINVAL; + } + snd_ctl_elem_value_set_byte(ctl, idx, val); + return 1; + default: + break; + } + return 0; +} + +static int set_control(snd_ctl_t *handle, snd_config_t *control, + int *maxnumid, int doit) +{ + snd_ctl_elem_value_t *ctl; + snd_ctl_elem_info_t *info; + snd_config_iterator_t i, next; + unsigned int numid1; + snd_ctl_elem_iface_t iface = -1; + int iface1; + const char *name1; + unsigned int numid; + snd_ctl_elem_type_t type; + unsigned int count; + long device = -1; + long device1; + long subdevice = -1; + long subdevice1; + const char *name = NULL; + long index1; + long index = -1; + snd_config_t *value = NULL; + snd_config_t *comment = NULL; + unsigned int idx; + int err; + char *set; + const char *id; + snd_ctl_elem_value_alloca(&ctl); + snd_ctl_elem_info_alloca(&info); + if (snd_config_get_type(control) != SND_CONFIG_TYPE_COMPOUND) { + cerror(doit, "control is not a compound"); + return -EINVAL; + } + err = snd_config_get_id(control, &id); + if (err < 0) { + cerror(doit, "unable to get id"); + return -EINVAL; + } + numid = atoi(id); + if ((int)numid > *maxnumid) + *maxnumid = numid; + snd_config_for_each(i, next, control) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *fld; + if (snd_config_get_id(n, &fld) < 0) + continue; + if (strcmp(fld, "comment") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { + cerror(doit, "control.%d.%s is invalid", numid, fld); + return -EINVAL; + } + comment = n; + continue; + } + if (strcmp(fld, "iface") == 0) { + iface = (snd_ctl_elem_iface_t)config_iface(n); + continue; + } + if (strcmp(fld, "device") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { + cerror(doit, "control.%d.%s is invalid", numid, fld); + return -EINVAL; + } + snd_config_get_integer(n, &device); + continue; + } + if (strcmp(fld, "subdevice") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { + cerror(doit, "control.%d.%s is invalid", numid, fld); + return -EINVAL; + } + snd_config_get_integer(n, &subdevice); + continue; + } + if (strcmp(fld, "name") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_STRING) { + cerror(doit, "control.%d.%s is invalid", numid, fld); + return -EINVAL; + } + snd_config_get_string(n, &name); + continue; + } + if (strcmp(fld, "index") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { + cerror(doit, "control.%d.%s is invalid", numid, fld); + return -EINVAL; + } + snd_config_get_integer(n, &index); + continue; + } + if (strcmp(fld, "value") == 0) { + value = n; + continue; + } + cerror(doit, "unknown control.%d.%s field", numid, fld); + } + if (!value) { + cerror(doit, "missing control.%d.value", numid); + return -EINVAL; + } + if (device < 0) + device = 0; + if (subdevice < 0) + subdevice = 0; + if (index < 0) + index = 0; + + err = -EINVAL; + if (!force_restore) { + snd_ctl_elem_info_set_numid(info, numid); + err = snd_ctl_elem_info(handle, info); + } + if (err < 0 && name) { + snd_ctl_elem_info_set_numid(info, 0); + snd_ctl_elem_info_set_interface(info, iface); + snd_ctl_elem_info_set_device(info, device); + snd_ctl_elem_info_set_subdevice(info, subdevice); + snd_ctl_elem_info_set_name(info, name); + snd_ctl_elem_info_set_index(info, index); + err = snd_ctl_elem_info(handle, info); + if (err < 0 && comment && check_comment_access(comment, "user")) { + err = add_user_control(handle, info, comment); + if (err < 0) { + cerror(doit, "failed to add user control #%d (%s)", + numid, snd_strerror(err)); + return err; + } + } + } + if (err < 0) { + cerror(doit, "failed to obtain info for control #%d (%s)", numid, snd_strerror(err)); + return -ENOENT; + } + numid1 = snd_ctl_elem_info_get_numid(info); + iface1 = snd_ctl_elem_info_get_interface(info); + device1 = snd_ctl_elem_info_get_device(info); + subdevice1 = snd_ctl_elem_info_get_subdevice(info); + name1 = snd_ctl_elem_info_get_name(info); + index1 = snd_ctl_elem_info_get_index(info); + count = snd_ctl_elem_info_get_count(info); + type = snd_ctl_elem_info_get_type(info); + if (err |= numid != numid1 && !force_restore) + cerror(doit, "warning: numid mismatch (%d/%d) for control #%d", + numid, numid1, numid); + if (err |= iface != iface1) + cerror(doit, "warning: iface mismatch (%d/%d) for control #%d", iface, iface1, numid); + if (err |= device != device1) + cerror(doit, "warning: device mismatch (%ld/%ld) for control #%d", device, device1, numid); + if (err |= subdevice != subdevice1) + cerror(doit, "warning: subdevice mismatch (%ld/%ld) for control #%d", subdevice, subdevice1, numid); + if (err |= strcmp(name, name1)) + cerror(doit, "warning: name mismatch (%s/%s) for control #%d", name, name1, numid); + if (err |= index != index1) + cerror(doit, "warning: index mismatch (%ld/%ld) for control #%d", index, index1, numid); + if (err < 0) { + cerror(doit, "failed to obtain info for control #%d (%s)", numid, snd_strerror(err)); + return -ENOENT; + } + + if (comment) { + if (check_comment_type(comment, type) < 0) + cerror(doit, "incompatible field type for control #%d", numid); + if (type == SND_CTL_ELEM_TYPE_INTEGER) { + if (check_comment_range(handle, comment, info, value, doit) < 0) { + cerror(doit, "value range mismatch for control #%d", + numid); + return -EINVAL; + } + } + /* inactive controls are not restored */ + if (comment && check_comment_access(comment, "inactive")) + return 0; + } + + if (snd_ctl_elem_info_is_inactive(info) || + !snd_ctl_elem_info_is_writable(info)) + return 0; + snd_ctl_elem_value_set_numid(ctl, numid1); + + if (count == 1) { + err = restore_config_value(handle, info, type, value, ctl, 0, doit); + if (err < 0) + return err; + if (err > 0) + goto _ok; + } + switch (type) { + case SND_CTL_ELEM_TYPE_BYTES: + case SND_CTL_ELEM_TYPE_IEC958: + { + const char *buf; + err = snd_config_get_string(value, &buf); + if (err >= 0) { + int c1 = 0; + int len = strlen(buf); + unsigned int idx = 0; + int size = type == SND_CTL_ELEM_TYPE_BYTES ? + count : sizeof(snd_aes_iec958_t); + if (size * 2 != len) { + cerror(doit, "bad control.%d.value contents\n", numid); + return -EINVAL; + } + while (*buf) { + int c = *buf++; + if ((c = hextodigit(c)) < 0) { + cerror(doit, "bad control.%d.value contents\n", numid); + return -EINVAL; + } + if (idx % 2 == 1) + snd_ctl_elem_value_set_byte(ctl, idx / 2, c1 << 4 | c); + else + c1 = c; + idx++; + } + goto _ok; + } + } + default: + break; + } + if (snd_config_get_type(value) != SND_CONFIG_TYPE_COMPOUND) { + if (!force_restore || !doit) { + cerror(doit, "bad control.%d.value type", numid); + return -EINVAL; + } + for (idx = 0; idx < count; ++idx) { + err = restore_config_value2(handle, info, type, value, + ctl, idx, numid, doit); + if (err < 0) + return err; + } + goto _ok; + } + + set = (char*) alloca(count); + memset(set, 0, count); + snd_config_for_each(i, next, value) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *id; + if (snd_config_get_id(n, &id) < 0) + continue; + idx = atoi(id); + if (idx >= count || set[idx]) { + cerror(doit, "bad control.%d.value index", numid); + if (!force_restore || !doit) + return -EINVAL; + continue; + } + err = restore_config_value2(handle, info, type, n, + ctl, idx, numid, doit); + if (err < 0) + return err; + if (err > 0) + set[idx] = 1; + } + for (idx = 0; idx < count; ++idx) { + if (!set[idx]) { + cerror(doit, "control.%d.value.%d is not specified", numid, idx); + if (!force_restore || !doit) + return -EINVAL; + } + } + + _ok: + err = doit ? snd_ctl_elem_write(handle, ctl) : 0; + if (err < 0) { + error("Cannot write control '%d:%ld:%ld:%s:%ld' : %s", (int)iface, device, subdevice, name, index, snd_strerror(err)); + return err; + } + return 0; +} + +static int set_controls(int card, snd_config_t *top, int doit) +{ + snd_ctl_t *handle; + snd_ctl_card_info_t *info; + snd_config_t *control; + snd_config_iterator_t i, next; + int err, maxnumid = -1; + char name[32], tmpid[16]; + const char *id; + snd_ctl_card_info_alloca(&info); + + sprintf(name, "hw:%d", card); + dbg("device='%s', doit=%i", name, doit); + err = snd_ctl_open(&handle, name, 0); + if (err < 0) { + error("snd_ctl_open error: %s", snd_strerror(err)); + return err; + } + err = snd_ctl_card_info(handle, info); + if (err < 0) { + error("snd_ctl_card_info error: %s", snd_strerror(err)); + goto _close; + } + id = snd_ctl_card_info_get_id(info); + dbg("card-info-id: '%s'", id); + err = snd_config_searchv(top, &control, "state", id, "control", 0); + if (err < 0) { + if (force_restore) { + sprintf(tmpid, "card%d", card); + err = snd_config_searchv(top, &control, "state", tmpid, "control", 0); + if (! err) + id = tmpid; + } + if (err < 0) { + fprintf(stderr, "No state is present for card %s\n", id); + goto _close; + } + id = tmpid; + } + if (snd_config_get_type(control) != SND_CONFIG_TYPE_COMPOUND) { + cerror(doit, "state.%s.control is not a compound\n", id); + return -EINVAL; + } + snd_config_for_each(i, next, control) { + snd_config_t *n = snd_config_iterator_entry(i); + err = set_control(handle, n, &maxnumid, doit); + if (err < 0 && (!force_restore || !doit)) + goto _close; + } + + dbg("maxnumid=%i", maxnumid); + /* check if we have additional controls in driver */ + /* in this case we should go through init procedure */ + if (!doit && maxnumid >= 0) { + snd_ctl_elem_info_t *info; + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_info_set_numid(info, maxnumid+1); + if (snd_ctl_elem_info(handle, info) == 0) { + /* not very informative */ + /* but value is used for check only */ + err = -EAGAIN; + dbg("more controls than maxnumid?"); + goto _close; + } + } + + _close: + snd_ctl_close(handle); + dbg("result code: %i", err); + return err; +} + +int save_state(const char *file, const char *cardname) +{ + int err; + snd_config_t *config; + snd_input_t *in; + snd_output_t *out; + int stdio; + + err = snd_config_top(&config); + if (err < 0) { + error("snd_config_top error: %s", snd_strerror(err)); + return err; + } + stdio = !strcmp(file, "-"); + if (!stdio && (err = snd_input_stdio_open(&in, file, "r")) >= 0) { + err = snd_config_load(config, in); + snd_input_close(in); +#if 0 + if (err < 0) { + error("snd_config_load error: %s", snd_strerror(err)); + return err; + } +#endif + } + + if (!cardname) { + int card, first = 1; + + card = -1; + /* find each installed soundcards */ + while (1) { + if (snd_card_next(&card) < 0) + break; + if (card < 0) { + if (first) { + if (ignore_nocards) { + return 0; + } else { + error("No soundcards found..."); + return -ENODEV; + } + } + break; + } + first = 0; + if ((err = get_controls(card, config))) + return err; + } + } else { + int cardno; + + cardno = snd_card_get_index(cardname); + if (cardno < 0) { + error("Cannot find soundcard '%s'...", cardname); + return cardno; + } + if ((err = get_controls(cardno, config))) { + return err; + } + } + + if (stdio) + err = snd_output_stdio_attach(&out, stdout, 0); + else + err = snd_output_stdio_open(&out, file, "w"); + if (err < 0) { + error("Cannot open %s for writing: %s", file, snd_strerror(err)); + return -errno; + } + err = snd_config_save(config, out); + snd_output_close(out); + if (err < 0) + error("snd_config_save: %s", snd_strerror(err)); + return 0; +} + +int load_state(const char *file, const char *initfile, const char *cardname, + int do_init) +{ + int err, finalerr = 0; + snd_config_t *config; + snd_input_t *in; + int stdio; + + err = snd_config_top(&config); + if (err < 0) { + error("snd_config_top error: %s", snd_strerror(err)); + return err; + } + stdio = !strcmp(file, "-"); + if (stdio) + err = snd_input_stdio_attach(&in, stdin, 0); + else + err = snd_input_stdio_open(&in, file, "r"); + if (err >= 0) { + err = snd_config_load(config, in); + snd_input_close(in); + if (err < 0) { + error("snd_config_load error: %s", snd_strerror(err)); + return err; + } + } else { + int card, first = 1; + char cardname1[16]; + + error("Cannot open %s for reading: %s", file, snd_strerror(err)); + finalerr = err; + card = -1; + /* find each installed soundcards */ + while (1) { + if (snd_card_next(&card) < 0) + break; + if (card < 0) + break; + first = 0; + if (!do_init) + break; + sprintf(cardname1, "%i", card); + err = init(initfile, cardname1); + if (err < 0) { + finalerr = err; + initfailed(card, "init", err); + } + initfailed(card, "restore", -ENOENT); + } + if (first) + finalerr = 0; /* no cards, no error code */ + return finalerr; + } + + if (!cardname) { + int card, first = 1; + char cardname1[16]; + + card = -1; + /* find each installed soundcards */ + while (1) { + if (snd_card_next(&card) < 0) + break; + if (card < 0) { + if (first) { + if (ignore_nocards) { + return 0; + } else { + error("No soundcards found..."); + return -ENODEV; + } + } + break; + } + first = 0; + /* do a check if controls matches state file */ + if (do_init && set_controls(card, config, 0)) { + sprintf(cardname1, "%i", card); + err = init(initfile, cardname1); + if (err < 0) { + initfailed(card, "init", err); + finalerr = err; + } + } + if ((err = set_controls(card, config, 1))) { + if (!force_restore) + finalerr = err; + initfailed(card, "restore", err); + } + } + } else { + int cardno; + + cardno = snd_card_get_index(cardname); + if (cardno < 0) { + error("Cannot find soundcard '%s'...", cardname); + return -ENODEV; + } + /* do a check if controls matches state file */ + if (do_init && set_controls(cardno, config, 0)) { + err = init(initfile, cardname); + if (err < 0) { + initfailed(cardno, "init", err); + finalerr = err; + } + } + if ((err = set_controls(cardno, config, 1))) { + initfailed(cardno, "restore", err); + if (!force_restore) + return err; + } + } + return finalerr; +} diff --git a/alsactl/utils.c b/alsactl/utils.c new file mode 100644 index 0000000..a27eb6e --- /dev/null +++ b/alsactl/utils.c @@ -0,0 +1,102 @@ +/* + * Advanced Linux Sound Architecture Control Program - Support routines + * Copyright (c) by Jaroslav Kysela + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "alsactl.h" + +int file_map(const char *filename, char **buf, size_t *bufsize) +{ + struct stat stats; + int fd; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + return -1; + } + + if (fstat(fd, &stats) < 0) { + close(fd); + return -1; + } + + *buf = mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (*buf == MAP_FAILED) { + close(fd); + return -1; + } + *bufsize = stats.st_size; + + close(fd); + + return 0; +} + +void file_unmap(void *buf, size_t bufsize) +{ + munmap(buf, bufsize); +} + +size_t line_width(const char *buf, size_t bufsize, size_t pos) +{ + int esc = 0; + size_t count; + + for (count = pos; count < bufsize; count++) { + if (!esc && buf[count] == '\n') + break; + esc = buf[count] == '\\'; + } + + return count - pos; +} + +void initfailed(int cardnumber, const char *reason, int exitcode) +{ + int fp; + char *str; + char sexitcode[16]; + + if (statefile == NULL) + return; + if (snd_card_get_name(cardnumber, &str) < 0) + return; + sprintf(sexitcode, "%i", exitcode); + fp = open(statefile, O_WRONLY|O_CREAT|O_APPEND, 0644); + write(fp, str, strlen(str)); + write(fp, ":", 1); + write(fp, reason, strlen(reason)); + write(fp, ":", 1); + write(fp, sexitcode, strlen(sexitcode)); + write(fp, "\n", 1); + close(fp); + free(str); +} diff --git a/alsaloop/Makefile.am b/alsaloop/Makefile.am new file mode 100644 index 0000000..f76eafd --- /dev/null +++ b/alsaloop/Makefile.am @@ -0,0 +1,14 @@ +INCLUDES = -I$(top_srcdir)/include +LDADD = -lm +CFLAGS += -D_GNU_SOURCE +if HAVE_SAMPLERATE +LDADD += -lsamplerate +endif +# LDFLAGS = -static +# CFLAGS += -g -Wall + +bin_PROGRAMS = alsaloop +alsaloop_SOURCES = alsaloop.c pcmjob.c control.c +noinst_HEADERS = alsaloop.h +man_MANS = alsaloop.1 +EXTRA_DIST = alsaloop.1 diff --git a/alsaloop/Makefile.in b/alsaloop/Makefile.in new file mode 100644 index 0000000..929b56d --- /dev/null +++ b/alsaloop/Makefile.in @@ -0,0 +1,590 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_SAMPLERATE_TRUE@am__append_1 = -lsamplerate +bin_PROGRAMS = alsaloop$(EXEEXT) +subdir = alsaloop +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_alsaloop_OBJECTS = alsaloop.$(OBJEXT) pcmjob.$(OBJEXT) \ + control.$(OBJEXT) +alsaloop_OBJECTS = $(am_alsaloop_OBJECTS) +alsaloop_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +alsaloop_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(alsaloop_SOURCES) +DIST_SOURCES = $(alsaloop_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ -D_GNU_SOURCE +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +LDADD = -lm $(am__append_1) +alsaloop_SOURCES = alsaloop.c pcmjob.c control.c +noinst_HEADERS = alsaloop.h +man_MANS = alsaloop.1 +EXTRA_DIST = alsaloop.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alsaloop/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign alsaloop/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +alsaloop$(EXEEXT): $(alsaloop_OBJECTS) $(alsaloop_DEPENDENCIES) + @rm -f alsaloop$(EXEEXT) + $(LINK) $(alsaloop_OBJECTS) $(alsaloop_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alsaloop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcmjob.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alsaloop/alsaloop.1 b/alsaloop/alsaloop.1 new file mode 100644 index 0000000..048d1e0 --- /dev/null +++ b/alsaloop/alsaloop.1 @@ -0,0 +1,206 @@ +.TH ALSALOOP 1 "5 Aug 2010" +.SH NAME +alsaloop \- command-line PCM loopback +.SH SYNOPSIS +\fBalsaloop\fP [\fI\-option\fP] [\fIcmd\fP] +.SH DESCRIPTION + +\fBalsaloop\fP allows create a PCM loopback between a PCM capture device +and a PCM playback device. + +\fBalsaloop\fP supports multiple soundcards, adaptive clock synchronization, +adaptive rate resampling using the samplerate library (if available in +the system). Also, mixer controls can be redirected from one card to +another (for example Master and PCM). + +.SH OPTIONS + +.TP +\fI\-h\fP | \fI\-\-help\fP + +Prints the help information. + +.TP +\fI\-g \fP | \fI\-\-config=\fP + +Use given configuration file. The syntax of this file is simple: one line +contains the command line options for one job. The '#' means comment and +rest of line is ignored. Example: + + # First line - comment, second line - first job + -C hw:1,0 -P hw:0,0 -t 50000 -T 1 + # Third line - comment, fourth line - second job + -C hw:1,1 -P hw:0,1 -t 40000 -T 2 + +.TP +\fI\-d\fP | \fI\-\-daemonize\fP + +Daemonize the main process and use syslog for messages. + +.TP +\fI\-P \fP | \fI\-\-pdevice=\fP + +Use given playback device. + +.TP +\fI\-C \fP | \fI\-\-cdevice=\fP + +Use given capture device. + +.TP +\fI\-X \fP | \fI\-\-pctl=\fP + +Use given CTL device for playback. + +.TP +\fI\-Y \fP | \fI\-\-cctl=\fP + +Use given CTL device for capture. + +.TP +\fI\-l \fP | \fI\-\-latency=\fP + +Requested latency in frames. + +.TP +\fI\-t \fP | \fI\-\-tlatency=\fP + +Requested latency in usec (1/1000000sec). + +.TP +\fI\-f \fP | \fI\-\-format=\fP + +Format specification (usually S16_LE S32_LE). Use -h to list all formats. +Default format is S16_LE. + +.TP +\fI\-c \fP | \fI\-\-channels=\fP + +Channel count specification. Default value is 2. + +.TP +\fI\-c \fP | \fI\-\-rate=\fP + +Rate specification. Default value is 48000 (Hz). + +.TP +\fI\-n\fP | \fI\-\-resample\fP + +Allow rate resampling using alsa-lib. + +.TP +\fI\-A \fP | \fI\-\-samplerate=\fP + +Use libsamplerate and choose a converter: + + 0 or sincbest - best quality + 1 or sincmedium - medium quality + 2 or sincfastest - lowest quality + 3 or zerohold - hold zero samples + 4 or linear - worst quality - linear resampling + 5 or auto - choose best method + +.TP +\fI\-B \fP | \fI\-\-buffer=\fP + +Buffer size in frames. + +.TP +\fI\-E \fP | \fI\-\-period=\fP + +Period size in frames. + +.TP +\fI\-s \fP | \fI\-\-seconds=\fP + +Duration of loop in seconds. + +.TP +\fI\-b\fP | \fI\-\-nblock\fP + +Non-block mode (very early process wakeup). Eats more CPU. + +.TP +\fI\-S \fP | \fI\-\-sync=\fP + +Sync mode specification for capture to playback stream: + 0 or none - do not touch the stream + 1 or simple - add or remove samples to keep + both streams synchronized + 2 or captshift - use driver for the capture device + (if supported) to compensate + the rate shift + 3 or playshift - use driver for the playback device + (if supported) to compensate + the rate shift + 4 or samplerate - use samplerate library to do rate resampling + 5 or auto - automatically selects the best method + in this order: captshift, playshift, + samplerate, simple + +.TP +\fI\-T \fP | \fI\-\-thread=\fP + +Thread number (-1 means create a unique thread). All jobs with same +thread numbers are run within one thread. + +.TP +\fI\-m \fP | \fI\-\-mixer=\fP + +Redirect mixer control from the playback card to the capture card. Format of +\fImixid\fP is SRCID(PLAYBACK)[@DSTID(PLAYBACK)]: + + "name='Master Playback Switch'@name='Another Switch'" + "name='PCM Playback Volume'" + +Known attributes: + + name - control ID name + index - control ID index + device - control ID device + subdevice - control ID subdevice + iface - control ID interface + numid - control ID numid + +.TP +\fI\-O \fP | \fI\-\-ossmixer=\fP + +Redirect mixer control from the OSS Mixer emulation layer (capture card) +to the ALSA layer (capture card). Format of \fIossmixid\fP is +ALSAID[,INDEX]@OSSID: + + "Master@VOLUME" + "PCM,1@ALTPCM" + +Known OSS attributes: + + VOLUME, BASS, TREBLE, SYNTH, PCM, SPEAKER, LINE, MIC, CD, IMIX, ALTPCM, + RECLEV, IGAIN, OGAIN, LINE1, LINE2, LINE3, DIGITAL1, DIGITAL2, DIGITAL3, + PHONEIN, PHONEOUT, VIDEO, RADIO, MONITOR + +.TP +\fI\-v\fP | \fI\-\-verbose\fP + +Verbose mode. Use multiple times to increase verbosity. + + +.TP +\fI\-U\fP | \fI\-\-xrun\fP + +Verbose xrun profiling. + +.TP +\fI\-W \fP | \fI\-\-wake=\fP + +Set process wake timeout. + +.SH EXAMPLES + +.TP +\fBalsaloop \-C hw:0,0 \-P hw:1,0 \-t 50000\fR + +.SH BUGS +None known. +.SH AUTHOR +\fBalsaloop\fP is by Jaroslav Kysela . +This document is by Jaroslav Kysela . diff --git a/alsaloop/alsaloop.c b/alsaloop/alsaloop.c new file mode 100644 index 0000000..8710dd1 --- /dev/null +++ b/alsaloop/alsaloop.c @@ -0,0 +1,923 @@ +/* + * A simple PCM loopback utility with adaptive sample rate support + * + * Author: Jaroslav Kysela + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "alsaloop.h" + +struct loopback_thread { + int threaded; + pthread_t thread; + int exitcode; + struct loopback **loopbacks; + int loopbacks_count; + snd_output_t *output; +}; + +int quit = 0; +int verbose = 0; +int workarounds = 0; +int daemonize = 0; +int use_syslog = 0; +struct loopback **loopbacks = NULL; +int loopbacks_count = 0; +char **my_argv = NULL; +int my_argc = 0; +struct loopback_thread *threads; +int threads_count = 0; +pthread_t main_job; +int arg_default_xrun = 0; +int arg_default_wake = 0; + +static void my_exit(struct loopback_thread *thread, int exitcode) +{ + int i; + + for (i = 0; i < thread->loopbacks_count; i++) + pcmjob_done(thread->loopbacks[i]); + if (thread->threaded) { + thread->exitcode = exitcode; + pthread_exit(0); + } + exit(exitcode); +} + +static int create_loopback_handle(struct loopback_handle **_handle, + const char *device, + const char *ctldev, + const char *id) +{ + char idbuf[1024]; + struct loopback_handle *handle; + + handle = calloc(1, sizeof(*handle)); + if (handle == NULL) + return -ENOMEM; + if (device == NULL) + device = "hw:0,0"; + handle->device = strdup(device); + if (handle->device == NULL) + return -ENOMEM; + if (ctldev) { + handle->ctldev = strdup(ctldev); + if (handle->ctldev == NULL) + return -ENOMEM; + } else { + handle->ctldev = NULL; + } + snprintf(idbuf, sizeof(idbuf)-1, "%s %s", id, device); + idbuf[sizeof(idbuf)-1] = '\0'; + handle->id = strdup(idbuf); + handle->access = SND_PCM_ACCESS_RW_INTERLEAVED; + handle->format = SND_PCM_FORMAT_S16_LE; + handle->rate = handle->rate_req = 48000; + handle->channels = 2; + handle->resample = 0; + *_handle = handle; + return 0; +} + +static int create_loopback(struct loopback **_handle, + struct loopback_handle *play, + struct loopback_handle *capt, + snd_output_t *output) +{ + struct loopback *handle; + + handle = calloc(1, sizeof(*handle)); + if (handle == NULL) + return -ENOMEM; + handle->play = play; + handle->capt = capt; + play->loopback = handle; + capt->loopback = handle; + handle->latency_req = 0; + handle->latency_reqtime = 10000; + handle->loop_time = ~0UL; + handle->loop_limit = ~0ULL; + handle->output = output; + handle->state = output; +#ifdef USE_SAMPLERATE + handle->src_enable = 1; + handle->src_converter_type = SRC_SINC_BEST_QUALITY; +#endif + *_handle = handle; + return 0; +} + +static void set_loop_time(struct loopback *loop, unsigned long loop_time) +{ + loop->loop_time = loop_time; + loop->loop_limit = loop->capt->rate * loop_time; +} + +static void setscheduler(void) +{ + struct sched_param sched_param; + + if (sched_getparam(0, &sched_param) < 0) { + logit(LOG_WARNING, "Scheduler getparam failed.\n"); + return; + } + sched_param.sched_priority = sched_get_priority_max(SCHED_RR); + if (!sched_setscheduler(0, SCHED_RR, &sched_param)) { + if (verbose) + logit(LOG_WARNING, "Scheduler set to Round Robin with priority %i\n", sched_param.sched_priority); + return; + } + if (verbose) + logit(LOG_INFO, "!!!Scheduler set to Round Robin with priority %i FAILED!\n", sched_param.sched_priority); +} + +void help(void) +{ + int k; + printf( +"Usage: alsaloop [OPTION]...\n\n" +"-h,--help help\n" +"-g,--config configuration file (one line = one job specified)\n" +"-d,--daemonize daemonize the main process and use syslog for errors\n" +"-P,--pdevice playback device\n" +"-C,--cdevice capture device\n" +"-X,--pctl playback ctl device\n" +"-Y,--cctl capture ctl device\n" +"-l,--latency requested latency in frames\n" +"-t,--tlatency requested latency in usec (1/1000000sec)\n" +"-f,--format sample format\n" +"-c,--channels channels\n" +"-r,--rate rate\n" +"-n,--resample resample in alsa-lib\n" +"-A,--samplerate use converter (0=sincbest,1=sincmedium,2=sincfastest,\n" +" 3=zerohold,4=linear)\n" +"-B,--buffer buffer size in frames\n" +"-E,--period period size in frames\n" +"-s,--seconds duration of loop in seconds\n" +"-b,--nblock non-block mode (very early process wakeup)\n" +"-S,--sync sync mode(0=none,1=simple,2=captshift,3=playshift,4=samplerate,\n" +" 5=auto)\n" +"-a,--slave stream parameters slave mode (0=auto, 1=on, 2=off)\n" +"-T,--thread thread number (-1 = create unique)\n" +"-m,--mixer redirect mixer, argument is:\n" +" SRC_SLAVE_ID(PLAYBACK)[@DST_SLAVE_ID(CAPTURE)]\n" +"-O,--ossmixer rescan and redirect oss mixer, argument is:\n" +" ALSA_ID@OSS_ID (for example: \"Master@VOLUME\")\n" +"-e,--effect apply an effect (bandpass filter sweep)\n" +"-v,--verbose verbose mode (more -v means more verbose)\n" +"-w,--workaround use workaround (serialopen)\n" +"-U,--xrun xrun profiling\n" +"-W,--wake process wake timeout in ms\n" +); + printf("\nRecognized sample formats are:"); + for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) { + const char *s = snd_pcm_format_name(k); + if (s) + printf(" %s", s); + } + printf("\n\n"); + printf( +"Tip #1 (usable 500ms latency, good CPU usage, superb xrun prevention):\n" +" alsaloop -t 500000\n" +"Tip #2 (superb 1ms latency, but heavy CPU usage):\n" +" alsaloop -t 1000\n" +); +} + +static long timediff(struct timeval t1, struct timeval t2) +{ + signed long l; + + t1.tv_sec -= t2.tv_sec; + l = (signed long) t1.tv_usec - (signed long) t2.tv_usec; + if (l < 0) { + t1.tv_sec--; + l = 1000000 + l; + l %= 1000000; + } + return (t1.tv_sec * 1000000) + l; +} + +static void add_loop(struct loopback *loop) +{ + loopbacks = realloc(loopbacks, (loopbacks_count + 1) * + sizeof(struct loopback *)); + if (loopbacks == NULL) { + logit(LOG_CRIT, "No enough memory\n"); + exit(EXIT_FAILURE); + } + loopbacks[loopbacks_count++] = loop; +} + +static int init_mixer_control(struct loopback_control *control, + char *id) +{ + int err; + + err = snd_ctl_elem_id_malloc(&control->id); + if (err < 0) + return err; + err = snd_ctl_elem_info_malloc(&control->info); + if (err < 0) + return err; + err = snd_ctl_elem_value_malloc(&control->value); + if (err < 0) + return err; + err = control_parse_id(id, control->id); + if (err < 0) + return err; + return 0; +} + +static int add_mixers(struct loopback *loop, + char **mixers, + int mixers_count) +{ + struct loopback_mixer *mixer, *last = NULL; + char *str1; + int err; + + while (mixers_count > 0) { + mixer = calloc(1, sizeof(*mixer)); + if (mixer == NULL) + return -ENOMEM; + if (last) + last->next = mixer; + else + loop->controls = mixer; + last = mixer; + str1 = strchr(*mixers, '@'); + if (str1) + *str1 = '\0'; + err = init_mixer_control(&mixer->src, *mixers); + if (err < 0) { + logit(LOG_CRIT, "Wrong mixer control ID syntax '%s'\n", *mixers); + return -EINVAL; + } + err = init_mixer_control(&mixer->dst, str1 ? str1 + 1 : *mixers); + if (err < 0) { + logit(LOG_CRIT, "Wrong mixer control ID syntax '%s'\n", str1 ? str1 + 1 : *mixers); + return -EINVAL; + } + if (str1) + *str1 = '@'; + mixers++; + mixers_count--; + } + return 0; +} + +static int add_oss_mixers(struct loopback *loop, + char **mixers, + int mixers_count) +{ + struct loopback_ossmixer *mixer, *last = NULL; + char *str1, *str2; + + while (mixers_count > 0) { + mixer = calloc(1, sizeof(*mixer)); + if (mixer == NULL) + return -ENOMEM; + if (last) + last->next = mixer; + else + loop->oss_controls = mixer; + last = mixer; + str1 = strchr(*mixers, ','); + if (str1) + *str1 = '\0'; + str2 = strchr(str1 ? str1 + 1 : *mixers, '@'); + if (str2) + *str2 = '\0'; + mixer->alsa_id = strdup(*mixers); + if (str1) + mixer->alsa_index = atoi(str1); + mixer->oss_id = strdup(str2 ? str2 + 1 : *mixers); + if (mixer->alsa_id == NULL || mixer->oss_id == NULL) { + logit(LOG_CRIT, "Not enough memory"); + return -ENOMEM; + } + if (str1) + *str1 = ','; + if (str2) + *str2 = ','; + mixers++; + mixers_count--; + } + return 0; +} + +static int parse_config_file(const char *file, snd_output_t *output); + +static int parse_config(int argc, char *argv[], snd_output_t *output, + int cmdline) +{ + struct option long_option[] = + { + {"help", 0, NULL, 'h'}, + {"config", 1, NULL, 'g'}, + {"daemonize", 0, NULL, 'd'}, + {"pdevice", 1, NULL, 'P'}, + {"cdevice", 1, NULL, 'C'}, + {"pctl", 1, NULL, 'X'}, + {"cctl", 1, NULL, 'Y'}, + {"latency", 1, NULL, 'l'}, + {"tlatency", 1, NULL, 't'}, + {"format", 1, NULL, 'f'}, + {"channels", 1, NULL, 'c'}, + {"rate", 1, NULL, 'r'}, + {"buffer", 1, NULL, 'B'}, + {"period", 1, NULL, 'E'}, + {"seconds", 1, NULL, 's'}, + {"nblock", 0, NULL, 'b'}, + {"effect", 0, NULL, 'e'}, + {"verbose", 0, NULL, 'v'}, + {"resample", 0, NULL, 'n'}, + {"samplerate", 1, NULL, 'A'}, + {"sync", 1, NULL, 'S'}, + {"slave", 1, NULL, 'a'}, + {"thread", 1, NULL, 'T'}, + {"mixer", 1, NULL, 'm'}, + {"ossmixer", 1, NULL, 'O'}, + {"workaround", 1, NULL, 'w'}, + {"xrun", 0, NULL, 'U'}, + {NULL, 0, NULL, 0}, + }; + int err, morehelp; + char *arg_config = NULL; + char *arg_pdevice = NULL; + char *arg_cdevice = NULL; + char *arg_pctl = NULL; + char *arg_cctl = NULL; + unsigned int arg_latency_req = 0; + unsigned int arg_latency_reqtime = 10000; + snd_pcm_format_t arg_format = SND_PCM_FORMAT_S16_LE; + unsigned int arg_channels = 2; + unsigned int arg_rate = 48000; + snd_pcm_uframes_t arg_buffer_size = 0; + snd_pcm_uframes_t arg_period_size = 0; + unsigned long arg_loop_time = ~0UL; + int arg_nblock = 0; + int arg_effect = 0; + int arg_resample = 0; + int arg_samplerate = SRC_SINC_FASTEST + 1; + int arg_sync = SYNC_TYPE_AUTO; + int arg_slave = SLAVE_TYPE_AUTO; + int arg_thread = 0; + struct loopback *loop = NULL; + char *arg_mixers[MAX_MIXERS]; + int arg_mixers_count = 0; + char *arg_ossmixers[MAX_MIXERS]; + int arg_ossmixers_count = 0; + int arg_xrun = arg_default_xrun; + int arg_wake = arg_default_wake; + + morehelp = 0; + while (1) { + int c; + if ((c = getopt_long(argc, argv, + "hdg:P:C:X:Y:l:t:F:f:c:r:s:benvA:S:a:m:T:O:w:UW:", + long_option, NULL)) < 0) + break; + switch (c) { + case 'h': + morehelp++; + break; + case 'g': + arg_config = strdup(optarg); + break; + case 'd': + daemonize = 1; + use_syslog = 1; + openlog("alsaloop", LOG_NDELAY|LOG_PID, LOG_DAEMON); + break; + case 'P': + arg_pdevice = strdup(optarg); + break; + case 'C': + arg_cdevice = strdup(optarg); + break; + case 'X': + arg_pctl = strdup(optarg); + break; + case 'Y': + arg_cctl = strdup(optarg); + break; + case 'l': + err = atoi(optarg); + arg_latency_req = err >= 4 ? err : 4; + break; + case 't': + err = atoi(optarg); + arg_latency_reqtime = err >= 500 ? err : 500; + break; + case 'f': + arg_format = snd_pcm_format_value(optarg); + if (arg_format == SND_PCM_FORMAT_UNKNOWN) { + logit(LOG_WARNING, "Unknown format, setting to default S16_LE\n"); + arg_format = SND_PCM_FORMAT_S16_LE; + } + break; + case 'c': + err = atoi(optarg); + arg_channels = err >= 1 && err < 1024 ? err : 1; + break; + case 'r': + err = atoi(optarg); + arg_rate = err >= 4000 && err < 200000 ? err : 44100; + break; + case 'B': + err = atoi(optarg); + arg_buffer_size = err >= 32 && err < 200000 ? err : 0; + break; + case 'E': + err = atoi(optarg); + arg_period_size = err >= 32 && err < 200000 ? err : 0; + break; + case 's': + err = atoi(optarg); + arg_loop_time = err >= 1 && err <= 100000 ? err : 30; + break; + case 'b': + arg_nblock = 1; + break; + case 'e': + arg_effect = 1; + break; + case 'n': + arg_resample = 1; + break; + case 'A': + if (strcasecmp(optarg, "sincbest") == 0) + arg_samplerate = SRC_SINC_BEST_QUALITY; + else if (strcasecmp(optarg, "sincmedium") == 0) + arg_samplerate = SRC_SINC_MEDIUM_QUALITY; + else if (strcasecmp(optarg, "sincfastest") == 0) + arg_samplerate = SRC_SINC_FASTEST; + else if (strcasecmp(optarg, "zerohold") == 0) + arg_samplerate = SRC_ZERO_ORDER_HOLD; + else if (strcasecmp(optarg, "linear") == 0) + arg_samplerate = SRC_LINEAR; + else + arg_samplerate = atoi(optarg); + if (arg_samplerate < 0 || arg_samplerate > SRC_LINEAR) + arg_sync = SRC_SINC_FASTEST; + arg_samplerate += 1; + break; + case 'S': + if (strcasecmp(optarg, "samplerate") == 0) + arg_sync = SYNC_TYPE_SAMPLERATE; + else if (optarg[0] == 'n') + arg_sync = SYNC_TYPE_NONE; + else if (optarg[0] == 's') + arg_sync = SYNC_TYPE_SIMPLE; + else if (optarg[0] == 'c') + arg_sync = SYNC_TYPE_CAPTRATESHIFT; + else if (optarg[0] == 'p') + arg_sync = SYNC_TYPE_PLAYRATESHIFT; + else if (optarg[0] == 'r') + arg_sync = SYNC_TYPE_SAMPLERATE; + else + arg_sync = atoi(optarg); + if (arg_sync < 0 || arg_sync > SYNC_TYPE_LAST) + arg_sync = SYNC_TYPE_AUTO; + break; + case 'a': + if (optarg[0] == 'a') + arg_slave = SLAVE_TYPE_AUTO; + else if (strcasecmp(optarg, "on") == 0) + arg_slave = SLAVE_TYPE_ON; + else if (strcasecmp(optarg, "off") == 0) + arg_slave = SLAVE_TYPE_OFF; + else + arg_slave = atoi(optarg); + if (arg_slave < 0 || arg_slave > SLAVE_TYPE_LAST) + arg_slave = SLAVE_TYPE_AUTO; + break; + case 'T': + arg_thread = atoi(optarg); + if (arg_thread < 0) + arg_thread = 10000000 + loopbacks_count; + break; + case 'm': + if (arg_mixers_count >= MAX_MIXERS) { + logit(LOG_CRIT, "Maximum redirected mixer controls reached (max %i)\n", (int)MAX_MIXERS); + exit(EXIT_FAILURE); + } + arg_mixers[arg_mixers_count++] = optarg; + break; + case 'O': + if (arg_ossmixers_count >= MAX_MIXERS) { + logit(LOG_CRIT, "Maximum redirected mixer controls reached (max %i)\n", (int)MAX_MIXERS); + exit(EXIT_FAILURE); + } + arg_ossmixers[arg_ossmixers_count++] = optarg; + break; + case 'v': + verbose++; + break; + case 'w': + if (strcasecmp(optarg, "serialopen") == 0) + workarounds |= WORKAROUND_SERIALOPEN; + break; + case 'U': + arg_xrun = 1; + if (cmdline) + arg_default_xrun = 1; + break; + case 'W': + arg_wake = atoi(optarg); + if (cmdline) + arg_default_wake = arg_wake; + break; + } + } + + if (morehelp) { + help(); + exit(EXIT_SUCCESS); + } + if (arg_config == NULL) { + struct loopback_handle *play; + struct loopback_handle *capt; + err = create_loopback_handle(&play, arg_pdevice, arg_pctl, "playback"); + if (err < 0) { + logit(LOG_CRIT, "Unable to create playback handle.\n"); + exit(EXIT_FAILURE); + } + err = create_loopback_handle(&capt, arg_cdevice, arg_cctl, "capture"); + if (err < 0) { + logit(LOG_CRIT, "Unable to create capture handle.\n"); + exit(EXIT_FAILURE); + } + err = create_loopback(&loop, play, capt, output); + if (err < 0) { + logit(LOG_CRIT, "Unable to create loopback handle.\n"); + exit(EXIT_FAILURE); + } + play->format = capt->format = arg_format; + play->rate = play->rate_req = capt->rate = capt->rate_req = arg_rate; + play->channels = capt->channels = arg_channels; + play->buffer_size_req = capt->buffer_size_req = arg_buffer_size; + play->period_size_req = capt->period_size_req = arg_period_size; + play->resample = capt->resample = arg_resample; + play->nblock = capt->nblock = arg_nblock ? 1 : 0; + loop->latency_req = arg_latency_req; + loop->latency_reqtime = arg_latency_reqtime; + loop->sync = arg_sync; + loop->slave = arg_slave; + loop->thread = arg_thread; + loop->xrun = arg_xrun; + loop->wake = arg_wake; + err = add_mixers(loop, arg_mixers, arg_mixers_count); + if (err < 0) { + logit(LOG_CRIT, "Unable to add mixer controls.\n"); + exit(EXIT_FAILURE); + } + err = add_oss_mixers(loop, arg_ossmixers, arg_ossmixers_count); + if (err < 0) { + logit(LOG_CRIT, "Unable to add ossmixer controls.\n"); + exit(EXIT_FAILURE); + } +#ifdef USE_SAMPLERATE + loop->src_enable = arg_samplerate > 0; + if (loop->src_enable) + loop->src_converter_type = arg_samplerate - 1; +#else + if (arg_samplerate > 0) { + logit(LOG_CRIT, "No libsamplerate support.\n"); + exit(EXIT_FAILURE); + } +#endif + set_loop_time(loop, arg_loop_time); + add_loop(loop); + return 0; + } + + return parse_config_file(arg_config, output); +} + +static int parse_config_file(const char *file, snd_output_t *output) +{ + FILE *fp; + char line[2048], word[2048]; + char *str, *ptr; + int argc, c, err = 0; + char **argv; + + fp = fopen(file, "r"); + if (fp == NULL) { + logit(LOG_CRIT, "Unable to open file '%s': %s\n", file, strerror(errno)); + return -EIO; + } + while (!feof(fp)) { + if (fgets(line, sizeof(line)-1, fp) == NULL) + break; + line[sizeof(line)-1] = '\0'; + my_argv = realloc(my_argv, my_argc + MAX_ARGS * sizeof(char *)); + if (my_argv == NULL) + return -ENOMEM; + argv = my_argv + my_argc; + argc = 0; + argv[argc++] = strdup(""); + my_argc++; + str = line; + while (*str) { + ptr = word; + while (*str && (*str == ' ' || *str < ' ')) + str++; + if (*str == '#') + goto __next; + if (*str == '\'' || *str == '\"') { + c = *str++; + while (*str && *str != c) + *ptr++ = *str++; + if (*str == c) + str++; + } else { + while (*str && *str != ' ' && *str != '\t') + *ptr++ = *str++; + } + if (ptr != word) { + if (*(ptr-1) == '\n') + ptr--; + *ptr = '\0'; + if (argc >= MAX_ARGS) { + logit(LOG_CRIT, "Too many arguments."); + goto __error; + } + argv[argc++] = strdup(word); + my_argc++; + } + } + /* erase runtime variables for getopt */ + optarg = NULL; + optind = opterr = 1; + optopt = '?'; + + err = parse_config(argc, argv, output, 0); + __next: + if (err < 0) + break; + err = 0; + } + __error: + fclose(fp); + + return err; +} + +static void thread_job1(void *_data) +{ + struct loopback_thread *thread = _data; + snd_output_t *output = thread->output; + struct pollfd *pfds = NULL; + int pfds_count = 0; + int i, j, err, wake = 1000000; + + setscheduler(); + + for (i = 0; i < thread->loopbacks_count; i++) { + err = pcmjob_init(thread->loopbacks[i]); + if (err < 0) { + logit(LOG_CRIT, "Loopback initialization failure.\n"); + my_exit(thread, EXIT_FAILURE); + } + } + for (i = 0; i < thread->loopbacks_count; i++) { + err = pcmjob_start(thread->loopbacks[i]); + if (err < 0) { + logit(LOG_CRIT, "Loopback start failure.\n"); + my_exit(thread, EXIT_FAILURE); + } + pfds_count += thread->loopbacks[i]->pollfd_count; + j = thread->loopbacks[i]->wake; + if (j > 0 && j < wake) + wake = j; + } + if (wake >= 1000000) + wake = -1; + pfds = calloc(pfds_count, sizeof(struct pollfd)); + if (pfds == NULL || pfds_count <= 0) { + logit(LOG_CRIT, "Poll FDs allocation failed.\n"); + my_exit(thread, EXIT_FAILURE); + } + while (!quit) { + struct timeval tv1, tv2; + for (i = j = 0; i < thread->loopbacks_count; i++) { + err = pcmjob_pollfds_init(thread->loopbacks[i], &pfds[j]); + if (err < 0) { + logit(LOG_CRIT, "Poll FD initialization failed.\n"); + my_exit(thread, EXIT_FAILURE); + } + j += err; + } + if (verbose > 10) + gettimeofday(&tv1, NULL); + err = poll(pfds, j, wake); + if (err < 0) + err = -errno; + if (verbose > 10) { + gettimeofday(&tv2, NULL); + snd_output_printf(output, "pool took %lius\n", timediff(tv2, tv1)); + } + if (err < 0) { + if (err == -EINTR || err == -ERESTART) + continue; + logit(LOG_CRIT, "Poll failed: %s\n", strerror(-err)); + my_exit(thread, EXIT_FAILURE); + } + for (i = j = 0; i < thread->loopbacks_count; i++) { + struct loopback *loop = thread->loopbacks[i]; + if (j < loop->active_pollfd_count) { + err = pcmjob_pollfds_handle(loop, &pfds[j]); + if (err < 0) { + logit(LOG_CRIT, "pcmjob failed.\n"); + exit(EXIT_FAILURE); + } + } + j += loop->active_pollfd_count; + } + } + + my_exit(thread, EXIT_SUCCESS); +} + +static void thread_job(struct loopback_thread *thread) +{ + if (!thread->threaded) { + thread_job1(thread); + return; + } + pthread_create(&thread->thread, NULL, (void *) &thread_job1, + (void *) thread); +} + +static void send_to_all(int sig) +{ + struct loopback_thread *thread; + int i; + + for (i = 0; i < threads_count; i++) { + thread = &threads[i]; + if (thread->threaded) + pthread_kill(thread->thread, sig); + } +} + +static void signal_handler(int sig) +{ + quit = 1; + send_to_all(SIGUSR2); +} + +static void signal_handler_state(int sig) +{ + pthread_t self = pthread_self(); + struct loopback_thread *thread; + int i, j; + + if (pthread_equal(main_job, self)) + send_to_all(SIGUSR1); + for (i = 0; i < threads_count; i++) { + thread = &threads[i]; + if (thread->thread == self) { + for (j = 0; j < thread->loopbacks_count; j++) + pcmjob_state(thread->loopbacks[j]); + } + } + signal(sig, signal_handler_state); +} + +static void signal_handler_ignore(int sig) +{ + signal(sig, signal_handler_ignore); +} + +int main(int argc, char *argv[]) +{ + snd_output_t *output; + int i, j, k, l, err; + + err = snd_output_stdio_attach(&output, stdout, 0); + if (err < 0) { + logit(LOG_CRIT, "Output failed: %s\n", snd_strerror(err)); + exit(EXIT_FAILURE); + } + err = parse_config(argc, argv, output, 1); + if (err < 0) { + logit(LOG_CRIT, "Unable to parse arguments or configuration...\n"); + exit(EXIT_FAILURE); + } + while (my_argc > 0) + free(my_argv[--my_argc]); + free(my_argv); + + if (loopbacks_count <= 0) { + logit(LOG_CRIT, "No loopback defined...\n"); + exit(EXIT_FAILURE); + } + + if (daemonize) { + if (daemon(0, 0) < 0) { + logit(LOG_CRIT, "daemon() failed: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + i = fork(); + if (i < 0) { + logit(LOG_CRIT, "fork() failed: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + if (i > 0) { + /* wait(&i); */ + exit(EXIT_SUCCESS); + } + } + + /* we must sort thread IDs */ + j = -1; + do { + k = 0x7fffffff; + for (i = 0; i < loopbacks_count; i++) { + if (loopbacks[i]->thread < k && + loopbacks[i]->thread > j) + k = loopbacks[i]->thread; + } + j++; + for (i = 0; i < loopbacks_count; i++) { + if (loopbacks[i]->thread == k) + loopbacks[i]->thread = j; + } + } while (k != 0x7fffffff); + /* fix maximum thread id */ + for (i = 0, j = -1; i < loopbacks_count; i++) { + if (loopbacks[i]->thread > j) + j = loopbacks[i]->thread; + } + j += 1; + threads = calloc(1, sizeof(struct loopback_thread) * j); + if (threads == NULL) { + logit(LOG_CRIT, "No enough memory\n"); + exit(EXIT_FAILURE); + } + /* sort all threads */ + for (k = 0; k < j; k++) { + for (i = l = 0; i < loopbacks_count; i++) + if (loopbacks[i]->thread == k) + l++; + threads[k].loopbacks = malloc(l * sizeof(struct loopback *)); + threads[k].loopbacks_count = l; + threads[k].output = output; + threads[k].threaded = j > 1; + for (i = l = 0; i < loopbacks_count; i++) + if (loopbacks[i]->thread == k) + threads[k].loopbacks[l++] = loopbacks[i]; + } + threads_count = j; + main_job = pthread_self(); + + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + signal(SIGABRT, signal_handler); + signal(SIGUSR1, signal_handler_state); + signal(SIGUSR2, signal_handler_ignore); + + for (k = 0; k < threads_count; k++) + thread_job(&threads[k]); + + if (j > 1) { + for (k = 0; k < threads_count; k++) + pthread_join(threads[k].thread, NULL); + } + + if (use_syslog) + closelog(); + exit(EXIT_SUCCESS); +} diff --git a/alsaloop/alsaloop.h b/alsaloop/alsaloop.h new file mode 100644 index 0000000..8dc445a --- /dev/null +++ b/alsaloop/alsaloop.h @@ -0,0 +1,218 @@ +/* + * A simple PCM loopback utility + * Copyright (c) 2010 by Jaroslav Kysela + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "aconfig.h" +#ifdef HAVE_SAMPLERATE_H +#define USE_SAMPLERATE +#include +#else +enum { + SRC_SINC_BEST_QUALITY = 0, + SRC_SINC_MEDIUM_QUALITY = 1, + SRC_SINC_FASTEST = 2, + SRC_ZERO_ORDER_HOLD = 3, + SRC_LINEAR = 4 +}; +#endif + +#define MAX_ARGS 128 +#define MAX_MIXERS 64 + +#if 0 +#define FILE_PWRITE "/tmp/alsaloop.praw" +#define FILE_CWRITE "/tmp/alsaloop.craw" +#endif + +#define WORKAROUND_SERIALOPEN (1<<0) + +typedef enum _sync_type { + SYNC_TYPE_NONE = 0, + SYNC_TYPE_SIMPLE, /* add or remove samples */ + SYNC_TYPE_CAPTRATESHIFT, + SYNC_TYPE_PLAYRATESHIFT, + SYNC_TYPE_SAMPLERATE, + SYNC_TYPE_AUTO, /* order: CAPTRATESHIFT, PLAYRATESHIFT, */ + /* SAMPLERATE, SIMPLE */ + SYNC_TYPE_LAST = SYNC_TYPE_AUTO +} sync_type_t; + +typedef enum _slave_type { + SLAVE_TYPE_AUTO = 0, + SLAVE_TYPE_ON = 1, + SLAVE_TYPE_OFF = 2, + SLAVE_TYPE_LAST = SLAVE_TYPE_OFF +} slave_type_t; + +struct loopback_control { + snd_ctl_elem_id_t *id; + snd_ctl_elem_info_t *info; + snd_ctl_elem_value_t *value; +}; + +struct loopback_mixer { + unsigned int skip:1; + struct loopback_control src; + struct loopback_control dst; + struct loopback_mixer *next; +}; + +struct loopback_ossmixer { + unsigned int skip:1; + const char *alsa_id; + int alsa_index; + const char *oss_id; + struct loopback_ossmixer *next; +}; + +struct loopback_handle { + struct loopback *loopback; + char *device; + char *ctldev; + char *id; + int card_number; + snd_pcm_t *handle; + snd_pcm_access_t access; + snd_pcm_format_t format; + unsigned int rate; + unsigned int rate_req; + unsigned int channels; + unsigned int buffer_size; + unsigned int period_size; + snd_pcm_uframes_t avail_min; + unsigned int buffer_size_req; + unsigned int period_size_req; + unsigned int frame_size; + unsigned int resample:1; /* do resample */ + unsigned int nblock:1; /* do block (period size) transfers */ + unsigned int xrun_pending:1; + unsigned int pollfd_count; + /* I/O job */ + char *buf; /* I/O buffer */ + snd_pcm_uframes_t buf_pos; /* I/O position */ + snd_pcm_uframes_t buf_count; /* filled samples */ + snd_pcm_uframes_t buf_size; /* buffer size in frames */ + snd_pcm_uframes_t buf_over; /* capture buffer overflow */ + /* statistics */ + snd_pcm_uframes_t max; + unsigned long long counter; + unsigned long sync_point; /* in samples */ + snd_pcm_sframes_t last_delay; + double pitch; + snd_pcm_uframes_t total_queued; + /* control */ + snd_ctl_t *ctl; + unsigned int ctl_pollfd_count; + snd_ctl_elem_value_t *ctl_notify; + snd_ctl_elem_value_t *ctl_rate_shift; + snd_ctl_elem_value_t *ctl_active; + snd_ctl_elem_value_t *ctl_format; + snd_ctl_elem_value_t *ctl_rate; + snd_ctl_elem_value_t *ctl_channels; +}; + +struct loopback { + char *id; + struct loopback_handle *capt; + struct loopback_handle *play; + snd_pcm_uframes_t latency; /* final latency in frames */ + unsigned int latency_req; /* in frames */ + unsigned int latency_reqtime; /* in us */ + unsigned long loop_time; /* ~0 = unlimited (in seconds) */ + unsigned long long loop_limit; /* ~0 = unlimited (in frames) */ + snd_output_t *output; + snd_output_t *state; + int pollfd_count; + int active_pollfd_count; + unsigned int linked:1; /* linked streams */ + unsigned int reinit:1; + unsigned int running:1; + unsigned int stop_pending:1; + snd_pcm_uframes_t stop_count; + sync_type_t sync; /* type of sync */ + slave_type_t slave; + int thread; /* thread number */ + unsigned int wake; + /* statistics */ + double pitch; + double pitch_delta; + snd_pcm_sframes_t pitch_diff; + snd_pcm_sframes_t pitch_diff_min; + snd_pcm_sframes_t pitch_diff_max; + unsigned int total_queued_count; + snd_timestamp_t tstamp_start; + snd_timestamp_t tstamp_end; + /* xrun profiling */ + unsigned int xrun:1; /* xrun profiling */ + snd_timestamp_t xrun_last_update; + snd_timestamp_t xrun_last_wake0; + snd_timestamp_t xrun_last_wake; + snd_timestamp_t xrun_last_check0; + snd_timestamp_t xrun_last_check; + snd_pcm_sframes_t xrun_last_pdelay; + snd_pcm_sframes_t xrun_last_cdelay; + snd_pcm_uframes_t xrun_buf_pcount; + snd_pcm_uframes_t xrun_buf_ccount; + unsigned int xrun_out_frames; + long xrun_max_proctime; + double xrun_max_missing; + /* control mixer */ + struct loopback_mixer *controls; + struct loopback_ossmixer *oss_controls; + /* sample rate */ + unsigned int use_samplerate:1; +#ifdef USE_SAMPLERATE + unsigned int src_enable:1; + int src_converter_type; + SRC_STATE *src_state; + SRC_DATA src_data; + unsigned int src_out_frames; +#endif +#ifdef FILE_CWRITE + FILE *cfile; +#endif +#ifdef FILE_PWRITE + FILE *pfile; +#endif +}; + +extern int verbose; +extern int workarounds; +extern int use_syslog; + +#define logit(priority, fmt, args...) do { \ + if (use_syslog) \ + syslog(priority, fmt, ##args); \ + else \ + fprintf(stderr, fmt, ##args); \ +} while (0) + +int pcmjob_init(struct loopback *loop); +int pcmjob_done(struct loopback *loop); +int pcmjob_start(struct loopback *loop); +int pcmjob_stop(struct loopback *loop); +int pcmjob_pollfds_init(struct loopback *loop, struct pollfd *fds); +int pcmjob_pollfds_handle(struct loopback *loop, struct pollfd *fds); +void pcmjob_state(struct loopback *loop); + +int control_parse_id(const char *str, snd_ctl_elem_id_t *id); +int control_id_match(snd_ctl_elem_id_t *id1, snd_ctl_elem_id_t *id2); +int control_init(struct loopback *loop); +int control_done(struct loopback *loop); +int control_event(struct loopback_handle *lhandle, snd_ctl_event_t *ev); diff --git a/alsaloop/control.c b/alsaloop/control.c new file mode 100644 index 0000000..8383d79 --- /dev/null +++ b/alsaloop/control.c @@ -0,0 +1,424 @@ +/* + * A simple PCM loopback utility + * Copyright (c) 2010 by Jaroslav Kysela + * + * Author: Jaroslav Kysela + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include "alsaloop.h" + +static char *id_str(snd_ctl_elem_id_t *id) +{ + static char str[128]; + + sprintf(str, "%i,%s,%i,%i,%s,%i", + snd_ctl_elem_id_get_numid(id), + snd_ctl_elem_iface_name(snd_ctl_elem_id_get_interface(id)), + snd_ctl_elem_id_get_device(id), + snd_ctl_elem_id_get_subdevice(id), + snd_ctl_elem_id_get_name(id), + snd_ctl_elem_id_get_index(id)); + return str; +} + +int control_parse_id(const char *str, snd_ctl_elem_id_t *id) +{ + int c, size, numid; + char *ptr; + + while (*str == ' ' || *str == '\t') + str++; + if (!(*str)) + return -EINVAL; + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); /* default */ + while (*str) { + if (!strncasecmp(str, "numid=", 6)) { + str += 6; + numid = atoi(str); + if (numid <= 0) { + logit(LOG_CRIT, "Invalid numid %d\n", numid); + return -EINVAL; + } + snd_ctl_elem_id_set_numid(id, atoi(str)); + while (isdigit(*str)) + str++; + } else if (!strncasecmp(str, "iface=", 6)) { + str += 6; + if (!strncasecmp(str, "card", 4)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_CARD); + str += 4; + } else if (!strncasecmp(str, "mixer", 5)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); + str += 5; + } else if (!strncasecmp(str, "pcm", 3)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_PCM); + str += 3; + } else if (!strncasecmp(str, "rawmidi", 7)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_RAWMIDI); + str += 7; + } else if (!strncasecmp(str, "timer", 5)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_TIMER); + str += 5; + } else if (!strncasecmp(str, "sequencer", 9)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_SEQUENCER); + str += 9; + } else { + return -EINVAL; + } + } else if (!strncasecmp(str, "name=", 5)) { + char buf[64]; + str += 5; + ptr = buf; + size = 0; + if (*str == '\'' || *str == '\"') { + c = *str++; + while (*str && *str != c) { + if (size < (int)sizeof(buf)) { + *ptr++ = *str; + size++; + } + str++; + } + if (*str == c) + str++; + } else { + while (*str && *str != ',') { + if (size < (int)sizeof(buf)) { + *ptr++ = *str; + size++; + } + str++; + } + } + *ptr = '\0'; + snd_ctl_elem_id_set_name(id, buf); + } else if (!strncasecmp(str, "index=", 6)) { + str += 6; + snd_ctl_elem_id_set_index(id, atoi(str)); + while (isdigit(*str)) + str++; + } else if (!strncasecmp(str, "device=", 7)) { + str += 7; + snd_ctl_elem_id_set_device(id, atoi(str)); + while (isdigit(*str)) + str++; + } else if (!strncasecmp(str, "subdevice=", 10)) { + str += 10; + snd_ctl_elem_id_set_subdevice(id, atoi(str)); + while (isdigit(*str)) + str++; + } + if (*str == ',') { + str++; + } else { + if (*str) + return -EINVAL; + } + } + return 0; +} + +int control_id_match(snd_ctl_elem_id_t *id1, snd_ctl_elem_id_t *id2) +{ + if (snd_ctl_elem_id_get_interface(id1) != + snd_ctl_elem_id_get_interface(id2)) + return 0; + if (snd_ctl_elem_id_get_device(id1) != + snd_ctl_elem_id_get_device(id2)) + return 0; + if (snd_ctl_elem_id_get_subdevice(id1) != + snd_ctl_elem_id_get_subdevice(id2)) + return 0; + if (strcmp(snd_ctl_elem_id_get_name(id1), + snd_ctl_elem_id_get_name(id2)) != 0) + return 0; + if (snd_ctl_elem_id_get_index(id1) != + snd_ctl_elem_id_get_index(id2)) + return 0; + return 1; +} + +static int control_init1(struct loopback_handle *lhandle, + struct loopback_control *ctl) +{ + int err; + + snd_ctl_elem_info_set_id(ctl->info, ctl->id); + snd_ctl_elem_value_set_id(ctl->value, ctl->id); + if (lhandle->ctl == NULL) { + logit(LOG_WARNING, "Unable to read control info for '%s'\n", id_str(ctl->id)); + return -EIO; + } + err = snd_ctl_elem_info(lhandle->ctl, ctl->info); + if (err < 0) { + logit(LOG_WARNING, "Unable to read control info '%s': %s\n", id_str(ctl->id), snd_strerror(err)); + return err; + } + err = snd_ctl_elem_read(lhandle->ctl, ctl->value); + if (err < 0) { + logit(LOG_WARNING, "Unable to read control value (init1) '%s': %s\n", id_str(ctl->id), snd_strerror(err)); + return err; + } + return 0; +} + +static int copy_value(struct loopback_control *dst, + struct loopback_control *src) +{ + snd_ctl_elem_type_t type; + unsigned int count; + int i; + + type = snd_ctl_elem_info_get_type(dst->info); + count = snd_ctl_elem_info_get_count(dst->info); + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + for (i = 0; i < count; i++) + snd_ctl_elem_value_set_boolean(dst->value, + i, snd_ctl_elem_value_get_boolean(src->value, i)); + break; + case SND_CTL_ELEM_TYPE_INTEGER: + for (i = 0; i < count; i++) { + snd_ctl_elem_value_set_integer(dst->value, + i, snd_ctl_elem_value_get_integer(src->value, i)); + } + break; + default: + logit(LOG_CRIT, "Unable to copy control value for type %s\n", snd_ctl_elem_type_name(type)); + return -EINVAL; + } + return 0; +} + +static int oss_set(struct loopback *loop, + struct loopback_ossmixer *ossmix, + int enable) +{ + char buf[128], file[128]; + int fd; + + if (loop->capt->card_number < 0) + return 0; + if (!enable) { + sprintf(buf, "%s \"\" 0\n", ossmix->oss_id); + } else { + sprintf(buf, "%s \"%s\" %i\n", ossmix->oss_id, ossmix->alsa_id, ossmix->alsa_index); + } + sprintf(file, "/proc/asound/card%i/oss_mixer", loop->capt->card_number); + if (verbose) + snd_output_printf(loop->output, "%s: Initialize OSS volume %s: %s", loop->id, file, buf); + fd = open(file, O_WRONLY); + if (fd >= 0 && write(fd, buf, strlen(buf)) == strlen(buf)) { + close(fd); + return 0; + } + if (fd >= 0) + close(fd); + logit(LOG_INFO, "%s: Unable to initialize OSS Mixer ID '%s'\n", loop->id, ossmix->oss_id); + return -1; +} + +static int control_init2(struct loopback *loop, + struct loopback_mixer *mix) +{ + snd_ctl_elem_type_t type; + unsigned int count; + int err; + + snd_ctl_elem_info_copy(mix->dst.info, mix->src.info); + snd_ctl_elem_info_set_id(mix->dst.info, mix->dst.id); + snd_ctl_elem_value_clear(mix->dst.value); + snd_ctl_elem_value_set_id(mix->dst.value, mix->dst.id); + type = snd_ctl_elem_info_get_type(mix->dst.info); + count = snd_ctl_elem_info_get_count(mix->dst.info); + snd_ctl_elem_remove(loop->capt->ctl, mix->dst.id); + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + err = snd_ctl_elem_add_boolean(loop->capt->ctl, + mix->dst.id, count); + copy_value(&mix->dst, &mix->src); + break; + case SND_CTL_ELEM_TYPE_INTEGER: + err = snd_ctl_elem_add_integer(loop->capt->ctl, + mix->dst.id, count, + snd_ctl_elem_info_get_min(mix->dst.info), + snd_ctl_elem_info_get_max(mix->dst.info), + snd_ctl_elem_info_get_step(mix->dst.info)); + copy_value(&mix->dst, &mix->src); + break; + default: + logit(LOG_CRIT, "Unable to handle control type %s\n", snd_ctl_elem_type_name(type)); + err = -EINVAL; + break; + } + if (err < 0) { + logit(LOG_CRIT, "Unable to create control '%s': %s\n", id_str(mix->dst.id), snd_strerror(err)); + return err; + } + err = snd_ctl_elem_unlock(loop->capt->ctl, mix->dst.id); + if (err < 0) { + logit(LOG_CRIT, "Unable to unlock control info '%s': %s\n", id_str(mix->dst.id), snd_strerror(err)); + return err; + } + err = snd_ctl_elem_info(loop->capt->ctl, mix->dst.info); + if (err < 0) { + logit(LOG_CRIT, "Unable to read control info '%s': %s\n", id_str(mix->dst.id), snd_strerror(err)); + return err; + } + if (snd_ctl_elem_info_is_tlv_writable(mix->dst.info)) { + unsigned int tlv[64]; + err = snd_ctl_elem_tlv_read(loop->play->ctl, + mix->src.id, + tlv, sizeof(tlv)); + if (err < 0) { + logit(LOG_CRIT, "Unable to read TLV for '%s': %s\n", id_str(mix->src.id), snd_strerror(err)); + tlv[0] = tlv[1] = 0; + } + err = snd_ctl_elem_tlv_write(loop->capt->ctl, + mix->dst.id, + tlv); + if (err < 0) { + logit(LOG_CRIT, "Unable to write TLV for '%s': %s\n", id_str(mix->src.id), snd_strerror(err)); + return err; + } + } + err = snd_ctl_elem_write(loop->capt->ctl, mix->dst.value); + if (err < 0) { + logit(LOG_CRIT, "Unable to write control value '%s': %s\n", id_str(mix->dst.id), snd_strerror(err)); + return err; + } + return 0; +} + +int control_init(struct loopback *loop) +{ + struct loopback_mixer *mix; + struct loopback_ossmixer *ossmix; + int err; + + for (ossmix = loop->oss_controls; ossmix; ossmix = ossmix->next) + oss_set(loop, ossmix, 0); + for (mix = loop->controls; mix; mix = mix->next) { + err = control_init1(loop->play, &mix->src); + if (err < 0) { + logit(LOG_WARNING, "%s: Disabling playback control '%s'\n", loop->id, id_str(mix->src.id)); + mix->skip = 1; + continue; + } + err = control_init2(loop, mix); + if (err < 0) + return err; + } + for (ossmix = loop->oss_controls; ossmix; ossmix = ossmix->next) { + err = oss_set(loop, ossmix, 1); + if (err < 0) { + ossmix->skip = 1; + logit(LOG_WARNING, "%s: Disabling OSS mixer ID '%s'\n", loop->id, ossmix->oss_id); + } + } + return 0; +} + +int control_done(struct loopback *loop) +{ + struct loopback_mixer *mix; + struct loopback_ossmixer *ossmix; + int err; + + if (loop->capt->ctl == NULL) + return 0; + for (ossmix = loop->oss_controls; ossmix; ossmix = ossmix->next) { + err = oss_set(loop, ossmix, 0); + if (err < 0) + logit(LOG_WARNING, "%s: Unable to remove OSS control '%s'\n", loop->id, ossmix->oss_id); + } + for (mix = loop->controls; mix; mix = mix->next) { + if (mix->skip) + continue; + err = snd_ctl_elem_remove(loop->capt->ctl, mix->dst.id); + if (err < 0) + logit(LOG_WARNING, "%s: Unable to remove control '%s': %s\n", loop->id, id_str(mix->dst.id), snd_strerror(err)); + } + return 0; +} + +static int control_event1(struct loopback *loop, + struct loopback_mixer *mix, + snd_ctl_event_t *ev, + int capture) +{ + unsigned int mask = snd_ctl_event_elem_get_mask(ev); + int err; + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + if ((mask & SND_CTL_EVENT_MASK_VALUE) == 0) + return 0; + if (!capture) { + snd_ctl_elem_value_set_id(mix->src.value, mix->src.id); + err = snd_ctl_elem_read(loop->play->ctl, mix->src.value); + if (err < 0) { + logit(LOG_CRIT, "Unable to read control value (event1) '%s': %s\n", id_str(mix->src.id), snd_strerror(err)); + return err; + } + copy_value(&mix->dst, &mix->src); + err = snd_ctl_elem_write(loop->capt->ctl, mix->dst.value); + if (err < 0) { + logit(LOG_CRIT, "Unable to write control value (event1) '%s': %s\n", id_str(mix->dst.id), snd_strerror(err)); + return err; + } + } else { + err = snd_ctl_elem_read(loop->capt->ctl, mix->dst.value); + if (err < 0) { + logit(LOG_CRIT, "Unable to read control value (event2) '%s': %s\n", id_str(mix->dst.id), snd_strerror(err)); + return err; + } + copy_value(&mix->src, &mix->dst); + err = snd_ctl_elem_write(loop->play->ctl, mix->src.value); + if (err < 0) { + logit(LOG_CRIT, "Unable to write control value (event2) '%s': %s\n", id_str(mix->src.id), snd_strerror(err)); + return err; + } + } + return 0; +} + +int control_event(struct loopback_handle *lhandle, snd_ctl_event_t *ev) +{ + snd_ctl_elem_id_t *id2; + struct loopback_mixer *mix; + int capt = lhandle == lhandle->loopback->capt; + int err; + + snd_ctl_elem_id_alloca(&id2); + snd_ctl_event_elem_get_id(ev, id2); + for (mix = lhandle->loopback->controls; mix; mix = mix->next) { + if (mix->skip) + continue; + if (control_id_match(id2, capt ? mix->dst.id : mix->src.id)) { + err = control_event1(lhandle->loopback, mix, ev, capt); + if (err < 0) + return err; + } + } + return 0; +} diff --git a/alsaloop/pcmjob.c b/alsaloop/pcmjob.c new file mode 100644 index 0000000..0b84803 --- /dev/null +++ b/alsaloop/pcmjob.c @@ -0,0 +1,1925 @@ +/* + * A simple PCM loopback utility + * Copyright (c) 2010 by Jaroslav Kysela + * + * Author: Jaroslav Kysela + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "alsaloop.h" + +#define XRUN_PROFILE_UNKNOWN (-10000000) + +static int set_rate_shift(struct loopback_handle *lhandle, double pitch); +static int get_rate(struct loopback_handle *lhandle); + +#define SYNCTYPE(v) [SYNC_TYPE_##v] = #v + +static const char *sync_types[] = { + SYNCTYPE(NONE), + SYNCTYPE(SIMPLE), + SYNCTYPE(CAPTRATESHIFT), + SYNCTYPE(PLAYRATESHIFT), + SYNCTYPE(SAMPLERATE), + SYNCTYPE(AUTO) +}; + +#define SRCTYPE(v) [SRC_##v] = "SRC_" #v + +#ifdef USE_SAMPLERATE +static const char *src_types[] = { + SRCTYPE(SINC_BEST_QUALITY), + SRCTYPE(SINC_MEDIUM_QUALITY), + SRCTYPE(SINC_FASTEST), + SRCTYPE(ZERO_ORDER_HOLD), + SRCTYPE(LINEAR) +}; +#endif + +static pthread_mutex_t pcm_open_mutex = + PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; + +static inline void pcm_open_lock(void) +{ + if (workarounds & WORKAROUND_SERIALOPEN) + pthread_mutex_lock(&pcm_open_mutex); +} + +static inline void pcm_open_unlock(void) +{ + if (workarounds & WORKAROUND_SERIALOPEN) + pthread_mutex_unlock(&pcm_open_mutex); +} + +static inline snd_pcm_uframes_t get_whole_latency(struct loopback *loop) +{ + return loop->latency; +} + +static inline unsigned long long + frames_to_time(unsigned int rate, + snd_pcm_uframes_t frames) +{ + return (frames * 1000000ULL) / rate; +} + +static inline snd_pcm_uframes_t time_to_frames(unsigned int rate, + unsigned long long time) +{ + return (time * rate) / 1000000ULL; +} + +static int setparams_stream(struct loopback_handle *lhandle, + snd_pcm_hw_params_t *params) +{ + snd_pcm_t *handle = lhandle->handle; + int err; + unsigned int rrate; + + err = snd_pcm_hw_params_any(handle, params); + if (err < 0) { + logit(LOG_CRIT, "Broken configuration for %s PCM: no configurations available: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + err = snd_pcm_hw_params_set_rate_resample(handle, params, lhandle->resample); + if (err < 0) { + logit(LOG_CRIT, "Resample setup failed for %s (val %i): %s\n", lhandle->id, lhandle->resample, snd_strerror(err)); + return err; + } + err = snd_pcm_hw_params_set_access(handle, params, lhandle->access); + if (err < 0) { + logit(LOG_CRIT, "Access type not available for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + err = snd_pcm_hw_params_set_format(handle, params, lhandle->format); + if (err < 0) { + logit(LOG_CRIT, "Sample format not available for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + err = snd_pcm_hw_params_set_channels(handle, params, lhandle->channels); + if (err < 0) { + logit(LOG_CRIT, "Channels count (%i) not available for %s: %s\n", lhandle->channels, lhandle->id, snd_strerror(err)); + return err; + } + rrate = lhandle->rate_req; + err = snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0); + if (err < 0) { + logit(LOG_CRIT, "Rate %iHz not available for %s: %s\n", lhandle->rate_req, lhandle->id, snd_strerror(err)); + return err; + } + rrate = 0; + snd_pcm_hw_params_get_rate(params, &rrate, 0); + lhandle->rate = rrate; + if ( +#ifdef USE_SAMPLERATE + !lhandle->loopback->src_enable && +#endif + (int)rrate != lhandle->rate) { + logit(LOG_CRIT, "Rate does not match (requested %iHz, got %iHz, resample %i)\n", lhandle->rate, rrate, lhandle->resample); + return -EINVAL; + } + lhandle->pitch = (double)lhandle->rate_req / (double)lhandle->rate; + return 0; +} + +static int setparams_bufsize(struct loopback_handle *lhandle, + snd_pcm_hw_params_t *params, + snd_pcm_hw_params_t *tparams, + snd_pcm_uframes_t bufsize) +{ + snd_pcm_t *handle = lhandle->handle; + int err; + snd_pcm_uframes_t periodsize; + snd_pcm_uframes_t buffersize; + snd_pcm_uframes_t last_bufsize = 0; + + if (lhandle->buffer_size_req > 0) { + bufsize = lhandle->buffer_size_req; + last_bufsize = bufsize; + goto __set_it; + } + __again: + if (lhandle->buffer_size_req > 0) { + logit(LOG_CRIT, "Unable to set buffer size %li for %s\n", (long)lhandle->buffer_size, lhandle->id); + return -EIO; + } + if (last_bufsize == bufsize) + bufsize += 4; + last_bufsize = bufsize; + if (bufsize > 10*1024*1024) { + logit(LOG_CRIT, "Buffer size too big\n"); + return -EIO; + } + __set_it: + snd_pcm_hw_params_copy(params, tparams); + periodsize = bufsize * 8; + err = snd_pcm_hw_params_set_buffer_size_near(handle, params, &periodsize); + if (err < 0) { + logit(LOG_CRIT, "Unable to set buffer size %li for %s: %s\n", periodsize, lhandle->id, snd_strerror(err)); + goto __again; + } + snd_pcm_hw_params_get_buffer_size(params, &periodsize); + if (verbose > 6) + snd_output_printf(lhandle->loopback->output, "%s: buffer_size=%li\n", lhandle->id, periodsize); + if (lhandle->period_size_req > 0) + periodsize = lhandle->period_size_req; + else + periodsize /= 8; + err = snd_pcm_hw_params_set_period_size_near(handle, params, &periodsize, 0); + if (err < 0) { + logit(LOG_CRIT, "Unable to set period size %li for %s: %s\n", periodsize, lhandle->id, snd_strerror(err)); + goto __again; + } + snd_pcm_hw_params_get_period_size(params, &periodsize, NULL); + if (verbose > 6) + snd_output_printf(lhandle->loopback->output, "%s: period_size=%li\n", lhandle->id, periodsize); + if (periodsize != bufsize) + bufsize = periodsize; + snd_pcm_hw_params_get_buffer_size(params, &buffersize); + if (periodsize * 2 > buffersize) + goto __again; + lhandle->period_size = periodsize; + lhandle->buffer_size = buffersize; + return 0; +} + +static int setparams_set(struct loopback_handle *lhandle, + snd_pcm_hw_params_t *params, + snd_pcm_sw_params_t *swparams, + snd_pcm_uframes_t bufsize) +{ + snd_pcm_t *handle = lhandle->handle; + int err; + snd_pcm_uframes_t val, period_size, buffer_size; + + err = snd_pcm_hw_params(handle, params); + if (err < 0) { + logit(LOG_CRIT, "Unable to set hw params for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + err = snd_pcm_sw_params_current(handle, swparams); + if (err < 0) { + logit(LOG_CRIT, "Unable to determine current swparams for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + err = snd_pcm_sw_params_set_start_threshold(handle, swparams, 0x7fffffff); + if (err < 0) { + logit(LOG_CRIT, "Unable to set start threshold mode for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + snd_pcm_hw_params_get_period_size(params, &period_size, NULL); + snd_pcm_hw_params_get_buffer_size(params, &buffer_size); + if (lhandle->nblock) { + if (lhandle == lhandle->loopback->play) { + val = buffer_size - (2 * period_size - 4); + } else { + val = 4; + } + if (verbose > 6) + snd_output_printf(lhandle->loopback->output, "%s: avail_min1=%li\n", lhandle->id, val); + } else { + if (lhandle == lhandle->loopback->play) { + val = bufsize + bufsize / 2; + if (val < (period_size * 3) / 4) + val = (period_size * 3) / 4; + if (val > (buffer_size * 3) / 4) + val = (buffer_size * 3) / 4; + val = buffer_size - val; + } else { + val = bufsize / 2; + if (val < period_size / 2) + val = period_size / 2; + if (val > buffer_size / 4) + val = buffer_size / 4; + } + if (verbose > 6) + snd_output_printf(lhandle->loopback->output, "%s: avail_min2=%li\n", lhandle->id, val); + } + err = snd_pcm_sw_params_set_avail_min(handle, swparams, val); + if (err < 0) { + logit(LOG_CRIT, "Unable to set avail min for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + snd_pcm_sw_params_get_avail_min(swparams, &lhandle->avail_min); + err = snd_pcm_sw_params(handle, swparams); + if (err < 0) { + logit(LOG_CRIT, "Unable to set sw params for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return 0; +} + +static int setparams(struct loopback *loop, snd_pcm_uframes_t bufsize) +{ + int err; + snd_pcm_hw_params_t *pt_params, *ct_params; /* templates with rate, format and channels */ + snd_pcm_hw_params_t *p_params, *c_params; + snd_pcm_sw_params_t *p_swparams, *c_swparams; + + snd_pcm_hw_params_alloca(&p_params); + snd_pcm_hw_params_alloca(&c_params); + snd_pcm_hw_params_alloca(&pt_params); + snd_pcm_hw_params_alloca(&ct_params); + snd_pcm_sw_params_alloca(&p_swparams); + snd_pcm_sw_params_alloca(&c_swparams); + if ((err = setparams_stream(loop->play, pt_params)) < 0) { + logit(LOG_CRIT, "Unable to set parameters for %s stream: %s\n", loop->play->id, snd_strerror(err)); + return err; + } + if ((err = setparams_stream(loop->capt, ct_params)) < 0) { + logit(LOG_CRIT, "Unable to set parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err)); + return err; + } + + if ((err = setparams_bufsize(loop->play, p_params, pt_params, bufsize / loop->play->pitch)) < 0) { + logit(LOG_CRIT, "Unable to set buffer parameters for %s stream: %s\n", loop->play->id, snd_strerror(err)); + return err; + } + if ((err = setparams_bufsize(loop->capt, c_params, ct_params, bufsize / loop->capt->pitch)) < 0) { + logit(LOG_CRIT, "Unable to set buffer parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err)); + return err; + } + + if ((err = setparams_set(loop->play, p_params, p_swparams, bufsize / loop->play->pitch)) < 0) { + logit(LOG_CRIT, "Unable to set sw parameters for %s stream: %s\n", loop->play->id, snd_strerror(err)); + return err; + } + if ((err = setparams_set(loop->capt, c_params, c_swparams, bufsize / loop->capt->pitch)) < 0) { + logit(LOG_CRIT, "Unable to set sw parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err)); + return err; + } + +#if 0 + if (!loop->linked) + if (snd_pcm_link(loop->capt->handle, loop->play->handle) >= 0) + loop->linked = 1; +#endif + if ((err = snd_pcm_prepare(loop->play->handle)) < 0) { + logit(LOG_CRIT, "Prepare %s error: %s\n", loop->play->id, snd_strerror(err)); + return err; + } + if (!loop->linked && (err = snd_pcm_prepare(loop->capt->handle)) < 0) { + logit(LOG_CRIT, "Prepare %s error: %s\n", loop->capt->id, snd_strerror(err)); + return err; + } + + if (verbose) { + snd_pcm_dump(loop->play->handle, loop->output); + snd_pcm_dump(loop->capt->handle, loop->output); + } + return 0; +} + +static void showlatency(snd_output_t *out, size_t latency, unsigned int rate, + char *prefix) +{ + double d; + d = (double)latency / (double)rate; + snd_output_printf(out, "%s %li frames, %.3fus, %.6fms (%.4fHz)\n", prefix, (long)latency, d * 1000000, d * 1000, (double)1 / d); +} + +static long timediff(snd_timestamp_t t1, snd_timestamp_t t2) +{ + signed long l; + + t1.tv_sec -= t2.tv_sec; + if (t1.tv_usec < t2.tv_usec) { + l = ((t1.tv_usec + 1000000) - t2.tv_usec) % 1000000; + t1.tv_sec--; + } else { + l = t1.tv_usec - t2.tv_usec; + } + return (t1.tv_sec * 1000000) + l; +} + +static int getcurtimestamp(snd_timestamp_t *ts) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + ts->tv_sec = tv.tv_sec; + ts->tv_usec = tv.tv_usec; + return 0; +} + +static void xrun_profile0(struct loopback *loop) +{ + snd_pcm_sframes_t pdelay, cdelay; + + if (snd_pcm_delay(loop->play->handle, &pdelay) >= 0 && + snd_pcm_delay(loop->capt->handle, &cdelay) >= 0) { + getcurtimestamp(&loop->xrun_last_update); + loop->xrun_last_pdelay = pdelay; + loop->xrun_last_cdelay = cdelay; + loop->xrun_buf_pcount = loop->play->buf_count; + loop->xrun_buf_ccount = loop->capt->buf_count; +#ifdef USE_SAMPLERATE + loop->xrun_out_frames = loop->src_out_frames; +#endif + } +} + +static inline void xrun_profile(struct loopback *loop) +{ + if (loop->xrun) + xrun_profile0(loop); +} + +static void xrun_stats0(struct loopback *loop) +{ + snd_timestamp_t t; + double expected, last, wake, check, queued = -1, proc, missing = -1; + double maxbuf, pfilled, cfilled, cqueued = -1, avail_min; + double sincejob; + + expected = ((double)loop->latency / + (double)loop->play->rate_req) * 1000; + getcurtimestamp(&t); + last = (double)timediff(t, loop->xrun_last_update) / 1000; + wake = (double)timediff(t, loop->xrun_last_wake) / 1000; + check = (double)timediff(t, loop->xrun_last_check) / 1000; + sincejob = (double)timediff(t, loop->tstamp_start) / 1000; + if (loop->xrun_last_pdelay != XRUN_PROFILE_UNKNOWN) + queued = ((double)loop->xrun_last_pdelay / + (double)loop->play->rate) * 1000; + if (loop->xrun_last_cdelay != XRUN_PROFILE_UNKNOWN) + cqueued = ((double)loop->xrun_last_cdelay / + (double)loop->capt->rate) * 1000; + maxbuf = ((double)loop->play->buffer_size / + (double)loop->play->rate) * 1000; + proc = (double)loop->xrun_max_proctime / 1000; + pfilled = ((double)(loop->xrun_buf_pcount + loop->xrun_out_frames) / + (double)loop->play->rate) * 1000; + cfilled = ((double)loop->xrun_buf_ccount / + (double)loop->capt->rate) * 1000; + avail_min = (((double)loop->play->buffer_size - + (double)loop->play->avail_min ) / + (double)loop->play->rate) * 1000; + avail_min = expected - avail_min; + if (queued >= 0) + missing = last - queued; + if (missing >= 0 && loop->xrun_max_missing < missing) + loop->xrun_max_missing = missing; + loop->xrun_max_proctime = 0; + getcurtimestamp(&t); + logit(LOG_INFO, " last write before %.4fms, queued %.4fms/%.4fms -> missing %.4fms\n", last, queued, cqueued, missing); + logit(LOG_INFO, " expected %.4fms, processing %.4fms, max missing %.4fms\n", expected, proc, loop->xrun_max_missing); + logit(LOG_INFO, " last wake %.4fms, last check %.4fms, avail_min %.4fms\n", wake, check, avail_min); + logit(LOG_INFO, " max buf %.4fms, pfilled %.4fms, cfilled %.4fms\n", maxbuf, pfilled, cfilled); + logit(LOG_INFO, " job started before %.4fms\n", sincejob); +} + +static inline void xrun_stats(struct loopback *loop) +{ + if (loop->xrun) + xrun_stats0(loop); +} + +static inline snd_pcm_uframes_t buf_avail(struct loopback_handle *lhandle) +{ + return lhandle->buf_size - lhandle->buf_count; +} + +static void buf_remove(struct loopback *loop, snd_pcm_uframes_t count) +{ + /* remove samples from the capture buffer */ + if (count <= 0) + return; + if (loop->play->buf == loop->capt->buf) { + if (count < loop->capt->buf_count) + loop->capt->buf_count -= count; + else + loop->capt->buf_count = 0; + } +} + +#if 0 +static void buf_add_copy(struct loopback *loop) +{ + struct loopback_handle *capt = loop->capt; + struct loopback_handle *play = loop->play; + snd_pcm_uframes_t count, count1, cpos, ppos; + + count = capt->buf_count; + cpos = capt->buf_pos - count; + if (cpos > capt->buf_size) + cpos += capt->buf_size; + ppos = (play->buf_pos + play->buf_count) % play->buf_size; + while (count > 0) { + count1 = count; + if (count1 + cpos > capt->buf_size) + count1 = capt->buf_size - cpos; + if (count1 > buf_avail(play)) + count1 = buf_avail(play); + if (count1 + ppos > play->buf_size) + count1 = play->buf_size - ppos; + if (count1 == 0) + break; + memcpy(play->buf + ppos * play->frame_size, + capt->buf + cpos * capt->frame_size, + count1 * capt->frame_size); + play->buf_count += count1; + capt->buf_count -= count1; + ppos += count1; + ppos %= play->buf_size; + cpos += count1; + cpos %= capt->buf_size; + count -= count1; + } +} +#endif + +#ifdef USE_SAMPLERATE +static void buf_add_src(struct loopback *loop) +{ + struct loopback_handle *capt = loop->capt; + struct loopback_handle *play = loop->play; + float *old_data_out; + snd_pcm_uframes_t count, pos, count1, pos1; + count = capt->buf_count; + pos = 0; + pos1 = capt->buf_pos - count; + if (pos1 > capt->buf_size) + pos1 += capt->buf_size; + while (count > 0) { + count1 = count; + if (count1 + pos1 > capt->buf_size) + count1 = capt->buf_size - pos1; + if (capt->format == SND_PCM_FORMAT_S32) + src_int_to_float_array((int *)(capt->buf + + pos1 * capt->frame_size), + loop->src_data.data_in + + pos * capt->channels, + count1 * capt->channels); + else + src_short_to_float_array((short *)(capt->buf + + pos1 * capt->frame_size), + loop->src_data.data_in + + pos * capt->channels, + count1 * capt->channels); + count -= count1; + pos += count1; + pos1 += count1; + pos1 %= capt->buf_size; + } + loop->src_data.input_frames = pos; + loop->src_data.output_frames = play->buf_size - + loop->src_out_frames; + loop->src_data.end_of_input = 0; + old_data_out = loop->src_data.data_out; + loop->src_data.data_out = old_data_out + loop->src_out_frames; + src_process(loop->src_state, &loop->src_data); + loop->src_data.data_out = old_data_out; + capt->buf_count -= loop->src_data.input_frames_used; + count = loop->src_data.output_frames_gen + + loop->src_out_frames; + pos = 0; + pos1 = (play->buf_pos + play->buf_count) % play->buf_size; + while (count > 0) { + count1 = count; + if (count1 + pos1 > play->buf_size) + count1 = play->buf_size - pos1; + if (count1 > buf_avail(play)) + count1 = buf_avail(play); + if (count1 == 0) + break; + if (capt->format == SND_PCM_FORMAT_S32) + src_float_to_int_array(loop->src_data.data_out + + pos * play->channels, + (int *)(play->buf + + pos1 * play->frame_size), + count1 * play->channels); + else + src_float_to_short_array(loop->src_data.data_out + + pos * play->channels, + (short *)(play->buf + + pos1 * play->frame_size), + count1 * play->channels); + play->buf_count += count1; + count -= count1; + pos += count1; + pos1 += count1; + pos1 %= play->buf_size; + } +#if 0 + printf("src: pos = %li, gen = %li, out = %li, count = %li\n", + (long)pos, (long)loop->src_data.output_frames_gen, + (long)loop->src_out_frames, play->buf_count); +#endif + loop->src_out_frames = (loop->src_data.output_frames_gen + + loop->src_out_frames) - pos; + if (loop->src_out_frames > 0) { + memmove(loop->src_data.data_out, + loop->src_data.data_out + pos * play->channels, + loop->src_out_frames * play->channels * sizeof(float)); + } +} +#else +static void buf_add_src(struct loopback *loop) +{ +} +#endif + +static void buf_add(struct loopback *loop, snd_pcm_uframes_t count) +{ + /* copy samples from capture to playback buffer */ + if (count <= 0) + return; + if (loop->play->buf == loop->capt->buf) { + loop->play->buf_count += count; + } else { + buf_add_src(loop); + } +} + +static int xrun(struct loopback_handle *lhandle) +{ + int err; + + if (lhandle == lhandle->loopback->play) { + logit(LOG_DEBUG, "underrun for %s\n", lhandle->id); + xrun_stats(lhandle->loopback); + if ((err = snd_pcm_prepare(lhandle->handle)) < 0) + return err; + lhandle->xrun_pending = 1; + } else { + logit(LOG_DEBUG, "overrun for %s\n", lhandle->id); + xrun_stats(lhandle->loopback); + if ((err = snd_pcm_prepare(lhandle->handle)) < 0) + return err; + lhandle->xrun_pending = 1; + } + return 0; +} + +static int suspend(struct loopback_handle *lhandle) +{ + int err; + + while ((err = snd_pcm_resume(lhandle->handle)) == -EAGAIN) + usleep(1); + if (err < 0) + return xrun(lhandle); + return 0; +} + +static int readit(struct loopback_handle *lhandle) +{ + snd_pcm_sframes_t r, res = 0; + snd_pcm_sframes_t avail; + int err; + + avail = snd_pcm_avail_update(lhandle->handle); + if (avail == -EPIPE) { + return xrun(lhandle); + } else if (avail == -ESTRPIPE) { + if ((err = suspend(lhandle)) < 0) + return err; + } + if (avail > buf_avail(lhandle)) { + lhandle->buf_over += avail - buf_avail(lhandle); + avail = buf_avail(lhandle); + } else if (avail == 0) { + if (snd_pcm_state(lhandle->handle) == SND_PCM_STATE_DRAINING) { + lhandle->loopback->reinit = 1; + return 0; + } + } + while (avail > 0) { + r = buf_avail(lhandle); + if (r + lhandle->buf_pos > lhandle->buf_size) + r = lhandle->buf_size - lhandle->buf_pos; + if (r > avail) + r = avail; + r = snd_pcm_readi(lhandle->handle, + lhandle->buf + + lhandle->buf_pos * + lhandle->frame_size, r); + if (r == 0) + return res; + if (r < 0) { + if (r == -EPIPE) { + err = xrun(lhandle); + return res > 0 ? res : err; + } else if (r == -ESTRPIPE) { + if ((err = suspend(lhandle)) < 0) + return res > 0 ? res : err; + r = 0; + } else { + return res > 0 ? res : r; + } + } +#ifdef FILE_CWRITE + if (lhandle->loopback->cfile) + fwrite(lhandle->buf + lhandle->buf_pos * lhandle->frame_size, + r, lhandle->frame_size, lhandle->loopback->cfile); +#endif + res += r; + if (lhandle->max < res) + lhandle->max = res; + lhandle->counter += r; + lhandle->buf_count += r; + lhandle->buf_pos += r; + lhandle->buf_pos %= lhandle->buf_size; + avail -= r; + } + return res; +} + +static int writeit(struct loopback_handle *lhandle) +{ + snd_pcm_sframes_t avail; + snd_pcm_sframes_t r, res = 0; + int err; + + __again: + avail = snd_pcm_avail_update(lhandle->handle); + if (avail == -EPIPE) { + if ((err = xrun(lhandle)) < 0) + return err; + return res; + } else if (avail == -ESTRPIPE) { + if ((err = suspend(lhandle)) < 0) + return err; + goto __again; + } + while (avail > 0 && lhandle->buf_count > 0) { + r = lhandle->buf_count; + if (r + lhandle->buf_pos > lhandle->buf_size) + r = lhandle->buf_size - lhandle->buf_pos; + if (r > avail) + r = avail; + r = snd_pcm_writei(lhandle->handle, + lhandle->buf + + lhandle->buf_pos * + lhandle->frame_size, r); + if (r <= 0) { + if (r == -EPIPE) { + if ((err = xrun(lhandle)) < 0) + return err; + return res; + } else if (r == -ESTRPIPE) { + } + return res > 0 ? res : r; + } +#ifdef FILE_PWRITE + if (lhandle->loopback->pfile) + fwrite(lhandle->buf + lhandle->buf_pos * lhandle->frame_size, + r, lhandle->frame_size, lhandle->loopback->pfile); +#endif + res += r; + lhandle->counter += r; + lhandle->buf_count -= r; + lhandle->buf_pos += r; + lhandle->buf_pos %= lhandle->buf_size; + xrun_profile(lhandle->loopback); + if (lhandle->loopback->stop_pending) { + lhandle->loopback->stop_count += r; + if (lhandle->loopback->stop_count * lhandle->pitch > + lhandle->loopback->latency * 3) { + lhandle->loopback->stop_pending = 0; + lhandle->loopback->reinit = 1; + break; + } + } + } + return res; +} + +static snd_pcm_sframes_t remove_samples(struct loopback *loop, + int capture_preferred, + snd_pcm_sframes_t count) +{ + struct loopback_handle *play = loop->play; + struct loopback_handle *capt = loop->capt; + + if (loop->play->buf == loop->capt->buf) { + if (count > loop->play->buf_count) + count = loop->play->buf_count; + if (count > loop->capt->buf_count) + count = loop->capt->buf_count; + capt->buf_count -= count; + play->buf_pos += count; + play->buf_pos %= play->buf_size; + play->buf_count -= count; + return count; + } + if (capture_preferred) { + if (count > capt->buf_count) + count = capt->buf_count; + capt->buf_count -= count; + } else { + if (count > play->buf_count) + count = play->buf_count; + play->buf_count -= count; + } + return count; +} + +static int xrun_sync(struct loopback *loop) +{ + struct loopback_handle *play = loop->play; + struct loopback_handle *capt = loop->capt; + snd_pcm_uframes_t fill = get_whole_latency(loop); + snd_pcm_sframes_t pdelay, cdelay, delay1, pdelay1, cdelay1, diff; + int err; + + __again: + if (verbose > 5) + snd_output_printf(loop->output, "%s: xrun sync %i %i\n", loop->id, capt->xrun_pending, play->xrun_pending); + if (capt->xrun_pending) { + __pagain: + capt->xrun_pending = 0; + if ((err = snd_pcm_prepare(capt->handle)) < 0) { + logit(LOG_CRIT, "%s prepare failed: %s\n", capt->id, snd_strerror(err)); + return err; + } + if ((err = snd_pcm_start(capt->handle)) < 0) { + logit(LOG_CRIT, "%s start failed: %s\n", capt->id, snd_strerror(err)); + return err; + } + } else { + diff = readit(capt); + buf_add(loop, diff); + if (capt->xrun_pending) + goto __pagain; + } + /* skip additional playback samples */ + if ((err = snd_pcm_delay(capt->handle, &cdelay)) < 0) { + if (err == -EPIPE) { + capt->xrun_pending = 1; + goto __again; + } + if (err == -ESTRPIPE) { + err = suspend(capt); + if (err < 0) + return err; + goto __again; + } + logit(LOG_CRIT, "%s capture delay failed: %s\n", capt->id, snd_strerror(err)); + return err; + } + if ((err = snd_pcm_delay(play->handle, &pdelay)) < 0) { + if (err == -EPIPE) { + pdelay = 0; + play->xrun_pending = 1; + } else if (err == -ESTRPIPE) { + err = suspend(play); + if (err < 0) + return err; + goto __again; + } else { + logit(LOG_CRIT, "%s playback delay failed: %s\n", play->id, snd_strerror(err)); + return err; + } + } + capt->counter = cdelay; + play->counter = pdelay; + if (play->buf != capt->buf) + cdelay += capt->buf_count; + pdelay += play->buf_count; +#ifdef USE_SAMPLERATE + pdelay += loop->src_out_frames; +#endif + cdelay1 = cdelay * capt->pitch; + pdelay1 = pdelay * play->pitch; + delay1 = cdelay1 + pdelay1; + capt->total_queued = 0; + play->total_queued = 0; + loop->total_queued_count = 0; + loop->pitch_diff = loop->pitch_diff_min = loop->pitch_diff_max = 0; + if (verbose > 6) { + snd_output_printf(loop->output, + "sync: cdelay=%li(%li), pdelay=%li(%li), fill=%li (delay=%li)" +#ifdef USE_SAMPLERATE + ", src_out=%li" +#endif + "\n", + (long)cdelay, (long)cdelay1, (long)pdelay, (long)pdelay1, + (long)fill, (long)delay1 +#ifdef USE_SAMPLERATE + , (long)loop->src_out_frames +#endif + ); + snd_output_printf(loop->output, + "sync: cbufcount=%li, pbufcount=%li\n", + (long)capt->buf_count, (long)play->buf_count); + } + if (delay1 > fill && capt->counter > 0) { + if ((err = snd_pcm_drop(capt->handle)) < 0) + return err; + if ((err = snd_pcm_prepare(capt->handle)) < 0) + return err; + if ((err = snd_pcm_start(capt->handle)) < 0) + return err; + diff = remove_samples(loop, 1, (delay1 - fill) / capt->pitch); + if (verbose > 6) + snd_output_printf(loop->output, + "sync: capt stop removed %li samples\n", (long)diff); + goto __again; + } + if (delay1 > fill) { + diff = (delay1 - fill) / play->pitch; + if (diff > play->buf_count) + diff = play->buf_count; + if (verbose > 6) + snd_output_printf(loop->output, + "sync: removing %li playback samples, delay1=%li\n", (long)diff, (long)delay1); + diff = remove_samples(loop, 0, diff); + pdelay -= diff; + pdelay1 = pdelay * play->pitch; + delay1 = cdelay1 + pdelay1; + if (verbose > 6) + snd_output_printf(loop->output, + "sync: removed %li playback samples, delay1=%li\n", (long)diff, (long)delay1); + } + if (delay1 > fill) { + diff = (delay1 - fill) / capt->pitch; + if (diff > capt->buf_count) + diff = capt->buf_count; + if (verbose > 6) + snd_output_printf(loop->output, + "sync: removing %li captured samples, delay1=%li\n", (long)diff, (long)delay1); + diff -= remove_samples(loop, 1, diff); + cdelay -= diff; + cdelay1 = cdelay * capt->pitch; + delay1 = cdelay1 + pdelay1; + if (verbose > 6) + snd_output_printf(loop->output, + "sync: removed %li captured samples, delay1=%li\n", (long)diff, (long)delay1); + } + if (play->xrun_pending) { + play->xrun_pending = 0; + diff = (fill - delay1) / play->pitch; + if (verbose > 6) + snd_output_printf(loop->output, + "sync: xrun_pending, silence filling %li / buf_count=%li\n", (long)diff, play->buf_count); + if (fill > delay1 && play->buf_count < diff) { + diff = diff - play->buf_count; + if (verbose > 6) + snd_output_printf(loop->output, + "sync: playback silence added %li samples\n", (long)diff); + play->buf_pos -= diff; + play->buf_pos %= play->buf_size; + if ((err = snd_pcm_format_set_silence(play->format, play->buf + play->buf_pos * play->channels, diff)) < 0) + return err; + play->buf_count += diff; + } + if ((err = snd_pcm_prepare(play->handle)) < 0) { + logit(LOG_CRIT, "%s prepare failed: %s\n", play->id, snd_strerror(err)); + + return err; + } + delay1 = writeit(play); + if (verbose > 6) + snd_output_printf(loop->output, + "sync: playback wrote %li samples\n", (long)delay1); + if (delay1 > diff) { + buf_remove(loop, delay1 - diff); + if (verbose > 6) + snd_output_printf(loop->output, + "sync: playback buf_remove %li samples\n", (long)(delay1 - diff)); + } + if ((err = snd_pcm_start(play->handle)) < 0) { + logit(LOG_CRIT, "%s start failed: %s\n", play->id, snd_strerror(err)); + return err; + } + } + if (verbose > 5) { + snd_output_printf(loop->output, "%s: xrun sync ok\n", loop->id); + if (verbose > 6) { + if (snd_pcm_delay(capt->handle, &cdelay) < 0) + cdelay = -1; + if (snd_pcm_delay(play->handle, &pdelay) < 0) + pdelay = -1; + if (play->buf != capt->buf) + cdelay += capt->buf_count; + pdelay += play->buf_count; +#ifdef USE_SAMPLERATE + pdelay += loop->src_out_frames; +#endif + cdelay1 = cdelay * capt->pitch; + pdelay1 = pdelay * play->pitch; + delay1 = cdelay1 + pdelay1; + snd_output_printf(loop->output, "%s: sync verify: %li\n", loop->id, delay1); + } + } + loop->xrun_max_proctime = 0; + return 0; +} + +static int set_notify(struct loopback_handle *lhandle, int enable) +{ + int err; + + if (lhandle->ctl_notify == NULL) + return 0; + snd_ctl_elem_value_set_boolean(lhandle->ctl_notify, 0, enable); + err = snd_ctl_elem_write(lhandle->ctl, lhandle->ctl_notify); + if (err < 0) { + logit(LOG_CRIT, "Cannot set PCM Notify element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + err = snd_ctl_elem_read(lhandle->ctl, lhandle->ctl_notify); + if (err < 0) { + logit(LOG_CRIT, "Cannot get PCM Notify element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return 0; +} + +static int set_rate_shift(struct loopback_handle *lhandle, double pitch) +{ + int err; + + if (lhandle->ctl_rate_shift == NULL) + return 0; + snd_ctl_elem_value_set_integer(lhandle->ctl_rate_shift, 0, pitch * 100000); + err = snd_ctl_elem_write(lhandle->ctl, lhandle->ctl_rate_shift); + if (err < 0) { + logit(LOG_CRIT, "Cannot set PCM Rate Shift element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return 0; +} + +void update_pitch(struct loopback *loop) +{ + double pitch = loop->pitch; + +#ifdef USE_SAMPLERATE + if (loop->sync == SYNC_TYPE_SAMPLERATE) { + loop->src_data.src_ratio = (double)1.0 / (pitch * + loop->play->pitch * loop->capt->pitch); + if (verbose > 2) + snd_output_printf(loop->output, "%s: Samplerate src_ratio update1: %.8f\n", loop->id, loop->src_data.src_ratio); + } else +#endif + if (loop->sync == SYNC_TYPE_CAPTRATESHIFT) { + set_rate_shift(loop->capt, pitch); +#ifdef USE_SAMPLERATE + if (loop->use_samplerate) { + loop->src_data.src_ratio = + (double)1.0 / + (loop->play->pitch * loop->capt->pitch); + if (verbose > 2) + snd_output_printf(loop->output, "%s: Samplerate src_ratio update2: %.8f\n", loop->id, loop->src_data.src_ratio); + } +#endif + } + else if (loop->sync == SYNC_TYPE_PLAYRATESHIFT) { + set_rate_shift(loop->play, pitch); +#ifdef USE_SAMPLERATE + if (loop->use_samplerate) { + loop->src_data.src_ratio = + (double)1.0 / + (loop->play->pitch * loop->capt->pitch); + if (verbose > 2) + snd_output_printf(loop->output, "%s: Samplerate src_ratio update3: %.8f\n", loop->id, loop->src_data.src_ratio); + } +#endif + } + if (verbose) + snd_output_printf(loop->output, "New pitch for %s: %.8f (min/max samples = %li/%li)\n", loop->id, pitch, loop->pitch_diff_min, loop->pitch_diff_max); +} + +static int get_active(struct loopback_handle *lhandle) +{ + int err; + + if (lhandle->ctl_active == NULL) + return 0; + err = snd_ctl_elem_read(lhandle->ctl, lhandle->ctl_active); + if (err < 0) { + logit(LOG_CRIT, "Cannot get PCM Slave Active element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return snd_ctl_elem_value_get_boolean(lhandle->ctl_active, 0); +} + +static int get_format(struct loopback_handle *lhandle) +{ + int err; + + if (lhandle->ctl_format == NULL) + return 0; + err = snd_ctl_elem_read(lhandle->ctl, lhandle->ctl_format); + if (err < 0) { + logit(LOG_CRIT, "Cannot get PCM Format element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return snd_ctl_elem_value_get_integer(lhandle->ctl_format, 0); +} + +static int get_rate(struct loopback_handle *lhandle) +{ + int err; + + if (lhandle->ctl_rate == NULL) + return 0; + err = snd_ctl_elem_read(lhandle->ctl, lhandle->ctl_rate); + if (err < 0) { + logit(LOG_CRIT, "Cannot get PCM Rate element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return snd_ctl_elem_value_get_integer(lhandle->ctl_rate, 0); +} + +static int get_channels(struct loopback_handle *lhandle) +{ + int err; + + if (lhandle->ctl_channels == NULL) + return 0; + err = snd_ctl_elem_read(lhandle->ctl, lhandle->ctl_channels); + if (err < 0) { + logit(LOG_CRIT, "Cannot get PCM Channels element for %s: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + return snd_ctl_elem_value_get_integer(lhandle->ctl_channels, 0); +} + +static void openctl_elem(struct loopback_handle *lhandle, + int device, int subdevice, + const char *name, + snd_ctl_elem_value_t **elem) +{ + int err; + + if (snd_ctl_elem_value_malloc(elem) < 0) { + *elem = NULL; + } else { + snd_ctl_elem_value_set_interface(*elem, + SND_CTL_ELEM_IFACE_PCM); + snd_ctl_elem_value_set_device(*elem, device); + snd_ctl_elem_value_set_subdevice(*elem, subdevice); + snd_ctl_elem_value_set_name(*elem, name); + err = snd_ctl_elem_read(lhandle->ctl, *elem); + if (err < 0) { + snd_ctl_elem_value_free(*elem); + *elem = NULL; + } + } +} + +static int openctl(struct loopback_handle *lhandle, int device, int subdevice) +{ + int err; + + lhandle->ctl_rate_shift = NULL; + if (lhandle->loopback->play == lhandle) { + if (lhandle->loopback->controls) + goto __events; + return 0; + } + openctl_elem(lhandle, device, subdevice, "PCM Notify", + &lhandle->ctl_notify); + openctl_elem(lhandle, device, subdevice, "PCM Rate Shift 100000", + &lhandle->ctl_rate_shift); + set_rate_shift(lhandle, 1); + openctl_elem(lhandle, device, subdevice, "PCM Slave Active", + &lhandle->ctl_active); + openctl_elem(lhandle, device, subdevice, "PCM Slave Format", + &lhandle->ctl_format); + openctl_elem(lhandle, device, subdevice, "PCM Slave Rate", + &lhandle->ctl_rate); + openctl_elem(lhandle, device, subdevice, "PCM Slave Channels", + &lhandle->ctl_channels); + if ((lhandle->ctl_active && + lhandle->ctl_format && + lhandle->ctl_rate && + lhandle->ctl_channels) || + lhandle->loopback->controls) { + __events: + if ((err = snd_ctl_poll_descriptors_count(lhandle->ctl)) < 0) + lhandle->ctl_pollfd_count = 0; + else + lhandle->ctl_pollfd_count = err; + if (snd_ctl_subscribe_events(lhandle->ctl, 1) < 0) + lhandle->ctl_pollfd_count = 0; + } + return 0; +} + +static int openit(struct loopback_handle *lhandle) +{ + snd_pcm_info_t *info; + int stream = lhandle == lhandle->loopback->play ? + SND_PCM_STREAM_PLAYBACK : + SND_PCM_STREAM_CAPTURE; + int err, card, device, subdevice; + pcm_open_lock(); + err = snd_pcm_open(&lhandle->handle, lhandle->device, stream, SND_PCM_NONBLOCK); + pcm_open_unlock(); + if (err < 0) { + logit(LOG_CRIT, "%s open error: %s\n", lhandle->id, snd_strerror(err)); + return err; + } + if ((err = snd_pcm_info_malloc(&info)) < 0) + return err; + if ((err = snd_pcm_info(lhandle->handle, info)) < 0) { + snd_pcm_info_free(info); + return err; + } + card = snd_pcm_info_get_card(info); + device = snd_pcm_info_get_device(info); + subdevice = snd_pcm_info_get_subdevice(info); + snd_pcm_info_free(info); + lhandle->card_number = card; + lhandle->ctl = NULL; + if (card >= 0 || lhandle->ctldev) { + char name[16], *dev = lhandle->ctldev; + if (dev == NULL) { + sprintf(name, "hw:%i", card); + dev = name; + } + pcm_open_lock(); + err = snd_ctl_open(&lhandle->ctl, dev, SND_CTL_NONBLOCK); + pcm_open_unlock(); + if (err < 0) { + logit(LOG_CRIT, "%s [%s] ctl open error: %s\n", lhandle->id, dev, snd_strerror(err)); + lhandle->ctl = NULL; + } + if (lhandle->ctl) + openctl(lhandle, device, subdevice); + } + return 0; +} + +static int freeit(struct loopback_handle *lhandle) +{ + free(lhandle->buf); + lhandle->buf = NULL; + return 0; +} + +static int closeit(struct loopback_handle *lhandle) +{ + int err = 0; + + set_rate_shift(lhandle, 1); + if (lhandle->ctl_rate_shift) + snd_ctl_elem_value_free(lhandle->ctl_rate_shift); + lhandle->ctl_rate_shift = NULL; + if (lhandle->ctl) + err = snd_ctl_close(lhandle->ctl); + lhandle->ctl = NULL; + if (lhandle->handle) + err = snd_pcm_close(lhandle->handle); + lhandle->handle = NULL; + return err; +} + +static int init_handle(struct loopback_handle *lhandle, int alloc) +{ + snd_pcm_uframes_t lat; + lhandle->frame_size = (snd_pcm_format_width(lhandle->format) / 8) * + lhandle->channels; + lhandle->sync_point = lhandle->rate * 15; /* every 15 seconds */ + lat = lhandle->loopback->latency; + if (lhandle->buffer_size > lat) + lat = lhandle->buffer_size; + lhandle->buf_size = lat * 2; + if (alloc) { + lhandle->buf = calloc(1, lhandle->buf_size * lhandle->frame_size); + if (lhandle->buf == NULL) + return -ENOMEM; + } + return 0; +} + +int pcmjob_init(struct loopback *loop) +{ + int err; + char id[128]; + +#ifdef FILE_CWRITE + loop->cfile = fopen(FILE_CWRITE, "w+"); +#endif +#ifdef FILE_PWRITE + loop->pfile = fopen(FILE_PWRITE, "w+"); +#endif + if ((err = openit(loop->play)) < 0) + goto __error; + if ((err = openit(loop->capt)) < 0) + goto __error; + snprintf(id, sizeof(id), "%s/%s", loop->play->id, loop->capt->id); + id[sizeof(id)-1] = '\0'; + loop->id = strdup(id); + if (loop->sync == SYNC_TYPE_AUTO && loop->capt->ctl_rate_shift) + loop->sync = SYNC_TYPE_CAPTRATESHIFT; + if (loop->sync == SYNC_TYPE_AUTO && loop->play->ctl_rate_shift) + loop->sync = SYNC_TYPE_PLAYRATESHIFT; +#ifdef USE_SAMPLERATE + if (loop->sync == SYNC_TYPE_AUTO && loop->src_enable) + loop->sync = SYNC_TYPE_SAMPLERATE; +#endif + if (loop->sync == SYNC_TYPE_AUTO) + loop->sync = SYNC_TYPE_SIMPLE; + if (loop->slave == SLAVE_TYPE_AUTO && + loop->capt->ctl_notify && + loop->capt->ctl_active && + loop->capt->ctl_format && + loop->capt->ctl_rate && + loop->capt->ctl_channels) + loop->slave = SLAVE_TYPE_ON; + if (loop->slave == SLAVE_TYPE_ON) { + err = set_notify(loop->capt, 1); + if (err < 0) + goto __error; + if (loop->capt->ctl_notify == NULL || + snd_ctl_elem_value_get_boolean(loop->capt->ctl_notify, 0) == 0) { + logit(LOG_CRIT, "unable to enable slave mode for %s\n", loop->id); + err = -EINVAL; + goto __error; + } + } + err = control_init(loop); + if (err < 0) + goto __error; + return 0; + __error: + pcmjob_done(loop); + return err; +} + +static void freeloop(struct loopback *loop) +{ +#ifdef USE_SAMPLERATE + if (loop->use_samplerate) { + if (loop->src_state) + src_delete(loop->src_state); + loop->src_state = NULL; + free(loop->src_data.data_in); + loop->src_data.data_in = NULL; + free(loop->src_data.data_out); + loop->src_data.data_out = NULL; + } +#endif + if (loop->play->buf == loop->capt->buf) + loop->play->buf = NULL; + freeit(loop->play); + freeit(loop->capt); +} + +int pcmjob_done(struct loopback *loop) +{ + control_done(loop); + closeit(loop->play); + closeit(loop->capt); + freeloop(loop); + free(loop->id); + loop->id = NULL; +#ifdef FILE_PWRITE + if (loop->pfile) { + fclose(loop->pfile); + loop->pfile = NULL; + } +#endif +#ifdef FILE_CWRITE + if (loop->cfile) { + fclose(loop->cfile); + loop->cfile = NULL; + } +#endif + return 0; +} + +static void lhandle_start(struct loopback_handle *lhandle) +{ + lhandle->buf_pos = 0; + lhandle->buf_count = 0; + lhandle->counter = 0; + lhandle->total_queued = 0; +} + +int pcmjob_start(struct loopback *loop) +{ + snd_pcm_uframes_t count; + int err; + + loop->pollfd_count = loop->play->ctl_pollfd_count + + loop->capt->ctl_pollfd_count; + if ((err = snd_pcm_poll_descriptors_count(loop->play->handle)) < 0) + goto __error; + loop->play->pollfd_count = err; + loop->pollfd_count += err; + if ((err = snd_pcm_poll_descriptors_count(loop->capt->handle)) < 0) + goto __error; + loop->capt->pollfd_count = err; + loop->pollfd_count += err; + if (loop->slave == SLAVE_TYPE_ON) { + err = get_active(loop->capt); + if (err < 0) + goto __error; + if (err == 0) /* stream is not active */ + return 0; + err = get_format(loop->capt); + if (err < 0) + goto __error; + loop->play->format = loop->capt->format = err; + err = get_rate(loop->capt); + if (err < 0) + goto __error; + loop->play->rate_req = loop->capt->rate_req = err; + err = get_channels(loop->capt); + if (err < 0) + goto __error; + loop->play->channels = loop->capt->channels = err; + } + loop->reinit = 0; + loop->use_samplerate = 0; + if (loop->latency_req) { + loop->latency_reqtime = frames_to_time(loop->play->rate_req, + loop->latency_req); + loop->latency_req = 0; + } + loop->latency = time_to_frames(loop->play->rate_req, loop->latency_reqtime); + if ((err = setparams(loop, loop->latency/2)) < 0) + goto __error; + if (verbose) + showlatency(loop->output, loop->latency, loop->play->rate_req, "Latency"); + if (loop->play->access == loop->capt->access && + loop->play->format == loop->capt->format && + loop->play->rate == loop->capt->rate && + loop->play->channels == loop->play->channels && + loop->sync != SYNC_TYPE_SAMPLERATE) { + if (verbose > 1) + snd_output_printf(loop->output, "shared buffer!!!\n"); + if ((err = init_handle(loop->play, 1)) < 0) + goto __error; + if ((err = init_handle(loop->capt, 0)) < 0) + goto __error; + if (loop->play->buf_size < loop->capt->buf_size) { + char *nbuf = realloc(loop->play->buf, + loop->capt->buf_size * + loop->capt->frame_size); + if (nbuf == NULL) { + err = -ENOMEM; + goto __error; + } + loop->play->buf = nbuf; + loop->play->buf_size = loop->capt->buf_size; + } else if (loop->capt->buf_size < loop->play->buf_size) { + char *nbuf = realloc(loop->capt->buf, + loop->play->buf_size * + loop->play->frame_size); + if (nbuf == NULL) { + err = -ENOMEM; + goto __error; + } + loop->capt->buf = nbuf; + loop->capt->buf_size = loop->play->buf_size; + } + loop->capt->buf = loop->play->buf; + } else { + if ((err = init_handle(loop->play, 1)) < 0) + goto __error; + if ((err = init_handle(loop->capt, 1)) < 0) + goto __error; + if (loop->play->rate_req != loop->play->rate) + loop->use_samplerate = 1; + if (loop->capt->rate_req != loop->capt->rate) + loop->use_samplerate = 1; + } +#ifdef USE_SAMPLERATE + if (loop->sync == SYNC_TYPE_SAMPLERATE) + loop->use_samplerate = 1; + if (loop->use_samplerate && !loop->src_enable) { + logit(LOG_CRIT, "samplerate conversion required but disabled\n"); + loop->use_samplerate = 0; + err = -EIO; + goto __error; + } + if (loop->use_samplerate) { + if ((loop->capt->format != SND_PCM_FORMAT_S16 || + loop->play->format != SND_PCM_FORMAT_S16) && + (loop->capt->format != SND_PCM_FORMAT_S32 || + loop->play->format != SND_PCM_FORMAT_S32)) { + logit(LOG_CRIT, "samplerate conversion supports only %s or %s formats (play=%s, capt=%s)\n", snd_pcm_format_name(SND_PCM_FORMAT_S16), snd_pcm_format_name(SND_PCM_FORMAT_S32), snd_pcm_format_name(loop->play->format), snd_pcm_format_name(loop->capt->format)); + loop->use_samplerate = 0; + err = -EIO; + goto __error; + } + loop->src_state = src_new(loop->src_converter_type, + loop->play->channels, &err); + loop->src_data.data_in = calloc(1, sizeof(float)*loop->capt->channels*loop->capt->buf_size); + if (loop->src_data.data_in == NULL) { + err = -ENOMEM; + goto __error; + } + loop->src_data.data_out = calloc(1, sizeof(float)*loop->play->channels*loop->play->buf_size); + if (loop->src_data.data_out == NULL) { + err = -ENOMEM; + goto __error; + } + loop->src_data.src_ratio = (double)loop->play->rate / + (double)loop->capt->rate; + loop->src_data.end_of_input = 0; + loop->src_out_frames = 0; + } else { + loop->src_state = NULL; + } +#else + if (loop->sync == SYNC_TYPE_SAMPLERATE || loop->use_samplerate) { + logit(LOG_CRIT, "alsaloop is compiled without libsamplerate support\n"); + err = -EIO; + goto __error; + } +#endif + if (verbose) { + snd_output_printf(loop->output, "%s sync type: %s", loop->id, sync_types[loop->sync]); +#ifdef USE_SAMPLERATE + if (loop->sync == SYNC_TYPE_SAMPLERATE) + snd_output_printf(loop->output, " (%s)", src_types[loop->src_converter_type]); +#endif + snd_output_printf(loop->output, "\n"); + } + lhandle_start(loop->play); + lhandle_start(loop->capt); + if ((err = snd_pcm_format_set_silence(loop->play->format, + loop->play->buf, + loop->play->buf_size * loop->play->channels)) < 0) { + logit(LOG_CRIT, "%s: silence error\n", loop->id); + goto __error; + } + if (verbose > 4) + snd_output_printf(loop->output, "%s: capt->buffer_size = %li, play->buffer_size = %li\n", loop->id, loop->capt->buf_size, loop->play->buf_size); + loop->pitch = 1.0; + update_pitch(loop); + loop->pitch_delta = 1.0 / ((double)loop->capt->rate * 4); + loop->total_queued_count = 0; + loop->pitch_diff = 0; + count = get_whole_latency(loop) / loop->play->pitch; + loop->play->buf_count = count; + if (loop->play->buf == loop->capt->buf) + loop->capt->buf_pos = count; + err = writeit(loop->play); + if (verbose > 4) + snd_output_printf(loop->output, "%s: silence queued %i samples\n", loop->id, err); + if (count > loop->play->buffer_size) + count = loop->play->buffer_size; + if (err != count) { + logit(LOG_CRIT, "%s: initial playback fill error (%i/%i/%i)\n", loop->id, err, (int)count, loop->play->buffer_size); + err = -EIO; + goto __error; + } + loop->running = 1; + loop->stop_pending = 0; + if (loop->xrun) { + getcurtimestamp(&loop->xrun_last_update); + loop->xrun_last_pdelay = XRUN_PROFILE_UNKNOWN; + loop->xrun_last_cdelay = XRUN_PROFILE_UNKNOWN; + loop->xrun_max_proctime = 0; + } + if ((err = snd_pcm_start(loop->capt->handle)) < 0) { + logit(LOG_CRIT, "pcm start %s error: %s\n", loop->capt->id, snd_strerror(err)); + goto __error; + } + if (!loop->linked) { + if ((err = snd_pcm_start(loop->play->handle)) < 0) { + logit(LOG_CRIT, "pcm start %s error: %s\n", loop->play->id, snd_strerror(err)); + goto __error; + } + } + return 0; + __error: + pcmjob_stop(loop); + return err; +} + +int pcmjob_stop(struct loopback *loop) +{ + int err; + + if (loop->running) { + if ((err = snd_pcm_drop(loop->capt->handle)) < 0) + logit(LOG_WARNING, "pcm drop %s error: %s\n", loop->capt->id, snd_strerror(err)); + if ((err = snd_pcm_drop(loop->play->handle)) < 0) + logit(LOG_WARNING, "pcm drop %s error: %s\n", loop->play->id, snd_strerror(err)); + if ((err = snd_pcm_hw_free(loop->capt->handle)) < 0) + logit(LOG_WARNING, "pcm hw_free %s error: %s\n", loop->capt->id, snd_strerror(err)); + if ((err = snd_pcm_hw_free(loop->play->handle)) < 0) + logit(LOG_WARNING, "pcm hw_free %s error: %s\n", loop->play->id, snd_strerror(err)); + loop->running = 0; + } + freeloop(loop); + return 0; +} + +int pcmjob_pollfds_init(struct loopback *loop, struct pollfd *fds) +{ + int err, idx = 0; + + if (loop->running) { + err = snd_pcm_poll_descriptors(loop->play->handle, fds + idx, loop->play->pollfd_count); + if (err < 0) + return err; + idx += loop->play->pollfd_count; + err = snd_pcm_poll_descriptors(loop->capt->handle, fds + idx, loop->capt->pollfd_count); + if (err < 0) + return err; + idx += loop->capt->pollfd_count; + } + if (loop->play->ctl_pollfd_count > 0 && + (loop->slave == SLAVE_TYPE_ON || loop->controls)) { + err = snd_ctl_poll_descriptors(loop->play->ctl, fds + idx, loop->play->ctl_pollfd_count); + if (err < 0) + return err; + idx += loop->play->ctl_pollfd_count; + } + if (loop->capt->ctl_pollfd_count > 0 && + (loop->slave == SLAVE_TYPE_ON || loop->controls)) { + err = snd_ctl_poll_descriptors(loop->capt->ctl, fds + idx, loop->capt->ctl_pollfd_count); + if (err < 0) + return err; + idx += loop->capt->ctl_pollfd_count; + } + loop->active_pollfd_count = idx; + return idx; +} + +static snd_pcm_sframes_t get_queued_playback_samples(struct loopback *loop) +{ + snd_pcm_sframes_t delay; + int err; + + if ((err = snd_pcm_delay(loop->play->handle, &delay)) < 0) + return 0; + loop->play->last_delay = delay; + delay += loop->play->buf_count; +#ifdef USE_SAMPLERATE + delay += loop->src_out_frames; +#endif + return delay; +} + +static snd_pcm_sframes_t get_queued_capture_samples(struct loopback *loop) +{ + snd_pcm_sframes_t delay; + int err; + + if ((err = snd_pcm_delay(loop->capt->handle, &delay)) < 0) + return 0; + loop->capt->last_delay = delay; + delay += loop->capt->buf_count; + return delay; +} + +static int ctl_event_check(snd_ctl_elem_value_t *val, snd_ctl_event_t *ev) +{ + snd_ctl_elem_id_t *id1, *id2; + snd_ctl_elem_id_alloca(&id1); + snd_ctl_elem_id_alloca(&id2); + snd_ctl_elem_value_get_id(val, id1); + snd_ctl_event_elem_get_id(ev, id2); + if (snd_ctl_event_elem_get_mask(ev) == SND_CTL_EVENT_MASK_REMOVE) + return 0; + if ((snd_ctl_event_elem_get_mask(ev) & SND_CTL_EVENT_MASK_VALUE) == 0) + return 0; + return control_id_match(id1, id2); +} + +static int handle_ctl_events(struct loopback_handle *lhandle, + unsigned short events) +{ + struct loopback *loop = lhandle->loopback; + snd_ctl_event_t *ev; + int err, restart = 0; + + snd_ctl_event_alloca(&ev); + while ((err = snd_ctl_read(lhandle->ctl, ev)) != 0 && err != -EAGAIN) { + if (err < 0) + break; + if (snd_ctl_event_get_type(ev) != SND_CTL_EVENT_ELEM) + continue; + if (lhandle == loop->play) + goto __ctl_check; + if (verbose > 6) + snd_output_printf(loop->output, "%s: ctl event!!!! %s\n", lhandle->id, snd_ctl_event_elem_get_name(ev)); + if (ctl_event_check(lhandle->ctl_active, ev)) { + continue; + } else if (ctl_event_check(lhandle->ctl_format, ev)) { + err = get_format(lhandle); + if (lhandle->format != err) + restart = 1; + continue; + } else if (ctl_event_check(lhandle->ctl_rate, ev)) { + err = get_rate(lhandle); + if (lhandle->rate != err) + restart = 1; + continue; + } else if (ctl_event_check(lhandle->ctl_channels, ev)) { + err = get_channels(lhandle); + if (lhandle->channels != err) + restart = 1; + continue; + } + __ctl_check: + control_event(lhandle, ev); + } + err = get_active(lhandle); + if (verbose > 7) + snd_output_printf(loop->output, "%s: ctl event active %i\n", lhandle->id, err); + if (!err) { + if (lhandle->loopback->running) { + loop->stop_pending = 1; + loop->stop_count = 0; + } + } else { + loop->stop_pending = 0; + if (loop->running == 0) + restart = 1; + } + if (restart) { + pcmjob_stop(loop); + err = pcmjob_start(loop); + if (err < 0) + return err; + } + return 1; +} + +int pcmjob_pollfds_handle(struct loopback *loop, struct pollfd *fds) +{ + struct loopback_handle *play = loop->play; + struct loopback_handle *capt = loop->capt; + unsigned short prevents, crevents, events; + snd_pcm_uframes_t ccount, pcount; + int err, loopcount = 10, idx; + + if (verbose > 11) + snd_output_printf(loop->output, "%s: pollfds handle\n", loop->id); + if (verbose > 13 || loop->xrun) + getcurtimestamp(&loop->tstamp_start); + if (verbose > 12) { + snd_pcm_sframes_t pdelay, cdelay; + if ((err = snd_pcm_delay(play->handle, &pdelay)) < 0) + snd_output_printf(loop->output, "%s: delay error: %s / %li / %li\n", play->id, snd_strerror(err), play->buf_size, play->buf_count); + else + snd_output_printf(loop->output, "%s: delay %li / %li / %li\n", play->id, pdelay, play->buf_size, play->buf_count); + if ((err = snd_pcm_delay(capt->handle, &cdelay)) < 0) + snd_output_printf(loop->output, "%s: delay error: %s / %li / %li\n", capt->id, snd_strerror(err), capt->buf_size, capt->buf_count); + else + snd_output_printf(loop->output, "%s: delay %li / %li / %li\n", capt->id, cdelay, capt->buf_size, capt->buf_count); + } + idx = 0; + if (loop->running) { + err = snd_pcm_poll_descriptors_revents(play->handle, fds, + play->pollfd_count, + &prevents); + if (err < 0) + return err; + idx += play->pollfd_count; + err = snd_pcm_poll_descriptors_revents(capt->handle, fds + idx, + capt->pollfd_count, + &crevents); + if (err < 0) + return err; + idx += capt->pollfd_count; + if (loop->xrun) { + if (prevents || crevents) { + loop->xrun_last_wake = loop->xrun_last_wake0; + loop->xrun_last_wake0 = loop->tstamp_start; + } + loop->xrun_last_check = loop->xrun_last_check0; + loop->xrun_last_check0 = loop->tstamp_start; + } + } else { + prevents = crevents = 0; + } + if (play->ctl_pollfd_count > 0 && + (loop->slave == SLAVE_TYPE_ON || loop->controls)) { + err = snd_ctl_poll_descriptors_revents(play->ctl, fds + idx, + play->ctl_pollfd_count, + &events); + if (err < 0) + return err; + if (events) { + err = handle_ctl_events(play, events); + if (err == 1) + return 0; + if (err < 0) + return err; + } + idx += play->ctl_pollfd_count; + } + if (capt->ctl_pollfd_count > 0 && + (loop->slave == SLAVE_TYPE_ON || loop->controls)) { + err = snd_ctl_poll_descriptors_revents(capt->ctl, fds + idx, + capt->ctl_pollfd_count, + &events); + if (err < 0) + return err; + if (events) { + err = handle_ctl_events(capt, events); + if (err == 1) + return 0; + if (err < 0) + return err; + } + idx += capt->ctl_pollfd_count; + } + if (verbose > 9) + snd_output_printf(loop->output, "%s: prevents = 0x%x, crevents = 0x%x\n", loop->id, prevents, crevents); + if (!loop->running) + goto __pcm_end; + do { + ccount = readit(capt); + buf_add(loop, ccount); + if (capt->xrun_pending || loop->reinit) + break; + /* we read new samples, if we have a room in the playback + buffer, feed them there */ + pcount = writeit(play); + buf_remove(loop, pcount); + if (play->xrun_pending || loop->reinit) + break; + loopcount--; + } while ((ccount > 0 || pcount > 0) && loopcount > 0); + if (play->xrun_pending || capt->xrun_pending) { + if ((err = xrun_sync(loop)) < 0) + return err; + } + if (loop->reinit) { + err = pcmjob_stop(loop); + if (err < 0) + return err; + err = pcmjob_start(loop); + if (err < 0) + return err; + } + if (loop->sync != SYNC_TYPE_NONE && + play->counter >= play->sync_point && + capt->counter >= play->sync_point) { + snd_pcm_sframes_t diff, lat = get_whole_latency(loop); + diff = ((double)(((double)play->total_queued * play->pitch) + + ((double)capt->total_queued * capt->pitch)) / + (double)loop->total_queued_count) - lat; + /* FIXME: this algorithm may be slightly better */ + if (verbose > 3) + snd_output_printf(loop->output, "%s: sync diff %li old diff %li\n", loop->id, diff, loop->pitch_diff); + if (diff > 0) { + if (diff == loop->pitch_diff) + loop->pitch += loop->pitch_delta; + else if (diff > loop->pitch_diff) + loop->pitch += loop->pitch_delta*2; + } else if (diff < 0) { + if (diff == loop->pitch_diff) + loop->pitch -= loop->pitch_delta; + else if (diff < loop->pitch_diff) + loop->pitch -= loop->pitch_delta*2; + } + loop->pitch_diff = diff; + if (loop->pitch_diff_min > diff) + loop->pitch_diff_min = diff; + if (loop->pitch_diff_max < diff) + loop->pitch_diff_max = diff; + update_pitch(loop); + play->counter -= play->sync_point; + capt->counter -= play->sync_point; + play->total_queued = 0; + capt->total_queued = 0; + loop->total_queued_count = 0; + } + if (loop->sync != SYNC_TYPE_NONE) { + snd_pcm_sframes_t pqueued, cqueued; + pqueued = get_queued_playback_samples(loop); + cqueued = get_queued_capture_samples(loop); + if (verbose > 4) + snd_output_printf(loop->output, "%s: queued %li/%li samples\n", loop->id, pqueued, cqueued); + if (pqueued > 0) + play->total_queued += pqueued; + if (cqueued > 0) + capt->total_queued += cqueued; + if (pqueued > 0 || cqueued > 0) + loop->total_queued_count += 1; + } + if (verbose > 12) { + snd_pcm_sframes_t pdelay, cdelay; + if ((err = snd_pcm_delay(play->handle, &pdelay)) < 0) + snd_output_printf(loop->output, "%s: end delay error: %s / %li / %li\n", play->id, snd_strerror(err), play->buf_size, play->buf_count); + else + snd_output_printf(loop->output, "%s: end delay %li / %li / %li\n", play->id, pdelay, play->buf_size, play->buf_count); + if ((err = snd_pcm_delay(capt->handle, &cdelay)) < 0) + snd_output_printf(loop->output, "%s: end delay error: %s / %li / %li\n", capt->id, snd_strerror(err), capt->buf_size, capt->buf_count); + else + snd_output_printf(loop->output, "%s: end delay %li / %li / %li\n", capt->id, cdelay, capt->buf_size, capt->buf_count); + } + __pcm_end: + if (verbose > 13 || loop->xrun) { + long diff; + getcurtimestamp(&loop->tstamp_end); + diff = timediff(loop->tstamp_end, loop->tstamp_start); + if (verbose > 13) + snd_output_printf(loop->output, "%s: processing time %lius\n", loop->id, diff); + if (loop->xrun && loop->xrun_max_proctime < diff) + loop->xrun_max_proctime = diff; + } + return 0; +} + +#define OUT(args...) \ + snd_output_printf(loop->state, ##args) + +static pthread_mutex_t state_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void show_handle(struct loopback_handle *lhandle, const char *id) +{ + struct loopback *loop = lhandle->loopback; + + OUT(" %s: %s:\n", id, lhandle->id); + OUT(" device = '%s', ctldev '%s'\n", lhandle->device, lhandle->ctldev); + OUT(" card_number = %i\n", lhandle->card_number); + if (!loop->running) + return; + OUT(" access = %s, format = %s, rate = %u, channels = %u\n", snd_pcm_access_name(lhandle->access), snd_pcm_format_name(lhandle->format), lhandle->rate, lhandle->channels); + OUT(" buffer_size = %u, period_size = %u, avail_min = %li\n", lhandle->buffer_size, lhandle->period_size, lhandle->avail_min); + OUT(" xrun_pending = %i\n", lhandle->xrun_pending); + OUT(" buf_size = %li, buf_pos = %li, buf_count = %li, buf_over = %li\n", lhandle->buf_size, lhandle->buf_pos, lhandle->buf_count, lhandle->buf_over); + OUT(" pitch = %.8f\n", lhandle->pitch); +} + +void pcmjob_state(struct loopback *loop) +{ + pthread_t self = pthread_self(); + pthread_mutex_lock(&state_mutex); + OUT("State dump for thread %p job %i: %s:\n", (void *)self, loop->thread, loop->id); + OUT(" running = %i\n", loop->running); + OUT(" sync = %i\n", loop->sync); + OUT(" slave = %i\n", loop->slave); + if (!loop->running) + goto __skip; + OUT(" pollfd_count = %i\n", loop->pollfd_count); + OUT(" pitch = %.8f, delta = %.8f, diff = %li, min = %li, max = %li\n", loop->pitch, loop->pitch_delta, loop->pitch_diff, loop->pitch_diff_min, loop->pitch_diff_max); + OUT(" use_samplerate = %i\n", loop->use_samplerate); + __skip: + show_handle(loop->play, "playback"); + show_handle(loop->capt, "capture"); + pthread_mutex_unlock(&state_mutex); +} diff --git a/alsamixer/Makefile.am b/alsamixer/Makefile.am new file mode 100644 index 0000000..8a82323 --- /dev/null +++ b/alsamixer/Makefile.am @@ -0,0 +1,25 @@ +AM_CFLAGS = @CURSES_CFLAGS@ -DCURSESINC="@CURSESINC@" +LDADD = @CURSESLIB@ + +bin_PROGRAMS = alsamixer +alsamixer_SOURCES = card_select.c card_select.h \ + cli.c \ + colors.c colors.h \ + device_name.c device_name.h \ + die.c die.h \ + mainloop.c mainloop.h \ + mem.c mem.h \ + mixer_controls.c mixer_controls.h \ + mixer_display.c mixer_display.h \ + mixer_widget.c mixer_widget.h \ + proc_files.c proc_files.h \ + textbox.c textbox.h \ + utils.c utils.h \ + volume_mapping.c volume_mapping.h \ + widget.c widget.h +man_MANS = alsamixer.1 +EXTRA_DIST = alsamixer.1 +alsamixer_INCLUDES = -I$(top_srcdir)/include + +#LDFLAGS = -static +#CFLAGS += -g -Wall diff --git a/alsamixer/Makefile.in b/alsamixer/Makefile.in new file mode 100644 index 0000000..daefb4e --- /dev/null +++ b/alsamixer/Makefile.in @@ -0,0 +1,619 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = alsamixer$(EXEEXT) +subdir = alsamixer +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_alsamixer_OBJECTS = card_select.$(OBJEXT) cli.$(OBJEXT) \ + colors.$(OBJEXT) device_name.$(OBJEXT) die.$(OBJEXT) \ + mainloop.$(OBJEXT) mem.$(OBJEXT) mixer_controls.$(OBJEXT) \ + mixer_display.$(OBJEXT) mixer_widget.$(OBJEXT) \ + proc_files.$(OBJEXT) textbox.$(OBJEXT) utils.$(OBJEXT) \ + volume_mapping.$(OBJEXT) widget.$(OBJEXT) +alsamixer_OBJECTS = $(am_alsamixer_OBJECTS) +alsamixer_LDADD = $(LDADD) +alsamixer_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(alsamixer_SOURCES) +DIST_SOURCES = $(alsamixer_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +AM_CFLAGS = @CURSES_CFLAGS@ -DCURSESINC="@CURSESINC@" +LDADD = @CURSESLIB@ +alsamixer_SOURCES = card_select.c card_select.h \ + cli.c \ + colors.c colors.h \ + device_name.c device_name.h \ + die.c die.h \ + mainloop.c mainloop.h \ + mem.c mem.h \ + mixer_controls.c mixer_controls.h \ + mixer_display.c mixer_display.h \ + mixer_widget.c mixer_widget.h \ + proc_files.c proc_files.h \ + textbox.c textbox.h \ + utils.c utils.h \ + volume_mapping.c volume_mapping.h \ + widget.c widget.h + +man_MANS = alsamixer.1 +EXTRA_DIST = alsamixer.1 +alsamixer_INCLUDES = -I$(top_srcdir)/include +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alsamixer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign alsamixer/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +alsamixer$(EXEEXT): $(alsamixer_OBJECTS) $(alsamixer_DEPENDENCIES) + @rm -f alsamixer$(EXEEXT) + $(LINK) $(alsamixer_OBJECTS) $(alsamixer_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/card_select.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/colors.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/device_name.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/die.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainloop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixer_controls.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixer_display.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixer_widget.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proc_files.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textbox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/volume_mapping.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/widget.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +#LDFLAGS = -static +#CFLAGS += -g -Wall + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alsamixer/alsamixer.1 b/alsamixer/alsamixer.1 new file mode 100644 index 0000000..cd88404 --- /dev/null +++ b/alsamixer/alsamixer.1 @@ -0,0 +1,178 @@ +.TH ALSAMIXER 1 "22 May 2009" +.SH NAME +alsamixer \- soundcard mixer for ALSA soundcard driver, with ncurses interface +.SH SYNOPSIS + +\fBalsamixer\fP [\fIoptions\fP] + +.SH DESCRIPTION +\fBalsamixer\fP is an ncurses mixer program for use with the ALSA +soundcard drivers. It supports multiple soundcards with multiple devices. + +.SH OPTIONS + +.TP +\fI\-h, \-\-help\fP +Help: show available flags. + +.TP +\fI\-c, \-\-card\fP +Select the soundcard to use, if you have more than one. Cards are +numbered from 0 (the default). + +.TP +\fI\-D, \-\-device\fP +Select the mixer device to control. + +.TP +\fI\-V, \-\-view\fP +Select the starting view mode, either \fIplayback\fP, \fIcapture\fP or \fIall\fP. + +.TP +\fI\-g, \-\-no\-color\fP +Toggle the using of colors. + +.SH MIXER VIEWS + +The top-left corner of \fBalsamixer\fP is the are to show some basic +information: the card name, the mixer chip name, the current view +mode and the currently selected mixer item. +When the mixer item is switched off, \fI[Off]\fP is displayed in its +name. + +Volume bars are located below the basic information area. You can +scroll left/right when all controls can't be put in a single screen. +The name of each control is shown in the bottom below the volume bars. +The currently selected item is drawn in red and/of emphasized. + +Each mixer control with volume capability shows a box and the current +volume filled in that box. The volume percentages are displayed below +the volume bar for left and right channels. For a mono control, only +one value is shown there. + +When a mixer control is turned off, \fIM\fP (mute) appears below the +volume bar. When it's turned on, \fIO\fP in green appears instead. +You can toggle the switch via \fIm\fP key. + +When a mixer control has capture capability, the capture flag appears +below the volume bar, too. When the capture is turned off, +\-\-\-\-\-\-\- is shown. \fICAPTURE\fP in red appears when the +capture switch is turned on. In addition, \fIL\fP and \fIR\fP letters +appear in left and right side to indicate that left and the right +channels are turned on. + +Some controls have the enumeration list, and don't show boxes but only +texts which indicate the currently active item. You can change the +item via up/down keys. + +.SH VIEW MODES +\fBalsamixer\fP has three view modes: playback, capture and all. +In the playback view, only the controls related with playback are shown. +Similarly, only the controls for capture (recording) are shown in the capture +view. The all view mode shows all controls. The current view mode is displayed +in the top-left position together with the mixer name, etc. + +The default view mode is the playback view. You can change it via +\fI-V\fP option. + +Each view mode can be switched via keyboard commands, too. +See the next section. + +.SH KEYBOARD COMMANDS +\fBalsamixer\fP recognizes the following keyboard commands to control the soundcard. +Commands shown here in upper case can also be given in lower case. +To be reminded of these keystrokes, hit the \fIh\fP key. + +.SS +General Controls + +The \fILeft\fP and \fIright arrow\fP keys are used to select the +channel (or device, depending on your preferred terminology). You can +also use \fIn\fP ("next") and \fIp\fP ("previous"). + +The \fIUp\fP and \fIDown Arrows\fP control the volume for the +currently selected device. You can also use \fI+\fP or \fI\-\fP for the +same purpose. Both the left and right signals are affected. For +independent left and right control, see below. + +The \fIB\fP or \fI=\fP key adjusts the balance of volumes on left and +right channels. + +\fIM\fP toggles muting for the current channel (both left and right). +If the hardware supports it, you can +mute left and right independently by using \fI,\fP (or \fI<\fP) and +\fI.\fP (or \fI>\fP) respectively. + +\fISPACE\fP enables recording for the current channel. If any other +channels have recording enabled, they will have their recording function +disabled first. This only works for valid input channels, of course. + +\fIL\fP re-draws the screen. + +.SS +View Mode Controls +Function keys are used to change view modes. +You can switch to the help mode and the proc info mode via \fIF1\fP and +\fIF2\fP keys, respectively. +On terminals that can't use function keys like gnome\-terminal, \fI?\fP and +\fI/\fP keys can be used alternatively for help and proc modes. + +\fIF3\fP, \fIF4\fP and \fIF5\fP keys are used to switch to playback, capture +and all view mode, respectively. \fITAB\fP key toggles the +current view mode circularly. + +.SS +Quick Volume Changes + +\fIPageUp\fP increases volume by 5. + +\fIPageDown\fP decreases volume by 5. + +\fIEnd\fP sets volume to 0. + +You can also control left & right levels for the current channel +independently, as follows: + +[\fIQ\fP | \fIW\fP | \fIE\fP ] -- turn UP [ left | both | right ] + +[\fIZ\fP | \fIX\fP | \fIC\fP ] -- turn DOWN [ left | both | right ] + +If the currently selected mixer channel is not a stereo channel, then +all UP keys will work like \fIW\fP, and all DOWN keys will work like \fIX\fP. + +The number keys from \fI0\fP to \fI9\fP are to change the absolute volume +quickly. They correspond to 0 to 90% volume. + +.SS +Selecting the Sound Card + +You can select another sound card by pressing the \fIF6\fP or \fIS\fP keys. +This will show a list of available sound cards to choose from, +and an entry to enter the mixer device name by hand. + +.SS +Exiting + +Quit the program with \fIALT Q\fP, or by hitting \fIESC\fP. +Please note that you might need to hit \fIESC\fP twice on some terminals +since it's regarded as a prefix key. + +.SH SEE ALSO +\fB +amixer(1), +aplay(1), +arecord(1) +\fP + +.SH BUGS +Some terminal emulators (e.g. \fBnxterm\fP) may not +work quite right with ncurses, but that's their own damn +fault. Plain old \fBxterm\fP seems to be fine. + +.SH AUTHOR +.B alsamixer +has been written by Tim Janik and +been further improved by Jaroslav Kysela +and Clemens Ladisch . + +This manual page was provided by Paul Winkler . diff --git a/alsamixer/card_select.c b/alsamixer/card_select.c new file mode 100644 index 0000000..b473dcf --- /dev/null +++ b/alsamixer/card_select.c @@ -0,0 +1,268 @@ +/* + * card_select.c - select a card by list or device name + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include +#include "gettext_curses.h" +#include "die.h" +#include "mem.h" +#include "utils.h" +#include "colors.h" +#include "widget.h" +#include "mixer_widget.h" +#include "device_name.h" +#include "card_select.h" + +struct card { + struct card *next; + char *indexstr; + char *name; + char *device_name; +}; + +static struct widget list_widget; +static struct card first_card; +static ITEM **items; +static MENU *menu; +static ITEM *initial_item; + +static void on_key_enter(void) +{ + ITEM *item = current_item(menu); + if (item) { + struct card *card = item_userptr(item); + if (card->device_name) { + if (select_card_by_name(card->device_name)) + list_widget.close(); + } else { + create_device_name_form(); + } + } +} + +static void on_menu_key(int key) +{ + static const struct { + int key; + int request; + } key_map[] = { + { KEY_DOWN, REQ_DOWN_ITEM }, + { KEY_UP, REQ_UP_ITEM }, + { KEY_HOME, REQ_FIRST_ITEM }, + { KEY_NPAGE, REQ_SCR_DPAGE }, + { KEY_PPAGE, REQ_SCR_UPAGE }, + { KEY_BEG, REQ_FIRST_ITEM }, + { KEY_END, REQ_LAST_ITEM }, + }; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(key_map); ++i) + if (key_map[i].key == key) { + menu_driver(menu, key_map[i].request); + break; + } +} + +static void on_handle_key(int key) +{ + switch (key) { + case 27: + case KEY_CANCEL: + case 'q': + case 'Q': + list_widget.close(); + break; + case 10: + case 13: + case KEY_ENTER: + on_key_enter(); + break; + default: + on_menu_key(key); + break; + } +} + +static bool create(void) +{ + int rows, columns; + const char *title; + + if (screen_lines < 3 || screen_cols < 10) { + beep(); + list_widget.close(); + return FALSE; + } + scale_menu(menu, &rows, &columns); + rows += 2; + columns += 2; + if (rows > screen_lines) + rows = screen_lines; + if (columns > screen_cols) + columns = screen_cols; + + widget_init(&list_widget, rows, columns, SCREEN_CENTER, SCREEN_CENTER, + attr_menu, WIDGET_BORDER | WIDGET_SUBWINDOW); + + title = _("Sound Card"); + mvwprintw(list_widget.window, 0, (columns - 2 - get_mbs_width(title)) / 2, " %s ", title); + set_menu_win(menu, list_widget.window); + set_menu_sub(menu, list_widget.subwindow); + return TRUE; +} + +static void on_window_size_changed(void) +{ + unpost_menu(menu); + if (!create()) + return; + post_menu(menu); +} + +static void on_close(void) +{ + unsigned int i; + struct card *card, *next_card; + + unpost_menu(menu); + free_menu(menu); + for (i = 0; items[i]; ++i) + free_item(items[i]); + free(items); + for (card = first_card.next; card; card = next_card) { + next_card = card->next; + free(card->indexstr); + free(card->name); + free(card->device_name); + free(card); + } + widget_free(&list_widget); +} + +void close_card_select_list(void) +{ + on_close(); +} + +static struct widget list_widget = { + .handle_key = on_handle_key, + .window_size_changed = on_window_size_changed, + .close = on_close, +}; + +static int get_cards(void) +{ + int count, number, err; + snd_ctl_t *ctl; + snd_ctl_card_info_t *info; + char buf[16]; + struct card *card, *prev_card; + + first_card.indexstr = "-"; + first_card.name = _("(default)"); + first_card.device_name = "default"; + count = 1; + + snd_ctl_card_info_alloca(&info); + prev_card = &first_card; + number = -1; + for (;;) { + err = snd_card_next(&number); + if (err < 0) + fatal_alsa_error(_("cannot enumerate sound cards"), err); + if (number < 0) + break; + sprintf(buf, "hw:%d", number); + err = snd_ctl_open(&ctl, buf, 0); + if (err < 0) + continue; + err = snd_ctl_card_info(ctl, info); + snd_ctl_close(ctl); + if (err < 0) + continue; + card = ccalloc(1, sizeof *card); + sprintf(buf, "%d", number); + card->indexstr = cstrdup(buf); + card->name = cstrdup(snd_ctl_card_info_get_name(info)); + sprintf(buf, "hw:%d", number); + card->device_name = cstrdup(buf); + prev_card->next = card; + prev_card = card; + ++count; + } + + card = ccalloc(1, sizeof *card); + card->indexstr = cstrdup(" "); + card->name = cstrdup(_("enter device name...")); + prev_card->next = card; + ++count; + + return count; +} + +static void create_list_items(int cards) +{ + int i; + struct card *card; + ITEM *item; + + initial_item = NULL; + items = ccalloc(cards + 1, sizeof(ITEM*)); + i = 0; + for (card = &first_card; card; card = card->next) { + item = new_item(card->indexstr, card->name); + if (!item) + fatal_error("cannot create menu item"); + set_item_userptr(item, card); + items[i++] = item; + if (!initial_item && + mixer_device_name && + (!card->device_name || + !strcmp(card->device_name, mixer_device_name))) + initial_item = item; + } + assert(i == cards); +} + +void create_card_select_list(void) +{ + int cards; + + cards = get_cards(); + create_list_items(cards); + + menu = new_menu(items); + if (!menu) + fatal_error("cannot create menu"); + set_menu_fore(menu, attr_menu_selected); + set_menu_back(menu, attr_menu); + set_menu_mark(menu, NULL); + if (initial_item) + set_current_item(menu, initial_item); + set_menu_spacing(menu, 2, 1, 1); + menu_opts_on(menu, O_SHOWDESC); + + if (!create()) + return; + + post_menu(menu); +} diff --git a/alsamixer/card_select.h b/alsamixer/card_select.h new file mode 100644 index 0000000..4ba15fc --- /dev/null +++ b/alsamixer/card_select.h @@ -0,0 +1,7 @@ +#ifndef CARD_SELECT_H_INCLUDED +#define CARD_SELECT_H_INCLUDED + +void create_card_select_list(void); +void close_card_select_list(void); + +#endif diff --git a/alsamixer/cli.c b/alsamixer/cli.c new file mode 100644 index 0000000..3898196 --- /dev/null +++ b/alsamixer/cli.c @@ -0,0 +1,135 @@ +/* + * alsamixer - curses mixer for the ALSA project + * Copyright (c) 1998,1999 Tim Janik + * Jaroslav Kysela + * Copyright (c) 2009 Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include +#include "gettext_curses.h" +#include "mixer_widget.h" +#include "mainloop.h" + +static int use_color = 1; +static struct snd_mixer_selem_regopt selem_regopt = { + .ver = 1, + .abstract = SND_MIXER_SABSTRACT_NONE, + .device = "default", +}; + +static void show_help(void) +{ + puts(_("Usage: alsamixer [options]")); + puts(_("Useful options:\n" + " -h, --help this help\n" + " -c, --card=NUMBER sound card number or id\n" + " -D, --device=NAME mixer device name\n" + " -V, --view=MODE starting view mode: playback/capture/all")); + puts(_("Debugging options:\n" + " -g, --no-color toggle using of colors\n" + " -a, --abstraction=NAME mixer abstraction level: none/basic")); +} + +static void parse_options(int argc, char *argv[]) +{ + static const char short_options[] = "hc:D:V:gsa:"; + static const struct option long_options[] = { + { .name = "help", .val = 'h' }, + { .name = "card", .has_arg = 1, .val = 'c' }, + { .name = "device", .has_arg = 1, .val = 'D' }, + { .name = "view", .has_arg = 1, .val = 'V' }, + { .name = "no-color", .val = 'g' }, + { .name = "abstraction", .has_arg = 1, .val = 'a' }, + { } + }; + int option; + int card_index; + static char name_buf[16]; + + while ((option = getopt_long(argc, argv, short_options, + long_options, NULL)) != -1) { + switch (option) { + case '?': + case 'h': + show_help(); + exit(EXIT_SUCCESS); + case 'c': + card_index = snd_card_get_index(optarg); + if (card_index < 0) { + fprintf(stderr, _("invalid card index: %s\n"), optarg); + goto fail; + } + sprintf(name_buf, "hw:%d", card_index); + selem_regopt.device = name_buf; + break; + case 'D': + selem_regopt.device = optarg; + break; + case 'V': + if (*optarg == 'p' || *optarg == 'P') + view_mode = VIEW_MODE_PLAYBACK; + else if (*optarg == 'c' || *optarg == 'C') + view_mode = VIEW_MODE_CAPTURE; + else + view_mode = VIEW_MODE_ALL; + break; + case 'g': + use_color = !use_color; + break; + case 'a': + if (!strcmp(optarg, "none")) + selem_regopt.abstract = SND_MIXER_SABSTRACT_NONE; + else if (!strcmp(optarg, "basic")) + selem_regopt.abstract = SND_MIXER_SABSTRACT_BASIC; + else { + fprintf(stderr, _("unknown abstraction level: %s\n"), optarg); + goto fail; + } + break; + default: + fprintf(stderr, _("unknown option: %c\n"), option); +fail: + fputs(_("try `alsamixer --help' for more information\n"), stderr); + exit(EXIT_FAILURE); + } + } +} + +int main(int argc, char *argv[]) +{ + setlocale(LC_ALL, ""); +#ifdef ENABLE_NLS_IN_CURSES + textdomain(PACKAGE); +#endif + + parse_options(argc, argv); + + create_mixer_object(&selem_regopt); + + initialize_curses(use_color); + + create_mixer_widget(); + + mainloop(); + + shutdown(); + return 0; +} diff --git a/alsamixer/colors.c b/alsamixer/colors.c new file mode 100644 index 0000000..b4b98e5 --- /dev/null +++ b/alsamixer/colors.c @@ -0,0 +1,119 @@ +/* + * colors.c - color and attribute definitions + * Copyright (c) 1998,1999 Tim Janik + * Jaroslav Kysela + * Copyright (c) 2009 Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include CURSESINC +#include "colors.h" + +int attr_mixer_frame; +int attr_mixer_text; +int attr_mixer_active; +int attr_ctl_frame; +int attr_ctl_mute; +int attr_ctl_nomute; +int attr_ctl_capture; +int attr_ctl_nocapture; +int attr_ctl_label; +int attr_ctl_label_focus; +int attr_ctl_mark_focus; +int attr_ctl_bar_lo; +#ifdef TRICOLOR_VOLUME_BAR +int attr_ctl_bar_mi; +int attr_ctl_bar_hi; +#endif +int attr_ctl_inactive; +int attr_ctl_label_inactive; +int attr_errormsg; +int attr_infomsg; +int attr_textbox; +int attr_textfield; +int attr_menu; +int attr_menu_selected; + +void init_colors(int use_color) +{ + if (!!has_colors() == !!use_color) { + start_color(); + + init_pair(1, COLOR_CYAN, COLOR_BLACK); + init_pair(2, COLOR_YELLOW, COLOR_BLACK); + init_pair(3, COLOR_WHITE, COLOR_GREEN); + init_pair(4, COLOR_RED, COLOR_BLACK); + init_pair(5, COLOR_WHITE, COLOR_BLACK); + init_pair(6, COLOR_WHITE, COLOR_BLUE); + init_pair(7, COLOR_RED, COLOR_BLUE); + init_pair(8, COLOR_GREEN, COLOR_GREEN); + init_pair(9, COLOR_WHITE, COLOR_RED); +#ifdef TRICOLOR_VOLUME_BAR + init_pair(10, COLOR_WHITE, COLOR_WHITE); + init_pair(11, COLOR_RED, COLOR_RED); +#endif + + attr_mixer_frame = COLOR_PAIR(1); + attr_mixer_text = COLOR_PAIR(1); + attr_mixer_active = A_BOLD | COLOR_PAIR(2); + attr_ctl_frame = A_BOLD | COLOR_PAIR(1); + attr_ctl_mute = COLOR_PAIR(1); + attr_ctl_nomute = A_BOLD | COLOR_PAIR(3); + attr_ctl_capture = A_BOLD | COLOR_PAIR(4); + attr_ctl_nocapture = COLOR_PAIR(5); + attr_ctl_label = A_BOLD | COLOR_PAIR(6); + attr_ctl_label_focus = A_BOLD | COLOR_PAIR(7); + attr_ctl_mark_focus = A_BOLD | COLOR_PAIR(4); + attr_ctl_bar_lo = A_BOLD | COLOR_PAIR(8); +#ifdef TRICOLOR_VOLUME_BAR + attr_ctl_bar_mi = A_BOLD | COLOR_PAIR(10); + attr_ctl_bar_hi = A_BOLD | COLOR_PAIR(11); +#endif + attr_ctl_inactive = COLOR_PAIR(5); + attr_ctl_label_inactive = A_REVERSE | COLOR_PAIR(5); + attr_errormsg = A_BOLD | COLOR_PAIR(9); + attr_infomsg = A_BOLD | COLOR_PAIR(6); + attr_textbox = A_BOLD | COLOR_PAIR(6); + attr_textfield = A_REVERSE | COLOR_PAIR(5); + attr_menu = A_BOLD | COLOR_PAIR(6); + attr_menu_selected = A_REVERSE | COLOR_PAIR(6); + } else { + attr_mixer_frame = A_NORMAL; + attr_mixer_text = A_NORMAL; + attr_mixer_active = A_BOLD; + attr_ctl_frame = A_BOLD; + attr_ctl_mute = A_NORMAL; + attr_ctl_nomute = A_BOLD; + attr_ctl_capture = A_BOLD; + attr_ctl_nocapture = A_NORMAL; + attr_ctl_label = A_REVERSE; + attr_ctl_label_focus = A_REVERSE | A_BOLD; + attr_ctl_mark_focus = A_BOLD; + attr_ctl_bar_lo = A_BOLD; +#ifdef TRICOLOR_VOLUME_BAR + attr_ctl_bar_mi = A_BOLD; + attr_ctl_bar_hi = A_BOLD; +#endif + attr_ctl_inactive = A_NORMAL; + attr_ctl_label_inactive = A_REVERSE; + attr_errormsg = A_STANDOUT; + attr_infomsg = A_NORMAL; + attr_textbox = A_NORMAL; + attr_textfield = A_REVERSE; + attr_menu = A_NORMAL; + attr_menu_selected = A_REVERSE; + } +} diff --git a/alsamixer/colors.h b/alsamixer/colors.h new file mode 100644 index 0000000..9396004 --- /dev/null +++ b/alsamixer/colors.h @@ -0,0 +1,33 @@ +#ifndef COLORS_H_INCLUDED +#define COLORS_H_INCLUDED + +#define TRICOLOR_VOLUME_BAR + +extern int attr_mixer_frame; +extern int attr_mixer_text; +extern int attr_mixer_active; +extern int attr_ctl_frame; +extern int attr_ctl_mute; +extern int attr_ctl_nomute; +extern int attr_ctl_capture; +extern int attr_ctl_nocapture; +extern int attr_ctl_label; +extern int attr_ctl_label_focus; +extern int attr_ctl_mark_focus; +extern int attr_ctl_bar_lo; +#ifdef TRICOLOR_VOLUME_BAR +extern int attr_ctl_bar_mi; +extern int attr_ctl_bar_hi; +#endif +extern int attr_ctl_inactive; +extern int attr_ctl_label_inactive; +extern int attr_errormsg; +extern int attr_infomsg; +extern int attr_textbox; +extern int attr_textfield; +extern int attr_menu; +extern int attr_menu_selected; + +void init_colors(int use_color); + +#endif diff --git a/alsamixer/device_name.c b/alsamixer/device_name.c new file mode 100644 index 0000000..c58e652 --- /dev/null +++ b/alsamixer/device_name.c @@ -0,0 +1,197 @@ +/* + * device_name_form.c - ask for sound control device name + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include CURSESINC +#include +#include "gettext_curses.h" +#include "die.h" +#include "mem.h" +#include "utils.h" +#include "colors.h" +#include "widget.h" +#include "mixer_widget.h" +#include "card_select.h" +#include "device_name.h" + +static struct widget form_widget; +static FIELD *fields[3]; +static FORM *form; + +static char *dup_current_name(void) +{ + int rows, cols, max, i; + char *s; + + if (form_driver(form, REQ_VALIDATION) == E_OK) { + dynamic_field_info(fields[1], &rows, &cols, &max); + s = ccalloc(1, cols + 1); + memcpy(s, field_buffer(fields[1], 0), cols); + for (i = strlen(s) - 1; i >= 0 && s[i] == ' '; --i) + s[i] = '\0'; + return s; + } else { + return cstrdup(""); + } +} + +static void on_key_enter(void) +{ + char *s; + bool ok; + + s = dup_current_name(); + ok = select_card_by_name(s); + free(s); + if (ok) { + form_widget.close(); + close_card_select_list(); + } +} + +static void on_form_key(int key) +{ + static const struct { + int key; + int request; + } key_map[] = { + { KEY_LEFT, REQ_PREV_CHAR }, + { KEY_RIGHT, REQ_NEXT_CHAR }, + { KEY_HOME, REQ_BEG_FIELD }, + { KEY_BACKSPACE, REQ_DEL_PREV }, + { KEY_DC, REQ_DEL_CHAR }, + { KEY_BEG, REQ_BEG_FIELD }, + { KEY_END, REQ_END_FIELD }, + }; + unsigned int i; + + if (key >= 32 && key < 256) { + form_driver(form, key); + return; + } + for (i = 0; i < ARRAY_SIZE(key_map); ++i) + if (key_map[i].key == key) { + form_driver(form, key_map[i].request); + break; + } +} + +static void on_handle_key(int key) +{ + switch (key) { + case 27: + case KEY_CANCEL: + form_widget.close(); + break; + case 10: + case 13: + case KEY_ENTER: + on_key_enter(); + break; + default: + on_form_key(key); + break; + } +} + +static bool create(void) +{ + const char *title; + + if (screen_lines < 6 || screen_cols < 36) { + form_widget.close(); + beep(); + return FALSE; + } + widget_init(&form_widget, + 6, 36, SCREEN_CENTER, SCREEN_CENTER, + attr_textbox, WIDGET_BORDER | WIDGET_SUBWINDOW | WIDGET_CURSOR_VISIBLE); + title = _("Sound Card"); + mvwprintw(form_widget.window, 0, (36 - 2 - get_mbs_width(title)) / 2, " %s ", title); + + set_form_win(form, form_widget.window); + set_form_sub(form, form_widget.subwindow); + return TRUE; +} + +static void on_window_size_changed(void) +{ + form_driver(form, REQ_VALIDATION); /* save field value */ + unpost_form(form); + + if (!create()) + return; + + /* + * This call fails because ncurses does not allow changing options of + * the current field, and we cannot change the current field because + * there is only one. The only way to make this work would be to throw + * away and recreate all fields. + */ + field_opts_off(fields[1], O_BLANK); + + post_form(form); +} + +static void on_close(void) +{ + unpost_form(form); + free_form(form); + free_field(fields[0]); + free_field(fields[1]); + widget_free(&form_widget); +} + +static struct widget form_widget = { + .handle_key = on_handle_key, + .window_size_changed = on_window_size_changed, + .close = on_close, +}; + +void create_device_name_form(void) +{ + fields[0] = new_field(1, 32, 1, 1, 0, 0); + if (!fields[0]) + fatal_error("cannot create field"); + field_opts_off(fields[0], O_ACTIVE); + field_opts_off(fields[0], O_EDIT); + set_field_fore(fields[0], attr_textbox); + set_field_back(fields[0], attr_textbox); + set_field_buffer(fields[0], 0, _("Device name:")); + + fields[1] = new_field(1, 32, 2, 1, 0, 0); + if (!fields[1]) + fatal_error("cannot create field"); + field_opts_off(fields[1], O_AUTOSKIP); + field_opts_off(fields[1], O_NULLOK); + field_opts_off(fields[1], O_STATIC); + set_field_fore(fields[1], attr_textfield); + set_field_back(fields[1], attr_textfield); + set_field_buffer(fields[1], 0, mixer_device_name); + + form = new_form(fields); + if (!form) + fatal_error("cannot create form"); + + if (!create()) + return; + + post_form(form); +} diff --git a/alsamixer/device_name.h b/alsamixer/device_name.h new file mode 100644 index 0000000..f4a1f3f --- /dev/null +++ b/alsamixer/device_name.h @@ -0,0 +1,6 @@ +#ifndef DEVICE_NAME_FORM_H_INCLUDED +#define DEVICE_NAME_FORM_H_INCLUDED + +void create_device_name_form(void); + +#endif diff --git a/alsamixer/die.c b/alsamixer/die.c new file mode 100644 index 0000000..dcd8536 --- /dev/null +++ b/alsamixer/die.c @@ -0,0 +1,39 @@ +/* + * die.c - error handlers + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include "gettext_curses.h" +#include "mainloop.h" +#include "die.h" + +void fatal_error(const char *msg) +{ + shutdown(); + fprintf(stderr, "%s\n", msg); + exit(EXIT_FAILURE); +} + +void fatal_alsa_error(const char *msg, int err) +{ + shutdown(); + fprintf(stderr, _("%s: %s\n"), msg, snd_strerror(err)); + exit(EXIT_FAILURE); +} diff --git a/alsamixer/die.h b/alsamixer/die.h new file mode 100644 index 0000000..39ef1c0 --- /dev/null +++ b/alsamixer/die.h @@ -0,0 +1,7 @@ +#ifndef DIE_H_INCLUDED +#define DIE_H_INCLUDED + +void fatal_error(const char *msg) __attribute__((__noreturn__)); +void fatal_alsa_error(const char *msg, int err) __attribute__((__noreturn__)); + +#endif diff --git a/alsamixer/mainloop.c b/alsamixer/mainloop.c new file mode 100644 index 0000000..eddaf3b --- /dev/null +++ b/alsamixer/mainloop.c @@ -0,0 +1,135 @@ +/* + * mainloop.c - main loop + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include +#include +#include "mem.h" +#include "die.h" +#include "colors.h" +#include "widget.h" +#include "mixer_widget.h" +#include "mixer_display.h" +#include "mainloop.h" + +static WINDOW *curses_initialized; + +static void black_hole_error_handler(const char *file, int line, + const char *function, int err, + const char *fmt, ...) +{ +} + +void initialize_curses(bool use_color) +{ + curses_initialized = initscr(); + cbreak(); + noecho(); +#ifdef HAVE_CURSES_ESCDELAY + set_escdelay(100); +#endif + window_size_changed(); /* update screen_lines/cols */ + init_colors(use_color); + snd_lib_error_set_handler(black_hole_error_handler); +} + +void shutdown(void) +{ + if (curses_initialized) { + clear(); + refresh(); + curs_set(1); + endwin(); + } + mixer_shutdown(); +} + +void mainloop(void) +{ + struct pollfd *pollfds = NULL; + int nfds = 0, n; + struct widget *active_widget; + unsigned short revents; + int key; + int err; + + for (;;) { + update_panels(); + doupdate(); + + active_widget = get_active_widget(); + if (!active_widget) + break; + + n = 1 + snd_mixer_poll_descriptors_count(mixer); + if (n != nfds) { + free(pollfds); + nfds = n; + pollfds = ccalloc(nfds, sizeof *pollfds); + pollfds[0].fd = fileno(stdin); + pollfds[0].events = POLLIN; + } + err = snd_mixer_poll_descriptors(mixer, &pollfds[1], nfds - 1); + if (err < 0) + fatal_alsa_error("cannot get poll descriptors", err); + n = poll(pollfds, nfds, -1); + if (n < 0) { + if (errno == EINTR) { + pollfds[0].revents = 0; + doupdate(); /* handle SIGWINCH */ + } else { + fatal_error("poll error"); + } + } + if (pollfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) + break; + if (pollfds[0].revents & POLLIN) + --n; + if (n > 0) { + err = snd_mixer_poll_descriptors_revents(mixer, &pollfds[1], nfds - 1, &revents); + if (err < 0) + fatal_alsa_error("cannot get poll events", err); + if (revents & (POLLERR | POLLNVAL)) + close_mixer_device(); + else if (revents & POLLIN) + snd_mixer_handle_events(mixer); + } + key = wgetch(active_widget->window); + while (key != ERR) { +#ifdef KEY_RESIZE + if (key == KEY_RESIZE) + window_size_changed(); + else +#endif + active_widget->handle_key(key); + active_widget = get_active_widget(); + if (!active_widget) + break; + key = wgetch(active_widget->window); + } + if (!active_widget) + break; + if (controls_changed) + display_controls(); + } + free(pollfds); +} diff --git a/alsamixer/mainloop.h b/alsamixer/mainloop.h new file mode 100644 index 0000000..0cfc989 --- /dev/null +++ b/alsamixer/mainloop.h @@ -0,0 +1,10 @@ +#ifndef MAINLOOP_H_INCLUDED +#define MAINLOOP_H_INCLUDED + +#include CURSESINC + +void initialize_curses(bool use_color); +void mainloop(void); +void shutdown(void); + +#endif diff --git a/alsamixer/mem.c b/alsamixer/mem.c new file mode 100644 index 0000000..fa03a89 --- /dev/null +++ b/alsamixer/mem.c @@ -0,0 +1,68 @@ +/* + * mem.c - memory allocation checkers + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _GNU_SOURCE +#include "aconfig.h" +#include +#include +#include +#include +#include +#include "die.h" +#include "mem.h" + +static void check(void *p) +{ + if (!p) + fatal_error("out of memory"); +} + +void *ccalloc(size_t n, size_t size) +{ + void *mem = calloc(n, size); + if (n && size) + check(mem); + return mem; +} + +void *crealloc(void *ptr, size_t new_size) +{ + ptr = realloc(ptr, new_size); + if (new_size) + check(ptr); + return ptr; +} + +char *cstrdup(const char *s) +{ + char *str = strdup(s); + check(str); + return str; +} + +char *casprintf(const char *fmt, ...) +{ + va_list ap; + char *str; + + va_start(ap, fmt); + if (vasprintf(&str, fmt, ap) < 0) + check(NULL); + va_end(ap); + return str; +} diff --git a/alsamixer/mem.h b/alsamixer/mem.h new file mode 100644 index 0000000..d0e5f54 --- /dev/null +++ b/alsamixer/mem.h @@ -0,0 +1,11 @@ +#ifndef MEM_H_INCLUDED +#define MEM_H_INCLUDED + +#include + +void *ccalloc(size_t n, size_t size); +void *crealloc(void *ptr, size_t new_size); +char *cstrdup(const char *s); +char *casprintf(const char *fmt, ...) __attribute__((__format__(printf, 1, 2))); + +#endif diff --git a/alsamixer/mixer_controls.c b/alsamixer/mixer_controls.c new file mode 100644 index 0000000..cc98b64 --- /dev/null +++ b/alsamixer/mixer_controls.c @@ -0,0 +1,521 @@ +/* + * mixer_controls.c - handles mixer controls and mapping from selems + * Copyright (c) 1998,1999 Tim Janik + * Jaroslav Kysela + * Copyright (c) 2009 Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include CURSESINC +#include +#include "utils.h" +#include "mem.h" +#include "mixer_display.h" +#include "mixer_widget.h" +#include "mixer_controls.h" + +struct control *controls; +unsigned int controls_count; + +static const snd_mixer_selem_channel_id_t supported_channels[] = { + SND_MIXER_SCHN_FRONT_LEFT, + SND_MIXER_SCHN_FRONT_RIGHT, + SND_MIXER_SCHN_REAR_LEFT, + SND_MIXER_SCHN_REAR_RIGHT, + SND_MIXER_SCHN_FRONT_CENTER, + SND_MIXER_SCHN_WOOFER, + SND_MIXER_SCHN_SIDE_LEFT, + SND_MIXER_SCHN_SIDE_RIGHT, +}; +#define LAST_SUPPORTED_CHANNEL SND_MIXER_SCHN_SIDE_RIGHT + +static const snd_mixer_selem_channel_id_t control_channels[][2] = { + { SND_MIXER_SCHN_FRONT_LEFT, SND_MIXER_SCHN_FRONT_RIGHT }, + { SND_MIXER_SCHN_REAR_LEFT, SND_MIXER_SCHN_REAR_RIGHT }, + { SND_MIXER_SCHN_FRONT_CENTER, SND_MIXER_SCHN_UNKNOWN }, + { SND_MIXER_SCHN_WOOFER, SND_MIXER_SCHN_UNKNOWN }, + { SND_MIXER_SCHN_SIDE_LEFT, SND_MIXER_SCHN_SIDE_RIGHT }, +}; + +bool are_there_any_controls(void) +{ + snd_mixer_elem_t *elem; + unsigned int i; + + for (elem = snd_mixer_first_elem(mixer); + elem; + elem = snd_mixer_elem_next(elem)) { + if (snd_mixer_elem_get_type(elem) != SND_MIXER_ELEM_SIMPLE) + continue; + if (snd_mixer_selem_is_enumerated(elem)) + return TRUE; + if (snd_mixer_selem_has_playback_volume_joined(elem) || + snd_mixer_selem_has_capture_volume_joined(elem) || + snd_mixer_selem_has_playback_switch_joined(elem) || + snd_mixer_selem_has_capture_switch_joined(elem)) + return TRUE; + for (i = 0; i < ARRAY_SIZE(supported_channels); ++i) + if (snd_mixer_selem_has_playback_channel(elem, supported_channels[i]) || + snd_mixer_selem_has_capture_channel(elem, supported_channels[i])) + return TRUE; + } + return FALSE; +} + +static bool has_more_than_front_capture_channels(snd_mixer_elem_t *elem) +{ + unsigned int i; + + for (i = 2; i < ARRAY_SIZE(supported_channels); ++i) + if (snd_mixer_selem_has_capture_channel(elem, supported_channels[i])) + return TRUE; + return FALSE; +} + +static bool has_any_control_channel(snd_mixer_elem_t *elem, + const snd_mixer_selem_channel_id_t channels[2], + int (*has_channel)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t)) +{ + return has_channel(elem, channels[0]) || + (channels[1] != SND_MIXER_SCHN_UNKNOWN && has_channel(elem, channels[1])); +} + +static bool has_merged_cswitch(snd_mixer_elem_t *elem) +{ + bool pvol, psw; + unsigned int i; + + pvol = snd_mixer_selem_has_playback_volume(elem); + psw = snd_mixer_selem_has_playback_switch(elem); + if ((pvol || psw) && + snd_mixer_selem_has_capture_switch(elem) && + !snd_mixer_selem_has_capture_volume(elem)) { + if (snd_mixer_selem_has_capture_switch_joined(elem)) + return TRUE; + else if (((pvol && snd_mixer_selem_has_playback_volume_joined(elem)) || + (psw && snd_mixer_selem_has_playback_switch_joined(elem))) && + has_more_than_front_capture_channels(elem)) + return FALSE; + for (i = 0; i < ARRAY_SIZE(control_channels); ++i) { + if (has_any_control_channel(elem, control_channels[i], snd_mixer_selem_has_capture_channel) && + !has_any_control_channel(elem, control_channels[i], snd_mixer_selem_has_playback_channel)) + return FALSE; + } + return TRUE; + } + return FALSE; +} + +static unsigned int get_playback_controls_count(snd_mixer_elem_t *elem) +{ + unsigned int count = 0; + unsigned int i; + int has_vol, has_sw; + + has_vol = snd_mixer_selem_has_playback_volume(elem); + has_sw = snd_mixer_selem_has_playback_switch(elem); + if (!has_vol && !has_sw) + return 0; + if ((!has_vol || snd_mixer_selem_has_playback_volume_joined(elem)) && + (!has_sw || snd_mixer_selem_has_playback_switch_joined(elem))) + return 1; + for (i = 0; i < ARRAY_SIZE(control_channels); ++i) { + if (snd_mixer_selem_has_playback_channel(elem, control_channels[i][0]) || + (control_channels[i][1] != SND_MIXER_SCHN_UNKNOWN && + snd_mixer_selem_has_playback_channel(elem, control_channels[i][1]))) + ++count; + } + return count; +} + +static unsigned int get_capture_controls_count(snd_mixer_elem_t *elem) +{ + unsigned int count = 0; + unsigned int i; + int has_vol, has_sw; + + has_vol = snd_mixer_selem_has_capture_volume(elem); + has_sw = snd_mixer_selem_has_capture_switch(elem); + if ((!has_vol && !has_sw) || + (view_mode == VIEW_MODE_ALL && has_merged_cswitch(elem))) + return 0; + if ((!has_vol || snd_mixer_selem_has_capture_volume_joined(elem)) && + (!has_sw || snd_mixer_selem_has_capture_switch_joined(elem))) + return 1; + for (i = 0; i < ARRAY_SIZE(control_channels); ++i) { + if (snd_mixer_selem_has_capture_channel(elem, control_channels[i][0]) || + (control_channels[i][1] != SND_MIXER_SCHN_UNKNOWN && + snd_mixer_selem_has_capture_channel(elem, control_channels[i][1]))) + ++count; + } + return count; +} + +static unsigned int get_controls_count_for_elem(snd_mixer_elem_t *elem) +{ + unsigned int p, c; + + if (snd_mixer_elem_get_type(elem) != SND_MIXER_ELEM_SIMPLE) + return 0; + if (snd_mixer_selem_is_enumerated(elem)) { + switch (view_mode) { + case VIEW_MODE_PLAYBACK: + return snd_mixer_selem_is_enum_capture(elem) ? 0 : 1; + case VIEW_MODE_CAPTURE: + return snd_mixer_selem_is_enum_capture(elem) ? 1 : 0; + case VIEW_MODE_ALL: + default: + return 1; + } + } + switch (view_mode) { + case VIEW_MODE_PLAYBACK: + return get_playback_controls_count(elem); + case VIEW_MODE_CAPTURE: + return get_capture_controls_count(elem); + case VIEW_MODE_ALL: + default: + p = get_playback_controls_count(elem); + c = get_capture_controls_count(elem); + return has_merged_cswitch(elem) ? p : p + c; + } +} + +static void create_name(struct control *control) +{ + unsigned int index; + char *s; + + index = snd_mixer_selem_get_index(control->elem); + if (index > 0) + control->name = casprintf("%s %u", snd_mixer_selem_get_name(control->elem), index); + else + control->name = cstrdup(snd_mixer_selem_get_name(control->elem)); + + while ((s = strstr(control->name, "IEC958")) != NULL) + memcpy(s, "S/PDIF", 6); +} + +static unsigned int create_controls_for_elem(snd_mixer_elem_t *elem, struct control *control) +{ + unsigned int count = 0; + unsigned int i; + unsigned int multich_flag; + unsigned int enum_index; + struct control *front_control = NULL; + bool has_pvol, has_psw; + bool has_cvol, has_csw; + bool has_channel[LAST_SUPPORTED_CHANNEL + 1]; + bool merged_cswitch; + bool has_ch0, has_ch1; + + if (snd_mixer_elem_get_type(elem) != SND_MIXER_ELEM_SIMPLE) + return 0; + if (snd_mixer_selem_is_enumerated(elem)) { + if ((view_mode == VIEW_MODE_PLAYBACK && snd_mixer_selem_is_enum_capture(elem)) || + (view_mode == VIEW_MODE_CAPTURE && !snd_mixer_selem_is_enum_capture(elem))) + return 0; + control->elem = elem; + control->flags = TYPE_ENUM; + control->enum_channel_bits = 0; + for (i = 0; i <= SND_MIXER_SCHN_LAST; ++i) + if (snd_mixer_selem_get_enum_item(control->elem, (snd_mixer_selem_channel_id_t)i, &enum_index) >= 0) + control->enum_channel_bits |= 1 << i; + if (snd_mixer_selem_is_active(control->elem)) + control->flags |= IS_ACTIVE; + create_name(control); + return 1; + } + has_pvol = snd_mixer_selem_has_playback_volume(elem); + has_psw = snd_mixer_selem_has_playback_switch(elem); + has_cvol = snd_mixer_selem_has_capture_volume(elem); + has_csw = snd_mixer_selem_has_capture_switch(elem); + merged_cswitch = view_mode == VIEW_MODE_ALL && has_merged_cswitch(elem); + if (view_mode != VIEW_MODE_CAPTURE && (has_pvol || has_psw)) { + if ((!has_pvol || snd_mixer_selem_has_playback_volume_joined(elem)) && + (!has_psw || snd_mixer_selem_has_playback_switch_joined(elem))) { + control->elem = elem; + if (has_pvol) { + control->flags |= TYPE_PVOLUME | HAS_VOLUME_0; + control->volume_channels[0] = 0; + } + if (has_psw) { + control->flags |= TYPE_PSWITCH | HAS_PSWITCH_0; + control->pswitch_channels[0] = 0; + } + if (merged_cswitch) { + control->flags |= TYPE_CSWITCH; + if (snd_mixer_selem_has_capture_switch_joined(elem)) { + control->flags |= HAS_CSWITCH_0; + control->cswitch_channels[0] = 0; + } else { + if (snd_mixer_selem_has_capture_channel(elem, control_channels[0][0])) { + control->flags |= HAS_CSWITCH_0; + control->cswitch_channels[0] = control_channels[0][0]; + } + if (control_channels[0][1] != SND_MIXER_SCHN_UNKNOWN && + snd_mixer_selem_has_capture_channel(elem, control_channels[0][1])) { + control->flags |= HAS_CSWITCH_1; + control->cswitch_channels[1] = control_channels[0][1]; + } + } + if ((control->flags & (HAS_CSWITCH_0 | HAS_CSWITCH_1)) == HAS_CSWITCH_1) { + control->flags ^= HAS_CSWITCH_0 | HAS_CSWITCH_1; + control->cswitch_channels[0] = control->cswitch_channels[1]; + } + } + if (snd_mixer_selem_is_active(control->elem)) + control->flags |= IS_ACTIVE; + create_name(control); + ++control; + ++count; + } else { + multich_flag = 0; + for (i = 0; i < ARRAY_SIZE(supported_channels); ++i) + has_channel[supported_channels[i]] = + snd_mixer_selem_has_playback_channel(elem, supported_channels[i]); + for (i = 0; i < ARRAY_SIZE(control_channels); ++i) { + has_ch0 = has_channel[control_channels[i][0]]; + has_ch1 = control_channels[i][1] != SND_MIXER_SCHN_UNKNOWN && + has_channel[control_channels[i][1]]; + if (!has_ch0 && !has_ch1) + continue; + control->elem = elem; + if (has_pvol) { + control->flags |= TYPE_PVOLUME; + if (snd_mixer_selem_has_playback_volume_joined(elem)) { + control->flags |= HAS_VOLUME_0; + control->volume_channels[0] = 0; + } else { + if (has_ch0) { + control->flags |= HAS_VOLUME_0; + control->volume_channels[0] = control_channels[i][0]; + } + if (has_ch1) { + control->flags |= HAS_VOLUME_1; + control->volume_channels[1] = control_channels[i][1]; + } + } + } + if (has_psw) { + control->flags |= TYPE_PSWITCH; + if (snd_mixer_selem_has_playback_switch_joined(elem)) { + control->flags |= HAS_PSWITCH_0; + control->pswitch_channels[0] = 0; + } else { + if (has_ch0) { + control->flags |= HAS_PSWITCH_0; + control->pswitch_channels[0] = control_channels[i][0]; + } + if (has_ch1) { + control->flags |= HAS_PSWITCH_1; + control->pswitch_channels[1] = control_channels[i][1]; + } + } + } + if (merged_cswitch) { + control->flags |= TYPE_CSWITCH; + if (snd_mixer_selem_has_capture_switch_joined(elem)) { + control->flags |= HAS_CSWITCH_0; + control->cswitch_channels[0] = 0; + } else { + if (snd_mixer_selem_has_capture_channel(elem, control_channels[i][0])) { + control->flags |= HAS_CSWITCH_0; + control->cswitch_channels[0] = control_channels[i][0]; + } + if (control_channels[i][1] != SND_MIXER_SCHN_UNKNOWN && + snd_mixer_selem_has_capture_channel(elem, control_channels[i][1])) { + control->flags |= HAS_CSWITCH_1; + control->cswitch_channels[1] = control_channels[i][1]; + } + } + } + if ((control->flags & (HAS_VOLUME_0 | HAS_VOLUME_1)) == HAS_VOLUME_1) { + control->flags ^= HAS_VOLUME_0 | HAS_VOLUME_1; + control->volume_channels[0] = control->volume_channels[1]; + } + if ((control->flags & (HAS_PSWITCH_0 | HAS_PSWITCH_1)) == HAS_PSWITCH_1) { + control->flags ^= HAS_PSWITCH_0 | HAS_PSWITCH_1; + control->pswitch_channels[0] = control->pswitch_channels[1]; + } + if ((control->flags & (HAS_CSWITCH_0 | HAS_CSWITCH_1)) == HAS_CSWITCH_1) { + control->flags ^= HAS_CSWITCH_0 | HAS_CSWITCH_1; + control->cswitch_channels[0] = control->cswitch_channels[1]; + } + if (snd_mixer_selem_is_active(control->elem)) + control->flags |= IS_ACTIVE; + create_name(control); + if (i == 0) + front_control = control; + else { + front_control->flags |= IS_MULTICH | 0; + control->flags |= IS_MULTICH | i; + } + ++control; + ++count; + } + } + } + if (view_mode != VIEW_MODE_PLAYBACK && (has_cvol || has_csw) && !merged_cswitch) { + if ((!has_cvol || snd_mixer_selem_has_capture_volume_joined(elem)) && + (!has_csw || snd_mixer_selem_has_capture_switch_joined(elem))) { + control->elem = elem; + if (has_cvol) { + control->flags |= TYPE_CVOLUME | HAS_VOLUME_0; + control->volume_channels[0] = 0; + } + if (has_csw) { + control->flags |= TYPE_CSWITCH | HAS_CSWITCH_0; + control->cswitch_channels[0] = 0; + } + if (snd_mixer_selem_is_active(control->elem)) + control->flags |= IS_ACTIVE; + create_name(control); + ++control; + ++count; + } else { + for (i = 0; i < ARRAY_SIZE(supported_channels); ++i) + has_channel[supported_channels[i]] = + snd_mixer_selem_has_capture_channel(elem, supported_channels[i]); + for (i = 0; i < ARRAY_SIZE(control_channels); ++i) { + has_ch0 = has_channel[control_channels[i][0]]; + has_ch1 = control_channels[i][1] != SND_MIXER_SCHN_UNKNOWN && + has_channel[control_channels[i][1]]; + if (!has_ch0 && !has_ch1) + continue; + control->elem = elem; + if (has_cvol) { + control->flags |= TYPE_CVOLUME; + if (snd_mixer_selem_has_capture_volume_joined(elem)) { + control->flags |= HAS_VOLUME_0; + control->volume_channels[0] = 0; + } else { + if (has_ch0) { + control->flags |= HAS_VOLUME_0; + control->volume_channels[0] = control_channels[i][0]; + } + if (has_ch1) { + control->flags |= HAS_VOLUME_1; + control->volume_channels[1] = control_channels[i][1]; + } + } + } + if (has_csw) { + control->flags |= TYPE_CSWITCH; + if (snd_mixer_selem_has_capture_switch_joined(elem)) { + control->flags |= HAS_CSWITCH_0; + control->cswitch_channels[0] = 0; + } else { + if (has_ch0) { + control->flags |= HAS_CSWITCH_0; + control->cswitch_channels[0] = control_channels[i][0]; + } + if (has_ch1) { + control->flags |= HAS_CSWITCH_1; + control->cswitch_channels[1] = control_channels[i][1]; + } + } + } + if ((control->flags & (HAS_VOLUME_0 | HAS_VOLUME_1)) == HAS_VOLUME_1) { + control->flags ^= HAS_VOLUME_0 | HAS_VOLUME_1; + control->volume_channels[0] = control->volume_channels[1]; + } + if ((control->flags & (HAS_CSWITCH_0 | HAS_CSWITCH_1)) == HAS_CSWITCH_1) { + control->flags ^= HAS_CSWITCH_0 | HAS_CSWITCH_1; + control->cswitch_channels[0] = control->cswitch_channels[1]; + } + if (snd_mixer_selem_is_active(control->elem)) + control->flags |= IS_ACTIVE; + create_name(control); + if (i == 0) + front_control = control; + else { + front_control->flags |= IS_MULTICH | 0; + control->flags |= IS_MULTICH | i; + } + ++control; + ++count; + } + } + } + return count; +} + +static void search_for_focus_control(void) +{ + snd_mixer_elem_t *elem; + unsigned int i; + + elem = snd_mixer_find_selem(mixer, current_selem_id); + if (elem) + for (i = 0; i < controls_count; ++i) + if (controls[i].elem == elem) { + focus_control_index = i; + for (;;) { + ++i; + if (i >= controls_count || controls[i].elem != elem) + return; + if (controls[i].flags == current_control_flags) { + focus_control_index = i; + return; + } + } + } + focus_control_index = 0; +} + +void free_controls(void) +{ + unsigned int i; + + for (i = 0; i < controls_count; ++i) + free(controls[i].name); + free(controls); + controls = NULL; + controls_count = 0; +} + +void create_controls(void) +{ + snd_mixer_elem_t *elem; + struct control *control; + + free_controls(); + + for (elem = snd_mixer_first_elem(mixer); + elem; + elem = snd_mixer_elem_next(elem)) + controls_count += get_controls_count_for_elem(elem); + + if (controls_count > 0) { + controls = ccalloc(controls_count, sizeof *controls); + control = controls; + for (elem = snd_mixer_first_elem(mixer); + elem; + elem = snd_mixer_elem_next(elem)) + control += create_controls_for_elem(elem, control); + assert(control == controls + controls_count); + } + + compute_controls_layout(); + display_view_mode(); + + search_for_focus_control(); + refocus_control(); +} diff --git a/alsamixer/mixer_controls.h b/alsamixer/mixer_controls.h new file mode 100644 index 0000000..dbb3a9d --- /dev/null +++ b/alsamixer/mixer_controls.h @@ -0,0 +1,37 @@ +#ifndef MIXER_CONTROLS_H_INCLUDED +#define MIXER_CONTROLS_H_INCLUDED + +#include + +struct control { + snd_mixer_elem_t *elem; + char *name; + unsigned int flags; +#define TYPE_PVOLUME (1u << 4) +#define TYPE_CVOLUME (1u << 5) +#define TYPE_PSWITCH (1u << 6) +#define TYPE_CSWITCH (1u << 7) +#define TYPE_ENUM (1u << 8) +#define HAS_VOLUME_0 (1u << 9) +#define HAS_VOLUME_1 (1u << 10) +#define HAS_PSWITCH_0 (1u << 11) +#define HAS_PSWITCH_1 (1u << 12) +#define HAS_CSWITCH_0 (1u << 13) +#define HAS_CSWITCH_1 (1u << 14) +#define IS_MULTICH (1u << 15) +#define IS_ACTIVE (1u << 16) +#define MULTICH_MASK (0x0000f) + snd_mixer_selem_channel_id_t volume_channels[2]; + snd_mixer_selem_channel_id_t pswitch_channels[2]; + snd_mixer_selem_channel_id_t cswitch_channels[2]; + unsigned int enum_channel_bits; +}; + +extern struct control *controls; +extern unsigned int controls_count; + +bool are_there_any_controls(void); +void create_controls(void); +void free_controls(void); + +#endif diff --git a/alsamixer/mixer_display.c b/alsamixer/mixer_display.c new file mode 100644 index 0000000..51a1546 --- /dev/null +++ b/alsamixer/mixer_display.c @@ -0,0 +1,743 @@ +/* + * mixer_display.c - handles displaying of mixer widget and controls + * Copyright (c) 1874 Lewis Carroll + * Copyright (c) 2009 Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _C99_SOURCE /* lrint() */ +#include "aconfig.h" +#include +#include +#include +#include +#include CURSESINC +#include +#include "gettext_curses.h" +#include "utils.h" +#include "mem.h" +#include "colors.h" +#include "widget.h" +#include "volume_mapping.h" +#include "mixer_widget.h" +#include "mixer_controls.h" +#include "mixer_display.h" + +enum align { + ALIGN_LEFT, + ALIGN_RIGHT, + ALIGN_CENTER, +}; + +static bool screen_too_small; +static bool has_info_items; + +static int info_items_left; +static int info_items_width; + +static int visible_controls; +static int first_visible_control_index; +static int first_control_x; +static int control_width; +static int control_name_width; + +static int base_y; +static int volume_height; +static int cswitch_y; +static int values_y; +static int name_y; +static int channel_name_y; + +static void display_string_in_field(int y, int x, const char *s, int width, enum align align) +{ + int string_width; + const char *s_end; + int spaces; + int cur_y, cur_x; + + wmove(mixer_widget.window, y, x); + string_width = width; + s_end = mbs_at_width(s, &string_width, -1); + if (string_width >= width) { + waddnstr(mixer_widget.window, s, s_end - s); + } else { + if (align != ALIGN_LEFT) { + spaces = width - string_width; + if (align == ALIGN_CENTER) + spaces /= 2; + if (spaces > 0) + wprintw(mixer_widget.window, "%*s", spaces, ""); + } + waddstr(mixer_widget.window, s); + if (align != ALIGN_RIGHT) { + getyx(mixer_widget.window, cur_y, cur_x); + if (cur_y == y) { + spaces = x + width - cur_x; + if (spaces > 0) + wprintw(mixer_widget.window, "%*s", spaces, ""); + } + } + } +} + +void init_mixer_layout(void) +{ + const char *labels_left[4] = { + _("Card:"), + _("Chip:"), + _("View:"), + _("Item:"), + }; + const char *labels_right[4] = { + _("F1: Help"), + _("F2: System information"), + _("F6: Select sound card"), + _("Esc: Exit"), + }; + unsigned int label_width_left, label_width_right; + unsigned int right_x, i; + + screen_too_small = screen_lines < 14 || screen_cols < 12; + has_info_items = screen_lines >= 6; + if (!has_info_items) + return; + + label_width_left = get_max_mbs_width(labels_left, 4); + label_width_right = get_max_mbs_width(labels_right, 4); + if (2 + label_width_left + 1 + 28 + label_width_right + 2 > screen_cols) + label_width_right = 0; + if (2 + label_width_left + 1 + 28 + label_width_right + 2 > screen_cols) + label_width_left = 0; + + info_items_left = label_width_left ? 3 + label_width_left : 2; + right_x = screen_cols - label_width_right - 2; + info_items_width = right_x - info_items_left; + if (info_items_width < 1) { + has_info_items = FALSE; + return; + } + + wattrset(mixer_widget.window, attr_mixer_text); + if (label_width_left) + for (i = 0; i < 4; ++i) + display_string_in_field(1 + i, 2, labels_left[i], + label_width_left, ALIGN_RIGHT); + if (label_width_right) + for (i = 0; i < 4; ++i) + display_string_in_field(1 + i, right_x, labels_right[i], + label_width_right, ALIGN_LEFT); +} + +void display_card_info(void) +{ + snd_hctl_t *hctl; + snd_ctl_t *ctl; + snd_ctl_card_info_t *card_info; + const char *card_name = NULL; + const char *mixer_name = NULL; + int err; + + if (!has_info_items) + return; + + snd_ctl_card_info_alloca(&card_info); + if (mixer_device_name) + err = snd_mixer_get_hctl(mixer, mixer_device_name, &hctl); + else + err = -1; + if (err >= 0) { + ctl = snd_hctl_ctl(hctl); + err = snd_ctl_card_info(ctl, card_info); + if (err >= 0) { + card_name = snd_ctl_card_info_get_name(card_info); + mixer_name = snd_ctl_card_info_get_mixername(card_info); + } + } + + if (card_name) + wattrset(mixer_widget.window, attr_mixer_active); + else { + wattrset(mixer_widget.window, attr_mixer_text); + if (unplugged) + card_name = _("(unplugged)"); + else + card_name = "-"; + } + display_string_in_field(1, info_items_left, card_name, info_items_width, ALIGN_LEFT); + + if (mixer_name) + wattrset(mixer_widget.window, attr_mixer_active); + else { + wattrset(mixer_widget.window, attr_mixer_text); + mixer_name = "-"; + } + display_string_in_field(2, info_items_left, mixer_name, info_items_width, ALIGN_LEFT); +} + +void display_view_mode(void) +{ + const char *modes[3] = { + _("Playback"), + _("Capture"), + _("All"), + }; + unsigned int widths[3]; + bool has_view_mode; + int i; + + if (!has_info_items) + return; + + has_view_mode = controls_count > 0 || are_there_any_controls(); + for (i = 0; i < 3; ++i) + widths[i] = get_mbs_width(modes[i]); + if (4 + widths[0] + 6 + widths[1] + 6 + widths[2] + 1 <= info_items_width) { + wmove(mixer_widget.window, 3, info_items_left); + wattrset(mixer_widget.window, attr_mixer_text); + for (i = 0; i < 3; ++i) { + wprintw(mixer_widget.window, "F%c:", '3' + i); + if (has_view_mode && (int)view_mode == i) { + wattrset(mixer_widget.window, attr_mixer_active); + wprintw(mixer_widget.window, "[%s]", modes[i]); + wattrset(mixer_widget.window, attr_mixer_text); + } else { + wprintw(mixer_widget.window, " %s ", modes[i]); + } + if (i < 2) + waddch(mixer_widget.window, ' '); + } + } else { + wattrset(mixer_widget.window, attr_mixer_active); + display_string_in_field(3, info_items_left, + has_view_mode ? modes[view_mode] : "", + info_items_width, ALIGN_LEFT); + } +} + +static char *format_gain(long db) +{ + if (db != SND_CTL_TLV_DB_GAIN_MUTE) + return casprintf("%.2f", db / 100.0); + else + return cstrdup(_("mute")); +} + +static void display_focus_item_info(void) +{ + struct control *control; + unsigned int index; + char buf[64]; + long db, db2; + int sw, sw2; + char *dbs, *dbs2; + char *value_info; + char *item_info; + int err; + + if (!has_info_items) + return; + wattrset(mixer_widget.window, attr_mixer_active); + if (!controls_count || screen_too_small) { + display_string_in_field(4, info_items_left, "", info_items_width, ALIGN_LEFT); + return; + } + control = &controls[focus_control_index]; + value_info = NULL; + if (control->flags & TYPE_ENUM) { + err = snd_mixer_selem_get_enum_item(control->elem, ffs(control->enum_channel_bits) - 1, &index); + if (err >= 0) + err = snd_mixer_selem_get_enum_item_name(control->elem, index, sizeof buf - 1, buf); + if (err >= 0) + value_info = casprintf(" [%s]", buf); + } else if (control->flags & (TYPE_PVOLUME | TYPE_CVOLUME)) { + int (*get_vol_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *); + + if (control->flags & TYPE_PVOLUME) + get_vol_func = snd_mixer_selem_get_playback_dB; + else + get_vol_func = snd_mixer_selem_get_capture_dB; + if (!(control->flags & HAS_VOLUME_1)) { + err = get_vol_func(control->elem, control->volume_channels[0], &db); + if (err >= 0) { + dbs = format_gain(db); + value_info = casprintf(" [%s %s]", _("dB gain:"), dbs); + free(dbs); + } + } else { + err = get_vol_func(control->elem, control->volume_channels[0], &db); + if (err >= 0) + err = get_vol_func(control->elem, control->volume_channels[1], &db2); + if (err >= 0) { + dbs = format_gain(db); + dbs2 = format_gain(db2); + value_info = casprintf(_(" [%s %s, %s]"), _("dB gain:"), dbs, dbs2); + free(dbs); + free(dbs2); + } + } + } else if (control->flags & TYPE_PSWITCH) { + if (!(control->flags & HAS_PSWITCH_1)) { + err = snd_mixer_selem_get_playback_switch(control->elem, control->pswitch_channels[0], &sw); + if (err >= 0 && !sw) + value_info = casprintf(" [%s]", _("Off")); + } else { + err = snd_mixer_selem_get_playback_switch(control->elem, control->pswitch_channels[0], &sw); + if (err >= 0) + err = snd_mixer_selem_get_playback_switch(control->elem, control->pswitch_channels[1], &sw2); + if (err >= 0 && (!sw || !sw2)) + value_info = casprintf(" [%s, %s]", sw ? _("On") : _("Off"), sw2 ? _("On") : _("Off")); + } + } else if (control->flags & TYPE_CSWITCH) { + if (!(control->flags & HAS_CSWITCH_1)) { + err = snd_mixer_selem_get_capture_switch(control->elem, control->cswitch_channels[0], &sw); + if (err >= 0 && !sw) + value_info = casprintf(" [%s]", _("Off")); + } else { + err = snd_mixer_selem_get_capture_switch(control->elem, control->cswitch_channels[0], &sw); + if (err >= 0) + err = snd_mixer_selem_get_capture_switch(control->elem, control->cswitch_channels[1], &sw2); + if (err >= 0 && (!sw || !sw2)) + value_info = casprintf(" [%s, %s]", sw ? _("On") : _("Off"), sw2 ? _("On") : _("Off")); + } + } + item_info = casprintf("%s%s", control->name, value_info ? value_info : ""); + free(value_info); + display_string_in_field(4, info_items_left, item_info, info_items_width, ALIGN_LEFT); + free(item_info); +} + +static void clear_controls_display(void) +{ + int i; + + wattrset(mixer_widget.window, attr_mixer_frame); + for (i = 5; i < screen_lines - 1; ++i) + mvwprintw(mixer_widget.window, i, 1, "%*s", screen_cols - 2, ""); +} + +static void center_string(int line, const char *s) +{ + int width = get_mbs_width(s); + if (width <= screen_cols - 2) + mvwaddstr(mixer_widget.window, line, (screen_cols - width) / 2, s); +} + +static void display_unplugged(void) +{ + int lines, top, left; + bool boojum; + + lines = screen_lines - 6; + if (lines < 2) + return; + top = lines / 2; + boojum = lines >= 10 && screen_cols >= 48; + top -= boojum ? 5 : 1; + if (top < 5) + top = 5; + if (boojum) { + left = (screen_cols - 46) / 2; + wattrset(mixer_widget.window, attr_mixer_text); + mvwaddstr(mixer_widget.window, top + 0, left, "In the midst of the word he was trying to say,"); + mvwaddstr(mixer_widget.window, top + 1, left + 2, "In the midst of his laughter and glee,"); + mvwaddstr(mixer_widget.window, top + 2, left, "He had softly and suddenly vanished away---"); + mvwaddstr(mixer_widget.window, top + 3, left + 2, "For the Snark was a Boojum, you see."); + mvwchgat(mixer_widget.window, top + 3, left + 16, 3, /* ^^^ */ + attr_mixer_text | A_BOLD, PAIR_NUMBER(attr_mixer_text), NULL); + mvwaddstr(mixer_widget.window, top + 5, left, "(Lewis Carroll, \"The Hunting of the Snark\")"); + top += 8; + } + wattrset(mixer_widget.window, attr_errormsg); + center_string(top, _("The sound device was unplugged.")); + center_string(top + 1, _("Press F6 to select another sound card.")); +} + +static void display_no_controls(void) +{ + int y; + const char *msg; + + y = (screen_lines - 6) / 2 - 1; + if (y < 5) + y = 5; + if (y >= screen_lines - 1) + return; + wattrset(mixer_widget.window, attr_infomsg); + if (view_mode == VIEW_MODE_PLAYBACK && are_there_any_controls()) + msg = _("This sound device does not have any playback controls."); + else if (view_mode == VIEW_MODE_CAPTURE && are_there_any_controls()) + msg = _("This sound device does not have any capture controls."); + else + msg = _("This sound device does not have any controls."); + center_string(y, msg); +} + +static void display_string_centered_in_control(int y, int col, const char *s, int width) +{ + int left, x; + + left = first_control_x + col * (control_width + 1); + x = left + (control_width - width) / 2; + display_string_in_field(y, x, s, width, ALIGN_CENTER); +} + +static void display_control(unsigned int control_index) +{ + struct control *control; + int col; + int i, c; + int left, frame_left; + int bar_height; + double volumes[2]; + int switches[2]; + unsigned int index; + const char *s; + char buf[64]; + int err; + + control = &controls[control_index]; + col = control_index - first_visible_control_index; + left = first_control_x + col * (control_width + 1); + frame_left = left + (control_width - 4) / 2; + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_ctl_frame); + else + wattrset(mixer_widget.window, attr_ctl_inactive); + if (control->flags & (TYPE_PVOLUME | TYPE_CVOLUME)) { + mvwaddch(mixer_widget.window, base_y - volume_height - 1, frame_left, ACS_ULCORNER); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_URCORNER); + for (i = 0; i < volume_height; ++i) { + mvwaddch(mixer_widget.window, base_y - i - 1, frame_left, ACS_VLINE); + mvwaddch(mixer_widget.window, base_y - i - 1, frame_left + 3, ACS_VLINE); + } + mvwaddch(mixer_widget.window, base_y, frame_left, + control->flags & TYPE_PSWITCH ? ACS_LTEE : ACS_LLCORNER); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, + control->flags & TYPE_PSWITCH ? ACS_RTEE : ACS_LRCORNER); + } else if (control->flags & TYPE_PSWITCH) { + mvwaddch(mixer_widget.window, base_y, frame_left, ACS_ULCORNER); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_URCORNER); + } + if (control->flags & TYPE_PSWITCH) { + mvwaddch(mixer_widget.window, base_y + 1, frame_left, ACS_VLINE); + mvwaddch(mixer_widget.window, base_y + 1, frame_left + 3, ACS_VLINE); + mvwaddch(mixer_widget.window, base_y + 2, frame_left, ACS_LLCORNER); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_HLINE); + waddch(mixer_widget.window, ACS_LRCORNER); + } + if (control->flags & (TYPE_PVOLUME | TYPE_CVOLUME)) { + double (*get_vol_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t); + + if (control->flags & TYPE_PVOLUME) + get_vol_func = get_normalized_playback_volume; + else + get_vol_func = get_normalized_capture_volume; + volumes[0] = get_vol_func(control->elem, control->volume_channels[0]); + if (control->flags & HAS_VOLUME_1) + volumes[1] = get_vol_func(control->elem, control->volume_channels[1]); + else + volumes[1] = volumes[0]; + + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, 0); + for (c = 0; c < 2; c++) { + bar_height = lrint(volumes[c] * volume_height); + for (i = 0; i < volume_height; ++i) { + chtype ch; + if (i + 1 > bar_height) + ch = ' ' | (control->flags & IS_ACTIVE ? + attr_ctl_frame : 0); + else { + ch = ACS_CKBOARD; + if (!(control->flags & IS_ACTIVE)) + ; +#ifdef TRICOLOR_VOLUME_BAR + else if (i > volume_height * 8 / 10) + ch |= attr_ctl_bar_hi; + else if (i > volume_height * 4 / 10) + ch |= attr_ctl_bar_mi; +#endif + else + ch |= attr_ctl_bar_lo; + } + mvwaddch(mixer_widget.window, base_y - i - 1, + frame_left + c + 1, ch); + } + } + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_mixer_active); + if (!(control->flags & HAS_VOLUME_1)) { + sprintf(buf, "%d", lrint(volumes[0] * 100)); + display_string_in_field(values_y, frame_left - 2, buf, 8, ALIGN_CENTER); + } else { + mvwprintw(mixer_widget.window, values_y, frame_left - 2, + "%3d", lrint(volumes[0] * 100)); + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_ctl_frame); + waddstr(mixer_widget.window, "<>"); + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_mixer_active); + wprintw(mixer_widget.window, "%-3d", lrint(volumes[1] * 100)); + } + } + + if (control->flags & TYPE_PSWITCH) { + err = snd_mixer_selem_get_playback_switch(control->elem, control->pswitch_channels[0], &switches[0]); + if (err >= 0 && (control->flags & HAS_PSWITCH_1)) + err = snd_mixer_selem_get_playback_switch(control->elem, control->pswitch_channels[1], &switches[1]); + else + switches[1] = switches[0]; + if (err < 0) + return; + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, 0); + mvwaddch(mixer_widget.window, base_y + 1, frame_left + 1, + switches[0] + /* TRANSLATORS: playback on; one character */ + ? _("O")[0] | (control->flags & IS_ACTIVE ? attr_ctl_nomute : 0) + /* TRANSLATORS: playback muted; one character */ + : _("M")[0] | (control->flags & IS_ACTIVE ? attr_ctl_mute : 0)); + waddch(mixer_widget.window, + switches[1] + ? _("O")[0] | (control->flags & IS_ACTIVE ? attr_ctl_nomute : 0) + : _("M")[0] | (control->flags & IS_ACTIVE ? attr_ctl_mute : 0)); + } + + if (control->flags & TYPE_CSWITCH) { + err = snd_mixer_selem_get_capture_switch(control->elem, control->cswitch_channels[0], &switches[0]); + if (err >= 0 && (control->flags & HAS_CSWITCH_1)) + err = snd_mixer_selem_get_capture_switch(control->elem, control->cswitch_channels[1], &switches[1]); + else + switches[1] = switches[0]; + if (err < 0) + return; + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, switches[0] ? attr_ctl_capture : attr_ctl_nocapture); + /* TRANSLATORS: "left"; no more than two characters */ + display_string_in_field(cswitch_y - 1, frame_left - 2, switches[0] ? _("L") : "", 2, ALIGN_RIGHT); + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, switches[1] ? attr_ctl_capture : attr_ctl_nocapture); + /* TRANSLATORS: "right"; no more than two characters */ + display_string_in_field(cswitch_y - 1, frame_left + 4, switches[1] ? _("R") : "", 2, ALIGN_LEFT); + /* TRANSLATORS: no more than eight characters */ + s = _("CAPTURE"); + if (switches[0] || switches[1]) { + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_ctl_capture); + display_string_in_field(cswitch_y, frame_left - 2, s, 8, ALIGN_CENTER); + } else { + i = get_mbs_width(s); + if (i > 8) + i = 8; + memset(buf, '-', i); + buf[i] = '\0'; + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_ctl_nocapture); + display_string_in_field(cswitch_y, frame_left - 2, buf, 8, ALIGN_CENTER); + } + } + + if (control->flags & TYPE_ENUM) { + err = snd_mixer_selem_get_enum_item(control->elem, ffs(control->enum_channel_bits) - 1, &index); + if (err < 0) + return; + err = snd_mixer_selem_get_enum_item_name(control->elem, index, sizeof buf - 1, buf); + if (err < 0) + return; + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_mixer_active); + display_string_centered_in_control(base_y, col, buf, control_width); + } + + if (control_index == focus_control_index) { + i = first_control_x + col * (control_width + 1) + (control_width - control_name_width) / 2; + wattrset(mixer_widget.window, attr_ctl_mark_focus); + mvwaddch(mixer_widget.window, name_y, i - 1, '<'); + mvwaddch(mixer_widget.window, name_y, i + control_name_width, '>'); + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_ctl_label_focus); + else + wattrset(mixer_widget.window, attr_ctl_label_inactive); + } else { + if (control->flags & IS_ACTIVE) + wattrset(mixer_widget.window, attr_ctl_label); + else + wattrset(mixer_widget.window, attr_ctl_label_inactive); + } + display_string_centered_in_control(name_y, col, control->name, control_name_width); + if (channel_name_y > name_y) { + if (control->flags & IS_MULTICH) { + switch (control->flags & MULTICH_MASK) { + case 0: + default: + s = _("Front"); + break; + case 1: + s = _("Rear"); + break; + case 2: + s = _("Center"); + break; + case 3: + s = _("Woofer"); + break; + case 4: + s = _("Side"); + break; + } + } else { + s = ""; + wattrset(mixer_widget.window, attr_mixer_frame); + } + display_string_centered_in_control(channel_name_y, col, s, + control_name_width); + } +} + +static void display_scroll_indicators(void) +{ + int y0, y1, y; + chtype left, right; + + if (screen_too_small) + return; + y0 = screen_lines * 3 / 8; + y1 = screen_lines * 5 / 8; + left = first_visible_control_index > 0 ? ACS_LARROW : ACS_VLINE; + right = first_visible_control_index + visible_controls < controls_count + ? ACS_RARROW : ACS_VLINE; + wattrset(mixer_widget.window, attr_mixer_frame); + for (y = y0; y <= y1; ++y) { + mvwaddch(mixer_widget.window, y, 0, left); + mvwaddch(mixer_widget.window, y, screen_cols - 1, right); + } +} + +void display_controls(void) +{ + unsigned int i; + + if (first_visible_control_index > controls_count - visible_controls) + first_visible_control_index = controls_count - visible_controls; + if (first_visible_control_index > focus_control_index) + first_visible_control_index = focus_control_index; + else if (first_visible_control_index < focus_control_index - visible_controls + 1 && visible_controls) + first_visible_control_index = focus_control_index - visible_controls + 1; + + clear_controls_display(); + + display_focus_item_info(); + + if (controls_count > 0) { + if (!screen_too_small) + for (i = 0; i < visible_controls; ++i) + display_control(first_visible_control_index + i); + } else if (unplugged) { + display_unplugged(); + } else if (mixer_device_name) { + display_no_controls(); + } + display_scroll_indicators(); + controls_changed = FALSE; +} + +void compute_controls_layout(void) +{ + bool any_volume, any_pswitch, any_cswitch, any_multich; + int max_width, name_len; + int height, space; + unsigned int i; + + if (controls_count == 0 || screen_too_small) { + visible_controls = 0; + return; + } + + any_volume = FALSE; + any_pswitch = FALSE; + any_cswitch = FALSE; + any_multich = FALSE; + for (i = 0; i < controls_count; ++i) { + if (controls[i].flags & (TYPE_PVOLUME | TYPE_CVOLUME)) + any_volume = 1; + if (controls[i].flags & TYPE_PSWITCH) + any_pswitch = 1; + if (controls[i].flags & TYPE_CSWITCH) + any_cswitch = 1; + if (controls[i].flags & IS_MULTICH) + any_multich = 1; + } + + max_width = 8; + for (i = 0; i < controls_count; ++i) { + name_len = strlen(controls[i].name); + if (name_len > max_width) + max_width = name_len; + } + max_width = (max_width + 1) & ~1; + + control_width = (screen_cols - 3 - (int)controls_count) / controls_count; + if (control_width < 8) + control_width = 8; + if (control_width > max_width) + control_width = max_width; + if (control_width > screen_cols - 4) + control_width = screen_cols - 4; + + visible_controls = (screen_cols - 3) / (control_width + 1); + if (visible_controls > controls_count) + visible_controls = controls_count; + + first_control_x = 2 + (screen_cols - 3 - visible_controls * (control_width + 1)) / 2; + + if (control_width < max_width) + control_name_width = control_width; + else + control_name_width = max_width; + + height = 2; + if (any_volume) + height += 2; + if (any_pswitch) + height += 2; + if (any_cswitch) + height += 1; + if (any_multich) + height += 1; + if (any_volume) { + space = screen_lines - 6 - height; + if (space <= 1) + volume_height = 1; + else if (space <= 10) + volume_height = space; + else + volume_height = 10 + (space - 10) / 2; + height += volume_height; + } + + space = screen_lines - 6 - height; + channel_name_y = screen_lines - 2 - space / 2; + name_y = channel_name_y - any_multich; + values_y = name_y - any_volume; + cswitch_y = values_y - any_cswitch; + base_y = cswitch_y - 1 - 2 * any_pswitch; +} diff --git a/alsamixer/mixer_display.h b/alsamixer/mixer_display.h new file mode 100644 index 0000000..3d65670 --- /dev/null +++ b/alsamixer/mixer_display.h @@ -0,0 +1,10 @@ +#ifndef MIXER_DISPLAY_H_INCLUDED +#define MIXER_DISPLAY_H_INCLUDED + +void init_mixer_layout(void); +void display_card_info(void); +void display_view_mode(void); +void display_controls(void); +void compute_controls_layout(void); + +#endif diff --git a/alsamixer/mixer_widget.c b/alsamixer/mixer_widget.c new file mode 100644 index 0000000..fb352d3 --- /dev/null +++ b/alsamixer/mixer_widget.c @@ -0,0 +1,650 @@ +/* + * mixer_widget.c - mixer widget and keys handling + * Copyright (c) 1998,1999 Tim Janik + * Jaroslav Kysela + * Copyright (c) 2009 Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include "gettext_curses.h" +#include "version.h" +#include "utils.h" +#include "die.h" +#include "mem.h" +#include "colors.h" +#include "widget.h" +#include "textbox.h" +#include "proc_files.h" +#include "card_select.h" +#include "volume_mapping.h" +#include "mixer_controls.h" +#include "mixer_display.h" +#include "mixer_widget.h" + +snd_mixer_t *mixer; +char *mixer_device_name; +bool unplugged; + +struct widget mixer_widget; + +enum view_mode view_mode; + +int focus_control_index; +snd_mixer_selem_id_t *current_selem_id; +unsigned int current_control_flags; + +bool controls_changed; + +enum channel_mask { + LEFT = 1, + RIGHT = 2, +}; + +static int elem_callback(snd_mixer_elem_t *elem, unsigned int mask) +{ + if (mask & (SND_CTL_EVENT_MASK_REMOVE | + SND_CTL_EVENT_MASK_INFO | + SND_CTL_EVENT_MASK_VALUE)) + controls_changed = TRUE; + return 0; +} + +static int mixer_callback(snd_mixer_t *mixer, unsigned int mask, snd_mixer_elem_t *elem) +{ + if (mask & SND_CTL_EVENT_MASK_ADD) { + snd_mixer_elem_set_callback(elem, elem_callback); + controls_changed = TRUE; + } + return 0; +} + +void create_mixer_object(struct snd_mixer_selem_regopt *selem_regopt) +{ + int err; + + err = snd_mixer_open(&mixer, 0); + if (err < 0) + fatal_alsa_error(_("cannot open mixer"), err); + + mixer_device_name = cstrdup(selem_regopt->device); + err = snd_mixer_selem_register(mixer, selem_regopt, NULL); + if (err < 0) + fatal_alsa_error(_("cannot open mixer"), err); + + snd_mixer_set_callback(mixer, mixer_callback); + + err = snd_mixer_load(mixer); + if (err < 0) + fatal_alsa_error(_("cannot load mixer controls"), err); + + err = snd_mixer_selem_id_malloc(¤t_selem_id); + if (err < 0) + fatal_error("out of memory"); +} + +static void set_view_mode(enum view_mode m) +{ + view_mode = m; + create_controls(); +} + +static void close_hctl(void) +{ + free_controls(); + if (mixer_device_name) { + snd_mixer_detach(mixer, mixer_device_name); + free(mixer_device_name); + mixer_device_name = NULL; + } +} + +static void check_unplugged(void) +{ + snd_hctl_t *hctl; + snd_ctl_t *ctl; + unsigned int state; + int err; + + unplugged = FALSE; + if (mixer_device_name) { + err = snd_mixer_get_hctl(mixer, mixer_device_name, &hctl); + if (err >= 0) { + ctl = snd_hctl_ctl(hctl); + /* just any random function that does an ioctl() */ + err = snd_ctl_get_power_state(ctl, &state); + if (err == -ENODEV) + unplugged = TRUE; + } + } +} + +void close_mixer_device(void) +{ + check_unplugged(); + close_hctl(); + + display_card_info(); + set_view_mode(view_mode); +} + +bool select_card_by_name(const char *device_name) +{ + int err; + bool opened; + char *msg; + + close_hctl(); + unplugged = FALSE; + + opened = FALSE; + if (device_name) { + err = snd_mixer_attach(mixer, device_name); + if (err >= 0) + opened = TRUE; + else { + msg = casprintf(_("Cannot open mixer device '%s'."), device_name); + show_alsa_error(msg, err); + free(msg); + } + } + if (opened) { + mixer_device_name = cstrdup(device_name); + + err = snd_mixer_load(mixer); + if (err < 0) + fatal_alsa_error(_("cannot load mixer controls"), err); + } + + display_card_info(); + set_view_mode(view_mode); + return opened; +} + +static void show_help(void) +{ + const char *help[] = { + _("Esc Exit"), + _("F1 ? H Help"), + _("F2 / System information"), + _("F3 Show playback controls"), + _("F4 Show capture controls"), + _("F5 Show all controls"), + _("Tab Toggle view mode (F3/F4/F5)"), + _("F6 S Select sound card"), + _("L Redraw screen"), + "", + _("Left Move to the previous control"), + _("Right Move to the next control"), + "", + _("Up/Down Change volume"), + _("+ - Change volume"), + _("Page Up/Dn Change volume in big steps"), + _("End Set volume to 0%"), + _("0-9 Set volume to 0%-90%"), + _("Q W E Increase left/both/right volumes"), + /* TRANSLATORS: or Y instead of Z */ + _("Z X C Decrease left/both/right volumes"), + _("B Balance left and right volumes"), + "", + _("M Toggle mute"), + /* TRANSLATORS: or , . */ + _("< > Toggle left/right mute"), + "", + _("Space Toggle capture"), + /* TRANSLATORS: or Insert Delete */ + _("; ' Toggle left/right capture"), + "", + _("Authors:"), + _(" Tim Janik"), + _(" Jaroslav Kysela "), + _(" Clemens Ladisch "), + }; + show_text(help, ARRAY_SIZE(help), _("Help")); +} + +void refocus_control(void) +{ + if (focus_control_index < controls_count) { + snd_mixer_selem_get_id(controls[focus_control_index].elem, current_selem_id); + current_control_flags = controls[focus_control_index].flags; + } + + display_controls(); +} + +static struct control *get_focus_control(unsigned int type) +{ + if (focus_control_index >= 0 && + focus_control_index < controls_count && + (controls[focus_control_index].flags & IS_ACTIVE) && + (controls[focus_control_index].flags & type)) + return &controls[focus_control_index]; + else + return NULL; +} + +static void change_enum_to_percent(struct control *control, int value) +{ + unsigned int i; + unsigned int index; + unsigned int new_index; + int items; + int err; + + i = ffs(control->enum_channel_bits) - 1; + err = snd_mixer_selem_get_enum_item(control->elem, i, &index); + if (err < 0) + return; + new_index = index; + if (value == 0) { + new_index = 0; + } else if (value == 100) { + items = snd_mixer_selem_get_enum_items(control->elem); + if (items < 1) + return; + new_index = items - 1; + } + if (new_index == index) + return; + for (i = 0; i <= SND_MIXER_SCHN_LAST; ++i) + if (control->enum_channel_bits & (1 << i)) + snd_mixer_selem_set_enum_item(control->elem, i, new_index); +} + +static void change_enum_relative(struct control *control, int delta) +{ + int items; + unsigned int i; + unsigned int index; + int new_index; + int err; + + items = snd_mixer_selem_get_enum_items(control->elem); + if (items < 1) + return; + err = snd_mixer_selem_get_enum_item(control->elem, 0, &index); + if (err < 0) + return; + new_index = (int)index + delta; + if (new_index < 0) + new_index = 0; + else if (new_index >= items) + new_index = items - 1; + if (new_index == index) + return; + for (i = 0; i <= SND_MIXER_SCHN_LAST; ++i) + if (control->enum_channel_bits & (1 << i)) + snd_mixer_selem_set_enum_item(control->elem, i, new_index); +} + +static void change_volume_to_percent(struct control *control, int value, unsigned int channels) +{ + int (*set_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, double, int); + + if (!(control->flags & HAS_VOLUME_1)) + channels = LEFT; + if (control->flags & TYPE_PVOLUME) + set_func = set_normalized_playback_volume; + else + set_func = set_normalized_capture_volume; + if (channels & LEFT) + set_func(control->elem, control->volume_channels[0], value / 100.0, 0); + if (channels & RIGHT) + set_func(control->elem, control->volume_channels[1], value / 100.0, 0); +} + +static double clamp_volume(double v) +{ + if (v < 0) + return 0; + if (v > 1) + return 1; + return v; +} + +static void change_volume_relative(struct control *control, int delta, unsigned int channels) +{ + double (*get_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t); + int (*set_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, double, int); + double left, right; + int dir; + + if (!(control->flags & HAS_VOLUME_1)) + channels = LEFT; + if (control->flags & TYPE_PVOLUME) { + get_func = get_normalized_playback_volume; + set_func = set_normalized_playback_volume; + } else { + get_func = get_normalized_capture_volume; + set_func = set_normalized_capture_volume; + } + if (channels & LEFT) + left = get_func(control->elem, control->volume_channels[0]); + if (channels & RIGHT) + right = get_func(control->elem, control->volume_channels[1]); + dir = delta > 0 ? 1 : -1; + if (channels & LEFT) { + left = clamp_volume(left + delta / 100.0); + set_func(control->elem, control->volume_channels[0], left, dir); + } + if (channels & RIGHT) { + right = clamp_volume(right + delta / 100.0); + set_func(control->elem, control->volume_channels[1], right, dir); + } +} + +static void change_control_to_percent(int value, unsigned int channels) +{ + struct control *control; + + control = get_focus_control(TYPE_PVOLUME | TYPE_CVOLUME | TYPE_ENUM); + if (!control) + return; + if (control->flags & TYPE_ENUM) + change_enum_to_percent(control, value); + else + change_volume_to_percent(control, value, channels); + display_controls(); +} + +static void change_control_relative(int delta, unsigned int channels) +{ + struct control *control; + + control = get_focus_control(TYPE_PVOLUME | TYPE_CVOLUME | TYPE_ENUM); + if (!control) + return; + if (control->flags & TYPE_ENUM) + change_enum_relative(control, delta); + else + change_volume_relative(control, delta, channels); + display_controls(); +} + +static void toggle_switches(unsigned int type, unsigned int channels) +{ + struct control *control; + unsigned int switch_1_mask; + int (*get_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, int *); + int (*set_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, int); + snd_mixer_selem_channel_id_t channel_ids[2]; + int left, right; + int err; + + control = get_focus_control(type); + if (!control) + return; + if (type == TYPE_PSWITCH) { + switch_1_mask = HAS_PSWITCH_1; + get_func = snd_mixer_selem_get_playback_switch; + set_func = snd_mixer_selem_set_playback_switch; + channel_ids[0] = control->pswitch_channels[0]; + channel_ids[1] = control->pswitch_channels[1]; + } else { + switch_1_mask = HAS_CSWITCH_1; + get_func = snd_mixer_selem_get_capture_switch; + set_func = snd_mixer_selem_set_capture_switch; + channel_ids[0] = control->cswitch_channels[0]; + channel_ids[1] = control->cswitch_channels[1]; + } + if (!(control->flags & switch_1_mask)) + channels = LEFT; + if (channels & LEFT) { + err = get_func(control->elem, channel_ids[0], &left); + if (err < 0) + return; + } + if (channels & RIGHT) { + err = get_func(control->elem, channel_ids[1], &right); + if (err < 0) + return; + } + if (channels & LEFT) + set_func(control->elem, channel_ids[0], !left); + if (channels & RIGHT) + set_func(control->elem, channel_ids[1], !right); + display_controls(); +} + +static void toggle_mute(unsigned int channels) +{ + toggle_switches(TYPE_PSWITCH, channels); +} + +static void toggle_capture(unsigned int channels) +{ + toggle_switches(TYPE_CSWITCH, channels); +} + +static void balance_volumes(void) +{ + struct control *control; + double left, right; + int err; + + control = get_focus_control(TYPE_PVOLUME | TYPE_CVOLUME); + if (!control || !(control->flags & HAS_VOLUME_1)) + return; + if (control->flags & TYPE_PVOLUME) { + left = get_normalized_playback_volume(control->elem, control->volume_channels[0]); + right = get_normalized_playback_volume(control->elem, control->volume_channels[1]); + } else { + left = get_normalized_capture_volume(control->elem, control->volume_channels[0]); + right = get_normalized_capture_volume(control->elem, control->volume_channels[1]); + } + left = (left + right) / 2; + if (control->flags & TYPE_PVOLUME) { + set_normalized_playback_volume(control->elem, control->volume_channels[0], left, 0); + set_normalized_playback_volume(control->elem, control->volume_channels[1], left, 0); + } else { + set_normalized_capture_volume(control->elem, control->volume_channels[0], left, 0); + set_normalized_capture_volume(control->elem, control->volume_channels[1], left, 0); + } + display_controls(); +} + +static void on_handle_key(int key) +{ + switch (key) { + case 27: + case KEY_CANCEL: + case KEY_F(10): + mixer_widget.close(); + break; + case KEY_F(1): + case KEY_HELP: + case 'H': + case 'h': + case '?': + show_help(); + break; + case KEY_F(2): + case '/': + create_proc_files_list(); + break; + case KEY_F(3): + set_view_mode(VIEW_MODE_PLAYBACK); + break; + case KEY_F(4): + set_view_mode(VIEW_MODE_CAPTURE); + break; + case KEY_F(5): + set_view_mode(VIEW_MODE_ALL); + break; + case '\t': + set_view_mode((enum view_mode)((view_mode + 1) % VIEW_MODE_COUNT)); + break; + case KEY_F(6): + case 'S': + case 's': + create_card_select_list(); + break; + case KEY_REFRESH: + case 12: + case 'L': + case 'l': + clearok(mixer_widget.window, TRUE); + display_controls(); + break; + case KEY_LEFT: + case 'P': + case 'p': + if (focus_control_index > 0) { + --focus_control_index; + refocus_control(); + } + break; + case KEY_RIGHT: + case 'N': + case 'n': + if (focus_control_index < controls_count - 1) { + ++focus_control_index; + refocus_control(); + } + break; + case KEY_PPAGE: + change_control_relative(5, LEFT | RIGHT); + break; + case KEY_NPAGE: + change_control_relative(-5, LEFT | RIGHT); + break; +#if 0 + case KEY_BEG: + case KEY_HOME: + change_control_to_percent(100, LEFT | RIGHT); + break; +#endif + case KEY_LL: + case KEY_END: + change_control_to_percent(0, LEFT | RIGHT); + break; + case KEY_UP: + case '+': + case 'K': + case 'k': + case 'W': + case 'w': + change_control_relative(1, LEFT | RIGHT); + break; + case KEY_DOWN: + case '-': + case 'J': + case 'j': + case 'X': + case 'x': + change_control_relative(-1, LEFT | RIGHT); + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + change_control_to_percent((key - '0') * 10, LEFT | RIGHT); + break; + case 'Q': + case 'q': + change_control_relative(1, LEFT); + break; + case 'Y': + case 'y': + case 'Z': + case 'z': + change_control_relative(-1, LEFT); + break; + case 'E': + case 'e': + change_control_relative(1, RIGHT); + break; + case 'C': + case 'c': + change_control_relative(-1, RIGHT); + break; + case 'M': + case 'm': + toggle_mute(LEFT | RIGHT); + break; + case 'B': + case 'b': + case '=': + balance_volumes(); + break; + case '<': + case ',': + toggle_mute(LEFT); + break; + case '>': + case '.': + toggle_mute(RIGHT); + break; + case ' ': + toggle_capture(LEFT | RIGHT); + break; + case KEY_IC: + case ';': + toggle_capture(LEFT); + break; + case KEY_DC: + case '\'': + toggle_capture(RIGHT); + break; + } +} + +static void create(void) +{ + static const char title[] = " AlsaMixer v" SND_UTIL_VERSION_STR " "; + + widget_init(&mixer_widget, screen_lines, screen_cols, 0, 0, + attr_mixer_frame, WIDGET_BORDER); + if (screen_cols >= (sizeof(title) - 1) + 2) { + wattrset(mixer_widget.window, attr_mixer_active); + mvwaddstr(mixer_widget.window, 0, (screen_cols - (sizeof(title) - 1)) / 2, title); + } + init_mixer_layout(); + display_card_info(); + set_view_mode(view_mode); +} + +static void on_window_size_changed(void) +{ + create(); +} + +static void on_close(void) +{ + widget_free(&mixer_widget); +} + +void mixer_shutdown(void) +{ + free_controls(); + if (mixer) + snd_mixer_close(mixer); + if (current_selem_id) + snd_mixer_selem_id_free(current_selem_id); +} + +struct widget mixer_widget = { + .handle_key = on_handle_key, + .window_size_changed = on_window_size_changed, + .close = on_close, +}; + +void create_mixer_widget(void) +{ + create(); +} diff --git a/alsamixer/mixer_widget.h b/alsamixer/mixer_widget.h new file mode 100644 index 0000000..da8628e --- /dev/null +++ b/alsamixer/mixer_widget.h @@ -0,0 +1,36 @@ +#ifndef MIXER_WIDGET_H_INCLUDED +#define MIXER_WIDGET_H_INCLUDED + +#include CURSESINC +#include +#include "widget.h" + +enum view_mode { + VIEW_MODE_PLAYBACK, + VIEW_MODE_CAPTURE, + VIEW_MODE_ALL, + VIEW_MODE_COUNT, +}; + +extern snd_mixer_t *mixer; +extern char *mixer_device_name; +extern bool unplugged; + +extern struct widget mixer_widget; + +extern enum view_mode view_mode; + +extern int focus_control_index; +extern snd_mixer_selem_id_t *current_selem_id; +extern unsigned int current_control_flags; + +extern bool controls_changed; + +void create_mixer_object(struct snd_mixer_selem_regopt *selem_regopt); +void create_mixer_widget(void); +void mixer_shutdown(void); +void close_mixer_device(void); +bool select_card_by_name(const char *device_name); +void refocus_control(void); + +#endif diff --git a/alsamixer/proc_files.c b/alsamixer/proc_files.c new file mode 100644 index 0000000..b2f5f21 --- /dev/null +++ b/alsamixer/proc_files.c @@ -0,0 +1,169 @@ +/* + * proc_files.c - shows ALSA system information files + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include "gettext_curses.h" +#include "utils.h" +#include "die.h" +#include "mem.h" +#include "colors.h" +#include "widget.h" +#include "textbox.h" +#include "proc_files.h" + +static struct widget proc_widget; +static ITEM *items[7]; +static unsigned int items_count; +static MENU *menu; + +static void on_menu_key(int key) +{ + static const struct { + int key; + int request; + } key_map[] = { + { KEY_DOWN, REQ_DOWN_ITEM }, + { KEY_UP, REQ_UP_ITEM }, + { KEY_HOME, REQ_FIRST_ITEM }, + { KEY_NPAGE, REQ_SCR_DPAGE }, + { KEY_PPAGE, REQ_SCR_UPAGE }, + { KEY_BEG, REQ_FIRST_ITEM }, + { KEY_END, REQ_LAST_ITEM }, + }; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(key_map); ++i) + if (key_map[i].key == key) { + menu_driver(menu, key_map[i].request); + break; + } +} + +static void on_handle_key(int key) +{ + ITEM *item; + + switch (key) { + case 27: + case KEY_CANCEL: + proc_widget.close(); + break; + case 10: + case 13: + case KEY_ENTER: + item = current_item(menu); + if (item) + show_textfile(item_name(item)); + break; + default: + on_menu_key(key); + break; + } +} + +static bool create(void) +{ + int rows, columns; + const char *title; + + if (screen_lines < 3 || screen_cols < 20) { + proc_widget.close(); + beep(); + return FALSE; + } + scale_menu(menu, &rows, &columns); + rows += 2; + columns += 2; + if (rows > screen_lines) + rows = screen_lines; + if (columns > screen_cols) + columns = screen_cols; + + widget_init(&proc_widget, rows, columns, SCREEN_CENTER, SCREEN_CENTER, + attr_menu, WIDGET_BORDER | WIDGET_SUBWINDOW); + + title = _("Select File"); + mvwprintw(proc_widget.window, 0, (columns - 2 - get_mbs_width(title)) / 2, " %s ", title); + set_menu_win(menu, proc_widget.window); + set_menu_sub(menu, proc_widget.subwindow); + return TRUE; +} + +static void on_window_size_changed(void) +{ + unpost_menu(menu); + if (!create()) + return; + post_menu(menu); +} + +static void on_close(void) +{ + unsigned int i; + + unpost_menu(menu); + free_menu(menu); + for (i = 0; i < items_count; ++i) + free_item(items[i]); + widget_free(&proc_widget); +} + +static void add_item(const char *file_name) +{ + if (access(file_name, F_OK) == 0) { + items[items_count] = new_item(file_name, NULL); + if (!items[items_count]) + fatal_error("cannot create menu item"); + ++items_count; + assert(items_count < ARRAY_SIZE(items)); + } +} + +static struct widget proc_widget = { + .handle_key = on_handle_key, + .window_size_changed = on_window_size_changed, + .close = on_close, +}; + +void create_proc_files_list(void) +{ + items_count = 0; + add_item("/proc/asound/version"); + add_item("/proc/asound/cards"); + add_item("/proc/asound/devices"); + add_item("/proc/asound/oss/devices"); + add_item("/proc/asound/timers"); + add_item("/proc/asound/pcm"); + items[items_count] = NULL; + + menu = new_menu(items); + if (!menu) + fatal_error("cannot create menu"); + set_menu_fore(menu, attr_menu_selected); + set_menu_back(menu, attr_menu); + set_menu_mark(menu, NULL); + menu_opts_off(menu, O_SHOWDESC); + + if (!create()) + return; + + post_menu(menu); +} diff --git a/alsamixer/proc_files.h b/alsamixer/proc_files.h new file mode 100644 index 0000000..8862c71 --- /dev/null +++ b/alsamixer/proc_files.h @@ -0,0 +1,6 @@ +#ifndef PROC_FILES_H_INCLUDED +#define PROC_FILES_H_INCLUDED + +void create_proc_files_list(void); + +#endif diff --git a/alsamixer/textbox.c b/alsamixer/textbox.c new file mode 100644 index 0000000..a979d3c --- /dev/null +++ b/alsamixer/textbox.c @@ -0,0 +1,397 @@ +/* + * textbox.c - show a text box for messages, files or help + * Copyright (c) 1998,1999 Tim Janik + * Jaroslav Kysela + * Copyright (c) 2009 Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include CURSESINC +#include +#include "gettext_curses.h" +#include "utils.h" +#include "die.h" +#include "mem.h" +#include "colors.h" +#include "widget.h" +#include "textbox.h" + +#define MAX_FILE_SIZE 1048576 + +static void create_text_box(const char *const *lines, unsigned int count, + const char *title, int attrs); + +void show_error(const char *msg, int err) +{ + const char *lines[2]; + unsigned int count; + + lines[0] = msg; + count = 1; + if (err) { + lines[1] = strerror(err); + count = 2; + } + create_text_box(lines, count, _("Error"), attr_errormsg); +} + +void show_alsa_error(const char *msg, int err) +{ + const char *lines[2]; + unsigned int count; + + lines[0] = msg; + count = 1; + if (err < 0) { + lines[1] = snd_strerror(err); + count = 2; + } + create_text_box(lines, count, _("Error"), attr_errormsg); +} + +static char *read_file(const char *file_name, unsigned int *file_size) +{ + FILE *f; + int err; + char *buf; + unsigned int allocated = 2048; + unsigned int bytes_read; + + f = fopen(file_name, "r"); + if (!f) { + err = errno; + buf = casprintf(_("Cannot open file \"%s\"."), file_name); + show_error(buf, err); + free(buf); + return NULL; + } + *file_size = 0; + buf = NULL; + do { + allocated *= 2; + buf = crealloc(buf, allocated); + bytes_read = fread(buf + *file_size, 1, allocated - *file_size, f); + *file_size += bytes_read; + } while (*file_size == allocated && allocated < MAX_FILE_SIZE); + fclose(f); + if (*file_size > 0 && buf[*file_size - 1] != '\n' && *file_size < allocated) { + buf[*file_size] = '\n'; + ++*file_size; + } + return buf; +} + +void show_textfile(const char *file_name) +{ + char *buf; + unsigned int file_size; + unsigned int line_count; + unsigned int i; + const char **lines; + const char *start_line; + + buf = read_file(file_name, &file_size); + if (!buf) + return; + line_count = 0; + for (i = 0; i < file_size; ++i) + line_count += buf[i] == '\n'; + lines = ccalloc(line_count, sizeof *lines); + line_count = 0; + start_line = buf; + for (i = 0; i < file_size; ++i) { + if (buf[i] == '\n') { + lines[line_count++] = start_line; + buf[i] = '\0'; + start_line = &buf[i + 1]; + } + if (buf[i] == '\t') + buf[i] = ' '; + } + create_text_box(lines, line_count, file_name, attr_textbox); + free(lines); + free(buf); +} + +void show_text(const char *const *lines, unsigned int count, const char *title) +{ + create_text_box(lines, count, title, attr_textbox); +} + +/**********************************************************************/ + +static struct widget text_widget; +static char *title; +static int widget_attrs; +static char **text_lines; +static unsigned int text_lines_count; +static int max_line_width; +static int text_box_y; +static int text_box_x; +static int max_scroll_y; +static int max_scroll_x; +static int current_top; +static int current_left; + +static void update_text_lines(void) +{ + int i; + int width; + const char *line_begin; + const char *line_end; + int cur_y, cur_x; + int rest_of_line; + + for (i = 0; i < text_box_y; ++i) { + width = current_left; + line_begin = mbs_at_width(text_lines[current_top + i], &width, 1); + wmove(text_widget.window, i + 1, 1); + if (width > current_left) + waddch(text_widget.window, ' '); + if (*line_begin != '\0') { + width = text_box_x - (width > current_left); + line_end = mbs_at_width(line_begin, &width, -1); + if (width) + waddnstr(text_widget.window, line_begin, + line_end - line_begin); + } + getyx(text_widget.window, cur_y, cur_x); + if (cur_y == i + 1) { + rest_of_line = text_box_x + 1 - cur_x; + if (rest_of_line > 0) + wprintw(text_widget.window, "%*s", rest_of_line, ""); + } + } +} + +static void update_y_scroll_bar(void) +{ + int length; + int begin, end; + int i; + + if (max_scroll_y <= 0 || text_lines_count == 0) + return; + length = text_box_y * text_box_y / text_lines_count; + if (length >= text_box_y) + return; + begin = current_top * (text_box_y - length) / max_scroll_y; + end = begin + length; + for (i = 0; i < text_box_y; ++i) + mvwaddch(text_widget.window, i + 1, text_box_x + 1, + i >= begin && i < end ? ACS_BOARD : ' '); +} + +static void update_x_scroll_bar(void) +{ + int length; + int begin, end; + int i; + + if (max_scroll_x <= 0 || max_line_width <= 0) + return; + length = text_box_x * text_box_x / max_line_width; + if (length >= text_box_x) + return; + begin = current_left * (text_box_x - length) / max_scroll_x; + end = begin + length; + wmove(text_widget.window, text_box_y + 1, 1); + for (i = 0; i < text_box_x; ++i) + waddch(text_widget.window, i >= begin && i < end ? ACS_BOARD : ' '); +} + +static void move_x(int delta) +{ + int left; + + left = current_left + delta; + if (left < 0) + left = 0; + else if (left > max_scroll_x) + left = max_scroll_x; + if (left != current_left) { + current_left = left; + update_text_lines(); + update_x_scroll_bar(); + } +} + +static void move_y(int delta) +{ + int top; + + top = current_top + delta; + if (top < 0) + top = 0; + else if (top > max_scroll_y) + top = max_scroll_y; + if (top != current_top) { + current_top = top; + update_text_lines(); + update_y_scroll_bar(); + } +} + +static void on_handle_key(int key) +{ + switch (key) { + case 10: + case 13: + case 27: + case KEY_CANCEL: + case KEY_ENTER: + case KEY_CLOSE: + case KEY_EXIT: + text_widget.close(); + break; + case KEY_DOWN: + case KEY_SF: + case 'J': + case 'j': + case 'X': + case 'x': + move_y(1); + break; + case KEY_UP: + case KEY_SR: + case 'K': + case 'k': + case 'W': + case 'w': + move_y(-1); + break; + case KEY_LEFT: + case 'H': + case 'h': + case 'P': + case 'p': + move_x(-1); + break; + case KEY_RIGHT: + case 'L': + case 'l': + case 'N': + case 'n': + move_x(1); + break; + case KEY_NPAGE: + case ' ': + move_y(text_box_y); + break; + case KEY_PPAGE: + case KEY_BACKSPACE: + case 'B': + case 'b': + move_y(-text_box_y); + break; + case KEY_HOME: + case KEY_BEG: + move_x(-max_scroll_x); + break; + case KEY_LL: + case KEY_END: + move_x(max_scroll_x); + break; + case '\t': + move_x(8); + break; + case KEY_BTAB: + move_x(-8); + break; + } +} + +static bool create(void) +{ + int len, width; + + if (screen_lines < 3 || screen_cols < 8) { + text_widget.close(); + beep(); + return FALSE; + } + + width = max_line_width; + len = get_mbs_width(title) + 2; + if (width < len) + width = len; + + text_box_y = text_lines_count; + if (text_box_y > screen_lines - 2) + text_box_y = screen_lines - 2; + max_scroll_y = text_lines_count - text_box_y; + text_box_x = width; + if (text_box_x > screen_cols - 2) + text_box_x = screen_cols - 2; + max_scroll_x = max_line_width - text_box_x; + + widget_init(&text_widget, text_box_y + 2, text_box_x + 2, + SCREEN_CENTER, SCREEN_CENTER, widget_attrs, WIDGET_BORDER); + mvwprintw(text_widget.window, 0, (text_box_x + 2 - get_mbs_width(title) - 2) / 2, " %s ", title); + + if (current_top > max_scroll_y) + current_top = max_scroll_y; + if (current_left > max_scroll_x) + current_left = max_scroll_x; + update_text_lines(); + update_y_scroll_bar(); + update_x_scroll_bar(); + return TRUE; +} + +static void on_window_size_changed(void) +{ + create(); +} + +static void on_close(void) +{ + unsigned int i; + + for (i = 0; i < text_lines_count; ++i) + free(text_lines[i]); + free(text_lines); + widget_free(&text_widget); +} + +static struct widget text_widget = { + .handle_key = on_handle_key, + .window_size_changed = on_window_size_changed, + .close = on_close, +}; + +static void create_text_box(const char *const *lines, unsigned int count, + const char *title_, int attrs) +{ + unsigned int i; + + text_lines = ccalloc(count, sizeof *text_lines); + for (i = 0; i < count; ++i) + text_lines[i] = cstrdup(lines[i]); + text_lines_count = count; + max_line_width = get_max_mbs_width(lines, count); + title = cstrdup(title_); + widget_attrs = attrs; + + current_top = 0; + current_left = 0; + + create(); +} diff --git a/alsamixer/textbox.h b/alsamixer/textbox.h new file mode 100644 index 0000000..7dc290b --- /dev/null +++ b/alsamixer/textbox.h @@ -0,0 +1,10 @@ +#ifndef TEXTBOX_H_INCLUDED +#define TEXTBOX_H_INCLUDED + +void show_error(const char *msg, int err); +void show_alsa_error(const char *msg, int err); +void show_text(const char *const *text_lines, unsigned int count, + const char *title); +void show_textfile(const char *file_name); + +#endif diff --git a/alsamixer/utils.c b/alsamixer/utils.c new file mode 100644 index 0000000..3602bef --- /dev/null +++ b/alsamixer/utils.c @@ -0,0 +1,111 @@ +/* + * utils.c - multibyte-string helpers + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _XOPEN_SOURCE +#include "aconfig.h" +#include +#include +#include +#include +#include "utils.h" + +/* + * mbs_at_width - compute screen position in a string + * + * For displaying strings on the screen, we have to know how many character + * cells are occupied. This function calculates the position in a multibyte + * string that is at a desired position. + * + * Parameters: + * s: the string + * width: on input, the desired number of character cells; on output, the actual + * position, in character cells, of the return value + * dir: -1 or 1; in which direction to round if a multi-column character goes + * over the desired width + * + * Return value: + * Pointer to the place in the string that is as near the desired width as + * possible. If the string is too short, the return value points to the + * terminating zero. If the last character is a multi-column character that + * goes over the desired width, the return value may be one character cell + * earlier or later than desired, depending on the dir parameter. + * In any case, the return value points after any zero-width characters that + * follow the last character. + */ +const char *mbs_at_width(const char *s, int *width, int dir) +{ + size_t len; + wchar_t wc; + int bytes; + int width_so_far, w; + + if (*width <= 0) + return s; + mbtowc(NULL, NULL, 0); /* reset shift state */ + len = strlen(s); + width_so_far = 0; + while (len && (bytes = mbtowc(&wc, s, len)) > 0) { + w = wcwidth(wc); + if (width_so_far + w > *width && dir < 0) + break; + if (w >= 0) + width_so_far += w; + s += bytes; + len -= bytes; + if (width_so_far >= *width) { + while (len && (bytes = mbtowc(&wc, s, len)) > 0) { + w = wcwidth(wc); + if (w != 0) + break; + s += bytes; + len -= bytes; + } + break; + } + } + *width = width_so_far; + return s; +} + +/* + * get_mbs_width - compute screen width of a string + */ +unsigned int get_mbs_width(const char *s) +{ + int width; + + width = INT_MAX; + mbs_at_width(s, &width, 1); + return width; +} + +/* + * get_max_mbs_width - get width of longest string in an array + */ +unsigned int get_max_mbs_width(const char *const *s, unsigned int count) +{ + unsigned int max_width, i, len; + + max_width = 0; + for (i = 0; i < count; ++i) { + len = get_mbs_width(s[i]); + if (len > max_width) + max_width = len; + } + return max_width; +} diff --git a/alsamixer/utils.h b/alsamixer/utils.h new file mode 100644 index 0000000..00a52dd --- /dev/null +++ b/alsamixer/utils.h @@ -0,0 +1,10 @@ +#ifndef UTILS_H_INCLUDED +#define UTILS_H_INCLUDED + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof *(a)) + +unsigned int get_mbs_width(const char *s); +unsigned int get_max_mbs_width(const char *const *s, unsigned int count); +const char *mbs_at_width(const char *s, int *width, int dir); + +#endif diff --git a/alsamixer/volume_mapping.c b/alsamixer/volume_mapping.c new file mode 100644 index 0000000..9cacad8 --- /dev/null +++ b/alsamixer/volume_mapping.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2010 Clemens Ladisch + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * The functions in this file map the value ranges of ALSA mixer controls onto + * the interval 0..1. + * + * The mapping is designed so that the position in the interval is proportional + * to the volume as a human ear would perceive it (i.e., the position is the + * cubic root of the linear sample multiplication factor). For controls with + * a small range (24 dB or less), the mapping is linear in the dB values so + * that each step has the same size visually. Only for controls without dB + * information, a linear mapping of the hardware volume register values is used + * (this is the same algorithm as used in the old alsamixer). + * + * When setting the volume, 'dir' is the rounding direction: + * -1/0/1 = down/nearest/up. + */ + +#define _ISOC99_SOURCE /* lrint() */ +#define _GNU_SOURCE /* exp10() */ +#include "aconfig.h" +#include +#include +#include "volume_mapping.h" + +#define MAX_LINEAR_DB_SCALE 24 + +static inline bool use_linear_dB_scale(long dBmin, long dBmax) +{ + return dBmax - dBmin <= MAX_LINEAR_DB_SCALE * 100; +} + +static long lrint_dir(double x, int dir) +{ + if (dir > 0) + return lrint(ceil(x)); + else if (dir < 0) + return lrint(floor(x)); + else + return lrint(x); +} + +enum ctl_dir { PLAYBACK, CAPTURE }; + +static int (* const get_dB_range[2])(snd_mixer_elem_t *, long *, long *) = { + snd_mixer_selem_get_playback_dB_range, + snd_mixer_selem_get_capture_dB_range, +}; +static int (* const get_raw_range[2])(snd_mixer_elem_t *, long *, long *) = { + snd_mixer_selem_get_playback_volume_range, + snd_mixer_selem_get_capture_volume_range, +}; +static int (* const get_dB[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *) = { + snd_mixer_selem_get_playback_dB, + snd_mixer_selem_get_capture_dB, +}; +static int (* const get_raw[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *) = { + snd_mixer_selem_get_playback_volume, + snd_mixer_selem_get_capture_volume, +}; +static int (* const set_dB[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long, int) = { + snd_mixer_selem_set_playback_dB, + snd_mixer_selem_set_capture_dB, +}; +static int (* const set_raw[2])(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long) = { + snd_mixer_selem_set_playback_volume, + snd_mixer_selem_set_capture_volume, +}; + +static double get_normalized_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + enum ctl_dir ctl_dir) +{ + long min, max, value; + double normalized, min_norm; + int err; + + err = get_dB_range[ctl_dir](elem, &min, &max); + if (err < 0 || min >= max) { + err = get_raw_range[ctl_dir](elem, &min, &max); + if (err < 0 || min == max) + return 0; + + err = get_raw[ctl_dir](elem, channel, &value); + if (err < 0) + return 0; + + return (value - min) / (double)(max - min); + } + + err = get_dB[ctl_dir](elem, channel, &value); + if (err < 0) + return 0; + + if (use_linear_dB_scale(min, max)) + return (value - min) / (double)(max - min); + + normalized = exp10((value - max) / 6000.0); + if (min != SND_CTL_TLV_DB_GAIN_MUTE) { + min_norm = exp10((min - max) / 6000.0); + normalized = (normalized - min_norm) / (1 - min_norm); + } + + return normalized; +} + +static int set_normalized_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + double volume, + int dir, + enum ctl_dir ctl_dir) +{ + long min, max, value; + double min_norm; + int err; + + err = get_dB_range[ctl_dir](elem, &min, &max); + if (err < 0 || min >= max) { + err = get_raw_range[ctl_dir](elem, &min, &max); + if (err < 0) + return err; + + value = lrint_dir(volume * (max - min), dir) + min; + return set_raw[ctl_dir](elem, channel, value); + } + + if (use_linear_dB_scale(min, max)) { + value = lrint_dir(volume * (max - min), dir) + min; + return set_dB[ctl_dir](elem, channel, value, dir); + } + + if (min != SND_CTL_TLV_DB_GAIN_MUTE) { + min_norm = exp10((min - max) / 6000.0); + volume = volume * (1 - min_norm) + min_norm; + } + value = lrint_dir(6000.0 * log10(volume), dir) + max; + return set_dB[ctl_dir](elem, channel, value, dir); +} + +double get_normalized_playback_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel) +{ + return get_normalized_volume(elem, channel, PLAYBACK); +} + +double get_normalized_capture_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel) +{ + return get_normalized_volume(elem, channel, CAPTURE); +} + +int set_normalized_playback_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + double volume, + int dir) +{ + return set_normalized_volume(elem, channel, volume, dir, PLAYBACK); +} + +int set_normalized_capture_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + double volume, + int dir) +{ + return set_normalized_volume(elem, channel, volume, dir, CAPTURE); +} diff --git a/alsamixer/volume_mapping.h b/alsamixer/volume_mapping.h new file mode 100644 index 0000000..d4251d6 --- /dev/null +++ b/alsamixer/volume_mapping.h @@ -0,0 +1,19 @@ +#ifndef VOLUME_MAPPING_H_INCLUDED +#define VOLUME_MAPPING_H_INCLUDED + +#include + +double get_normalized_playback_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel); +double get_normalized_capture_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel); +int set_normalized_playback_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + double volume, + int dir); +int set_normalized_capture_volume(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t channel, + double volume, + int dir); + +#endif diff --git a/alsamixer/widget.c b/alsamixer/widget.c new file mode 100644 index 0000000..75da4c2 --- /dev/null +++ b/alsamixer/widget.c @@ -0,0 +1,140 @@ +/* + * widget.c - handles widget objects and the widget stack + * Copyright (c) Clemens Ladisch + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "aconfig.h" +#include +#include +#include "die.h" +#include "widget.h" + +int screen_lines; +int screen_cols; + +static int cursor_visibility = -1; + +static void widget_handle_key(int key) +{ +} + +static void update_cursor_visibility(void) +{ + struct widget *active_widget; + + active_widget = get_active_widget(); + if (active_widget && + active_widget->cursor_visibility != cursor_visibility) { + cursor_visibility = active_widget->cursor_visibility; + curs_set(cursor_visibility); + } +} + +void widget_init(struct widget *widget, int lines_, int cols, int y, int x, + chtype bkgd, unsigned int flags) +{ + WINDOW *old_window; + + if (y == SCREEN_CENTER) + y = (screen_lines - lines_) / 2; + if (x == SCREEN_CENTER) + x = (screen_cols - cols) / 2; + + old_window = widget->window; + widget->window = newwin(lines_, cols, y, x); + if (!widget->window) + fatal_error("cannot create window"); + keypad(widget->window, TRUE); + nodelay(widget->window, TRUE); + leaveok(widget->window, !(flags & WIDGET_CURSOR_VISIBLE)); + wbkgdset(widget->window, bkgd); + werase(widget->window); + + if (flags & WIDGET_BORDER) + box(widget->window, 0, 0); + if (flags & WIDGET_SUBWINDOW) { + if (widget->subwindow) + delwin(widget->subwindow); + widget->subwindow = derwin(widget->window, + lines_ - 2, cols - 2, 1, 1); + if (!widget->subwindow) + fatal_error("cannot create subwindow"); + wbkgdset(widget->subwindow, bkgd); + } + widget->cursor_visibility = !!(flags & WIDGET_CURSOR_VISIBLE); + + if (widget->panel) { + replace_panel(widget->panel, widget->window); + } else { + widget->panel = new_panel(widget->window); + if (!widget->panel) + fatal_error("cannot create panel"); + set_panel_userptr(widget->panel, widget); + } + + if (!widget->handle_key) + widget->handle_key = widget_handle_key; + + if (old_window) + delwin(old_window); + + update_cursor_visibility(); +} + +void widget_free(struct widget *widget) +{ + if (widget->panel) { + del_panel(widget->panel); + widget->panel = NULL; + } + if (widget->subwindow) { + delwin(widget->subwindow); + widget->subwindow = NULL; + } + if (widget->window) { + delwin(widget->window); + widget->window = NULL; + } + + update_cursor_visibility(); +} + +struct widget *get_active_widget(void) +{ + PANEL *active_panel; + + active_panel = panel_below(NULL); + if (active_panel) + return panel_userptr(active_panel); + else + return NULL; +} + +void window_size_changed(void) +{ + PANEL *panel, *below; + struct widget *widget; + + getmaxyx(stdscr, screen_lines, screen_cols); + if (tigetflag("xenl") != 1 && tigetflag("am") != 1) + --screen_lines; + + for (panel = panel_below(NULL); panel; panel = below) { + below = panel_below(panel); + widget = panel_userptr(panel); + widget->window_size_changed(); + } +} diff --git a/alsamixer/widget.h b/alsamixer/widget.h new file mode 100644 index 0000000..6adb526 --- /dev/null +++ b/alsamixer/widget.h @@ -0,0 +1,33 @@ +#ifndef WIDGET_H_INCLUDED +#define WIDGET_H_INCLUDED + +#include + +#define WIDGET_BORDER 0x1 +#define WIDGET_SUBWINDOW 0x2 +#define WIDGET_CURSOR_VISIBLE 0x4 + +#define SCREEN_CENTER -1 + +struct widget { + WINDOW *window; + WINDOW *subwindow; /* optional: contents without border */ + PANEL *panel; + int cursor_visibility; + + void (*handle_key)(int key); + void (*window_size_changed)(void); + void (*close)(void); +}; + +extern int screen_lines; +extern int screen_cols; + +void widget_init(struct widget *widget, + int lines_, int cols, int y, int x, + chtype bkgd, unsigned int flags); +void widget_free(struct widget *widget); +struct widget *get_active_widget(void); +void window_size_changed(void); + +#endif diff --git a/alsaucm/Makefile.am b/alsaucm/Makefile.am new file mode 100644 index 0000000..4eba677 --- /dev/null +++ b/alsaucm/Makefile.am @@ -0,0 +1,13 @@ +bin_PROGRAMS = \ + alsaucm + +alsaucm_SOURCES = usecase.c + +INCLUDES = \ + -Wall -I$(top_srcdir)/include + +alsaucm_LDADD = -lasound + +# local build +INCLUDES += -I$(top_srcdir)/../alsa-lib/include +alsaucm_LDADD += -L$(top_srcdir)/../alsa-lib/src/.libs diff --git a/alsaucm/Makefile.in b/alsaucm/Makefile.in new file mode 100644 index 0000000..bee94a3 --- /dev/null +++ b/alsaucm/Makefile.in @@ -0,0 +1,503 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = alsaucm$(EXEEXT) +subdir = alsaucm +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_alsaucm_OBJECTS = usecase.$(OBJEXT) +alsaucm_OBJECTS = $(am_alsaucm_OBJECTS) +alsaucm_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(alsaucm_SOURCES) +DIST_SOURCES = $(alsaucm_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +alsaucm_SOURCES = usecase.c + +# local build +INCLUDES = -Wall -I$(top_srcdir)/include \ + -I$(top_srcdir)/../alsa-lib/include +alsaucm_LDADD = -lasound -L$(top_srcdir)/../alsa-lib/src/.libs +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alsaucm/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign alsaucm/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +alsaucm$(EXEEXT): $(alsaucm_OBJECTS) $(alsaucm_DEPENDENCIES) + @rm -f alsaucm$(EXEEXT) + $(LINK) $(alsaucm_OBJECTS) $(alsaucm_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usecase.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alsaucm/go.sh b/alsaucm/go.sh new file mode 100755 index 0000000..2aadd1c --- /dev/null +++ b/alsaucm/go.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +#GDB="gdb --args" + +ALSA_CONFIG_UCM="$HOME/alsa/alsa-lib/test/ucm" \ +LD_PRELOAD="$HOME/alsa/alsa-lib/src/.libs/libasound.so" \ +$GDB ./alsaucm "$@" diff --git a/alsaucm/usecase.c b/alsaucm/usecase.c new file mode 100644 index 0000000..1c94680 --- /dev/null +++ b/alsaucm/usecase.c @@ -0,0 +1,505 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Support for the verb/device/modifier core logic and API, + * command line tool and file parser was kindly sponsored by + * Texas Instruments Inc. + * Support for multiple active modifiers and devices, + * transition sequences, multiple client access and user defined use + * cases was kindly sponsored by Wolfson Microelectronics PLC. + * + * Copyright (C) 2008-2010 SlimLogic Ltd + * Copyright (C) 2010 Wolfson Microelectronics PLC + * Copyright (C) 2010 Texas Instruments Inc. + * Copyright (C) 2010 Red Hat Inc. + * Authors: Liam Girdwood + * Stefan Schmidt + * Justin Xu + * Jaroslav Kysela + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "version.h" + +#define MAX_BUF 256 + +struct context { + snd_use_case_mgr_t *uc_mgr; + const char *command; + char *card; + char **argv; + int argc; + int arga; + char *batch; + unsigned int interactive:1; + unsigned int no_open:1; + unsigned int do_exit:1; +}; + +enum uc_cmd { + /* management */ + OM_UNKNOWN = 0, + OM_OPEN, + OM_RESET, + OM_RELOAD, + OM_LISTCARDS, + OM_LIST2, + OM_LIST1, + + /* set/get */ + OM_SET, + OM_GET, + OM_GETI, + + /* misc */ + OM_HELP, + OM_QUIT, +}; + +struct cmd { + int code; + int args; + unsigned int opencard:1; + const char *id; +}; + +static struct cmd cmds[] = { + { OM_OPEN, 1, 0, "open" }, + { OM_RESET, 0, 1, "reset" }, + { OM_RELOAD, 0, 1, "reload" }, + { OM_LISTCARDS, 0, 0, "listcards" }, + { OM_LIST1, 1, 1, "list1" }, + { OM_LIST2, 1, 1, "list" }, + { OM_SET, 2, 1, "set" }, + { OM_GET, 1, 1, "get" }, + { OM_GETI, 1, 1, "geti" }, + { OM_HELP, 0, 0, "help" }, + { OM_QUIT, 0, 0, "quit" }, + { OM_HELP, 0, 0, "h" }, + { OM_HELP, 0, 0, "?" }, + { OM_QUIT, 0, 0, "q" }, + { OM_UNKNOWN, 0, 0, NULL } +}; + +static void dump_help(struct context *context) +{ + if (context->command) + printf("Usage: %s [command]\n", context->command); + printf( +"\nAvailable options:\n" +" -h,--help this help\n" +" -c,--card NAME open card NAME\n" +" -i,--interactive interactive mode\n" +" -b,--batch FILE batch mode (use '-' for the stdin input)\n" +" -n,--no-open do not open first card found\n" +"\nAvailable commands:\n" +" open NAME open card NAME\n" +" reset reset sound card to default state\n" +" reload reload configuration\n" +" listcards list available cards\n" +" list IDENTIFIER list command\n" +" get IDENTIFIER get string value\n" +" geti IDENTIFIER get integer value\n" +" set IDENTIFIER VALUE set string value\n" +" h,help help\n" +" q,quit quit\n" +); +} + +static int parse_line(struct context *context, char *line) +{ + char *start, **nargv; + int c; + + context->argc = 0; + while (*line) { + while (*line && (*line == ' ' || *line == '\t' || + *line == '\n')) + line++; + c = *line; + if (c == '\"' || c == '\'') { + start = ++line; + while (*line && *line != c) + line++; + if (*line) { + *line = '\0'; + line++; + } + } else { + start = line; + while (*line && *line != ' ' && *line != '\t' && + *line != '\n') + line++; + if (*line) { + *line = '\0'; + line++; + } + } + if (start[0] == '\0' && context->argc == 0) + return 0; + if (context->argc + 1 >= context->arga) { + context->arga += 4; + nargv = realloc(context->argv, + context->arga * sizeof(char *)); + if (nargv == NULL) + return -ENOMEM; + context->argv = nargv; + } + context->argv[context->argc++] = start; + } + return 0; +} + +static int do_one(struct context *context, struct cmd *cmd, char **argv) +{ + const char **list, *str; + long lval; + int err, i, j, entries; + + if (cmd->opencard && context->uc_mgr == NULL) { + fprintf(stderr, "%s: command '%s' requires an open card\n", + context->command, cmd->id); + return 0; + } + switch (cmd->code) { + case OM_OPEN: + if (context->uc_mgr) + snd_use_case_mgr_close(context->uc_mgr); + context->uc_mgr = NULL; + free(context->card); + context->card = strdup(argv[0]); + err = snd_use_case_mgr_open(&context->uc_mgr, context->card); + if (err < 0) { + fprintf(stderr, + "%s: error failed to open sound card %s: %s\n", + context->command, context->card, + snd_strerror(err)); + return err; + } + break; + case OM_RESET: + err = snd_use_case_mgr_reset(context->uc_mgr); + if (err < 0) { + fprintf(stderr, + "%s: error failed to reset sound card %s: %s\n", + context->command, context->card, + snd_strerror(err)); + return err; + } + break; + case OM_RELOAD: + err = snd_use_case_mgr_reload(context->uc_mgr); + if (err < 0) { + fprintf(stderr, + "%s: error failed to reload manager %s: %s\n", + context->command, context->card, + snd_strerror(err)); + return err; + } + break; + case OM_LISTCARDS: + err = snd_use_case_card_list(&list); + if (err < 0) { + fprintf(stderr, + "%s: error failed to get card list: %s\n", + context->command, + snd_strerror(err)); + return err; + } + if (err == 0) { + printf(" list is empty\n"); + return 0; + } + for (i = 0; i < err / 2; i++) { + printf(" %i: %s\n", i, list[i*2]); + if (list[i*2+1]) + printf(" %s\n", list[i*2+1]); + } + snd_use_case_free_list(list, err); + break; + case OM_LIST1: + case OM_LIST2: + switch (cmd->code) { + case OM_LIST1: + entries = 1; + break; + case OM_LIST2: + entries = 2; + break; + } + + err = snd_use_case_get_list(context->uc_mgr, + argv[0], + &list); + if (err < 0) { + fprintf(stderr, + "%s: error failed to get list %s: %s\n", + context->command, argv[0], + snd_strerror(err)); + return err; + } + if (err == 0) { + printf(" list is empty\n"); + return 0; + } + for (i = 0; i < err / entries; i++) { + printf(" %i: %s\n", i, list[i*entries]); + for (j = 0; j < entries - 1; j++) + if (list[i*entries+j+1]) + printf(" %s\n", list[i*entries+j+1]); + } + snd_use_case_free_list(list, err); + break; + case OM_SET: + err = snd_use_case_set(context->uc_mgr, argv[0], argv[1]); + if (err < 0) { + fprintf(stderr, + "%s: error failed to set %s=%s: %s\n", + context->command, argv[0], argv[1], + snd_strerror(err)); + return err; + } + break; + case OM_GET: + err = snd_use_case_get(context->uc_mgr, argv[0], &str); + if (err < 0) { + fprintf(stderr, + "%s: error failed to get %s: %s\n", + context->command, argv[0], + snd_strerror(err)); + return err; + } + printf(" %s=%s\n", argv[0], str); + free((void *)str); + break; + case OM_GETI: + err = snd_use_case_geti(context->uc_mgr, argv[0], &lval); + if (err < 0) { + fprintf(stderr, + "%s: error failed to get integer %s: %s\n", + context->command, argv[0], + snd_strerror(err)); + return lval; + } + printf(" %s=%li\n", argv[0], lval); + break; + case OM_QUIT: + context->do_exit = 1; + break; + case OM_HELP: + dump_help(context); + break; + default: + fprintf(stderr, "%s: unimplemented command '%s'\n", + context->command, cmd->id); + return -EINVAL; + } + return 0; +} + +static int do_commands(struct context *context) +{ + char *command, **argv; + struct cmd *cmd; + int i, acnt, err; + + for (i = 0; i < context->argc && !context->do_exit; i++) { + command = context->argv[i]; + for (cmd = cmds; cmd->id != NULL; cmd++) { + if (strcmp(cmd->id, command) == 0) + break; + } + if (cmd->id == NULL) { + fprintf(stderr, "%s: unknown command '%s'\n", + context->command, command); + return -EINVAL; + } + acnt = context->argc - (i + 1); + if (acnt < cmd->args) { + fprintf(stderr, "%s: expected %i arguments (got %i)\n", + context->command, cmd->args, acnt); + return -EINVAL; + } + argv = context->argv + i + 1; + err = do_one(context, cmd, argv); + if (err < 0) + return err; + i += cmd->args; + } + return 0; +} + +static void my_exit(struct context *context, int exitcode) +{ + if (context->uc_mgr) + snd_use_case_mgr_close(context->uc_mgr); + if (context->arga > 0) + free(context->argv); + if (context->card) + free(context->card); + if (context->batch) + free(context->batch); + free(context); + exit(exitcode); +} + +enum { + OPT_VERSION = 1, +}; + +int main(int argc, char *argv[]) +{ + static const char short_options[] = "hb:c:in"; + static const struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, OPT_VERSION}, + {"card", 1, 0, 'c'}, + {"interactive", 0, 0, 'i'}, + {"batch", 1, 0, 'b'}, + {"no-open", 0, 0, 'n'}, + {0, 0, 0, 0} + }; + struct context *context; + const char *command = argv[0]; + const char **list; + int c, err, option_index; + char cmd[MAX_BUF]; + FILE *in; + + context = calloc(1, sizeof(*context)); + if (context == NULL) + return EXIT_FAILURE; + context->command = command; + while ((c = getopt_long(argc, argv, short_options, + long_options, &option_index)) != -1) { + switch (c) { + case 'h': + dump_help(context); + break; + case OPT_VERSION: + printf("%s: version " SND_UTIL_VERSION_STR "\n", command); + break; + case 'c': + if (context->card) + free(context->card); + context->card = strdup(optarg); + break; + case 'i': + context->interactive = 1; + context->batch = NULL; + break; + case 'b': + context->batch = strdup(optarg); + context->interactive = 0; + break; + case 'n': + context->no_open = 1; + break; + default: + fprintf(stderr, "Try '%s --help' for more information.\n", command); + my_exit(context, EXIT_FAILURE); + } + } + + if (!context->no_open && context->card == NULL) { + err = snd_use_case_card_list(&list); + if (err < 0) { + fprintf(stderr, "%s: unable to obtain card list: %s\n", command, snd_strerror(err)); + my_exit(context, EXIT_FAILURE); + } + if (err == 0) { + printf("No card found\n"); + my_exit(context, EXIT_SUCCESS); + } + context->card = strdup(list[0]); + snd_use_case_free_list(list, err); + } + + /* open library */ + if (!context->no_open) { + err = snd_use_case_mgr_open(&context->uc_mgr, + context->card); + if (err < 0) { + fprintf(stderr, + "%s: error failed to open sound card %s: %s\n", + command, context->card, snd_strerror(err)); + my_exit(context, EXIT_FAILURE); + } + } + + /* parse and execute any command line commands */ + if (argc > optind) { + context->argv = argv + optind; + context->argc = argc - optind; + err = do_commands(context); + if (err < 0) + my_exit(context, EXIT_FAILURE); + } + + if (!context->interactive && !context->batch) + my_exit(context, EXIT_SUCCESS); + + if (context->interactive) { + printf("%s: Interacive mode - 'q' to quit\n", command); + in = stdin; + } else { + if (strcmp(context->batch, "-") == 0) { + in = stdin; + } else { + in = fopen(context->batch, "r"); + if (in == NULL) { + fprintf(stderr, "%s: error failed to open file '%s': %s\n", + command, context->batch, strerror(-errno)); + my_exit(context, EXIT_FAILURE); + } + } + } + + /* run the interactive command parser and handler */ + while (!context->do_exit && !feof(in)) { + if (context->interactive) + printf("%s>> ", argv[0]); + fflush(stdin); + if (fgets(cmd, MAX_BUF, in) == NULL) + break; + err = parse_line(context, cmd); + if (err < 0) { + fprintf(stderr, "%s: unable to parse line\n", + command); + my_exit(context, EXIT_FAILURE); + } + err = do_commands(context); + if (err < 0) { + if (context->interactive) + printf("^^^ error, try again\n"); + else + my_exit(context, EXIT_FAILURE); + } + } + + if (in != stdin) + fclose(in); + + my_exit(context, EXIT_SUCCESS); + return EXIT_SUCCESS; +} diff --git a/amidi/Makefile.am b/amidi/Makefile.am new file mode 100644 index 0000000..0b31a67 --- /dev/null +++ b/amidi/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = amidi.1 + +bin_PROGRAMS = amidi +man_MANS = amidi.1 diff --git a/amidi/Makefile.in b/amidi/Makefile.in new file mode 100644 index 0000000..9798a5f --- /dev/null +++ b/amidi/Makefile.in @@ -0,0 +1,578 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = amidi$(EXEEXT) +subdir = amidi +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +amidi_SOURCES = amidi.c +amidi_OBJECTS = amidi.$(OBJEXT) +amidi_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = amidi.c +DIST_SOURCES = amidi.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = amidi.1 +man_MANS = amidi.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign amidi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign amidi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +amidi$(EXEEXT): $(amidi_OBJECTS) $(amidi_DEPENDENCIES) + @rm -f amidi$(EXEEXT) + $(LINK) $(amidi_OBJECTS) $(amidi_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amidi.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/amidi/amidi.1 b/amidi/amidi.1 new file mode 100644 index 0000000..c58d65c --- /dev/null +++ b/amidi/amidi.1 @@ -0,0 +1,155 @@ +.TH AMIDI 1 "26 Jun 2006" + +.SH NAME +amidi \- read from and write to ALSA RawMIDI ports + +.SH SYNOPSIS +\fBamidi\fP [\fI\-p port\fP] [\fI\-s file\fP | \fI\-S data\fP] +[\fI\-r file\fP] [\fI\-d\fP] [\fI\-t seconds\fP] [\fI\-a\fP] + +.SH DESCRIPTION +.B amidi +is a command-line utility which allows to receive and send +SysEx (system exclusive) data from/to external MIDI devices. +It can also send any other MIDI commands. + +.B amidi +handles only files containing raw MIDI commands, without timing +information. +.B amidi +does not support Standard MIDI (.mid) files, but +.B aplaymidi(1) +and +.B arecordmidi(1) +do. + +.SH OPTIONS + +Use the +.I \-h, +.I \-V, +.I \-l, +or +.I \-L +options to display information; +or use at least one of the +.I \-s, +.I \-r, +.I \-S, +or +.I \-d +options to specify what data to send or receive. + +.TP +.I \-h, \-\-help +Help: prints a list of options. + +.TP +.I \-V, \-\-version +Prints the current version. + +.TP +.I \-l, \-\-list\-devices +Prints a list of all hardware MIDI ports. + +.TP +.I \-L, \-\-list\-rawmidis +Prints all RawMIDI definitions. +(used when debugging configuration files) + +.TP +.I \-p, \-\-port=name +Sets the name of the ALSA RawMIDI port to use. +If this is not specified, +.B amidi +uses the default port defined in the configuration file +(the default for this is port 0 on card 0, which may not exist). + +.TP +.I \-s, \-\-send=filename +Sends the contents of the specified file to the MIDI port. +The file must contain raw MIDI commands (e.g. a .syx file); +for Standard MIDI (.mid) files, use +.B aplaymidi(1). + +.TP +.I \-r, \-\-receive=filename +Writes data received from the MIDI port into the specified file. +The file will contain raw MIDI commands (such as in a .syx file); +to record a Standard MIDI (.mid) file, use +.B arecordmidi(1). + +.B amidi +will filter out any Active Sensing bytes (FEh), unless the +.I \-a +option has been given. + +.TP +.I \-S, \-\-send\-hex="..." +Sends the bytes specified as hexadecimal numbers to the MIDI port. + +.TP +.I \-d, \-\-dump +Prints data received from the MIDI port as hexadecimal bytes. +Active Sensing bytes (FEh) will not be shown, unless the +.I \-a +option has been given. + +This option is useful for debugging. + +.TP +.I \-t, \-\-timeout=seconds +Stops receiving data when no data has been received for the specified +amount of time. + +If this option has not been given, you must press Ctrl+C (or kill +.B amidi\fR) +to stop receiving data. + +.TP +.I \-a, \-\-active\-sensing +Does not ignore Active Sensing bytes (FEh) when saving or printing +received MIDI commands. + +.SH EXAMPLES + +.TP +.B amidi \-p hw:0 \-s my_settings.syx +will send the MIDI commands in +.I my_settings.syx +to port +.I hw:0. + +.TP +.B amidi \-S 'F0 43 10 4C 00 00 7E 00 F7' +sends an XG Reset to the default port. + +.TP +.B amidi \-p hw:1,2 \-S F0411042110C000000000074F7 \-r dump.syx \-t 1 +sends a \(lqParameter Dump Request\(rq to a GS device, saves the received +parameter data to the file +.I dump.syx, +and stops after the device has finished sending data +(when no data has been received for one second). + +.TP +.B amidi \-p virtual \-d +creates a virtual RawMIDI port and prints all data sent to this port. + +.SH FILES +.I /usr/share/alsa/alsa.conf +default rawmidi definitions +.br +.I /etc/asound.conf +system-wide rawmidi definitions +.br +.I ~/.asoundrc +user specific rawmidi definitions + +.SH SEE ALSO +aplaymidi(1) +.br +arecordmidi(1) + +.SH AUTHOR +Clemens Ladisch diff --git a/amidi/amidi.c b/amidi/amidi.c new file mode 100644 index 0000000..cedf18c --- /dev/null +++ b/amidi/amidi.c @@ -0,0 +1,620 @@ +/* + * amidi.c - read from/write to RawMIDI ports + * + * Copyright (c) Clemens Ladisch + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "version.h" + +static int do_device_list, do_rawmidi_list; +static char *port_name = "default"; +static char *send_file_name; +static char *receive_file_name; +static char *send_hex; +static char *send_data; +static int send_data_length; +static int receive_file; +static int dump; +static int timeout; +static int stop; +static snd_rawmidi_t *input, **inputp; +static snd_rawmidi_t *output, **outputp; + +static void error(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + putc('\n', stderr); +} + +static void usage(void) +{ + printf( + "Usage: amidi options\n" + "\n" + "-h, --help this help\n" + "-V, --version print current version\n" + "-l, --list-devices list all hardware ports\n" + "-L, --list-rawmidis list all RawMIDI definitions\n" + "-p, --port=name select port by name\n" + "-s, --send=file send the contents of a (.syx) file\n" + "-r, --receive=file write received data into a file\n" + "-S, --send-hex=\"...\" send hexadecimal bytes\n" + "-d, --dump print received data as hexadecimal bytes\n" + "-t, --timeout=seconds exits when no data has been received\n" + " for the specified duration\n" + "-a, --active-sensing don't ignore active sensing bytes\n"); +} + +static void version(void) +{ + puts("amidi version " SND_UTIL_VERSION_STR); +} + +static void *my_malloc(size_t size) +{ + void *p = malloc(size); + if (!p) { + error("out of memory"); + exit(EXIT_FAILURE); + } + return p; +} + +static void list_device(snd_ctl_t *ctl, int card, int device) +{ + snd_rawmidi_info_t *info; + const char *name; + const char *sub_name; + int subs, subs_in, subs_out; + int sub; + int err; + + snd_rawmidi_info_alloca(&info); + snd_rawmidi_info_set_device(info, device); + + snd_rawmidi_info_set_stream(info, SND_RAWMIDI_STREAM_INPUT); + err = snd_ctl_rawmidi_info(ctl, info); + if (err >= 0) + subs_in = snd_rawmidi_info_get_subdevices_count(info); + else + subs_in = 0; + + snd_rawmidi_info_set_stream(info, SND_RAWMIDI_STREAM_OUTPUT); + err = snd_ctl_rawmidi_info(ctl, info); + if (err >= 0) + subs_out = snd_rawmidi_info_get_subdevices_count(info); + else + subs_out = 0; + + subs = subs_in > subs_out ? subs_in : subs_out; + if (!subs) + return; + + for (sub = 0; sub < subs; ++sub) { + snd_rawmidi_info_set_stream(info, sub < subs_in ? + SND_RAWMIDI_STREAM_INPUT : + SND_RAWMIDI_STREAM_OUTPUT); + snd_rawmidi_info_set_subdevice(info, sub); + err = snd_ctl_rawmidi_info(ctl, info); + if (err < 0) { + error("cannot get rawmidi information %d:%d:%d: %s\n", + card, device, sub, snd_strerror(err)); + return; + } + name = snd_rawmidi_info_get_name(info); + sub_name = snd_rawmidi_info_get_subdevice_name(info); + if (sub == 0 && sub_name[0] == '\0') { + printf("%c%c hw:%d,%d %s", + sub < subs_in ? 'I' : ' ', + sub < subs_out ? 'O' : ' ', + card, device, name); + if (subs > 1) + printf(" (%d subdevices)", subs); + putchar('\n'); + break; + } else { + printf("%c%c hw:%d,%d,%d %s\n", + sub < subs_in ? 'I' : ' ', + sub < subs_out ? 'O' : ' ', + card, device, sub, sub_name); + } + } +} + +static void list_card_devices(int card) +{ + snd_ctl_t *ctl; + char name[32]; + int device; + int err; + + sprintf(name, "hw:%d", card); + if ((err = snd_ctl_open(&ctl, name, 0)) < 0) { + error("cannot open control for card %d: %s", card, snd_strerror(err)); + return; + } + device = -1; + for (;;) { + if ((err = snd_ctl_rawmidi_next_device(ctl, &device)) < 0) { + error("cannot determine device number: %s", snd_strerror(err)); + break; + } + if (device < 0) + break; + list_device(ctl, card, device); + } + snd_ctl_close(ctl); +} + +static void device_list(void) +{ + int card, err; + + card = -1; + if ((err = snd_card_next(&card)) < 0) { + error("cannot determine card number: %s", snd_strerror(err)); + return; + } + if (card < 0) { + error("no sound card found"); + return; + } + puts("Dir Device Name"); + do { + list_card_devices(card); + if ((err = snd_card_next(&card)) < 0) { + error("cannot determine card number: %s", snd_strerror(err)); + break; + } + } while (card >= 0); +} + +static void rawmidi_list(void) +{ + snd_output_t *output; + snd_config_t *config; + int err; + + if ((err = snd_config_update()) < 0) { + error("snd_config_update failed: %s", snd_strerror(err)); + return; + } + if ((err = snd_output_stdio_attach(&output, stdout, 0)) < 0) { + error("snd_output_stdio_attach failed: %s", snd_strerror(err)); + return; + } + if (snd_config_search(snd_config, "rawmidi", &config) >= 0) { + puts("RawMIDI list:"); + snd_config_save(config, output); + } + snd_output_close(output); +} + +static void load_file(void) +{ + int fd; + off_t length; + + fd = open(send_file_name, O_RDONLY); + if (fd == -1) { + error("cannot open %s - %s", send_file_name, strerror(errno)); + return; + } + length = lseek(fd, 0, SEEK_END); + if (length == (off_t)-1) { + error("cannot determine length of %s: %s", send_file_name, strerror(errno)); + goto _error; + } + send_data = my_malloc(length); + lseek(fd, 0, SEEK_SET); + if (read(fd, send_data, length) != length) { + error("cannot read from %s: %s", send_file_name, strerror(errno)); + goto _error; + } + if (length >= 4 && !memcmp(send_data, "MThd", 4)) { + error("%s is a Standard MIDI File; use aplaymidi to send it", send_file_name); + goto _error; + } + send_data_length = length; + goto _exit; +_error: + free(send_data); + send_data = NULL; +_exit: + close(fd); +} + +static int hex_value(char c) +{ + if ('0' <= c && c <= '9') + return c - '0'; + if ('A' <= c && c <= 'F') + return c - 'A' + 10; + if ('a' <= c && c <= 'f') + return c - 'a' + 10; + error("invalid character %c", c); + return -1; +} + +static void parse_data(void) +{ + const char *p; + int i, value; + + send_data = my_malloc(strlen(send_hex)); /* guesstimate */ + i = 0; + value = -1; /* value is >= 0 when the first hex digit of a byte has been read */ + for (p = send_hex; *p; ++p) { + int digit; + if (isspace((unsigned char)*p)) { + if (value >= 0) { + send_data[i++] = value; + value = -1; + } + continue; + } + digit = hex_value(*p); + if (digit < 0) { + send_data = NULL; + return; + } + if (value < 0) { + value = digit; + } else { + send_data[i++] = (value << 4) | digit; + value = -1; + } + } + if (value >= 0) + send_data[i++] = value; + send_data_length = i; +} + +/* + * prints MIDI commands, formatting them nicely + */ +static void print_byte(unsigned char byte) +{ + static enum { + STATE_UNKNOWN, + STATE_1PARAM, + STATE_1PARAM_CONTINUE, + STATE_2PARAM_1, + STATE_2PARAM_2, + STATE_2PARAM_1_CONTINUE, + STATE_SYSEX + } state = STATE_UNKNOWN; + int newline = 0; + + if (byte >= 0xf8) + newline = 1; + else if (byte >= 0xf0) { + newline = 1; + switch (byte) { + case 0xf0: + state = STATE_SYSEX; + break; + case 0xf1: + case 0xf3: + state = STATE_1PARAM; + break; + case 0xf2: + state = STATE_2PARAM_1; + break; + case 0xf4: + case 0xf5: + case 0xf6: + state = STATE_UNKNOWN; + break; + case 0xf7: + newline = state != STATE_SYSEX; + state = STATE_UNKNOWN; + break; + } + } else if (byte >= 0x80) { + newline = 1; + if (byte >= 0xc0 && byte <= 0xdf) + state = STATE_1PARAM; + else + state = STATE_2PARAM_1; + } else /* b < 0x80 */ { + int running_status = 0; + newline = state == STATE_UNKNOWN; + switch (state) { + case STATE_1PARAM: + state = STATE_1PARAM_CONTINUE; + break; + case STATE_1PARAM_CONTINUE: + running_status = 1; + break; + case STATE_2PARAM_1: + state = STATE_2PARAM_2; + break; + case STATE_2PARAM_2: + state = STATE_2PARAM_1_CONTINUE; + break; + case STATE_2PARAM_1_CONTINUE: + running_status = 1; + state = STATE_2PARAM_2; + break; + default: + break; + } + if (running_status) + fputs("\n ", stdout); + } + printf("%c%02X", newline ? '\n' : ' ', byte); +} + +static void sig_handler(int dummy) +{ + stop = 1; +} + +static void add_send_hex_data(const char *str) +{ + int length; + char *s; + + length = (send_hex ? strlen(send_hex) + 1 : 0) + strlen(str) + 1; + s = my_malloc(length); + if (send_hex) { + strcpy(s, send_hex); + strcat(s, " "); + } else { + s[0] = '\0'; + } + strcat(s, str); + free(send_hex); + send_hex = s; +} + +int main(int argc, char *argv[]) +{ + static const char short_options[] = "hVlLp:s:r:S::dt:a"; + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"list-devices", 0, NULL, 'l'}, + {"list-rawmidis", 0, NULL, 'L'}, + {"port", 1, NULL, 'p'}, + {"send", 1, NULL, 's'}, + {"receive", 1, NULL, 'r'}, + {"send-hex", 2, NULL, 'S'}, + {"dump", 0, NULL, 'd'}, + {"timeout", 1, NULL, 't'}, + {"active-sensing", 0, NULL, 'a'}, + { } + }; + int c, err, ok = 0; + int ignore_active_sensing = 1; + int do_send_hex = 0; + + while ((c = getopt_long(argc, argv, short_options, + long_options, NULL)) != -1) { + switch (c) { + case 'h': + usage(); + return 0; + case 'V': + version(); + return 0; + case 'l': + do_device_list = 1; + break; + case 'L': + do_rawmidi_list = 1; + break; + case 'p': + port_name = optarg; + break; + case 's': + send_file_name = optarg; + break; + case 'r': + receive_file_name = optarg; + break; + case 'S': + do_send_hex = 1; + if (optarg) + add_send_hex_data(optarg); + break; + case 'd': + dump = 1; + break; + case 't': + timeout = atoi(optarg); + break; + case 'a': + ignore_active_sensing = 0; + break; + default: + error("Try `amidi --help' for more information."); + return 1; + } + } + if (do_send_hex) { + /* data for -S can be specified as multiple arguments */ + if (!send_hex && !argv[optind]) { + error("Please specify some data for --send-hex."); + return 1; + } + for (; argv[optind]; ++optind) + add_send_hex_data(argv[optind]); + } else { + if (argv[optind]) { + error("%s is not an option.", argv[optind]); + return 1; + } + } + + if (do_rawmidi_list) + rawmidi_list(); + if (do_device_list) + device_list(); + if (do_rawmidi_list || do_device_list) + return 0; + + if (!send_file_name && !receive_file_name && !send_hex && !dump) { + error("Please specify at least one of --send, --receive, --send-hex, or --dump."); + return 1; + } + if (send_file_name && send_hex) { + error("--send and --send-hex cannot be specified at the same time."); + return 1; + } + + if (send_file_name) + load_file(); + else if (send_hex) + parse_data(); + if ((send_file_name || send_hex) && !send_data) + return 1; + + if (receive_file_name) { + receive_file = creat(receive_file_name, 0666); + if (receive_file == -1) { + error("cannot create %s: %s", receive_file_name, strerror(errno)); + return -1; + } + } else { + receive_file = -1; + } + + if (receive_file_name || dump) + inputp = &input; + else + inputp = NULL; + if (send_data) + outputp = &output; + else + outputp = NULL; + + if ((err = snd_rawmidi_open(inputp, outputp, port_name, SND_RAWMIDI_NONBLOCK)) < 0) { + error("cannot open port \"%s\": %s", port_name, snd_strerror(err)); + goto _exit2; + } + + if (inputp) + snd_rawmidi_read(input, NULL, 0); /* trigger reading */ + + if (send_data) { + if ((err = snd_rawmidi_nonblock(output, 0)) < 0) { + error("cannot set blocking mode: %s", snd_strerror(err)); + goto _exit; + } + if ((err = snd_rawmidi_write(output, send_data, send_data_length)) < 0) { + error("cannot send data: %s", snd_strerror(err)); + goto _exit; + } + } + + if (inputp) { + int read = 0; + int npfds, time = 0; + struct pollfd *pfds; + + timeout *= 1000; + npfds = snd_rawmidi_poll_descriptors_count(input); + pfds = alloca(npfds * sizeof(struct pollfd)); + snd_rawmidi_poll_descriptors(input, pfds, npfds); + signal(SIGINT, sig_handler); + for (;;) { + unsigned char buf[256]; + int i, length; + unsigned short revents; + + err = poll(pfds, npfds, 200); + if (stop || (err < 0 && errno == EINTR)) + break; + if (err < 0) { + error("poll failed: %s", strerror(errno)); + break; + } + if (err == 0) { + time += 200; + if (timeout && time >= timeout) + break; + continue; + } + if ((err = snd_rawmidi_poll_descriptors_revents(input, pfds, npfds, &revents)) < 0) { + error("cannot get poll events: %s", snd_strerror(errno)); + break; + } + if (revents & (POLLERR | POLLHUP)) + break; + if (!(revents & POLLIN)) + continue; + err = snd_rawmidi_read(input, buf, sizeof(buf)); + if (err == -EAGAIN) + continue; + if (err < 0) { + error("cannot read from port \"%s\": %s", port_name, snd_strerror(err)); + break; + } + length = 0; + for (i = 0; i < err; ++i) + if (!ignore_active_sensing || buf[i] != 0xfe) + buf[length++] = buf[i]; + if (length == 0) + continue; + read += length; + time = 0; + if (receive_file != -1) + write(receive_file, buf, length); + if (dump) { + for (i = 0; i < length; ++i) + print_byte(buf[i]); + fflush(stdout); + } + } + if (isatty(fileno(stdout))) + printf("\n%d bytes read\n", read); + } + + ok = 1; +_exit: + if (inputp) + snd_rawmidi_close(input); + if (outputp) + snd_rawmidi_close(output); +_exit2: + if (receive_file != -1) + close(receive_file); + return !ok; +} diff --git a/amixer/Makefile.am b/amixer/Makefile.am new file mode 100644 index 0000000..fcd0e81 --- /dev/null +++ b/amixer/Makefile.am @@ -0,0 +1,10 @@ +INCLUDES = -I$(top_srcdir)/include +LDADD = -lm +# LDFLAGS = -static +# CFLAGS += -g -Wall + +bin_PROGRAMS = amixer +amixer_SOURCES = amixer.c +noinst_HEADERS = amixer.h +man_MANS = amixer.1 +EXTRA_DIST = amixer.1 diff --git a/amixer/Makefile.in b/amixer/Makefile.in new file mode 100644 index 0000000..ada5dab --- /dev/null +++ b/amixer/Makefile.in @@ -0,0 +1,585 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = amixer$(EXEEXT) +subdir = amixer +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_amixer_OBJECTS = amixer.$(OBJEXT) +amixer_OBJECTS = $(am_amixer_OBJECTS) +amixer_LDADD = $(LDADD) +amixer_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(amixer_SOURCES) +DIST_SOURCES = $(amixer_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +LDADD = -lm +amixer_SOURCES = amixer.c +noinst_HEADERS = amixer.h +man_MANS = amixer.1 +EXTRA_DIST = amixer.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign amixer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign amixer/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +amixer$(EXEEXT): $(amixer_OBJECTS) $(amixer_DEPENDENCIES) + @rm -f amixer$(EXEEXT) + $(LINK) $(amixer_OBJECTS) $(amixer_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amixer.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/amixer/amixer.1 b/amixer/amixer.1 new file mode 100644 index 0000000..b1ac323 --- /dev/null +++ b/amixer/amixer.1 @@ -0,0 +1,141 @@ +.TH AMIXER 1 "11 Aug 2000" +.SH NAME +amixer \- command-line mixer for ALSA soundcard driver +.SH SYNOPSIS +\fBamixer\fP [\fI\-option\fP] [\fIcmd\fP] +.SH DESCRIPTION +\fBamixer\fP allows command-line control of the mixer for the ALSA +soundcard driver. +\fBamixer\fP supports multiple soundcards. + +\fBamixer\fR with no arguments will display the current mixer settings +for the default soundcard and device. This is a good way to see a list +of the simple mixer controls you can use. + +.SH COMMANDS + +.TP +\fIhelp\fP +Shows syntax. + +.TP +\fIinfo\fP +Shows the information about a mixer device. + +.TP +\fIscontrols\fP +Shows a complete list of simple mixer controls. + +.TP +\fIscontents\fP +Shows a complete list of simple mixer controls with their contents. + +.TP +\fIset\fP or \fIsset\fP <\fISCONTROL\fP> <\fIPARAMETER\fP> ... +Sets the simple mixer control contents. The parameter can be the volume +either as a percentage from 0% to 100% with \fI%\fP suffix, +a dB gain with \fIdB\fP suffix (like -12.5dB), or an exact hardware value. +The dB gain can be used only for the mixer elements with available +dB information. +When plus(+) or minus(\-) letter is appended after +volume value, the volume is incremented or decremented from the current +value, respectively. + +The parameters \fIcap, nocap, mute, unmute, toggle\fP are used to +change capture (recording) and muting for the group specified. + +The optional modifiers can be put as extra parameters to specify +the stream direction or channels to apply. +The modifiers \fIplayback\fP and \fIcapture\fP specify the stream, +and the modifiers \fIfront, rear, center, woofer\fP are used to specify +channels to be changed. + +A simple mixer control must be specified. Only one device can be controlled +at a time. + +.TP +\fIget\fP or \fIsget\fP <\fISCONTROL\fP> +Shows the simple mixer control contents. + +A simple mixer control must be specified. Only one device can be controlled +at a time. + +.TP +\fIcontrols\fP +Shows a complete list of card controls. + +.TP +\fIcontents\fP +Shows a complete list of card controls with their contents. + +.TP +\fIcset\fP <\fICONTROL\fP> <\fIPARAMETER\fP> ... +Sets the card control contents. The identifier has these components: iface, +name, index, device, subdevice, numid. The next argument specifies the value +of control. + +.TP +\fIcget\fP <\fICONTROL\fP> +Shows the card control contents. The identifier has same syntax as for +the \fIcset\fP command. + +.SH OPTIONS + +.TP +\fI\-c\fP card + +Select the card number to control. The device name created from this +parameter has syntax 'hw:N' where N is specified card number. + +.TP +\fI\-D\fP device + +Select the device name to control. The default control name is 'default'. + +.TP +\fI\-s\fP | \fI\-\-stdin\fP + +Read from stdin and execute the command on each line sequentially. +When this option is given, the command in command-line arguments is ignored. + +Only sset and cset are accepted. Other commands are ignored. +The commands to unmatched ids are ignored without errors too. + +.TP +\fI\-h\fP +Help: show syntax. +.TP +\fI\-q\fP +Quiet mode. Do not show results of changes. + +.SH EXAMPLES + +.TP +\fBamixer \-c 1 sset Line,0 80%,40% unmute cap\fR +will set the second soundcard's left line input volume to 80% and +right line input to 40%, unmute it, and select it as a source for +capture (recording).\fR + +.TP +\fBamixer \-c 1 \-\- sset Master playback -20dB\fR +will set the master volume of the second card to -20dB. If the master +has multiple channels, all channels are set to the same value. + +.TP +\fBamixer \-c 1 set PCM 2dB+\fR +will increase the PCM volume of the second card with 2dB. When both +playback and capture volumes exist, this is applied to both volumes. + +.TP +\fBamixer \-c 2 cset iface=MIXER,name='Line Playback Volume",index=1 40%\fR +will set the third soundcard's second line playback volume(s) to 40% + +.TP +\fBamixer \-c 2 cset numid=34 40%\fR +will set the 34th soundcard element to 40% + +.SH BUGS +None known. +.SH AUTHOR +\fBamixer\fP is by Jaroslav Kysela . +This document is by Paul Winkler and Jaroslav Kysela . diff --git a/amixer/amixer.c b/amixer/amixer.c new file mode 100644 index 0000000..a177288 --- /dev/null +++ b/amixer/amixer.c @@ -0,0 +1,2036 @@ +/* + * ALSA command line mixer utility + * Copyright (c) 1999-2000 by Jaroslav Kysela + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "amixer.h" + +#define LEVEL_BASIC (1<<0) +#define LEVEL_INACTIVE (1<<1) +#define LEVEL_ID (1<<2) + +static int quiet = 0; +static int debugflag = 0; +static int no_check = 0; +static int smixer_level = 0; +static int ignore_error = 0; +static struct snd_mixer_selem_regopt smixer_options; +static char card[64] = "default"; + +static void error(const char *fmt,...) +{ + va_list va; + + va_start(va, fmt); + fprintf(stderr, "amixer: "); + vfprintf(stderr, fmt, va); + fprintf(stderr, "\n"); + va_end(va); +} + +static int help(void) +{ + printf("Usage: amixer [command]\n"); + printf("\nAvailable options:\n"); + printf(" -h,--help this help\n"); + printf(" -c,--card N select the card\n"); + printf(" -D,--device N select the device, default '%s'\n", card); + printf(" -d,--debug debug mode\n"); + printf(" -n,--nocheck do not perform range checking\n"); + printf(" -v,--version print version of this program\n"); + printf(" -q,--quiet be quiet\n"); + printf(" -i,--inactive show also inactive controls\n"); + printf(" -a,--abstract L select abstraction level (none or basic)\n"); + printf(" -s,--stdin Read and execute commands from stdin sequentially\n"); + printf("\nAvailable commands:\n"); + printf(" scontrols show all mixer simple controls\n"); + printf(" scontents show contents of all mixer simple controls (default command)\n"); + printf(" sset sID P set contents for one mixer simple control\n"); + printf(" sget sID get contents for one mixer simple control\n"); + printf(" controls show all controls for given card\n"); + printf(" contents show contents of all controls for given card\n"); + printf(" cset cID P set control contents for one control\n"); + printf(" cget cID get control contents for one control\n"); + return 0; +} + +static int info(void) +{ + int err; + snd_ctl_t *handle; + snd_mixer_t *mhandle; + snd_ctl_card_info_t *info; + snd_ctl_elem_list_t *clist; + snd_ctl_card_info_alloca(&info); + snd_ctl_elem_list_alloca(&clist); + + if ((err = snd_ctl_open(&handle, card, 0)) < 0) { + error("Control device %s open error: %s", card, snd_strerror(err)); + return err; + } + + if ((err = snd_ctl_card_info(handle, info)) < 0) { + error("Control device %s hw info error: %s", card, snd_strerror(err)); + return err; + } + printf("Card %s '%s'/'%s'\n", card, snd_ctl_card_info_get_id(info), + snd_ctl_card_info_get_longname(info)); + printf(" Mixer name : '%s'\n", snd_ctl_card_info_get_mixername(info)); + printf(" Components : '%s'\n", snd_ctl_card_info_get_components(info)); + if ((err = snd_ctl_elem_list(handle, clist)) < 0) { + error("snd_ctl_elem_list failure: %s", snd_strerror(err)); + } else { + printf(" Controls : %i\n", snd_ctl_elem_list_get_count(clist)); + } + snd_ctl_close(handle); + if ((err = snd_mixer_open(&mhandle, 0)) < 0) { + error("Mixer open error: %s", snd_strerror(err)); + return err; + } + if (smixer_level == 0 && (err = snd_mixer_attach(mhandle, card)) < 0) { + error("Mixer attach %s error: %s", card, snd_strerror(err)); + snd_mixer_close(mhandle); + return err; + } + if ((err = snd_mixer_selem_register(mhandle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { + error("Mixer register error: %s", snd_strerror(err)); + snd_mixer_close(mhandle); + return err; + } + err = snd_mixer_load(mhandle); + if (err < 0) { + error("Mixer load %s error: %s", card, snd_strerror(err)); + snd_mixer_close(mhandle); + return err; + } + printf(" Simple ctrls : %i\n", snd_mixer_get_count(mhandle)); + snd_mixer_close(mhandle); + return 0; +} + +static const char *control_iface(snd_ctl_elem_id_t *id) +{ + return snd_ctl_elem_iface_name(snd_ctl_elem_id_get_interface(id)); +} + +static const char *control_type(snd_ctl_elem_info_t *info) +{ + return snd_ctl_elem_type_name(snd_ctl_elem_info_get_type(info)); +} + +static const char *control_access(snd_ctl_elem_info_t *info) +{ + static char result[10]; + char *res = result; + + *res++ = snd_ctl_elem_info_is_readable(info) ? 'r' : '-'; + *res++ = snd_ctl_elem_info_is_writable(info) ? 'w' : '-'; + *res++ = snd_ctl_elem_info_is_inactive(info) ? 'i' : '-'; + *res++ = snd_ctl_elem_info_is_volatile(info) ? 'v' : '-'; + *res++ = snd_ctl_elem_info_is_locked(info) ? 'l' : '-'; + *res++ = snd_ctl_elem_info_is_tlv_readable(info) ? 'R' : '-'; + *res++ = snd_ctl_elem_info_is_tlv_writable(info) ? 'W' : '-'; + *res++ = snd_ctl_elem_info_is_tlv_commandable(info) ? 'C' : '-'; + *res++ = '\0'; + return result; +} + +#define check_range(val, min, max) \ + (no_check ? (val) : ((val < min) ? (min) : (val > max) ? (max) : (val))) +#if 0 +static int convert_range(int val, int omin, int omax, int nmin, int nmax) +{ + int orange = omax - omin, nrange = nmax - nmin; + + if (orange == 0) + return 0; + return rint((((double)nrange * ((double)val - (double)omin)) + ((double)orange / 2.0)) / ((double)orange + (double)nmin)); +} +#endif + +#if 0 +static int convert_db_range(int val, int omin, int omax, int nmin, int nmax) +{ + int orange = omax - omin, nrange = nmax - nmin; + + if (orange == 0) + return 0; + return rint((((double)nrange * ((double)val - (double)omin)) + ((double)orange / 2.0)) / (double)orange + (double)nmin); +} +#endif + +/* Fuction to convert from volume to percentage. val = volume */ + +static int convert_prange(int val, int min, int max) +{ + int range = max - min; + int tmp; + + if (range == 0) + return 0; + val -= min; + tmp = rint((double)val/(double)range * 100); + return tmp; +} + +/* Function to convert from percentage to volume. val = percentage */ + +#define convert_prange1(val, min, max) \ + ceil((val) * ((max) - (min)) * 0.01 + (min)) + +static const char *get_percent(int val, int min, int max) +{ + static char str[32]; + int p; + + p = convert_prange(val, min, max); + sprintf(str, "%i [%i%%]", val, p); + return str; +} + +#if 0 +static const char *get_percent1(int val, int min, int max, int min_dB, int max_dB) +{ + static char str[32]; + int p, db; + + p = convert_prange(val, min, max); + db = convert_db_range(val, min, max, min_dB, max_dB); + sprintf(str, "%i [%i%%] [%i.%02idB]", val, p, db / 100, abs(db % 100)); + return str; +} +#endif + +static long get_integer(char **ptr, long min, long max) +{ + long val = min; + char *p = *ptr, *s; + + if (*p == ':') + p++; + if (*p == '\0' || (!isdigit(*p) && *p != '-')) + goto out; + + s = p; + val = strtol(s, &p, 10); + if (*p == '.') { + p++; + strtol(p, &p, 10); + } + if (*p == '%') { + val = (long)convert_prange1(strtod(s, NULL), min, max); + p++; + } + val = check_range(val, min, max); + if (*p == ',') + p++; + out: + *ptr = p; + return val; +} + +static long get_integer64(char **ptr, long long min, long long max) +{ + long long val = min; + char *p = *ptr, *s; + + if (*p == ':') + p++; + if (*p == '\0' || (!isdigit(*p) && *p != '-')) + goto out; + + s = p; + val = strtol(s, &p, 10); + if (*p == '.') { + p++; + strtol(p, &p, 10); + } + if (*p == '%') { + val = (long long)convert_prange1(strtod(s, NULL), min, max); + p++; + } + val = check_range(val, min, max); + if (*p == ',') + p++; + out: + *ptr = p; + return val; +} + +struct volume_ops { + int (*get_range)(snd_mixer_elem_t *elem, long *min, long *max); + int (*get)(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t c, + long *value); + int (*set)(snd_mixer_elem_t *elem, snd_mixer_selem_channel_id_t c, + long value); +}; + +enum { VOL_RAW, VOL_DB }; + +struct volume_ops_set { + int (*has_volume)(snd_mixer_elem_t *elem); + struct volume_ops v[2]; +}; + +static int set_playback_dB(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t c, long value) +{ + return snd_mixer_selem_set_playback_dB(elem, c, value, 0); +} + +static int set_capture_dB(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t c, long value) +{ + return snd_mixer_selem_set_capture_dB(elem, c, value, 0); +} + +static const struct volume_ops_set vol_ops[2] = { + { + .has_volume = snd_mixer_selem_has_playback_volume, + .v = {{ snd_mixer_selem_get_playback_volume_range, + snd_mixer_selem_get_playback_volume, + snd_mixer_selem_set_playback_volume }, + { snd_mixer_selem_get_playback_dB_range, + snd_mixer_selem_get_playback_dB, + set_playback_dB }}, + }, + { + .has_volume = snd_mixer_selem_has_capture_volume, + .v = {{ snd_mixer_selem_get_capture_volume_range, + snd_mixer_selem_get_capture_volume, + snd_mixer_selem_set_capture_volume }, + { snd_mixer_selem_get_capture_dB_range, + snd_mixer_selem_get_capture_dB, + set_capture_dB }}, + }, +}; + +static int set_volume_simple(snd_mixer_elem_t *elem, + snd_mixer_selem_channel_id_t chn, + char **ptr, int dir) +{ + long val, orig, pmin, pmax; + char *p = *ptr, *s; + int invalid = 0, err = 0, vol_type = VOL_RAW; + + if (! vol_ops[dir].has_volume(elem)) + invalid = 1; + + if (*p == ':') + p++; + if (*p == '\0' || (!isdigit(*p) && *p != '-')) + goto skip; + + if (! invalid && + vol_ops[dir].v[VOL_RAW].get_range(elem, &pmin, &pmax) < 0) + invalid = 1; + + s = p; + val = strtol(s, &p, 10); + if (*p == '.') { + p++; + strtol(p, &p, 10); + } + if (*p == '%') { + if (! invalid) + val = (long)convert_prange1(strtod(s, NULL), pmin, pmax); + p++; + } else if (p[0] == 'd' && p[1] == 'B') { + if (! invalid) { + val = (long)(strtod(s, NULL) * 100.0); + vol_type = VOL_DB; + if (vol_ops[dir].v[vol_type].get_range(elem, &pmin, &pmax) < 0) + invalid = 1; + } + p += 2; + } + if (*p == '+' || *p == '-') { + if (! invalid) { + if (vol_ops[dir].v[vol_type].get(elem, chn, &orig) < 0) + invalid = 1; + if (*p == '+') + val = orig + val; + else + val = orig - val; + } + p++; + } + if (! invalid) { + val = check_range(val, pmin, pmax); + err = vol_ops[dir].v[vol_type].set(elem, chn, val); + } + skip: + if (*p == ',') + p++; + *ptr = p; + return err ? err : (invalid ? -ENOENT : 0); +} + +static int get_bool_simple(char **ptr, char *str, int invert, int orig) +{ + if (**ptr == ':') + (*ptr)++; + if (!strncasecmp(*ptr, str, strlen(str))) { + orig = 1 ^ (invert ? 1 : 0); + while (**ptr != '\0' && **ptr != ',' && **ptr != ':') + (*ptr)++; + } + if (**ptr == ',' || **ptr == ':') + (*ptr)++; + return orig; +} + +static int simple_skip_word(char **ptr, char *str) +{ + char *xptr = *ptr; + if (*xptr == ':') + xptr++; + if (!strncasecmp(xptr, str, strlen(str))) { + while (*xptr != '\0' && *xptr != ',' && *xptr != ':') + xptr++; + if (*xptr == ',' || *xptr == ':') + xptr++; + *ptr = xptr; + return 1; + } + return 0; +} + +static void show_control_id(snd_ctl_elem_id_t *id) +{ + unsigned int index, device, subdevice; + printf("numid=%u,iface=%s,name='%s'", + snd_ctl_elem_id_get_numid(id), + control_iface(id), + snd_ctl_elem_id_get_name(id)); + index = snd_ctl_elem_id_get_index(id); + device = snd_ctl_elem_id_get_device(id); + subdevice = snd_ctl_elem_id_get_subdevice(id); + if (index) + printf(",index=%i", index); + if (device) + printf(",device=%i", device); + if (subdevice) + printf(",subdevice=%i", subdevice); +} + +static void print_spaces(unsigned int spaces) +{ + while (spaces-- > 0) + putc(' ', stdout); +} + +static void print_dB(long dB) +{ + printf("%li.%02lidB", dB / 100, (dB < 0 ? -dB : dB) % 100); +} + +static void decode_tlv(unsigned int spaces, unsigned int *tlv, unsigned int tlv_size) +{ + unsigned int type = tlv[0]; + unsigned int size; + unsigned int idx = 0; + + if (tlv_size < 2 * sizeof(unsigned int)) { + printf("TLV size error!\n"); + return; + } + print_spaces(spaces); + printf("| "); + type = tlv[idx++]; + size = tlv[idx++]; + tlv_size -= 2 * sizeof(unsigned int); + if (size > tlv_size) { + printf("TLV size error (%i, %i, %i)!\n", type, size, tlv_size); + return; + } + switch (type) { + case SND_CTL_TLVT_CONTAINER: + size += sizeof(unsigned int) -1; + size /= sizeof(unsigned int); + while (idx < size) { + if (tlv[idx+1] > (size - idx) * sizeof(unsigned int)) { + printf("TLV size error in compound!\n"); + return; + } + decode_tlv(spaces + 2, tlv + idx, tlv[idx+1]); + idx += 2 + (tlv[1] + sizeof(unsigned int) - 1) / sizeof(unsigned int); + } + break; + case SND_CTL_TLVT_DB_SCALE: + printf("dBscale-"); + if (size != 2 * sizeof(unsigned int)) { + while (size > 0) { + printf("0x%08x,", tlv[idx++]); + size -= sizeof(unsigned int); + } + } else { + printf("min="); + print_dB((int)tlv[2]); + printf(",step="); + print_dB(tlv[3] & 0xffff); + printf(",mute=%i", (tlv[3] >> 16) & 1); + } + break; +#ifdef SND_CTL_TLVT_DB_LINEAR + case SND_CTL_TLVT_DB_LINEAR: + printf("dBlinear-"); + if (size != 2 * sizeof(unsigned int)) { + while (size > 0) { + printf("0x%08x,", tlv[idx++]); + size -= sizeof(unsigned int); + } + } else { + printf("min="); + print_dB(tlv[2]); + printf(",max="); + print_dB(tlv[3]); + } + break; +#endif +#ifdef SND_CTL_TLVT_DB_RANGE + case SND_CTL_TLVT_DB_RANGE: + printf("dBrange-\n"); + if ((size / (6 * sizeof(unsigned int))) != 0) { + while (size > 0) { + printf("0x%08x,", tlv[idx++]); + size -= sizeof(unsigned int); + } + break; + } + idx = 0; + while (idx < size) { + print_spaces(spaces + 2); + printf("rangemin=%i,", tlv[0]); + printf(",rangemax=%i\n", tlv[1]); + decode_tlv(spaces + 4, tlv + 2, 6 * sizeof(unsigned int)); + idx += 6 * sizeof(unsigned int); + } + break; +#endif +#ifdef SND_CTL_TLVT_DB_MINMAX + case SND_CTL_TLVT_DB_MINMAX: + case SND_CTL_TLVT_DB_MINMAX_MUTE: + if (type == SND_CTL_TLVT_DB_MINMAX_MUTE) + printf("dBminmaxmute-"); + else + printf("dBminmax-"); + if (size != 2 * sizeof(unsigned int)) { + while (size > 0) { + printf("0x%08x,", tlv[idx++]); + size -= sizeof(unsigned int); + } + } else { + printf("min="); + print_dB(tlv[2]); + printf(",max="); + print_dB(tlv[3]); + } + break; +#endif + default: + printf("unk-%i-", type); + while (size > 0) { + printf("0x%08x,", tlv[idx++]); + size -= sizeof(unsigned int); + } + break; + } + putc('\n', stdout); +} + +static int show_control(const char *space, snd_hctl_elem_t *elem, + int level) +{ + int err; + unsigned int item, idx, count, *tlv; + snd_ctl_elem_type_t type; + snd_ctl_elem_id_t *id; + snd_ctl_elem_info_t *info; + snd_ctl_elem_value_t *control; + snd_aes_iec958_t iec958; + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_value_alloca(&control); + if ((err = snd_hctl_elem_info(elem, info)) < 0) { + error("Control %s snd_hctl_elem_info error: %s\n", card, snd_strerror(err)); + return err; + } + if (level & LEVEL_ID) { + snd_hctl_elem_get_id(elem, id); + show_control_id(id); + printf("\n"); + } + count = snd_ctl_elem_info_get_count(info); + type = snd_ctl_elem_info_get_type(info); + printf("%s; type=%s,access=%s,values=%i", space, control_type(info), control_access(info), count); + switch (type) { + case SND_CTL_ELEM_TYPE_INTEGER: + printf(",min=%li,max=%li,step=%li\n", + snd_ctl_elem_info_get_min(info), + snd_ctl_elem_info_get_max(info), + snd_ctl_elem_info_get_step(info)); + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + printf(",min=%Li,max=%Li,step=%Li\n", + snd_ctl_elem_info_get_min64(info), + snd_ctl_elem_info_get_max64(info), + snd_ctl_elem_info_get_step64(info)); + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + { + unsigned int items = snd_ctl_elem_info_get_items(info); + printf(",items=%u\n", items); + for (item = 0; item < items; item++) { + snd_ctl_elem_info_set_item(info, item); + if ((err = snd_hctl_elem_info(elem, info)) < 0) { + error("Control %s element info error: %s\n", card, snd_strerror(err)); + return err; + } + printf("%s; Item #%u '%s'\n", space, item, snd_ctl_elem_info_get_item_name(info)); + } + break; + } + default: + printf("\n"); + break; + } + if (level & LEVEL_BASIC) { + if (!snd_ctl_elem_info_is_readable(info)) + goto __skip_read; + if ((err = snd_hctl_elem_read(elem, control)) < 0) { + error("Control %s element read error: %s\n", card, snd_strerror(err)); + return err; + } + printf("%s: values=", space); + for (idx = 0; idx < count; idx++) { + if (idx > 0) + printf(","); + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + printf("%s", snd_ctl_elem_value_get_boolean(control, idx) ? "on" : "off"); + break; + case SND_CTL_ELEM_TYPE_INTEGER: + printf("%li", snd_ctl_elem_value_get_integer(control, idx)); + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + printf("%Li", snd_ctl_elem_value_get_integer64(control, idx)); + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + printf("%u", snd_ctl_elem_value_get_enumerated(control, idx)); + break; + case SND_CTL_ELEM_TYPE_BYTES: + printf("0x%02x", snd_ctl_elem_value_get_byte(control, idx)); + break; + case SND_CTL_ELEM_TYPE_IEC958: + snd_ctl_elem_value_get_iec958(control, &iec958); + printf("[AES0=0x%02x AES1=0x%02x AES2=0x%02x AES3=0x%02x]", + iec958.status[0], iec958.status[1], + iec958.status[2], iec958.status[3]); + break; + default: + printf("?"); + break; + } + } + printf("\n"); + __skip_read: + if (!snd_ctl_elem_info_is_tlv_readable(info)) + goto __skip_tlv; + tlv = malloc(4096); + if ((err = snd_hctl_elem_tlv_read(elem, tlv, 4096)) < 0) { + error("Control %s element TLV read error: %s\n", card, snd_strerror(err)); + free(tlv); + return err; + } + decode_tlv(strlen(space), tlv, 4096); + free(tlv); + } + __skip_tlv: + return 0; +} + +static int controls(int level) +{ + int err; + snd_hctl_t *handle; + snd_hctl_elem_t *elem; + snd_ctl_elem_id_t *id; + snd_ctl_elem_info_t *info; + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_info_alloca(&info); + + if ((err = snd_hctl_open(&handle, card, 0)) < 0) { + error("Control %s open error: %s", card, snd_strerror(err)); + return err; + } + if ((err = snd_hctl_load(handle)) < 0) { + error("Control %s local error: %s\n", card, snd_strerror(err)); + return err; + } + for (elem = snd_hctl_first_elem(handle); elem; elem = snd_hctl_elem_next(elem)) { + if ((err = snd_hctl_elem_info(elem, info)) < 0) { + error("Control %s snd_hctl_elem_info error: %s\n", card, snd_strerror(err)); + return err; + } + if (!(level & LEVEL_INACTIVE) && snd_ctl_elem_info_is_inactive(info)) + continue; + snd_hctl_elem_get_id(elem, id); + show_control_id(id); + printf("\n"); + if (level & LEVEL_BASIC) + show_control(" ", elem, 1); + } + snd_hctl_close(handle); + return 0; +} + +static int show_selem(snd_mixer_t *handle, snd_mixer_selem_id_t *id, const char *space, int level) +{ + snd_mixer_selem_channel_id_t chn; + long pmin = 0, pmax = 0; + long cmin = 0, cmax = 0; + long pvol, cvol; + int psw, csw; + int pmono, cmono, mono_ok = 0; + long db; + snd_mixer_elem_t *elem; + + elem = snd_mixer_find_selem(handle, id); + if (!elem) { + error("Mixer %s simple element not found", card); + return -ENOENT; + } + + if (level & LEVEL_BASIC) { + printf("%sCapabilities:", space); + if (snd_mixer_selem_has_common_volume(elem)) { + printf(" volume"); + if (snd_mixer_selem_has_playback_volume_joined(elem)) + printf(" volume-joined"); + } else { + if (snd_mixer_selem_has_playback_volume(elem)) { + printf(" pvolume"); + if (snd_mixer_selem_has_playback_volume_joined(elem)) + printf(" pvolume-joined"); + } + if (snd_mixer_selem_has_capture_volume(elem)) { + printf(" cvolume"); + if (snd_mixer_selem_has_capture_volume_joined(elem)) + printf(" cvolume-joined"); + } + } + if (snd_mixer_selem_has_common_switch(elem)) { + printf(" switch"); + if (snd_mixer_selem_has_playback_switch_joined(elem)) + printf(" switch-joined"); + } else { + if (snd_mixer_selem_has_playback_switch(elem)) { + printf(" pswitch"); + if (snd_mixer_selem_has_playback_switch_joined(elem)) + printf(" pswitch-joined"); + } + if (snd_mixer_selem_has_capture_switch(elem)) { + printf(" cswitch"); + if (snd_mixer_selem_has_capture_switch_joined(elem)) + printf(" cswitch-joined"); + if (snd_mixer_selem_has_capture_switch_exclusive(elem)) + printf(" cswitch-exclusive"); + } + } + if (snd_mixer_selem_is_enum_playback(elem)) { + printf(" penum"); + } else if (snd_mixer_selem_is_enum_capture(elem)) { + printf(" cenum"); + } else if (snd_mixer_selem_is_enumerated(elem)) { + printf(" enum"); + } + printf("\n"); + if (snd_mixer_selem_is_enumerated(elem)) { + int i, items; + unsigned int idx; + char itemname[40]; + items = snd_mixer_selem_get_enum_items(elem); + printf(" Items:"); + for (i = 0; i < items; i++) { + snd_mixer_selem_get_enum_item_name(elem, i, sizeof(itemname) - 1, itemname); + printf(" '%s'", itemname); + } + printf("\n"); + for (i = 0; !snd_mixer_selem_get_enum_item(elem, i, &idx); i++) { + snd_mixer_selem_get_enum_item_name(elem, idx, sizeof(itemname) - 1, itemname); + printf(" Item%d: '%s'\n", i, itemname); + } + return 0; /* no more thing to do */ + } + if (snd_mixer_selem_has_capture_switch_exclusive(elem)) + printf("%sCapture exclusive group: %i\n", space, + snd_mixer_selem_get_capture_group(elem)); + if (snd_mixer_selem_has_playback_volume(elem) || + snd_mixer_selem_has_playback_switch(elem)) { + printf("%sPlayback channels:", space); + if (snd_mixer_selem_is_playback_mono(elem)) { + printf(" Mono"); + } else { + int first = 1; + for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++){ + if (!snd_mixer_selem_has_playback_channel(elem, chn)) + continue; + if (!first) + printf(" -"); + printf(" %s", snd_mixer_selem_channel_name(chn)); + first = 0; + } + } + printf("\n"); + } + if (snd_mixer_selem_has_capture_volume(elem) || + snd_mixer_selem_has_capture_switch(elem)) { + printf("%sCapture channels:", space); + if (snd_mixer_selem_is_capture_mono(elem)) { + printf(" Mono"); + } else { + int first = 1; + for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++){ + if (!snd_mixer_selem_has_capture_channel(elem, chn)) + continue; + if (!first) + printf(" -"); + printf(" %s", snd_mixer_selem_channel_name(chn)); + first = 0; + } + } + printf("\n"); + } + if (snd_mixer_selem_has_playback_volume(elem) || + snd_mixer_selem_has_capture_volume(elem)) { + printf("%sLimits:", space); + if (snd_mixer_selem_has_common_volume(elem)) { + snd_mixer_selem_get_playback_volume_range(elem, &pmin, &pmax); + snd_mixer_selem_get_capture_volume_range(elem, &cmin, &cmax); + printf(" %li - %li", pmin, pmax); + } else { + if (snd_mixer_selem_has_playback_volume(elem)) { + snd_mixer_selem_get_playback_volume_range(elem, &pmin, &pmax); + printf(" Playback %li - %li", pmin, pmax); + } + if (snd_mixer_selem_has_capture_volume(elem)) { + snd_mixer_selem_get_capture_volume_range(elem, &cmin, &cmax); + printf(" Capture %li - %li", cmin, cmax); + } + } + printf("\n"); + } + pmono = snd_mixer_selem_has_playback_channel(elem, SND_MIXER_SCHN_MONO) && + (snd_mixer_selem_is_playback_mono(elem) || + (!snd_mixer_selem_has_playback_volume(elem) && + !snd_mixer_selem_has_playback_switch(elem))); + cmono = snd_mixer_selem_has_capture_channel(elem, SND_MIXER_SCHN_MONO) && + (snd_mixer_selem_is_capture_mono(elem) || + (!snd_mixer_selem_has_capture_volume(elem) && + !snd_mixer_selem_has_capture_switch(elem))); +#if 0 + printf("pmono = %i, cmono = %i (%i, %i, %i, %i)\n", pmono, cmono, + snd_mixer_selem_has_capture_channel(elem, SND_MIXER_SCHN_MONO), + snd_mixer_selem_is_capture_mono(elem), + snd_mixer_selem_has_capture_volume(elem), + snd_mixer_selem_has_capture_switch(elem)); +#endif + if (pmono || cmono) { + if (!mono_ok) { + printf("%s%s:", space, "Mono"); + mono_ok = 1; + } + if (snd_mixer_selem_has_common_volume(elem)) { + snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &pvol); + printf(" %s", get_percent(pvol, pmin, pmax)); + if (!snd_mixer_selem_get_playback_dB(elem, SND_MIXER_SCHN_MONO, &db)) { + printf(" ["); + print_dB(db); + printf("]"); + } + } + if (snd_mixer_selem_has_common_switch(elem)) { + snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_MONO, &psw); + printf(" [%s]", psw ? "on" : "off"); + } + } + if (pmono && snd_mixer_selem_has_playback_channel(elem, SND_MIXER_SCHN_MONO)) { + int title = 0; + if (!mono_ok) { + printf("%s%s:", space, "Mono"); + mono_ok = 1; + } + if (!snd_mixer_selem_has_common_volume(elem)) { + if (snd_mixer_selem_has_playback_volume(elem)) { + printf(" Playback"); + title = 1; + snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_MONO, &pvol); + printf(" %s", get_percent(pvol, pmin, pmax)); + if (!snd_mixer_selem_get_playback_dB(elem, SND_MIXER_SCHN_MONO, &db)) { + printf(" ["); + print_dB(db); + printf("]"); + } + } + } + if (!snd_mixer_selem_has_common_switch(elem)) { + if (snd_mixer_selem_has_playback_switch(elem)) { + if (!title) + printf(" Playback"); + snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_MONO, &psw); + printf(" [%s]", psw ? "on" : "off"); + } + } + } + if (cmono && snd_mixer_selem_has_capture_channel(elem, SND_MIXER_SCHN_MONO)) { + int title = 0; + if (!mono_ok) { + printf("%s%s:", space, "Mono"); + mono_ok = 1; + } + if (!snd_mixer_selem_has_common_volume(elem)) { + if (snd_mixer_selem_has_capture_volume(elem)) { + printf(" Capture"); + title = 1; + snd_mixer_selem_get_capture_volume(elem, SND_MIXER_SCHN_MONO, &cvol); + printf(" %s", get_percent(cvol, cmin, cmax)); + if (!snd_mixer_selem_get_capture_dB(elem, SND_MIXER_SCHN_MONO, &db)) { + printf(" ["); + print_dB(db); + printf("]"); + } + } + } + if (!snd_mixer_selem_has_common_switch(elem)) { + if (snd_mixer_selem_has_capture_switch(elem)) { + if (!title) + printf(" Capture"); + snd_mixer_selem_get_capture_switch(elem, SND_MIXER_SCHN_MONO, &csw); + printf(" [%s]", csw ? "on" : "off"); + } + } + } + if (pmono || cmono) + printf("\n"); + if (!pmono || !cmono) { + for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) { + if ((pmono || !snd_mixer_selem_has_playback_channel(elem, chn)) && + (cmono || !snd_mixer_selem_has_capture_channel(elem, chn))) + continue; + printf("%s%s:", space, snd_mixer_selem_channel_name(chn)); + if (!pmono && !cmono && snd_mixer_selem_has_common_volume(elem)) { + snd_mixer_selem_get_playback_volume(elem, chn, &pvol); + printf(" %s", get_percent(pvol, pmin, pmax)); + if (!snd_mixer_selem_get_playback_dB(elem, chn, &db)) { + printf(" ["); + print_dB(db); + printf("]"); + } + } + if (!pmono && !cmono && snd_mixer_selem_has_common_switch(elem)) { + snd_mixer_selem_get_playback_switch(elem, chn, &psw); + printf(" [%s]", psw ? "on" : "off"); + } + if (!pmono && snd_mixer_selem_has_playback_channel(elem, chn)) { + int title = 0; + if (!snd_mixer_selem_has_common_volume(elem)) { + if (snd_mixer_selem_has_playback_volume(elem)) { + printf(" Playback"); + title = 1; + snd_mixer_selem_get_playback_volume(elem, chn, &pvol); + printf(" %s", get_percent(pvol, pmin, pmax)); + if (!snd_mixer_selem_get_playback_dB(elem, chn, &db)) { + printf(" ["); + print_dB(db); + printf("]"); + } + } + } + if (!snd_mixer_selem_has_common_switch(elem)) { + if (snd_mixer_selem_has_playback_switch(elem)) { + if (!title) + printf(" Playback"); + snd_mixer_selem_get_playback_switch(elem, chn, &psw); + printf(" [%s]", psw ? "on" : "off"); + } + } + } + if (!cmono && snd_mixer_selem_has_capture_channel(elem, chn)) { + int title = 0; + if (!snd_mixer_selem_has_common_volume(elem)) { + if (snd_mixer_selem_has_capture_volume(elem)) { + printf(" Capture"); + title = 1; + snd_mixer_selem_get_capture_volume(elem, chn, &cvol); + printf(" %s", get_percent(cvol, cmin, cmax)); + if (!snd_mixer_selem_get_capture_dB(elem, chn, &db)) { + printf(" ["); + print_dB(db); + printf("]"); + } + } + } + if (!snd_mixer_selem_has_common_switch(elem)) { + if (snd_mixer_selem_has_capture_switch(elem)) { + if (!title) + printf(" Capture"); + snd_mixer_selem_get_capture_switch(elem, chn, &csw); + printf(" [%s]", csw ? "on" : "off"); + } + } + } + printf("\n"); + } + } + } + return 0; +} + +static int selems(int level) +{ + int err; + snd_mixer_t *handle; + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *elem; + snd_mixer_selem_id_alloca(&sid); + + if ((err = snd_mixer_open(&handle, 0)) < 0) { + error("Mixer %s open error: %s", card, snd_strerror(err)); + return err; + } + if (smixer_level == 0 && (err = snd_mixer_attach(handle, card)) < 0) { + error("Mixer attach %s error: %s", card, snd_strerror(err)); + snd_mixer_close(handle); + return err; + } + if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { + error("Mixer register error: %s", snd_strerror(err)); + snd_mixer_close(handle); + return err; + } + err = snd_mixer_load(handle); + if (err < 0) { + error("Mixer %s load error: %s", card, snd_strerror(err)); + snd_mixer_close(handle); + return err; + } + for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem)) { + snd_mixer_selem_get_id(elem, sid); + if (!(level & LEVEL_INACTIVE) && !snd_mixer_selem_is_active(elem)) + continue; + printf("Simple mixer control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); + show_selem(handle, sid, " ", level); + } + snd_mixer_close(handle); + return 0; +} + +static int parse_control_id(const char *str, snd_ctl_elem_id_t *id) +{ + int c, size, numid; + char *ptr; + + while (*str == ' ' || *str == '\t') + str++; + if (!(*str)) + return -EINVAL; + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); /* default */ + while (*str) { + if (!strncasecmp(str, "numid=", 6)) { + str += 6; + numid = atoi(str); + if (numid <= 0) { + fprintf(stderr, "amixer: Invalid numid %d\n", numid); + return -EINVAL; + } + snd_ctl_elem_id_set_numid(id, atoi(str)); + while (isdigit(*str)) + str++; + } else if (!strncasecmp(str, "iface=", 6)) { + str += 6; + if (!strncasecmp(str, "card", 4)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_CARD); + str += 4; + } else if (!strncasecmp(str, "mixer", 5)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); + str += 5; + } else if (!strncasecmp(str, "pcm", 3)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_PCM); + str += 3; + } else if (!strncasecmp(str, "rawmidi", 7)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_RAWMIDI); + str += 7; + } else if (!strncasecmp(str, "timer", 5)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_TIMER); + str += 5; + } else if (!strncasecmp(str, "sequencer", 9)) { + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_SEQUENCER); + str += 9; + } else { + return -EINVAL; + } + } else if (!strncasecmp(str, "name=", 5)) { + char buf[64]; + str += 5; + ptr = buf; + size = 0; + if (*str == '\'' || *str == '\"') { + c = *str++; + while (*str && *str != c) { + if (size < (int)sizeof(buf)) { + *ptr++ = *str; + size++; + } + str++; + } + if (*str == c) + str++; + } else { + while (*str && *str != ',') { + if (size < (int)sizeof(buf)) { + *ptr++ = *str; + size++; + } + str++; + } + } + *ptr = '\0'; + snd_ctl_elem_id_set_name(id, buf); + } else if (!strncasecmp(str, "index=", 6)) { + str += 6; + snd_ctl_elem_id_set_index(id, atoi(str)); + while (isdigit(*str)) + str++; + } else if (!strncasecmp(str, "device=", 7)) { + str += 7; + snd_ctl_elem_id_set_device(id, atoi(str)); + while (isdigit(*str)) + str++; + } else if (!strncasecmp(str, "subdevice=", 10)) { + str += 10; + snd_ctl_elem_id_set_subdevice(id, atoi(str)); + while (isdigit(*str)) + str++; + } + if (*str == ',') { + str++; + } else { + if (*str) + return -EINVAL; + } + } + return 0; +} + +static int parse_simple_id(const char *str, snd_mixer_selem_id_t *sid) +{ + int c, size; + char buf[128]; + char *ptr = buf; + + while (*str == ' ' || *str == '\t') + str++; + if (!(*str)) + return -EINVAL; + size = 1; /* for '\0' */ + if (*str != '"' && *str != '\'') { + while (*str && *str != ',') { + if (size < (int)sizeof(buf)) { + *ptr++ = *str; + size++; + } + str++; + } + } else { + c = *str++; + while (*str && *str != c) { + if (size < (int)sizeof(buf)) { + *ptr++ = *str; + size++; + } + str++; + } + if (*str == c) + str++; + } + if (*str == '\0') { + snd_mixer_selem_id_set_index(sid, 0); + *ptr = 0; + goto _set; + } + if (*str != ',') + return -EINVAL; + *ptr = 0; /* terminate the string */ + str++; + if (!isdigit(*str)) + return -EINVAL; + snd_mixer_selem_id_set_index(sid, atoi(str)); + _set: + snd_mixer_selem_id_set_name(sid, buf); + return 0; +} + +static int get_ctl_enum_item_index(snd_ctl_t *handle, snd_ctl_elem_info_t *info, + char **ptrp) +{ + char *ptr = *ptrp; + int items, i, len; + const char *name; + + items = snd_ctl_elem_info_get_items(info); + if (items <= 0) + return -1; + + for (i = 0; i < items; i++) { + snd_ctl_elem_info_set_item(info, i); + if (snd_ctl_elem_info(handle, info) < 0) + return -1; + name = snd_ctl_elem_info_get_item_name(info); + len = strlen(name); + if (! strncmp(name, ptr, len)) { + if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { + ptr += len; + *ptrp = ptr; + return i; + } + } + } + return -1; +} + +static int cset(int argc, char *argv[], int roflag, int keep_handle) +{ + int err; + static snd_ctl_t *handle = NULL; + snd_ctl_elem_info_t *info; + snd_ctl_elem_id_t *id; + snd_ctl_elem_value_t *control; + char *ptr; + unsigned int idx, count; + long tmp; + snd_ctl_elem_type_t type; + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&control); + + if (argc < 1) { + fprintf(stderr, "Specify a full control identifier: [[iface=,][name='name',][index=,][device=,][subdevice=]]|[numid=]\n"); + return -EINVAL; + } + if (parse_control_id(argv[0], id)) { + fprintf(stderr, "Wrong control identifier: %s\n", argv[0]); + return -EINVAL; + } + if (debugflag) { + printf("VERIFY ID: "); + show_control_id(id); + printf("\n"); + } + if (handle == NULL && + (err = snd_ctl_open(&handle, card, 0)) < 0) { + error("Control %s open error: %s\n", card, snd_strerror(err)); + return err; + } + snd_ctl_elem_info_set_id(info, id); + if ((err = snd_ctl_elem_info(handle, info)) < 0) { + if (ignore_error) + return 0; + error("Cannot find the given element from control %s\n", card); + if (! keep_handle) { + snd_ctl_close(handle); + handle = NULL; + } + return err; + } + snd_ctl_elem_info_get_id(info, id); /* FIXME: Remove it when hctl find works ok !!! */ + type = snd_ctl_elem_info_get_type(info); + count = snd_ctl_elem_info_get_count(info); + snd_ctl_elem_value_set_id(control, id); + + if (!roflag) { + ptr = argv[1]; + for (idx = 0; idx < count && idx < 128 && ptr && *ptr; idx++) { + switch (type) { + case SND_CTL_ELEM_TYPE_BOOLEAN: + tmp = 0; + if (!strncasecmp(ptr, "on", 2) || !strncasecmp(ptr, "up", 2)) { + tmp = 1; + ptr += 2; + } else if (!strncasecmp(ptr, "yes", 3)) { + tmp = 1; + ptr += 3; + } else if (!strncasecmp(ptr, "toggle", 6)) { + tmp = snd_ctl_elem_value_get_boolean(control, idx); + tmp = tmp > 0 ? 0 : 1; + ptr += 6; + } else if (isdigit(*ptr)) { + tmp = atoi(ptr) > 0 ? 1 : 0; + while (isdigit(*ptr)) + ptr++; + } else { + while (*ptr && *ptr != ',') + ptr++; + } + snd_ctl_elem_value_set_boolean(control, idx, tmp); + break; + case SND_CTL_ELEM_TYPE_INTEGER: + tmp = get_integer(&ptr, + snd_ctl_elem_info_get_min(info), + snd_ctl_elem_info_get_max(info)); + snd_ctl_elem_value_set_integer(control, idx, tmp); + break; + case SND_CTL_ELEM_TYPE_INTEGER64: + tmp = get_integer64(&ptr, + snd_ctl_elem_info_get_min64(info), + snd_ctl_elem_info_get_max64(info)); + snd_ctl_elem_value_set_integer64(control, idx, tmp); + break; + case SND_CTL_ELEM_TYPE_ENUMERATED: + tmp = get_ctl_enum_item_index(handle, info, &ptr); + if (tmp < 0) + tmp = get_integer(&ptr, 0, snd_ctl_elem_info_get_items(info) - 1); + snd_ctl_elem_value_set_enumerated(control, idx, tmp); + break; + case SND_CTL_ELEM_TYPE_BYTES: + tmp = get_integer(&ptr, 0, 255); + snd_ctl_elem_value_set_byte(control, idx, tmp); + break; + default: + break; + } + if (!strchr(argv[1], ',')) + ptr = argv[1]; + else if (*ptr == ',') + ptr++; + } + if ((err = snd_ctl_elem_write(handle, control)) < 0) { + if (!ignore_error) + error("Control %s element write error: %s\n", card, snd_strerror(err)); + if (!keep_handle) { + snd_ctl_close(handle); + handle = NULL; + } + return ignore_error ? 0 : err; + } + } + if (! keep_handle) { + snd_ctl_close(handle); + handle = NULL; + } + if (!quiet) { + snd_hctl_t *hctl; + snd_hctl_elem_t *elem; + if ((err = snd_hctl_open(&hctl, card, 0)) < 0) { + error("Control %s open error: %s\n", card, snd_strerror(err)); + return err; + } + if ((err = snd_hctl_load(hctl)) < 0) { + error("Control %s load error: %s\n", card, snd_strerror(err)); + return err; + } + elem = snd_hctl_find_elem(hctl, id); + if (elem) + show_control(" ", elem, LEVEL_BASIC | LEVEL_ID); + else + printf("Could not find the specified element\n"); + snd_hctl_close(hctl); + } + return 0; +} + +typedef struct channel_mask { + char *name; + unsigned int mask; +} channel_mask_t; +static const channel_mask_t chanmask[] = { + {"frontleft", 1 << SND_MIXER_SCHN_FRONT_LEFT}, + {"frontright", 1 << SND_MIXER_SCHN_FRONT_RIGHT}, + {"frontcenter", 1 << SND_MIXER_SCHN_FRONT_CENTER}, + {"front", ((1 << SND_MIXER_SCHN_FRONT_LEFT) | + (1 << SND_MIXER_SCHN_FRONT_RIGHT))}, + {"center", 1 << SND_MIXER_SCHN_FRONT_CENTER}, + {"rearleft", 1 << SND_MIXER_SCHN_REAR_LEFT}, + {"rearright", 1 << SND_MIXER_SCHN_REAR_RIGHT}, + {"rear", ((1 << SND_MIXER_SCHN_REAR_LEFT) | + (1 << SND_MIXER_SCHN_REAR_RIGHT))}, + {"woofer", 1 << SND_MIXER_SCHN_WOOFER}, + {NULL, 0} +}; + +static unsigned int channels_mask(char **arg, unsigned int def) +{ + const channel_mask_t *c; + + for (c = chanmask; c->name; c++) { + if (strncasecmp(*arg, c->name, strlen(c->name)) == 0) { + while (**arg != '\0' && **arg != ',' && **arg != ' ' && **arg != '\t') + (*arg)++; + if (**arg == ',' || **arg == ' ' || **arg == '\t') + (*arg)++; + return c->mask; + } + } + return def; +} + +static unsigned int dir_mask(char **arg, unsigned int def) +{ + int findend = 0; + + if (strncasecmp(*arg, "playback", 8) == 0) + def = findend = 1; + else if (strncasecmp(*arg, "capture", 8) == 0) + def = findend = 2; + if (findend) { + while (**arg != '\0' && **arg != ',' && **arg != ' ' && **arg != '\t') + (*arg)++; + if (**arg == ',' || **arg == ' ' || **arg == '\t') + (*arg)++; + } + return def; +} + +static int get_enum_item_index(snd_mixer_elem_t *elem, char **ptrp) +{ + char *ptr = *ptrp; + int items, i, len; + char name[40]; + + items = snd_mixer_selem_get_enum_items(elem); + if (items <= 0) + return -1; + + for (i = 0; i < items; i++) { + if (snd_mixer_selem_get_enum_item_name(elem, i, sizeof(name)-1, name) < 0) + continue; + len = strlen(name); + if (! strncmp(name, ptr, len)) { + if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { + ptr += len; + *ptrp = ptr; + return i; + } + } + } + return -1; +} + +static int sset_enum(snd_mixer_elem_t *elem, unsigned int argc, char **argv) +{ + unsigned int idx, chn = 0; + int check_flag = ignore_error ? 0 : -1; + + for (idx = 1; idx < argc; idx++) { + char *ptr = argv[idx]; + while (*ptr) { + int ival = get_enum_item_index(elem, &ptr); + if (ival < 0) + return check_flag; + if (snd_mixer_selem_set_enum_item(elem, chn, ival) >= 0) + check_flag = 1; + /* skip separators */ + while (*ptr == ',' || isspace(*ptr)) + ptr++; + } + } + return check_flag; +} + +static int sset_channels(snd_mixer_elem_t *elem, unsigned int argc, char **argv) +{ + unsigned int channels = ~0U; + unsigned int dir = 3, okflag = 3; + unsigned int idx; + snd_mixer_selem_channel_id_t chn; + int check_flag = ignore_error ? 0 : -1; + + for (idx = 1; idx < argc; idx++) { + char *ptr = argv[idx], *optr; + int multi, firstchn = 1; + channels = channels_mask(&ptr, channels); + if (*ptr == '\0') + continue; + dir = dir_mask(&ptr, dir); + if (*ptr == '\0') + continue; + multi = (strchr(ptr, ',') != NULL); + optr = ptr; + for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) { + char *sptr = NULL; + int ival; + + if (!(channels & (1 << chn))) + continue; + + if ((dir & 1) && snd_mixer_selem_has_playback_channel(elem, chn)) { + sptr = ptr; + if (!strncmp(ptr, "mute", 4) && snd_mixer_selem_has_playback_switch(elem)) { + snd_mixer_selem_get_playback_switch(elem, chn, &ival); + if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "mute", 1, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "off", 3) && snd_mixer_selem_has_playback_switch(elem)) { + snd_mixer_selem_get_playback_switch(elem, chn, &ival); + if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "off", 1, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "unmute", 6) && snd_mixer_selem_has_playback_switch(elem)) { + snd_mixer_selem_get_playback_switch(elem, chn, &ival); + if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "unmute", 0, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "on", 2) && snd_mixer_selem_has_playback_switch(elem)) { + snd_mixer_selem_get_playback_switch(elem, chn, &ival); + if (snd_mixer_selem_set_playback_switch(elem, chn, get_bool_simple(&ptr, "on", 0, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "toggle", 6) && snd_mixer_selem_has_playback_switch(elem)) { + if (firstchn || !snd_mixer_selem_has_playback_switch_joined(elem)) { + snd_mixer_selem_get_playback_switch(elem, chn, &ival); + if (snd_mixer_selem_set_playback_switch(elem, chn, (ival ? 1 : 0) ^ 1) >= 0) + check_flag = 1; + } + simple_skip_word(&ptr, "toggle"); + } else if (isdigit(*ptr) || *ptr == '-' || *ptr == '+') { + if (set_volume_simple(elem, chn, &ptr, 0) >= 0) + check_flag = 1; + } else if (simple_skip_word(&ptr, "cap") || simple_skip_word(&ptr, "rec") || + simple_skip_word(&ptr, "nocap") || simple_skip_word(&ptr, "norec")) { + /* nothing */ + } else { + okflag &= ~1; + } + } + if ((dir & 2) && snd_mixer_selem_has_capture_channel(elem, chn)) { + if (sptr != NULL) + ptr = sptr; + sptr = ptr; + if (!strncmp(ptr, "cap", 3) && snd_mixer_selem_has_capture_switch(elem)) { + snd_mixer_selem_get_capture_switch(elem, chn, &ival); + if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "cap", 0, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "rec", 3) && snd_mixer_selem_has_capture_switch(elem)) { + snd_mixer_selem_get_capture_switch(elem, chn, &ival); + if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "rec", 0, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "nocap", 5) && snd_mixer_selem_has_capture_switch(elem)) { + snd_mixer_selem_get_capture_switch(elem, chn, &ival); + if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "nocap", 1, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "norec", 5) && snd_mixer_selem_has_capture_switch(elem)) { + snd_mixer_selem_get_capture_switch(elem, chn, &ival); + if (snd_mixer_selem_set_capture_switch(elem, chn, get_bool_simple(&ptr, "norec", 1, ival)) >= 0) + check_flag = 1; + } else if (!strncmp(ptr, "toggle", 6) && snd_mixer_selem_has_capture_switch(elem)) { + if (firstchn || !snd_mixer_selem_has_capture_switch_joined(elem)) { + snd_mixer_selem_get_capture_switch(elem, chn, &ival); + if (snd_mixer_selem_set_capture_switch(elem, chn, (ival ? 1 : 0) ^ 1) >= 0) + check_flag = 1; + } + simple_skip_word(&ptr, "toggle"); + } else if (isdigit(*ptr) || *ptr == '-' || *ptr == '+') { + if (set_volume_simple(elem, chn, &ptr, 1) >= 0) + check_flag = 1; + } else if (simple_skip_word(&ptr, "mute") || simple_skip_word(&ptr, "off") || + simple_skip_word(&ptr, "unmute") || simple_skip_word(&ptr, "on")) { + /* nothing */ + } else { + okflag &= ~2; + } + } + if (okflag == 0) { + if (debugflag) { + if (dir & 1) + error("Unknown playback setup '%s'..", ptr); + if (dir & 2) + error("Unknown capture setup '%s'..", ptr); + } + return 0; /* just skip it */ + } + if (!multi) + ptr = optr; + firstchn = 0; + } + } + return check_flag; +} + +static int sset(unsigned int argc, char *argv[], int roflag, int keep_handle) +{ + int err = 0; + static snd_mixer_t *handle = NULL; + snd_mixer_elem_t *elem; + snd_mixer_selem_id_t *sid; + snd_mixer_selem_id_alloca(&sid); + + if (argc < 1) { + fprintf(stderr, "Specify a scontrol identifier: 'name',index\n"); + return 1; + } + if (parse_simple_id(argv[0], sid)) { + fprintf(stderr, "Wrong scontrol identifier: %s\n", argv[0]); + return 1; + } + if (!roflag && argc < 2) { + fprintf(stderr, "Specify what you want to set...\n"); + return 1; + } + if (handle == NULL) { + if ((err = snd_mixer_open(&handle, 0)) < 0) { + error("Mixer %s open error: %s\n", card, snd_strerror(err)); + return err; + } + if (smixer_level == 0 && (err = snd_mixer_attach(handle, card)) < 0) { + error("Mixer attach %s error: %s", card, snd_strerror(err)); + snd_mixer_close(handle); + handle = NULL; + return err; + } + if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { + error("Mixer register error: %s", snd_strerror(err)); + snd_mixer_close(handle); + handle = NULL; + return err; + } + err = snd_mixer_load(handle); + if (err < 0) { + error("Mixer %s load error: %s", card, snd_strerror(err)); + snd_mixer_close(handle); + handle = NULL; + return err; + } + } + elem = snd_mixer_find_selem(handle, sid); + if (!elem) { + if (ignore_error) + return 0; + error("Unable to find simple control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); + snd_mixer_close(handle); + handle = NULL; + return -ENOENT; + } + if (!roflag) { + /* enum control */ + if (snd_mixer_selem_is_enumerated(elem)) + err = sset_enum(elem, argc, argv); + else + err = sset_channels(elem, argc, argv); + + if (!err) + goto done; + if (err < 0) { + error("Invalid command!"); + goto done; + } + } + if (!quiet) { + printf("Simple mixer control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); + show_selem(handle, sid, " ", 1); + } + done: + if (! keep_handle) { + snd_mixer_close(handle); + handle = NULL; + } + return err < 0 ? 1 : 0; +} + +static void events_info(snd_hctl_elem_t *helem) +{ + snd_ctl_elem_id_t *id; + snd_ctl_elem_id_alloca(&id); + snd_hctl_elem_get_id(helem, id); + printf("event info: "); + show_control_id(id); + printf("\n"); +} + +static void events_value(snd_hctl_elem_t *helem) +{ + snd_ctl_elem_id_t *id; + snd_ctl_elem_id_alloca(&id); + snd_hctl_elem_get_id(helem, id); + printf("event value: "); + show_control_id(id); + printf("\n"); +} + +static void events_remove(snd_hctl_elem_t *helem) +{ + snd_ctl_elem_id_t *id; + snd_ctl_elem_id_alloca(&id); + snd_hctl_elem_get_id(helem, id); + printf("event remove: "); + show_control_id(id); + printf("\n"); +} + +static int element_callback(snd_hctl_elem_t *elem, unsigned int mask) +{ + if (mask == SND_CTL_EVENT_MASK_REMOVE) { + events_remove(elem); + return 0; + } + if (mask & SND_CTL_EVENT_MASK_INFO) + events_info(elem); + if (mask & SND_CTL_EVENT_MASK_VALUE) + events_value(elem); + return 0; +} + +static void events_add(snd_hctl_elem_t *helem) +{ + snd_ctl_elem_id_t *id; + snd_ctl_elem_id_alloca(&id); + snd_hctl_elem_get_id(helem, id); + printf("event add: "); + show_control_id(id); + printf("\n"); + snd_hctl_elem_set_callback(helem, element_callback); +} + +static int ctl_callback(snd_hctl_t *ctl, unsigned int mask, + snd_hctl_elem_t *elem) +{ + if (mask & SND_CTL_EVENT_MASK_ADD) + events_add(elem); + return 0; +} + +static int events(int argc ATTRIBUTE_UNUSED, char *argv[] ATTRIBUTE_UNUSED) +{ + snd_hctl_t *handle; + snd_hctl_elem_t *helem; + int err; + + if ((err = snd_hctl_open(&handle, card, 0)) < 0) { + error("Control %s open error: %s\n", card, snd_strerror(err)); + return err; + } + snd_hctl_set_callback(handle, ctl_callback); + if ((err = snd_hctl_load(handle)) < 0) { + error("Control %s hbuild error: %s\n", card, snd_strerror(err)); + return err; + } + for (helem = snd_hctl_first_elem(handle); helem; helem = snd_hctl_elem_next(helem)) { + snd_hctl_elem_set_callback(helem, element_callback); + } + printf("Ready to listen...\n"); + while (1) { + int res = snd_hctl_wait(handle, -1); + if (res >= 0) { + printf("Poll ok: %i\n", res); + res = snd_hctl_handle_events(handle); + assert(res > 0); + } + } + snd_hctl_close(handle); + return 0; +} + +static void sevents_value(snd_mixer_selem_id_t *sid) +{ + printf("event value: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); +} + +static void sevents_info(snd_mixer_selem_id_t *sid) +{ + printf("event info: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); +} + +static void sevents_remove(snd_mixer_selem_id_t *sid) +{ + printf("event remove: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); +} + +static int melem_event(snd_mixer_elem_t *elem, unsigned int mask) +{ + snd_mixer_selem_id_t *sid; + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_get_id(elem, sid); + if (mask == SND_CTL_EVENT_MASK_REMOVE) { + sevents_remove(sid); + return 0; + } + if (mask & SND_CTL_EVENT_MASK_INFO) + sevents_info(sid); + if (mask & SND_CTL_EVENT_MASK_VALUE) + sevents_value(sid); + return 0; +} + +static void sevents_add(snd_mixer_elem_t *elem) +{ + snd_mixer_selem_id_t *sid; + snd_mixer_selem_id_alloca(&sid); + snd_mixer_selem_get_id(elem, sid); + printf("event add: '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid)); + snd_mixer_elem_set_callback(elem, melem_event); +} + +static int mixer_event(snd_mixer_t *mixer, unsigned int mask, + snd_mixer_elem_t *elem) +{ + if (mask & SND_CTL_EVENT_MASK_ADD) + sevents_add(elem); + return 0; +} + +static int sevents(int argc ATTRIBUTE_UNUSED, char *argv[] ATTRIBUTE_UNUSED) +{ + snd_mixer_t *handle; + int err; + + if ((err = snd_mixer_open(&handle, 0)) < 0) { + error("Mixer %s open error: %s", card, snd_strerror(err)); + return err; + } + if (smixer_level == 0 && (err = snd_mixer_attach(handle, card)) < 0) { + error("Mixer attach %s error: %s", card, snd_strerror(err)); + snd_mixer_close(handle); + return err; + } + if ((err = snd_mixer_selem_register(handle, smixer_level > 0 ? &smixer_options : NULL, NULL)) < 0) { + error("Mixer register error: %s", snd_strerror(err)); + snd_mixer_close(handle); + return err; + } + snd_mixer_set_callback(handle, mixer_event); + err = snd_mixer_load(handle); + if (err < 0) { + error("Mixer %s load error: %s", card, snd_strerror(err)); + snd_mixer_close(handle); + return err; + } + + printf("Ready to listen...\n"); + while (1) { + int res; + res = snd_mixer_wait(handle, -1); + if (res >= 0) { + printf("Poll ok: %i\n", res); + res = snd_mixer_handle_events(handle); + assert(res >= 0); + } + } + snd_mixer_close(handle); + return 0; +} + +/* + * split a line into tokens + * the content in the line buffer is modified + */ +static int split_line(char *buf, char **token, int max_token) +{ + char *dst; + int n, esc, quote; + + for (n = 0; n < max_token; n++) { + while (isspace(*buf)) + buf++; + if (! *buf || *buf == '\n') + return n; + /* skip comments */ + if (*buf == '#' || *buf == '!') + return n; + esc = 0; + quote = 0; + token[n] = buf; + for (dst = buf; *buf && *buf != '\n'; buf++) { + if (esc) + esc = 0; + else if (isspace(*buf) && !quote) { + buf++; + break; + } else if (*buf == '\\') { + esc = 1; + continue; + } else if (*buf == '\'' || *buf == '"') { + if (! quote) { + quote = *buf; + continue; + } else if (*buf == quote) { + quote = 0; + continue; + } + } + *dst++ = *buf; + } + *dst = 0; + } + return n; +} + +#define MAX_ARGS 32 + +static int exec_stdin(void) +{ + int narg; + char buf[256], *args[MAX_ARGS]; + int err = 0; + + /* quiet = 1; */ + ignore_error = 1; + + while (fgets(buf, sizeof(buf), stdin)) { + narg = split_line(buf, args, MAX_ARGS); + if (narg > 0) { + if (!strcmp(args[0], "sset") || !strcmp(args[0], "set")) + err = sset(narg - 1, args + 1, 0, 1); + else if (!strcmp(args[0], "cset")) + err = cset(narg - 1, args + 1, 0, 1); + if (err < 0) + return 1; + } + } + return 0; +} + + +int main(int argc, char *argv[]) +{ + int morehelp, level = 0; + int read_stdin = 0; + static const struct option long_option[] = + { + {"help", 0, NULL, 'h'}, + {"card", 1, NULL, 'c'}, + {"device", 1, NULL, 'D'}, + {"quiet", 0, NULL, 'q'}, + {"inactive", 0, NULL, 'i'}, + {"debug", 0, NULL, 'd'}, + {"nocheck", 0, NULL, 'n'}, + {"version", 0, NULL, 'v'}, + {"abstract", 1, NULL, 'a'}, + {"stdin", 0, NULL, 's'}, + {NULL, 0, NULL, 0}, + }; + + morehelp = 0; + while (1) { + int c; + + if ((c = getopt_long(argc, argv, "hc:D:qidnva:s", long_option, NULL)) < 0) + break; + switch (c) { + case 'h': + help(); + return 0; + case 'c': + { + int i; + i = snd_card_get_index(optarg); + if (i >= 0 && i < 32) + sprintf(card, "hw:%i", i); + else { + fprintf(stderr, "Invalid card number.\n"); + morehelp++; + } + } + break; + case 'D': + strncpy(card, optarg, sizeof(card)-1); + card[sizeof(card)-1] = '\0'; + break; + case 'q': + quiet = 1; + break; + case 'i': + level |= LEVEL_INACTIVE; + break; + case 'd': + debugflag = 1; + break; + case 'n': + no_check = 1; + break; + case 'v': + printf("amixer version " SND_UTIL_VERSION_STR "\n"); + return 1; + case 'a': + smixer_level = 1; + memset(&smixer_options, 0, sizeof(smixer_options)); + smixer_options.ver = 1; + if (!strcmp(optarg, "none")) + smixer_options.abstract = SND_MIXER_SABSTRACT_NONE; + else if (!strcmp(optarg, "basic")) + smixer_options.abstract = SND_MIXER_SABSTRACT_BASIC; + else { + fprintf(stderr, "Select correct abstraction level (none or basic)...\n"); + morehelp++; + } + break; + case 's': + read_stdin = 1; + break; + default: + fprintf(stderr, "Invalid switch or option needs an argument.\n"); + morehelp++; + } + } + if (morehelp) { + help(); + return 1; + } + smixer_options.device = card; + + if (read_stdin) + return exec_stdin(); + + if (argc - optind <= 0) { + return selems(LEVEL_BASIC | level) ? 1 : 0; + } + if (!strcmp(argv[optind], "help")) { + return help() ? 1 : 0; + } else if (!strcmp(argv[optind], "info")) { + return info() ? 1 : 0; + } else if (!strcmp(argv[optind], "controls")) { + return controls(level) ? 1 : 0; + } else if (!strcmp(argv[optind], "contents")) { + return controls(LEVEL_BASIC | level) ? 1 : 0; + } else if (!strcmp(argv[optind], "scontrols") || !strcmp(argv[optind], "simple")) { + return selems(level) ? 1 : 0; + } else if (!strcmp(argv[optind], "scontents")) { + return selems(LEVEL_BASIC | level) ? 1 : 0; + } else if (!strcmp(argv[optind], "sset") || !strcmp(argv[optind], "set")) { + return sset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 0, 0) ? 1 : 0; + } else if (!strcmp(argv[optind], "sget") || !strcmp(argv[optind], "get")) { + return sset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 1, 0) ? 1 : 0; + } else if (!strcmp(argv[optind], "cset")) { + return cset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 0, 0) ? 1 : 0; + } else if (!strcmp(argv[optind], "cget")) { + return cset(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL, 1, 0) ? 1 : 0; + } else if (!strcmp(argv[optind], "events")) { + return events(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL); + } else if (!strcmp(argv[optind], "sevents")) { + return sevents(argc - optind - 1, argc - optind > 1 ? argv + optind + 1 : NULL); + } else { + fprintf(stderr, "amixer: Unknown command '%s'...\n", argv[optind]); + } + + return 0; +} diff --git a/amixer/amixer.h b/amixer/amixer.h new file mode 100644 index 0000000..3588f04 --- /dev/null +++ b/amixer/amixer.h @@ -0,0 +1,21 @@ +/* + * ALSA command line mixer utility + * Copyright (c) 1999 by Jaroslav Kysela + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "../include/version.h" diff --git a/aplay/Makefile.am b/aplay/Makefile.am new file mode 100644 index 0000000..92323d1 --- /dev/null +++ b/aplay/Makefile.am @@ -0,0 +1,31 @@ +LIBRT = @LIBRT@ + +INCLUDES = -I$(top_srcdir)/include +LDADD = $(LIBINTL) $(LIBRT) + +# debug flags +#LDFLAGS = -static +#LDADD += -ldl + +bin_PROGRAMS = aplay +man_MANS = aplay.1 arecord.1 +noinst_HEADERS = formats.h + +EXTRA_DIST = aplay.1 arecord.1 +EXTRA_CLEAN = arecord + +arecord: aplay + rm -f arecord + $(LN_S) $< $@ + +arecord.1: aplay.1 + rm -f arecord.1 + $(LN_S) $< $@ + +install-exec-hook: arecord + rm -f $(DESTDIR)$(bindir)/arecord + (cd $(DESTDIR)$(bindir) && $(LN_S) aplay arecord) + +install-data-hook: + rm -f $(DESTDIR)$(mandir)/man1/arecord.1 + (cd $(DESTDIR)$(mandir)/man1 && $(LN_S) aplay.1 arecord.1) diff --git a/aplay/Makefile.in b/aplay/Makefile.in new file mode 100644 index 0000000..3039dbc --- /dev/null +++ b/aplay/Makefile.in @@ -0,0 +1,604 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = aplay$(EXEEXT) +subdir = aplay +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +aplay_SOURCES = aplay.c +aplay_OBJECTS = aplay.$(OBJEXT) +aplay_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +aplay_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = aplay.c +DIST_SOURCES = aplay.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +LDADD = $(LIBINTL) $(LIBRT) +man_MANS = aplay.1 arecord.1 +noinst_HEADERS = formats.h +EXTRA_DIST = aplay.1 arecord.1 +EXTRA_CLEAN = arecord +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign aplay/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign aplay/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +aplay$(EXEEXT): $(aplay_OBJECTS) $(aplay_DEPENDENCIES) + @rm -f aplay$(EXEEXT) + $(LINK) $(aplay_OBJECTS) $(aplay_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aplay.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-data-am install-exec-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-man install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +arecord: aplay + rm -f arecord + $(LN_S) $< $@ + +arecord.1: aplay.1 + rm -f arecord.1 + $(LN_S) $< $@ + +install-exec-hook: arecord + rm -f $(DESTDIR)$(bindir)/arecord + (cd $(DESTDIR)$(bindir) && $(LN_S) aplay arecord) + +install-data-hook: + rm -f $(DESTDIR)$(mandir)/man1/arecord.1 + (cd $(DESTDIR)$(mandir)/man1 && $(LN_S) aplay.1 arecord.1) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/aplay/aplay.1 b/aplay/aplay.1 new file mode 100644 index 0000000..b6caf0b --- /dev/null +++ b/aplay/aplay.1 @@ -0,0 +1,237 @@ +.TH APLAY 1 "1 January 2010" +.SH NAME +arecord, aplay \- command-line sound recorder and player for ALSA +soundcard driver +.SH SYNOPSIS +\fBarecord\fP [\fIflags\fP] [filename] +.br +\fBaplay\fP [\fIflags\fP] [filename [filename]] ... + +.SH DESCRIPTION +\fBarecord\fP is a command-line soundfile recorder for the ALSA soundcard +driver. It supports several file formats and multiple soundcards with +multiple devices. If recording with interleaved mode samples the file is +automatically split before the 2GB filesize. + +\fBaplay\fP is much the same, only it plays instead of recording. For +supported soundfile formats, the sampling rate, bit depth, and so +forth can be automatically determined from the soundfile header. + +If filename is not specified, the standard output or input is used. The \fBaplay\fP utility accepts multiple filenames. + +.SH OPTIONS +.TP +\fI\-h, \-\-help\fP +Help: show syntax. +.TP +\fI\-\-version\fP +Print current version. +.TP +\fI\-l, \-\-list\-devices\fP +List all soundcards and digital audio devices +.TP +\fI\-L, \-\-list\-pcms\fP +List all PCMs defined +.TP +\fI\-D, \-\-device=NAME\fP +Select PCM by name +.TP +\fI\-q \-\-quiet\fP +Quiet mode. Suppress messages (not sound :)) +.TP +\fI\-t, \-\-file\-type TYPE\fP +File type (voc, wav, raw or au). +If this parameter is omitted the WAVE format is used. +.TP +\fI\-c, \-\-channels=#\fP +The number of channels. +The default is one channel. +Valid values are 1 through 32. +.TP +\fI\-f \-\-format=FORMAT\fP +Sample format +.br +Recognized sample formats are: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE +S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE +FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW +A_LAW IMA_ADPCM MPEG GSM SPECIAL S24_3LE S24_3BE U24_3LE U24_3BE S20_3LE +S20_3BE U20_3LE U20_3BE S18_3LE S18_3BE U18_3LE +.br +Some of these may not be available on selected hardware +.br +The available format shortcuts are: +.nf +\-f cd (16 bit little endian, 44100, stereo) [\-f S16_LE \-c2 \-r44100] +\-f cdr (16 bit big endian, 44100, stereo) [\-f S16_BE \-c2 \-f44100] +\-f dat (16 bit little endian, 48000, stereo) [\-f S16_LE \-c2 \-r48000] +.fi +If no format is given U8 is used. +.TP +\fI\-r, \-\-rate=#\fP +Sampling rate in Hertz. The default rate is 8000 Hertz. +If the value specified is less than 300, it is taken as the rate in kilohertz. +Valid values are 2000 through 192000 Hertz. +.TP +\fI\-d, \-\-duration=#\fP +Interrupt after # seconds. +A value of zero means infinity. +The default is zero, so if this option is omitted then the arecord process will run until it is killed. +.TP +\fI\-s, \-\-sleep\-min=#\fP +Min ticks to sleep. The default is not to sleep. +.TP +\fI\-M, \-\-mmap\fP +Use memory-mapped (mmap) I/O mode for the audio stream. +If this option is not set, the read/write I/O mode will be used. +.TP +\fI\-N, \-\-nonblock\fP +Open the audio device in non-blocking mode. If the device is busy the program will exit immediately. +If this option is not set the program will block until the audio device is available again. +.TP +\fI\-F, \-\-period\-time=#\fP +Distance between interrupts is # microseconds. +If no period time and no period size is given then a quarter of the buffer time is set. +.TP +\fI\-B, \-\-buffer\-time=#\fP +Buffer duration is # microseconds +If no buffer time and no buffer size is given then the maximal allowed buffer time but not more than 500ms is set. +.TP +\fI\-\-period\-size=#\fP +Distance between interrupts is # frames +If no period size and no period time is given then a quarter of the buffer size is set. +.TP +\fI\-\-buffer\-size=#\fP +Buffer duration is # frames +If no buffer time and no buffer size is given then the maximal allowed buffer time but not more than 500ms is set. +.TP +\fI\-A, \-\-avail\-min=#\fP +Min available space for wakeup is # microseconds +.TP +\fI\-R, \-\-start\-delay=#\fP +Delay for automatic PCM start is # microseconds +(relative to buffer size if <= 0) +.TP +\fI\-T, \-\-stop\-delay=#\fP +Delay for automatic PCM stop is # microseconds from xrun +.TP +\fI\-v, \-\-verbose\fP +Show PCM structure and setup. +This option is accumulative. The VU meter is displayed when this +is given twice or three times. +.TP +\fI\-V, \-\-vumeter=TYPE\fP +Specifies the VU-meter type, either \fIstereo\fP or \fImono\fP. +The stereo VU-meter is available only for 2-channel stereo samples +with interleaved format. +.TP +\fI\-I, \-\-separate\-channels\fP +One file for each channel. This option disables max\-file\-time +and use\-strftime, and ignores SIGUSR1. The stereo VU meter is +not available with separate channels. +.TP +\fI\-P\fP +Playback. This is the default if the program is invoked +by typing aplay. +.TP +\fI\-C\fP +Record. This is the default if the program is invoked +by typing arecord. +.TP +\fI\-\-disable\-resample\fP +Disable automatic rate resample. +.TP +\fI\-\-disable\-channels\fP +Disable automatic channel conversions. +.TP +\fI\-\-disable\-format\fP +Disable automatic format conversions. +.TP +\fI\-\-disable\-softvol\fP +Disable software volume control (softvol). +.TP +\fI\-\-test\-position\fP +Test ring buffer position. +.TP +\fI\-\-test\-coef=\fP +Test coefficient for ring buffer position; default is 8. +Expression for validation is: coef * (buffer_size / 2). +Minimum value is 1. +.TP +\fI\-\-test\-nowait\fP +Do not wait for the ring buffer--eats the whole CPU. +.TP +\fI\-\-max\-file\-time\fP +While recording, when the output file has been accumulating +sound for this long, +close it and open a new output file. Default is the maximum +size supported by the file format: 2 GiB for WAV files. +This option has no effect if \-\-separate\-channels is +specified. +.TP +\fI\-\-process\-id\-file \fP +aplay writes its process ID here, so other programs can +send signals to it. +.TP +\fI\-\-use\-strftime\fP +When recording, interpret %-codes in the file name parameter using +the strftime facility whenever the output file is opened. The +important strftime codes are: %Y is the year, %m month, %d day of +the month, %H hour, %M minute and %S second. In addition, %v is +the file number, starting at 1. When this option is specified, +intermediate directories for the output file are created automatically. +This option has no effect if \-\-separate\-channels is specified. + +.SH SIGNALS +When recording, SIGINT, SIGTERM and SIGABRT will close the output +file and exit. SIGUSR1 will close the output file, open a new one, +and continue recording. However, SIGUSR1 does not work with +\-\-separate\-channels. + +.SH EXAMPLES + +.TP +\fBaplay \-c 1 \-t raw \-r 22050 \-f mu_law foobar\fR +will play the raw file "foobar" as a +22050-Hz, mono, 8-bit, Mu-Law .au file. + +.TP +\fBarecord \-d 10 \-f cd \-t wav \-D copy foobar.wav\fP +will record foobar.wav as a 10-second, CD-quality wave file, using the +PCM "copy" (which might be defined in the user's .asoundrc file as: +.nf +pcm.copy { + type plug + slave { + pcm hw + } + route_policy copy +} +.fi + +.TP +\fBarecord \-t wav \-max-file_time 30 mon.wav\fP +Record from the default audio source in monaural, 8,000 samples +per second, 8 bits per sample. Start a new file every +30 seconds. File names are mon-nn.wav, where nn increases +from 01. The file after mon-99.wav is mon-100.wav. + +.TP +\fBarecord \-f cd \-t wav \-max-file-time 3600 --use-strftime %Y/%m/%d/listen-%H-%M-%v.wav\fP +Record in stereo from the default audio source. Create a new file +every hour. The files are placed in directories based on their start dates +and have names which include their start times and file numbers. + +.SH SEE ALSO +\fB +alsamixer(1), +amixer(1) +\fP + +.SH BUGS +Note that .aiff files are not currently supported. + +.SH AUTHOR +\fBarecord\fP and \fBaplay\fP are by Jaroslav Kysela +This document is by Paul Winkler . +Updated for Alsa 0.9 by James Tappin + diff --git a/aplay/aplay.c b/aplay/aplay.c new file mode 100644 index 0000000..c09f23c --- /dev/null +++ b/aplay/aplay.c @@ -0,0 +1,2963 @@ +/* + * aplay.c - plays and records + * + * CREATIVE LABS CHANNEL-files + * Microsoft WAVE-files + * SPARC AUDIO .AU-files + * Raw Data + * + * Copyright (c) by Jaroslav Kysela + * Based on vplay program by Michael Beck + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "gettext.h" +#include "formats.h" +#include "version.h" + +#ifndef LLONG_MAX +#define LLONG_MAX 9223372036854775807LL +#endif + +#define DEFAULT_FORMAT SND_PCM_FORMAT_U8 +#define DEFAULT_SPEED 8000 + +#define FORMAT_DEFAULT -1 +#define FORMAT_RAW 0 +#define FORMAT_VOC 1 +#define FORMAT_WAVE 2 +#define FORMAT_AU 3 + +/* global data */ + +static snd_pcm_sframes_t (*readi_func)(snd_pcm_t *handle, void *buffer, snd_pcm_uframes_t size); +static snd_pcm_sframes_t (*writei_func)(snd_pcm_t *handle, const void *buffer, snd_pcm_uframes_t size); +static snd_pcm_sframes_t (*readn_func)(snd_pcm_t *handle, void **bufs, snd_pcm_uframes_t size); +static snd_pcm_sframes_t (*writen_func)(snd_pcm_t *handle, void **bufs, snd_pcm_uframes_t size); + +enum { + VUMETER_NONE, + VUMETER_MONO, + VUMETER_STEREO +}; + +static char *command; +static snd_pcm_t *handle; +static struct { + snd_pcm_format_t format; + unsigned int channels; + unsigned int rate; +} hwparams, rhwparams; +static int timelimit = 0; +static int quiet_mode = 0; +static int file_type = FORMAT_DEFAULT; +static int open_mode = 0; +static snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK; +static int mmap_flag = 0; +static int interleaved = 1; +static int nonblock = 0; +static u_char *audiobuf = NULL; +static snd_pcm_uframes_t chunk_size = 0; +static unsigned period_time = 0; +static unsigned buffer_time = 0; +static snd_pcm_uframes_t period_frames = 0; +static snd_pcm_uframes_t buffer_frames = 0; +static int avail_min = -1; +static int start_delay = 0; +static int stop_delay = 0; +static int monotonic = 0; +static int can_pause = 0; +static int verbose = 0; +static int vumeter = VUMETER_NONE; +static int buffer_pos = 0; +static size_t bits_per_sample, bits_per_frame; +static size_t chunk_bytes; +static int test_position = 0; +static int test_coef = 8; +static int test_nowait = 0; +static snd_output_t *log; +static long long max_file_size = 0; +static int max_file_time = 0; +static int use_strftime = 0; +volatile static int recycle_capture_file = 0; +static long term_c_lflag = -1; + +static int fd = -1; +static off64_t pbrec_count = LLONG_MAX, fdcount; +static int vocmajor, vocminor; + +static char *pidfile_name = NULL; +FILE *pidf = NULL; +static int pidfile_written = 0; + +/* needed prototypes */ + +static void done_stdin(void); + +static void playback(char *filename); +static void capture(char *filename); +static void playbackv(char **filenames, unsigned int count); +static void capturev(char **filenames, unsigned int count); + +static void begin_voc(int fd, size_t count); +static void end_voc(int fd); +static void begin_wave(int fd, size_t count); +static void end_wave(int fd); +static void begin_au(int fd, size_t count); +static void end_au(int fd); + +static const struct fmt_capture { + void (*start) (int fd, size_t count); + void (*end) (int fd); + char *what; + long long max_filesize; +} fmt_rec_table[] = { + { NULL, NULL, N_("raw data"), LLONG_MAX }, + { begin_voc, end_voc, N_("VOC"), 16000000LL }, + /* FIXME: can WAV handle exactly 2GB or less than it? */ + { begin_wave, end_wave, N_("WAVE"), 2147483648LL }, + { begin_au, end_au, N_("Sparc Audio"), LLONG_MAX } +}; + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +#define error(...) do {\ + fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + putc('\n', stderr); \ +} while (0) +#else +#define error(args...) do {\ + fprintf(stderr, "%s: %s:%d: ", command, __FUNCTION__, __LINE__); \ + fprintf(stderr, ##args); \ + putc('\n', stderr); \ +} while (0) +#endif + +static void usage(char *command) +{ + snd_pcm_format_t k; + printf( +_("Usage: %s [OPTION]... [FILE]...\n" +"\n" +"-h, --help help\n" +" --version print current version\n" +"-l, --list-devices list all soundcards and digital audio devices\n" +"-L, --list-pcms list device names\n" +"-D, --device=NAME select PCM by name\n" +"-q, --quiet quiet mode\n" +"-t, --file-type TYPE file type (voc, wav, raw or au)\n" +"-c, --channels=# channels\n" +"-f, --format=FORMAT sample format (case insensitive)\n" +"-r, --rate=# sample rate\n" +"-d, --duration=# interrupt after # seconds\n" +"-M, --mmap mmap stream\n" +"-N, --nonblock nonblocking mode\n" +"-F, --period-time=# distance between interrupts is # microseconds\n" +"-B, --buffer-time=# buffer duration is # microseconds\n" +" --period-size=# distance between interrupts is # frames\n" +" --buffer-size=# buffer duration is # frames\n" +"-A, --avail-min=# min available space for wakeup is # microseconds\n" +"-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +" (relative to buffer size if <= 0)\n" +"-T, --stop-delay=# delay for automatic PCM stop is # microseconds from xrun\n" +"-v, --verbose show PCM structure and setup (accumulative)\n" +"-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +"-I, --separate-channels one file for each channel\n" +" --disable-resample disable automatic rate resample\n" +" --disable-channels disable automatic channel conversions\n" +" --disable-format disable automatic format conversions\n" +" --disable-softvol disable software volume control (softvol)\n" +" --test-position test ring buffer position\n" +" --test-coef=# test coeficient for ring buffer position (default 8)\n" +" expression for validation is: coef * (buffer_size / 2)\n" +" --test-nowait do not wait for ring buffer - eats whole CPU\n" +" --max-file-time=# start another output file when the old file has recorded\n" +" for this many seconds\n" +" --process-id-file write the process ID here\n" +" --use-strftime apply the strftime facility to the output file name\n") + , command); + printf(_("Recognized sample formats are:")); + for (k = 0; k < SND_PCM_FORMAT_LAST; ++k) { + const char *s = snd_pcm_format_name(k); + if (s) + printf(" %s", s); + } + printf(_("\nSome of these may not be available on selected hardware\n")); + printf(_("The availabled format shortcuts are:\n")); + printf(_("-f cd (16 bit little endian, 44100, stereo)\n")); + printf(_("-f cdr (16 bit big endian, 44100, stereo)\n")); + printf(_("-f dat (16 bit little endian, 48000, stereo)\n")); +} + +static void device_list(void) +{ + snd_ctl_t *handle; + int card, err, dev, idx; + snd_ctl_card_info_t *info; + snd_pcm_info_t *pcminfo; + snd_ctl_card_info_alloca(&info); + snd_pcm_info_alloca(&pcminfo); + + card = -1; + if (snd_card_next(&card) < 0 || card < 0) { + error(_("no soundcards found...")); + return; + } + printf(_("**** List of %s Hardware Devices ****\n"), + snd_pcm_stream_name(stream)); + while (card >= 0) { + char name[32]; + sprintf(name, "hw:%d", card); + if ((err = snd_ctl_open(&handle, name, 0)) < 0) { + error("control open (%i): %s", card, snd_strerror(err)); + goto next_card; + } + if ((err = snd_ctl_card_info(handle, info)) < 0) { + error("control hardware info (%i): %s", card, snd_strerror(err)); + snd_ctl_close(handle); + goto next_card; + } + dev = -1; + while (1) { + unsigned int count; + if (snd_ctl_pcm_next_device(handle, &dev)<0) + error("snd_ctl_pcm_next_device"); + if (dev < 0) + break; + snd_pcm_info_set_device(pcminfo, dev); + snd_pcm_info_set_subdevice(pcminfo, 0); + snd_pcm_info_set_stream(pcminfo, stream); + if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { + if (err != -ENOENT) + error("control digital audio info (%i): %s", card, snd_strerror(err)); + continue; + } + printf(_("card %i: %s [%s], device %i: %s [%s]\n"), + card, snd_ctl_card_info_get_id(info), snd_ctl_card_info_get_name(info), + dev, + snd_pcm_info_get_id(pcminfo), + snd_pcm_info_get_name(pcminfo)); + count = snd_pcm_info_get_subdevices_count(pcminfo); + printf( _(" Subdevices: %i/%i\n"), + snd_pcm_info_get_subdevices_avail(pcminfo), count); + for (idx = 0; idx < (int)count; idx++) { + snd_pcm_info_set_subdevice(pcminfo, idx); + if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { + error("control digital audio playback info (%i): %s", card, snd_strerror(err)); + } else { + printf(_(" Subdevice #%i: %s\n"), + idx, snd_pcm_info_get_subdevice_name(pcminfo)); + } + } + } + snd_ctl_close(handle); + next_card: + if (snd_card_next(&card) < 0) { + error("snd_card_next"); + break; + } + } +} + +static void pcm_list(void) +{ + void **hints, **n; + char *name, *descr, *descr1, *io; + const char *filter; + + if (snd_device_name_hint(-1, "pcm", &hints) < 0) + return; + n = hints; + filter = stream == SND_PCM_STREAM_CAPTURE ? "Input" : "Output"; + while (*n != NULL) { + name = snd_device_name_get_hint(*n, "NAME"); + descr = snd_device_name_get_hint(*n, "DESC"); + io = snd_device_name_get_hint(*n, "IOID"); + if (io != NULL && strcmp(io, filter) != 0) + goto __end; + printf("%s\n", name); + if ((descr1 = descr) != NULL) { + printf(" "); + while (*descr1) { + if (*descr1 == '\n') + printf("\n "); + else + putchar(*descr1); + descr1++; + } + putchar('\n'); + } + __end: + if (name != NULL) + free(name); + if (descr != NULL) + free(descr); + if (io != NULL) + free(io); + n++; + } + snd_device_name_free_hint(hints); +} + +static void version(void) +{ + printf("%s: version " SND_UTIL_VERSION_STR " by Jaroslav Kysela \n", command); +} + +/* + * Subroutine to clean up before exit. + */ +static void prg_exit(int code) +{ + done_stdin(); + if (handle) + snd_pcm_close(handle); + if (pidfile_written) + remove (pidfile_name); + exit(code); +} + +static void signal_handler(int sig) +{ + if (verbose==2) + putchar('\n'); + if (!quiet_mode) + fprintf(stderr, _("Aborted by signal %s...\n"), strsignal(sig)); + if (stream == SND_PCM_STREAM_CAPTURE) { + if (fmt_rec_table[file_type].end) { + fmt_rec_table[file_type].end(fd); + fd = -1; + } + stream = -1; + } + if (fd > 1) { + close(fd); + fd = -1; + } + if (handle && sig != SIGABRT) { + snd_pcm_close(handle); + handle = NULL; + } + prg_exit(EXIT_FAILURE); +} + +/* call on SIGUSR1 signal. */ +static void signal_handler_recycle (int sig) +{ + /* flag the capture loop to start a new output file */ + recycle_capture_file = 1; +} + +enum { + OPT_VERSION = 1, + OPT_PERIOD_SIZE, + OPT_BUFFER_SIZE, + OPT_DISABLE_RESAMPLE, + OPT_DISABLE_CHANNELS, + OPT_DISABLE_FORMAT, + OPT_DISABLE_SOFTVOL, + OPT_TEST_POSITION, + OPT_TEST_COEF, + OPT_TEST_NOWAIT, + OPT_MAX_FILE_TIME, + OPT_PROCESS_ID_FILE, + OPT_USE_STRFTIME +}; + +int main(int argc, char *argv[]) +{ + int option_index; + static const char short_options[] = "hnlLD:qt:c:f:r:d:MNF:A:R:T:B:vV:IPC"; + static const struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, OPT_VERSION}, + {"list-devnames", 0, 0, 'n'}, + {"list-devices", 0, 0, 'l'}, + {"list-pcms", 0, 0, 'L'}, + {"device", 1, 0, 'D'}, + {"quiet", 0, 0, 'q'}, + {"file-type", 1, 0, 't'}, + {"channels", 1, 0, 'c'}, + {"format", 1, 0, 'f'}, + {"rate", 1, 0, 'r'}, + {"duration", 1, 0 ,'d'}, + {"mmap", 0, 0, 'M'}, + {"nonblock", 0, 0, 'N'}, + {"period-time", 1, 0, 'F'}, + {"period-size", 1, 0, OPT_PERIOD_SIZE}, + {"avail-min", 1, 0, 'A'}, + {"start-delay", 1, 0, 'R'}, + {"stop-delay", 1, 0, 'T'}, + {"buffer-time", 1, 0, 'B'}, + {"buffer-size", 1, 0, OPT_BUFFER_SIZE}, + {"verbose", 0, 0, 'v'}, + {"vumeter", 1, 0, 'V'}, + {"separate-channels", 0, 0, 'I'}, + {"playback", 0, 0, 'P'}, + {"capture", 0, 0, 'C'}, + {"disable-resample", 0, 0, OPT_DISABLE_RESAMPLE}, + {"disable-channels", 0, 0, OPT_DISABLE_CHANNELS}, + {"disable-format", 0, 0, OPT_DISABLE_FORMAT}, + {"disable-softvol", 0, 0, OPT_DISABLE_SOFTVOL}, + {"test-position", 0, 0, OPT_TEST_POSITION}, + {"test-coef", 1, 0, OPT_TEST_COEF}, + {"test-nowait", 0, 0, OPT_TEST_NOWAIT}, + {"max-file-time", 1, 0, OPT_MAX_FILE_TIME}, + {"process-id-file", 1, 0, OPT_PROCESS_ID_FILE}, + {"use-strftime", 0, 0, OPT_USE_STRFTIME}, + {0, 0, 0, 0} + }; + char *pcm_name = "default"; + int tmp, err, c; + int do_device_list = 0, do_pcm_list = 0; + snd_pcm_info_t *info; + +#ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + textdomain(PACKAGE); +#endif + + snd_pcm_info_alloca(&info); + + err = snd_output_stdio_attach(&log, stderr, 0); + assert(err >= 0); + + command = argv[0]; + file_type = FORMAT_DEFAULT; + if (strstr(argv[0], "arecord")) { + stream = SND_PCM_STREAM_CAPTURE; + file_type = FORMAT_WAVE; + command = "arecord"; + start_delay = 1; + } else if (strstr(argv[0], "aplay")) { + stream = SND_PCM_STREAM_PLAYBACK; + command = "aplay"; + } else { + error(_("command should be named either arecord or aplay")); + return 1; + } + + chunk_size = -1; + rhwparams.format = DEFAULT_FORMAT; + rhwparams.rate = DEFAULT_SPEED; + rhwparams.channels = 1; + + while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) { + switch (c) { + case 'h': + usage(command); + return 0; + case OPT_VERSION: + version(); + return 0; + case 'l': + do_device_list = 1; + break; + case 'L': + do_pcm_list = 1; + break; + case 'D': + pcm_name = optarg; + break; + case 'q': + quiet_mode = 1; + break; + case 't': + if (strcasecmp(optarg, "raw") == 0) + file_type = FORMAT_RAW; + else if (strcasecmp(optarg, "voc") == 0) + file_type = FORMAT_VOC; + else if (strcasecmp(optarg, "wav") == 0) + file_type = FORMAT_WAVE; + else if (strcasecmp(optarg, "au") == 0 || strcasecmp(optarg, "sparc") == 0) + file_type = FORMAT_AU; + else { + error(_("unrecognized file format %s"), optarg); + return 1; + } + break; + case 'c': + rhwparams.channels = strtol(optarg, NULL, 0); + if (rhwparams.channels < 1 || rhwparams.channels > 32) { + error(_("value %i for channels is invalid"), rhwparams.channels); + return 1; + } + break; + case 'f': + if (strcasecmp(optarg, "cd") == 0 || strcasecmp(optarg, "cdr") == 0) { + if (strcasecmp(optarg, "cdr") == 0) + rhwparams.format = SND_PCM_FORMAT_S16_BE; + else + rhwparams.format = file_type == FORMAT_AU ? SND_PCM_FORMAT_S16_BE : SND_PCM_FORMAT_S16_LE; + rhwparams.rate = 44100; + rhwparams.channels = 2; + } else if (strcasecmp(optarg, "dat") == 0) { + rhwparams.format = file_type == FORMAT_AU ? SND_PCM_FORMAT_S16_BE : SND_PCM_FORMAT_S16_LE; + rhwparams.rate = 48000; + rhwparams.channels = 2; + } else { + rhwparams.format = snd_pcm_format_value(optarg); + if (rhwparams.format == SND_PCM_FORMAT_UNKNOWN) { + error(_("wrong extended format '%s'"), optarg); + prg_exit(EXIT_FAILURE); + } + } + break; + case 'r': + tmp = strtol(optarg, NULL, 0); + if (tmp < 300) + tmp *= 1000; + rhwparams.rate = tmp; + if (tmp < 2000 || tmp > 192000) { + error(_("bad speed value %i"), tmp); + return 1; + } + break; + case 'd': + timelimit = strtol(optarg, NULL, 0); + break; + case 'N': + nonblock = 1; + open_mode |= SND_PCM_NONBLOCK; + break; + case 'F': + period_time = strtol(optarg, NULL, 0); + break; + case 'B': + buffer_time = strtol(optarg, NULL, 0); + break; + case OPT_PERIOD_SIZE: + period_frames = strtol(optarg, NULL, 0); + break; + case OPT_BUFFER_SIZE: + buffer_frames = strtol(optarg, NULL, 0); + break; + case 'A': + avail_min = strtol(optarg, NULL, 0); + break; + case 'R': + start_delay = strtol(optarg, NULL, 0); + break; + case 'T': + stop_delay = strtol(optarg, NULL, 0); + break; + case 'v': + verbose++; + if (verbose > 1 && !vumeter) + vumeter = VUMETER_MONO; + break; + case 'V': + if (*optarg == 's') + vumeter = VUMETER_STEREO; + else if (*optarg == 'm') + vumeter = VUMETER_MONO; + else + vumeter = VUMETER_NONE; + break; + case 'M': + mmap_flag = 1; + break; + case 'I': + interleaved = 0; + break; + case 'P': + stream = SND_PCM_STREAM_PLAYBACK; + command = "aplay"; + break; + case 'C': + stream = SND_PCM_STREAM_CAPTURE; + command = "arecord"; + start_delay = 1; + if (file_type == FORMAT_DEFAULT) + file_type = FORMAT_WAVE; + break; + case OPT_DISABLE_RESAMPLE: + open_mode |= SND_PCM_NO_AUTO_RESAMPLE; + break; + case OPT_DISABLE_CHANNELS: + open_mode |= SND_PCM_NO_AUTO_CHANNELS; + break; + case OPT_DISABLE_FORMAT: + open_mode |= SND_PCM_NO_AUTO_FORMAT; + break; + case OPT_DISABLE_SOFTVOL: + open_mode |= SND_PCM_NO_SOFTVOL; + break; + case OPT_TEST_POSITION: + test_position = 1; + break; + case OPT_TEST_COEF: + test_coef = strtol(optarg, NULL, 0); + if (test_coef < 1) + test_coef = 1; + break; + case OPT_TEST_NOWAIT: + test_nowait = 1; + break; + case OPT_MAX_FILE_TIME: + max_file_time = strtol(optarg, NULL, 0); + break; + case OPT_PROCESS_ID_FILE: + pidfile_name = optarg; + break; + case OPT_USE_STRFTIME: + use_strftime = 1; + break; + default: + fprintf(stderr, _("Try `%s --help' for more information.\n"), command); + return 1; + } + } + + if (do_device_list) { + if (do_pcm_list) pcm_list(); + device_list(); + goto __end; + } else if (do_pcm_list) { + pcm_list(); + goto __end; + } + + err = snd_pcm_open(&handle, pcm_name, stream, open_mode); + if (err < 0) { + error(_("audio open error: %s"), snd_strerror(err)); + return 1; + } + + if ((err = snd_pcm_info(handle, info)) < 0) { + error(_("info error: %s"), snd_strerror(err)); + return 1; + } + + if (nonblock) { + err = snd_pcm_nonblock(handle, 1); + if (err < 0) { + error(_("nonblock setting error: %s"), snd_strerror(err)); + return 1; + } + } + + chunk_size = 1024; + hwparams = rhwparams; + + audiobuf = (u_char *)malloc(1024); + if (audiobuf == NULL) { + error(_("not enough memory")); + return 1; + } + + if (mmap_flag) { + writei_func = snd_pcm_mmap_writei; + readi_func = snd_pcm_mmap_readi; + writen_func = snd_pcm_mmap_writen; + readn_func = snd_pcm_mmap_readn; + } else { + writei_func = snd_pcm_writei; + readi_func = snd_pcm_readi; + writen_func = snd_pcm_writen; + readn_func = snd_pcm_readn; + } + + if (pidfile_name) { + errno = 0; + pidf = fopen (pidfile_name, "w"); + if (pidf) { + (void)fprintf (pidf, "%d\n", getpid()); + fclose(pidf); + pidfile_written = 1; + } else { + error(_("Cannot create process ID file %s: %s"), + pidfile_name, strerror (errno)); + return 1; + } + } + + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + signal(SIGABRT, signal_handler); + signal(SIGUSR1, signal_handler_recycle); + if (interleaved) { + if (optind > argc - 1) { + if (stream == SND_PCM_STREAM_PLAYBACK) + playback(NULL); + else + capture(NULL); + } else { + while (optind <= argc - 1) { + if (stream == SND_PCM_STREAM_PLAYBACK) + playback(argv[optind++]); + else + capture(argv[optind++]); + } + } + } else { + if (stream == SND_PCM_STREAM_PLAYBACK) + playbackv(&argv[optind], argc - optind); + else + capturev(&argv[optind], argc - optind); + } + if (verbose==2) + putchar('\n'); + snd_pcm_close(handle); + handle = NULL; + free(audiobuf); + __end: + snd_output_close(log); + snd_config_update_free_global(); + prg_exit(EXIT_SUCCESS); + /* avoid warning */ + return EXIT_SUCCESS; +} + +/* + * Safe read (for pipes) + */ + +static ssize_t safe_read(int fd, void *buf, size_t count) +{ + ssize_t result = 0, res; + + while (count > 0) { + if ((res = read(fd, buf, count)) == 0) + break; + if (res < 0) + return result > 0 ? result : res; + count -= res; + result += res; + buf = (char *)buf + res; + } + return result; +} + +/* + * Test, if it is a .VOC file and return >=0 if ok (this is the length of rest) + * < 0 if not + */ +static int test_vocfile(void *buffer) +{ + VocHeader *vp = buffer; + + if (!memcmp(vp->magic, VOC_MAGIC_STRING, 20)) { + vocminor = LE_SHORT(vp->version) & 0xFF; + vocmajor = LE_SHORT(vp->version) / 256; + if (LE_SHORT(vp->version) != (0x1233 - LE_SHORT(vp->coded_ver))) + return -2; /* coded version mismatch */ + return LE_SHORT(vp->headerlen) - sizeof(VocHeader); /* 0 mostly */ + } + return -1; /* magic string fail */ +} + +/* + * helper for test_wavefile + */ + +static size_t test_wavefile_read(int fd, u_char *buffer, size_t *size, size_t reqsize, int line) +{ + if (*size >= reqsize) + return *size; + if ((size_t)safe_read(fd, buffer + *size, reqsize - *size) != reqsize - *size) { + error(_("read error (called from line %i)"), line); + prg_exit(EXIT_FAILURE); + } + return *size = reqsize; +} + +#define check_wavefile_space(buffer, len, blimit) \ + if (len > blimit) { \ + blimit = len; \ + if ((buffer = realloc(buffer, blimit)) == NULL) { \ + error(_("not enough memory")); \ + prg_exit(EXIT_FAILURE); \ + } \ + } + +/* + * test, if it's a .WAV file, > 0 if ok (and set the speed, stereo etc.) + * == 0 if not + * Value returned is bytes to be discarded. + */ +static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size) +{ + WaveHeader *h = (WaveHeader *)_buffer; + u_char *buffer = NULL; + size_t blimit = 0; + WaveFmtBody *f; + WaveChunkHeader *c; + u_int type, len; + + if (size < sizeof(WaveHeader)) + return -1; + if (h->magic != WAV_RIFF || h->type != WAV_WAVE) + return -1; + if (size > sizeof(WaveHeader)) { + check_wavefile_space(buffer, size - sizeof(WaveHeader), blimit); + memcpy(buffer, _buffer + sizeof(WaveHeader), size - sizeof(WaveHeader)); + } + size -= sizeof(WaveHeader); + while (1) { + check_wavefile_space(buffer, sizeof(WaveChunkHeader), blimit); + test_wavefile_read(fd, buffer, &size, sizeof(WaveChunkHeader), __LINE__); + c = (WaveChunkHeader*)buffer; + type = c->type; + len = LE_INT(c->length); + len += len % 2; + if (size > sizeof(WaveChunkHeader)) + memmove(buffer, buffer + sizeof(WaveChunkHeader), size - sizeof(WaveChunkHeader)); + size -= sizeof(WaveChunkHeader); + if (type == WAV_FMT) + break; + check_wavefile_space(buffer, len, blimit); + test_wavefile_read(fd, buffer, &size, len, __LINE__); + if (size > len) + memmove(buffer, buffer + len, size - len); + size -= len; + } + + if (len < sizeof(WaveFmtBody)) { + error(_("unknown length of 'fmt ' chunk (read %u, should be %u at least)"), + len, (u_int)sizeof(WaveFmtBody)); + prg_exit(EXIT_FAILURE); + } + check_wavefile_space(buffer, len, blimit); + test_wavefile_read(fd, buffer, &size, len, __LINE__); + f = (WaveFmtBody*) buffer; + if (LE_SHORT(f->format) == WAV_FMT_EXTENSIBLE) { + WaveFmtExtensibleBody *fe = (WaveFmtExtensibleBody*)buffer; + if (len < sizeof(WaveFmtExtensibleBody)) { + error(_("unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)"), + len, (u_int)sizeof(WaveFmtExtensibleBody)); + prg_exit(EXIT_FAILURE); + } + if (memcmp(fe->guid_tag, WAV_GUID_TAG, 14) != 0) { + error(_("wrong format tag in extensible 'fmt ' chunk")); + prg_exit(EXIT_FAILURE); + } + f->format = fe->guid_format; + } + if (LE_SHORT(f->format) != WAV_FMT_PCM && + LE_SHORT(f->format) != WAV_FMT_IEEE_FLOAT) { + error(_("can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded"), LE_SHORT(f->format)); + prg_exit(EXIT_FAILURE); + } + if (LE_SHORT(f->channels) < 1) { + error(_("can't play WAVE-files with %d tracks"), LE_SHORT(f->channels)); + prg_exit(EXIT_FAILURE); + } + hwparams.channels = LE_SHORT(f->channels); + switch (LE_SHORT(f->bit_p_spl)) { + case 8: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_U8) + fprintf(stderr, _("Warning: format is changed to U8\n")); + hwparams.format = SND_PCM_FORMAT_U8; + break; + case 16: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_S16_LE) + fprintf(stderr, _("Warning: format is changed to S16_LE\n")); + hwparams.format = SND_PCM_FORMAT_S16_LE; + break; + case 24: + switch (LE_SHORT(f->byte_p_spl) / hwparams.channels) { + case 3: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_S24_3LE) + fprintf(stderr, _("Warning: format is changed to S24_3LE\n")); + hwparams.format = SND_PCM_FORMAT_S24_3LE; + break; + case 4: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_S24_LE) + fprintf(stderr, _("Warning: format is changed to S24_LE\n")); + hwparams.format = SND_PCM_FORMAT_S24_LE; + break; + default: + error(_(" can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)"), + LE_SHORT(f->bit_p_spl), LE_SHORT(f->byte_p_spl), hwparams.channels); + prg_exit(EXIT_FAILURE); + } + break; + case 32: + if (LE_SHORT(f->format) == WAV_FMT_PCM) + hwparams.format = SND_PCM_FORMAT_S32_LE; + else if (LE_SHORT(f->format) == WAV_FMT_IEEE_FLOAT) + hwparams.format = SND_PCM_FORMAT_FLOAT_LE; + break; + default: + error(_(" can't play WAVE-files with sample %d bits wide"), + LE_SHORT(f->bit_p_spl)); + prg_exit(EXIT_FAILURE); + } + hwparams.rate = LE_INT(f->sample_fq); + + if (size > len) + memmove(buffer, buffer + len, size - len); + size -= len; + + while (1) { + u_int type, len; + + check_wavefile_space(buffer, sizeof(WaveChunkHeader), blimit); + test_wavefile_read(fd, buffer, &size, sizeof(WaveChunkHeader), __LINE__); + c = (WaveChunkHeader*)buffer; + type = c->type; + len = LE_INT(c->length); + if (size > sizeof(WaveChunkHeader)) + memmove(buffer, buffer + sizeof(WaveChunkHeader), size - sizeof(WaveChunkHeader)); + size -= sizeof(WaveChunkHeader); + if (type == WAV_DATA) { + if (len < pbrec_count && len < 0x7ffffffe) + pbrec_count = len; + if (size > 0) + memcpy(_buffer, buffer, size); + free(buffer); + return size; + } + len += len % 2; + check_wavefile_space(buffer, len, blimit); + test_wavefile_read(fd, buffer, &size, len, __LINE__); + if (size > len) + memmove(buffer, buffer + len, size - len); + size -= len; + } + + /* shouldn't be reached */ + return -1; +} + +/* + + */ + +static int test_au(int fd, void *buffer) +{ + AuHeader *ap = buffer; + + if (ap->magic != AU_MAGIC) + return -1; + if (BE_INT(ap->hdr_size) > 128 || BE_INT(ap->hdr_size) < 24) + return -1; + pbrec_count = BE_INT(ap->data_size); + switch (BE_INT(ap->encoding)) { + case AU_FMT_ULAW: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_MU_LAW) + fprintf(stderr, _("Warning: format is changed to MU_LAW\n")); + hwparams.format = SND_PCM_FORMAT_MU_LAW; + break; + case AU_FMT_LIN8: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_U8) + fprintf(stderr, _("Warning: format is changed to U8\n")); + hwparams.format = SND_PCM_FORMAT_U8; + break; + case AU_FMT_LIN16: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_S16_BE) + fprintf(stderr, _("Warning: format is changed to S16_BE\n")); + hwparams.format = SND_PCM_FORMAT_S16_BE; + break; + default: + return -1; + } + hwparams.rate = BE_INT(ap->sample_rate); + if (hwparams.rate < 2000 || hwparams.rate > 256000) + return -1; + hwparams.channels = BE_INT(ap->channels); + if (hwparams.channels < 1 || hwparams.channels > 128) + return -1; + if ((size_t)safe_read(fd, buffer + sizeof(AuHeader), BE_INT(ap->hdr_size) - sizeof(AuHeader)) != BE_INT(ap->hdr_size) - sizeof(AuHeader)) { + error(_("read error")); + prg_exit(EXIT_FAILURE); + } + return 0; +} + +static void show_available_sample_formats(snd_pcm_hw_params_t* params) +{ + snd_pcm_format_t format; + + fprintf(stderr, "Available formats:\n"); + for (format = 0; format < SND_PCM_FORMAT_LAST; format++) { + if (snd_pcm_hw_params_test_format(handle, params, format) == 0) + fprintf(stderr, "- %s\n", snd_pcm_format_name(format)); + } +} + +static void set_params(void) +{ + snd_pcm_hw_params_t *params; + snd_pcm_sw_params_t *swparams; + snd_pcm_uframes_t buffer_size; + int err; + size_t n; + unsigned int rate; + snd_pcm_uframes_t start_threshold, stop_threshold; + snd_pcm_hw_params_alloca(¶ms); + snd_pcm_sw_params_alloca(&swparams); + err = snd_pcm_hw_params_any(handle, params); + if (err < 0) { + error(_("Broken configuration for this PCM: no configurations available")); + prg_exit(EXIT_FAILURE); + } + if (mmap_flag) { + snd_pcm_access_mask_t *mask = alloca(snd_pcm_access_mask_sizeof()); + snd_pcm_access_mask_none(mask); + snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED); + snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED); + snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX); + err = snd_pcm_hw_params_set_access_mask(handle, params, mask); + } else if (interleaved) + err = snd_pcm_hw_params_set_access(handle, params, + SND_PCM_ACCESS_RW_INTERLEAVED); + else + err = snd_pcm_hw_params_set_access(handle, params, + SND_PCM_ACCESS_RW_NONINTERLEAVED); + if (err < 0) { + error(_("Access type not available")); + prg_exit(EXIT_FAILURE); + } + err = snd_pcm_hw_params_set_format(handle, params, hwparams.format); + if (err < 0) { + error(_("Sample format non available")); + show_available_sample_formats(params); + prg_exit(EXIT_FAILURE); + } + err = snd_pcm_hw_params_set_channels(handle, params, hwparams.channels); + if (err < 0) { + error(_("Channels count non available")); + prg_exit(EXIT_FAILURE); + } + +#if 0 + err = snd_pcm_hw_params_set_periods_min(handle, params, 2); + assert(err >= 0); +#endif + rate = hwparams.rate; + err = snd_pcm_hw_params_set_rate_near(handle, params, &hwparams.rate, 0); + assert(err >= 0); + if ((float)rate * 1.05 < hwparams.rate || (float)rate * 0.95 > hwparams.rate) { + if (!quiet_mode) { + char plugex[64]; + const char *pcmname = snd_pcm_name(handle); + fprintf(stderr, _("Warning: rate is not accurate (requested = %iHz, got = %iHz)\n"), rate, hwparams.rate); + if (! pcmname || strchr(snd_pcm_name(handle), ':')) + *plugex = 0; + else + snprintf(plugex, sizeof(plugex), "(-Dplug:%s)", + snd_pcm_name(handle)); + fprintf(stderr, _(" please, try the plug plugin %s\n"), + plugex); + } + } + rate = hwparams.rate; + if (buffer_time == 0 && buffer_frames == 0) { + err = snd_pcm_hw_params_get_buffer_time_max(params, + &buffer_time, 0); + assert(err >= 0); + if (buffer_time > 500000) + buffer_time = 500000; + } + if (period_time == 0 && period_frames == 0) { + if (buffer_time > 0) + period_time = buffer_time / 4; + else + period_frames = buffer_frames / 4; + } + if (period_time > 0) + err = snd_pcm_hw_params_set_period_time_near(handle, params, + &period_time, 0); + else + err = snd_pcm_hw_params_set_period_size_near(handle, params, + &period_frames, 0); + assert(err >= 0); + if (buffer_time > 0) { + err = snd_pcm_hw_params_set_buffer_time_near(handle, params, + &buffer_time, 0); + } else { + err = snd_pcm_hw_params_set_buffer_size_near(handle, params, + &buffer_frames); + } + assert(err >= 0); + monotonic = snd_pcm_hw_params_is_monotonic(params); + can_pause = snd_pcm_hw_params_can_pause(params); + err = snd_pcm_hw_params(handle, params); + if (err < 0) { + error(_("Unable to install hw params:")); + snd_pcm_hw_params_dump(params, log); + prg_exit(EXIT_FAILURE); + } + snd_pcm_hw_params_get_period_size(params, &chunk_size, 0); + snd_pcm_hw_params_get_buffer_size(params, &buffer_size); + if (chunk_size == buffer_size) { + error(_("Can't use period equal to buffer size (%lu == %lu)"), + chunk_size, buffer_size); + prg_exit(EXIT_FAILURE); + } + snd_pcm_sw_params_current(handle, swparams); + if (avail_min < 0) + n = chunk_size; + else + n = (double) rate * avail_min / 1000000; + err = snd_pcm_sw_params_set_avail_min(handle, swparams, n); + + /* round up to closest transfer boundary */ + n = buffer_size; + if (start_delay <= 0) { + start_threshold = n + (double) rate * start_delay / 1000000; + } else + start_threshold = (double) rate * start_delay / 1000000; + if (start_threshold < 1) + start_threshold = 1; + if (start_threshold > n) + start_threshold = n; + err = snd_pcm_sw_params_set_start_threshold(handle, swparams, start_threshold); + assert(err >= 0); + if (stop_delay <= 0) + stop_threshold = buffer_size + (double) rate * stop_delay / 1000000; + else + stop_threshold = (double) rate * stop_delay / 1000000; + err = snd_pcm_sw_params_set_stop_threshold(handle, swparams, stop_threshold); + assert(err >= 0); + + if (snd_pcm_sw_params(handle, swparams) < 0) { + error(_("unable to install sw params:")); + snd_pcm_sw_params_dump(swparams, log); + prg_exit(EXIT_FAILURE); + } + + if (verbose) + snd_pcm_dump(handle, log); + + bits_per_sample = snd_pcm_format_physical_width(hwparams.format); + bits_per_frame = bits_per_sample * hwparams.channels; + chunk_bytes = chunk_size * bits_per_frame / 8; + audiobuf = realloc(audiobuf, chunk_bytes); + if (audiobuf == NULL) { + error(_("not enough memory")); + prg_exit(EXIT_FAILURE); + } + // fprintf(stderr, "real chunk_size = %i, frags = %i, total = %i\n", chunk_size, setup.buf.block.frags, setup.buf.block.frags * chunk_size); + + /* stereo VU-meter isn't always available... */ + if (vumeter == VUMETER_STEREO) { + if (hwparams.channels != 2 || !interleaved || verbose > 2) + vumeter = VUMETER_MONO; + } + + /* show mmap buffer arragment */ + if (mmap_flag && verbose) { + const snd_pcm_channel_area_t *areas; + snd_pcm_uframes_t offset, size = chunk_size; + int i; + err = snd_pcm_mmap_begin(handle, &areas, &offset, &size); + if (err < 0) { + error(_("snd_pcm_mmap_begin problem: %s"), snd_strerror(err)); + prg_exit(EXIT_FAILURE); + } + for (i = 0; i < hwparams.channels; i++) + fprintf(stderr, "mmap_area[%i] = %p,%u,%u (%u)\n", i, areas[i].addr, areas[i].first, areas[i].step, snd_pcm_format_physical_width(hwparams.format)); + /* not required, but for sure */ + snd_pcm_mmap_commit(handle, offset, 0); + } + + buffer_frames = buffer_size; /* for position test */ +} + +static void init_stdin(void) +{ + struct termios term; + long flags; + + tcgetattr(fileno(stdin), &term); + term_c_lflag = term.c_lflag; + if (fd == fileno(stdin)) + return; + flags = fcntl(fileno(stdin), F_GETFL); + if (flags < 0 || fcntl(fileno(stdin), F_SETFL, flags|O_NONBLOCK) < 0) + fprintf(stderr, _("stdin O_NONBLOCK flag setup failed\n")); + term.c_lflag &= ~ICANON; + tcsetattr(fileno(stdin), TCSANOW, &term); +} + +static void done_stdin(void) +{ + struct termios term; + + if (fd == fileno(stdin) || term_c_lflag == -1) + return; + tcgetattr(fileno(stdin), &term); + term.c_lflag = term_c_lflag; + tcsetattr(fileno(stdin), TCSANOW, &term); +} + +static void do_pause(void) +{ + int err; + unsigned char b; + + if (!can_pause) { + fprintf(stderr, _("\rPAUSE command ignored (no hw support)\n")); + return; + } + err = snd_pcm_pause(handle, 1); + if (err < 0) { + error(_("pause push error: %s"), snd_strerror(err)); + return; + } + while (1) { + while (read(fileno(stdin), &b, 1) != 1); + if (b == ' ' || b == '\r') { + while (read(fileno(stdin), &b, 1) == 1); + err = snd_pcm_pause(handle, 0); + if (err < 0) + error(_("pause release error: %s"), snd_strerror(err)); + return; + } + } +} + +static void check_stdin(void) +{ + unsigned char b; + + if (fd != fileno(stdin)) { + while (read(fileno(stdin), &b, 1) == 1) { + if (b == ' ' || b == '\r') { + while (read(fileno(stdin), &b, 1) == 1); + fprintf(stderr, _("\r=== PAUSE === ")); + fflush(stderr); + do_pause(); + fprintf(stderr, " \r"); + fflush(stderr); + } + } + } +} + +#ifndef timersub +#define timersub(a, b, result) \ +do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ + if ((result)->tv_usec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_usec += 1000000; \ + } \ +} while (0) +#endif + +#ifndef timermsub +#define timermsub(a, b, result) \ +do { \ + (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ + (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \ + if ((result)->tv_nsec < 0) { \ + --(result)->tv_sec; \ + (result)->tv_nsec += 1000000000L; \ + } \ +} while (0) +#endif + +/* I/O error handler */ +static void xrun(void) +{ + snd_pcm_status_t *status; + int res; + + snd_pcm_status_alloca(&status); + if ((res = snd_pcm_status(handle, status))<0) { + error(_("status error: %s"), snd_strerror(res)); + prg_exit(EXIT_FAILURE); + } + if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) { + if (monotonic) { +#ifdef HAVE_CLOCK_GETTIME + struct timespec now, diff, tstamp; + clock_gettime(CLOCK_MONOTONIC, &now); + snd_pcm_status_get_trigger_htstamp(status, &tstamp); + timermsub(&now, &tstamp, &diff); + fprintf(stderr, _("%s!!! (at least %.3f ms long)\n"), + stream == SND_PCM_STREAM_PLAYBACK ? _("underrun") : _("overrun"), + diff.tv_sec * 1000 + diff.tv_nsec / 10000000.0); +#else + fprintf(stderr, "%s !!!\n", _("underrun")); +#endif + } else { + struct timeval now, diff, tstamp; + gettimeofday(&now, 0); + snd_pcm_status_get_trigger_tstamp(status, &tstamp); + timersub(&now, &tstamp, &diff); + fprintf(stderr, _("%s!!! (at least %.3f ms long)\n"), + stream == SND_PCM_STREAM_PLAYBACK ? _("underrun") : _("overrun"), + diff.tv_sec * 1000 + diff.tv_usec / 1000.0); + } + if (verbose) { + fprintf(stderr, _("Status:\n")); + snd_pcm_status_dump(status, log); + } + if ((res = snd_pcm_prepare(handle))<0) { + error(_("xrun: prepare error: %s"), snd_strerror(res)); + prg_exit(EXIT_FAILURE); + } + return; /* ok, data should be accepted again */ + } if (snd_pcm_status_get_state(status) == SND_PCM_STATE_DRAINING) { + if (verbose) { + fprintf(stderr, _("Status(DRAINING):\n")); + snd_pcm_status_dump(status, log); + } + if (stream == SND_PCM_STREAM_CAPTURE) { + fprintf(stderr, _("capture stream format change? attempting recover...\n")); + if ((res = snd_pcm_prepare(handle))<0) { + error(_("xrun(DRAINING): prepare error: %s"), snd_strerror(res)); + prg_exit(EXIT_FAILURE); + } + return; + } + } + if (verbose) { + fprintf(stderr, _("Status(R/W):\n")); + snd_pcm_status_dump(status, log); + } + error(_("read/write error, state = %s"), snd_pcm_state_name(snd_pcm_status_get_state(status))); + prg_exit(EXIT_FAILURE); +} + +/* I/O suspend handler */ +static void suspend(void) +{ + int res; + + if (!quiet_mode) + fprintf(stderr, _("Suspended. Trying resume. ")); fflush(stderr); + while ((res = snd_pcm_resume(handle)) == -EAGAIN) + sleep(1); /* wait until suspend flag is released */ + if (res < 0) { + if (!quiet_mode) + fprintf(stderr, _("Failed. Restarting stream. ")); fflush(stderr); + if ((res = snd_pcm_prepare(handle)) < 0) { + error(_("suspend: prepare error: %s"), snd_strerror(res)); + prg_exit(EXIT_FAILURE); + } + } + if (!quiet_mode) + fprintf(stderr, _("Done.\n")); +} + +static void print_vu_meter_mono(int perc, int maxperc) +{ + const int bar_length = 50; + char line[80]; + int val; + + for (val = 0; val <= perc * bar_length / 100 && val < bar_length; val++) + line[val] = '#'; + for (; val <= maxperc * bar_length / 100 && val < bar_length; val++) + line[val] = ' '; + line[val] = '+'; + for (++val; val <= bar_length; val++) + line[val] = ' '; + if (maxperc > 99) + sprintf(line + val, "| MAX"); + else + sprintf(line + val, "| %02i%%", maxperc); + fputs(line, stdout); + if (perc > 100) + printf(_(" !clip ")); +} + +static void print_vu_meter_stereo(int *perc, int *maxperc) +{ + const int bar_length = 35; + char line[80]; + int c; + + memset(line, ' ', sizeof(line) - 1); + line[bar_length + 3] = '|'; + + for (c = 0; c < 2; c++) { + int p = perc[c] * bar_length / 100; + char tmp[4]; + if (p > bar_length) + p = bar_length; + if (c) + memset(line + bar_length + 6 + 1, '#', p); + else + memset(line + bar_length - p - 1, '#', p); + p = maxperc[c] * bar_length / 100; + if (p > bar_length) + p = bar_length; + if (c) + line[bar_length + 6 + 1 + p] = '+'; + else + line[bar_length - p - 1] = '+'; + if (maxperc[c] > 99) + sprintf(tmp, "MAX"); + else + sprintf(tmp, "%02d%%", maxperc[c]); + if (c) + memcpy(line + bar_length + 3 + 1, tmp, 3); + else + memcpy(line + bar_length, tmp, 3); + } + line[bar_length * 2 + 6 + 2] = 0; + fputs(line, stdout); +} + +static void print_vu_meter(signed int *perc, signed int *maxperc) +{ + if (vumeter == VUMETER_STEREO) + print_vu_meter_stereo(perc, maxperc); + else + print_vu_meter_mono(*perc, *maxperc); +} + +/* peak handler */ +static void compute_max_peak(u_char *data, size_t count) +{ + signed int val, max, perc[2], max_peak[2]; + static int run = 0; + size_t ocount = count; + int format_little_endian = snd_pcm_format_little_endian(hwparams.format); + int ichans, c; + + if (vumeter == VUMETER_STEREO) + ichans = 2; + else + ichans = 1; + + memset(max_peak, 0, sizeof(max_peak)); + switch (bits_per_sample) { + case 8: { + signed char *valp = (signed char *)data; + signed char mask = snd_pcm_format_silence(hwparams.format); + c = 0; + while (count-- > 0) { + val = *valp++ ^ mask; + val = abs(val); + if (max_peak[c] < val) + max_peak[c] = val; + if (vumeter == VUMETER_STEREO) + c = !c; + } + break; + } + case 16: { + signed short *valp = (signed short *)data; + signed short mask = snd_pcm_format_silence_16(hwparams.format); + signed short sval; + + count /= 2; + c = 0; + while (count-- > 0) { + if (format_little_endian) + sval = __le16_to_cpu(*valp); + else + sval = __be16_to_cpu(*valp); + sval = abs(sval) ^ mask; + if (max_peak[c] < sval) + max_peak[c] = sval; + valp++; + if (vumeter == VUMETER_STEREO) + c = !c; + } + break; + } + case 24: { + unsigned char *valp = data; + signed int mask = snd_pcm_format_silence_32(hwparams.format); + + count /= 3; + c = 0; + while (count-- > 0) { + if (format_little_endian) { + val = valp[0] | (valp[1]<<8) | (valp[2]<<16); + } else { + val = (valp[0]<<16) | (valp[1]<<8) | valp[2]; + } + /* Correct signed bit in 32-bit value */ + if (val & (1<<(bits_per_sample-1))) { + val |= 0xff<<24; /* Negate upper bits too */ + } + val = abs(val) ^ mask; + if (max_peak[c] < val) + max_peak[c] = val; + valp += 3; + if (vumeter == VUMETER_STEREO) + c = !c; + } + break; + } + case 32: { + signed int *valp = (signed int *)data; + signed int mask = snd_pcm_format_silence_32(hwparams.format); + + count /= 4; + c = 0; + while (count-- > 0) { + if (format_little_endian) + val = __le32_to_cpu(*valp); + else + val = __be32_to_cpu(*valp); + val = abs(val) ^ mask; + if (max_peak[c] < val) + max_peak[c] = val; + valp++; + if (vumeter == VUMETER_STEREO) + c = !c; + } + break; + } + default: + if (run == 0) { + fprintf(stderr, _("Unsupported bit size %d.\n"), (int)bits_per_sample); + run = 1; + } + return; + } + max = 1 << (bits_per_sample-1); + if (max <= 0) + max = 0x7fffffff; + + for (c = 0; c < ichans; c++) { + if (bits_per_sample > 16) + perc[c] = max_peak[c] / (max / 100); + else + perc[c] = max_peak[c] * 100 / max; + } + + if (interleaved && verbose <= 2) { + static int maxperc[2]; + static time_t t=0; + const time_t tt=time(NULL); + if(tt>t) { + t=tt; + maxperc[0] = 0; + maxperc[1] = 0; + } + for (c = 0; c < ichans; c++) + if (perc[c] > maxperc[c]) + maxperc[c] = perc[c]; + + putchar('\r'); + print_vu_meter(perc, maxperc); + fflush(stdout); + } + else if(verbose==3) { + printf(_("Max peak (%li samples): 0x%08x "), (long)ocount, max_peak[0]); + for (val = 0; val < 20; val++) + if (val <= perc[0] / 5) + putchar('#'); + else + putchar(' '); + printf(" %i%%\n", perc[0]); + fflush(stdout); + } +} + +static void do_test_position(void) +{ + static long counter = 0; + static time_t tmr = -1; + time_t now; + static float availsum, delaysum, samples; + static snd_pcm_sframes_t maxavail, maxdelay; + static snd_pcm_sframes_t minavail, mindelay; + static snd_pcm_sframes_t badavail = 0, baddelay = 0; + snd_pcm_sframes_t outofrange; + snd_pcm_sframes_t avail, delay; + int err; + + err = snd_pcm_avail_delay(handle, &avail, &delay); + if (err < 0) + return; + outofrange = (test_coef * (snd_pcm_sframes_t)buffer_frames) / 2; + if (avail > outofrange || avail < -outofrange || + delay > outofrange || delay < -outofrange) { + badavail = avail; baddelay = delay; + availsum = delaysum = samples = 0; + maxavail = maxdelay = 0; + minavail = mindelay = buffer_frames * 16; + fprintf(stderr, _("Suspicious buffer position (%li total): " + "avail = %li, delay = %li, buffer = %li\n"), + ++counter, (long)avail, (long)delay, (long)buffer_frames); + } else if (verbose) { + time(&now); + if (tmr == (time_t) -1) { + tmr = now; + availsum = delaysum = samples = 0; + maxavail = maxdelay = 0; + minavail = mindelay = buffer_frames * 16; + } + if (avail > maxavail) + maxavail = avail; + if (delay > maxdelay) + maxdelay = delay; + if (avail < minavail) + minavail = avail; + if (delay < mindelay) + mindelay = delay; + availsum += avail; + delaysum += delay; + samples++; + if (avail != 0 && now != tmr) { + fprintf(stderr, "BUFPOS: avg%li/%li " + "min%li/%li max%li/%li (%li) (%li:%li/%li)\n", + (long)(availsum / samples), + (long)(delaysum / samples), + (long)minavail, (long)mindelay, + (long)maxavail, (long)maxdelay, + (long)buffer_frames, + counter, badavail, baddelay); + tmr = now; + } + } +} + +/* + * write function + */ + +static ssize_t pcm_write(u_char *data, size_t count) +{ + ssize_t r; + ssize_t result = 0; + + if (count < chunk_size) { + snd_pcm_format_set_silence(hwparams.format, data + count * bits_per_frame / 8, (chunk_size - count) * hwparams.channels); + count = chunk_size; + } + while (count > 0) { + if (test_position) + do_test_position(); + check_stdin(); + r = writei_func(handle, data, count); + if (test_position) + do_test_position(); + if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { + if (!test_nowait) + snd_pcm_wait(handle, 100); + } else if (r == -EPIPE) { + xrun(); + } else if (r == -ESTRPIPE) { + suspend(); + } else if (r < 0) { + error(_("write error: %s"), snd_strerror(r)); + prg_exit(EXIT_FAILURE); + } + if (r > 0) { + if (vumeter) + compute_max_peak(data, r * hwparams.channels); + result += r; + count -= r; + data += r * bits_per_frame / 8; + } + } + return result; +} + +static ssize_t pcm_writev(u_char **data, unsigned int channels, size_t count) +{ + ssize_t r; + size_t result = 0; + + if (count != chunk_size) { + unsigned int channel; + size_t offset = count; + size_t remaining = chunk_size - count; + for (channel = 0; channel < channels; channel++) + snd_pcm_format_set_silence(hwparams.format, data[channel] + offset * bits_per_sample / 8, remaining); + count = chunk_size; + } + while (count > 0) { + unsigned int channel; + void *bufs[channels]; + size_t offset = result; + for (channel = 0; channel < channels; channel++) + bufs[channel] = data[channel] + offset * bits_per_sample / 8; + if (test_position) + do_test_position(); + check_stdin(); + r = writen_func(handle, bufs, count); + if (test_position) + do_test_position(); + if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { + if (!test_nowait) + snd_pcm_wait(handle, 100); + } else if (r == -EPIPE) { + xrun(); + } else if (r == -ESTRPIPE) { + suspend(); + } else if (r < 0) { + error(_("writev error: %s"), snd_strerror(r)); + prg_exit(EXIT_FAILURE); + } + if (r > 0) { + if (vumeter) { + for (channel = 0; channel < channels; channel++) + compute_max_peak(data[channel], r); + } + result += r; + count -= r; + } + } + return result; +} + +/* + * read function + */ + +static ssize_t pcm_read(u_char *data, size_t rcount) +{ + ssize_t r; + size_t result = 0; + size_t count = rcount; + + if (count != chunk_size) { + count = chunk_size; + } + + while (count > 0) { + if (test_position) + do_test_position(); + check_stdin(); + r = readi_func(handle, data, count); + if (test_position) + do_test_position(); + if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { + if (!test_nowait) + snd_pcm_wait(handle, 100); + } else if (r == -EPIPE) { + xrun(); + } else if (r == -ESTRPIPE) { + suspend(); + } else if (r < 0) { + error(_("read error: %s"), snd_strerror(r)); + prg_exit(EXIT_FAILURE); + } + if (r > 0) { + if (vumeter) + compute_max_peak(data, r * hwparams.channels); + result += r; + count -= r; + data += r * bits_per_frame / 8; + } + } + return rcount; +} + +static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount) +{ + ssize_t r; + size_t result = 0; + size_t count = rcount; + + if (count != chunk_size) { + count = chunk_size; + } + + while (count > 0) { + unsigned int channel; + void *bufs[channels]; + size_t offset = result; + for (channel = 0; channel < channels; channel++) + bufs[channel] = data[channel] + offset * bits_per_sample / 8; + if (test_position) + do_test_position(); + check_stdin(); + r = readn_func(handle, bufs, count); + if (test_position) + do_test_position(); + if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { + if (!test_nowait) + snd_pcm_wait(handle, 100); + } else if (r == -EPIPE) { + xrun(); + } else if (r == -ESTRPIPE) { + suspend(); + } else if (r < 0) { + error(_("readv error: %s"), snd_strerror(r)); + prg_exit(EXIT_FAILURE); + } + if (r > 0) { + if (vumeter) { + for (channel = 0; channel < channels; channel++) + compute_max_peak(data[channel], r); + } + result += r; + count -= r; + } + } + return rcount; +} + +/* + * ok, let's play a .voc file + */ + +static ssize_t voc_pcm_write(u_char *data, size_t count) +{ + ssize_t result = count, r; + size_t size; + + while (count > 0) { + size = count; + if (size > chunk_bytes - buffer_pos) + size = chunk_bytes - buffer_pos; + memcpy(audiobuf + buffer_pos, data, size); + data += size; + count -= size; + buffer_pos += size; + if ((size_t)buffer_pos == chunk_bytes) { + if ((size_t)(r = pcm_write(audiobuf, chunk_size)) != chunk_size) + return r; + buffer_pos = 0; + } + } + return result; +} + +static void voc_write_silence(unsigned x) +{ + unsigned l; + u_char *buf; + + buf = (u_char *) malloc(chunk_bytes); + if (buf == NULL) { + error(_("can't allocate buffer for silence")); + return; /* not fatal error */ + } + snd_pcm_format_set_silence(hwparams.format, buf, chunk_size * hwparams.channels); + while (x > 0) { + l = x; + if (l > chunk_size) + l = chunk_size; + if (voc_pcm_write(buf, l) != (ssize_t)l) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + x -= l; + } + free(buf); +} + +static void voc_pcm_flush(void) +{ + if (buffer_pos > 0) { + size_t b; + if (snd_pcm_format_set_silence(hwparams.format, audiobuf + buffer_pos, chunk_bytes - buffer_pos * 8 / bits_per_sample) < 0) + fprintf(stderr, _("voc_pcm_flush - silence error")); + b = chunk_size; + if (pcm_write(audiobuf, b) != (ssize_t)b) + error(_("voc_pcm_flush error")); + } + snd_pcm_nonblock(handle, 0); + snd_pcm_drain(handle); + snd_pcm_nonblock(handle, nonblock); +} + +static void voc_play(int fd, int ofs, char *name) +{ + int l; + VocBlockType *bp; + VocVoiceData *vd; + VocExtBlock *eb; + size_t nextblock, in_buffer; + u_char *data, *buf; + char was_extended = 0, output = 0; + u_short *sp, repeat = 0; + size_t silence; + off64_t filepos = 0; + +#define COUNT(x) nextblock -= x; in_buffer -= x; data += x +#define COUNT1(x) in_buffer -= x; data += x + + data = buf = (u_char *)malloc(64 * 1024); + buffer_pos = 0; + if (data == NULL) { + error(_("malloc error")); + prg_exit(EXIT_FAILURE); + } + if (!quiet_mode) { + fprintf(stderr, _("Playing Creative Labs Channel file '%s'...\n"), name); + } + /* first we waste the rest of header, ugly but we don't need seek */ + while (ofs > (ssize_t)chunk_bytes) { + if ((size_t)safe_read(fd, buf, chunk_bytes) != chunk_bytes) { + error(_("read error")); + prg_exit(EXIT_FAILURE); + } + ofs -= chunk_bytes; + } + if (ofs) { + if (safe_read(fd, buf, ofs) != ofs) { + error(_("read error")); + prg_exit(EXIT_FAILURE); + } + } + hwparams.format = DEFAULT_FORMAT; + hwparams.channels = 1; + hwparams.rate = DEFAULT_SPEED; + set_params(); + + in_buffer = nextblock = 0; + while (1) { + Fill_the_buffer: /* need this for repeat */ + if (in_buffer < 32) { + /* move the rest of buffer to pos 0 and fill the buf up */ + if (in_buffer) + memcpy(buf, data, in_buffer); + data = buf; + if ((l = safe_read(fd, buf + in_buffer, chunk_bytes - in_buffer)) > 0) + in_buffer += l; + else if (!in_buffer) { + /* the file is truncated, so simulate 'Terminator' + and reduce the datablock for safe landing */ + nextblock = buf[0] = 0; + if (l == -1) { + perror(name); + prg_exit(EXIT_FAILURE); + } + } + } + while (!nextblock) { /* this is a new block */ + if (in_buffer < sizeof(VocBlockType)) + goto __end; + bp = (VocBlockType *) data; + COUNT1(sizeof(VocBlockType)); + nextblock = VOC_DATALEN(bp); + if (output && !quiet_mode) + fprintf(stderr, "\n"); /* write /n after ASCII-out */ + output = 0; + switch (bp->type) { + case 0: +#if 0 + d_printf("Terminator\n"); +#endif + return; /* VOC-file stop */ + case 1: + vd = (VocVoiceData *) data; + COUNT1(sizeof(VocVoiceData)); + /* we need a SYNC, before we can set new SPEED, STEREO ... */ + + if (!was_extended) { + hwparams.rate = (int) (vd->tc); + hwparams.rate = 1000000 / (256 - hwparams.rate); +#if 0 + d_printf("Channel data %d Hz\n", dsp_speed); +#endif + if (vd->pack) { /* /dev/dsp can't it */ + error(_("can't play packed .voc files")); + return; + } + if (hwparams.channels == 2) /* if we are in Stereo-Mode, switch back */ + hwparams.channels = 1; + } else { /* there was extended block */ + hwparams.channels = 2; + was_extended = 0; + } + set_params(); + break; + case 2: /* nothing to do, pure data */ +#if 0 + d_printf("Channel continuation\n"); +#endif + break; + case 3: /* a silence block, no data, only a count */ + sp = (u_short *) data; + COUNT1(sizeof(u_short)); + hwparams.rate = (int) (*data); + COUNT1(1); + hwparams.rate = 1000000 / (256 - hwparams.rate); + set_params(); + silence = (((size_t) * sp) * 1000) / hwparams.rate; +#if 0 + d_printf("Silence for %d ms\n", (int) silence); +#endif + voc_write_silence(*sp); + break; + case 4: /* a marker for syncronisation, no effect */ + sp = (u_short *) data; + COUNT1(sizeof(u_short)); +#if 0 + d_printf("Marker %d\n", *sp); +#endif + break; + case 5: /* ASCII text, we copy to stderr */ + output = 1; +#if 0 + d_printf("ASCII - text :\n"); +#endif + break; + case 6: /* repeat marker, says repeatcount */ + /* my specs don't say it: maybe this can be recursive, but + I don't think somebody use it */ + repeat = *(u_short *) data; + COUNT1(sizeof(u_short)); +#if 0 + d_printf("Repeat loop %d times\n", repeat); +#endif + if (filepos >= 0) { /* if < 0, one seek fails, why test another */ + if ((filepos = lseek64(fd, 0, 1)) < 0) { + error(_("can't play loops; %s isn't seekable\n"), name); + repeat = 0; + } else { + filepos -= in_buffer; /* set filepos after repeat */ + } + } else { + repeat = 0; + } + break; + case 7: /* ok, lets repeat that be rewinding tape */ + if (repeat) { + if (repeat != 0xFFFF) { +#if 0 + d_printf("Repeat loop %d\n", repeat); +#endif + --repeat; + } +#if 0 + else + d_printf("Neverending loop\n"); +#endif + lseek64(fd, filepos, 0); + in_buffer = 0; /* clear the buffer */ + goto Fill_the_buffer; + } +#if 0 + else + d_printf("End repeat loop\n"); +#endif + break; + case 8: /* the extension to play Stereo, I have SB 1.0 :-( */ + was_extended = 1; + eb = (VocExtBlock *) data; + COUNT1(sizeof(VocExtBlock)); + hwparams.rate = (int) (eb->tc); + hwparams.rate = 256000000L / (65536 - hwparams.rate); + hwparams.channels = eb->mode == VOC_MODE_STEREO ? 2 : 1; + if (hwparams.channels == 2) + hwparams.rate = hwparams.rate >> 1; + if (eb->pack) { /* /dev/dsp can't it */ + error(_("can't play packed .voc files")); + return; + } +#if 0 + d_printf("Extended block %s %d Hz\n", + (eb->mode ? "Stereo" : "Mono"), dsp_speed); +#endif + break; + default: + error(_("unknown blocktype %d. terminate."), bp->type); + return; + } /* switch (bp->type) */ + } /* while (! nextblock) */ + /* put nextblock data bytes to dsp */ + l = in_buffer; + if (nextblock < (size_t)l) + l = nextblock; + if (l) { + if (output && !quiet_mode) { + if (write(2, data, l) != l) { /* to stderr */ + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + } else { + if (voc_pcm_write(data, l) != l) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + } + COUNT(l); + } + } /* while(1) */ + __end: + voc_pcm_flush(); + free(buf); +} +/* that was a big one, perhaps somebody split it :-) */ + +/* setting the globals for playing raw data */ +static void init_raw_data(void) +{ + hwparams = rhwparams; +} + +/* calculate the data count to read from/to dsp */ +static off64_t calc_count(void) +{ + off64_t count; + + if (timelimit == 0) { + count = pbrec_count; + } else { + count = snd_pcm_format_size(hwparams.format, hwparams.rate * hwparams.channels); + count *= (off64_t)timelimit; + } + return count < pbrec_count ? count : pbrec_count; +} + +/* write a .VOC-header */ +static void begin_voc(int fd, size_t cnt) +{ + VocHeader vh; + VocBlockType bt; + VocVoiceData vd; + VocExtBlock eb; + + memcpy(vh.magic, VOC_MAGIC_STRING, 20); + vh.headerlen = LE_SHORT(sizeof(VocHeader)); + vh.version = LE_SHORT(VOC_ACTUAL_VERSION); + vh.coded_ver = LE_SHORT(0x1233 - VOC_ACTUAL_VERSION); + + if (write(fd, &vh, sizeof(VocHeader)) != sizeof(VocHeader)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + if (hwparams.channels > 1) { + /* write an extended block */ + bt.type = 8; + bt.datalen = 4; + bt.datalen_m = bt.datalen_h = 0; + if (write(fd, &bt, sizeof(VocBlockType)) != sizeof(VocBlockType)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + eb.tc = LE_SHORT(65536 - 256000000L / (hwparams.rate << 1)); + eb.pack = 0; + eb.mode = 1; + if (write(fd, &eb, sizeof(VocExtBlock)) != sizeof(VocExtBlock)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + } + bt.type = 1; + cnt += sizeof(VocVoiceData); /* Channel_data block follows */ + bt.datalen = (u_char) (cnt & 0xFF); + bt.datalen_m = (u_char) ((cnt & 0xFF00) >> 8); + bt.datalen_h = (u_char) ((cnt & 0xFF0000) >> 16); + if (write(fd, &bt, sizeof(VocBlockType)) != sizeof(VocBlockType)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + vd.tc = (u_char) (256 - (1000000 / hwparams.rate)); + vd.pack = 0; + if (write(fd, &vd, sizeof(VocVoiceData)) != sizeof(VocVoiceData)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } +} + +/* write a WAVE-header */ +static void begin_wave(int fd, size_t cnt) +{ + WaveHeader h; + WaveFmtBody f; + WaveChunkHeader cf, cd; + int bits; + u_int tmp; + u_short tmp2; + + /* WAVE cannot handle greater than 32bit (signed?) int */ + if (cnt == (size_t)-2) + cnt = 0x7fffff00; + + bits = 8; + switch ((unsigned long) hwparams.format) { + case SND_PCM_FORMAT_U8: + bits = 8; + break; + case SND_PCM_FORMAT_S16_LE: + bits = 16; + break; + case SND_PCM_FORMAT_S32_LE: + case SND_PCM_FORMAT_FLOAT_LE: + bits = 32; + break; + case SND_PCM_FORMAT_S24_LE: + case SND_PCM_FORMAT_S24_3LE: + bits = 24; + break; + default: + error(_("Wave doesn't support %s format..."), snd_pcm_format_name(hwparams.format)); + prg_exit(EXIT_FAILURE); + } + h.magic = WAV_RIFF; + tmp = cnt + sizeof(WaveHeader) + sizeof(WaveChunkHeader) + sizeof(WaveFmtBody) + sizeof(WaveChunkHeader) - 8; + h.length = LE_INT(tmp); + h.type = WAV_WAVE; + + cf.type = WAV_FMT; + cf.length = LE_INT(16); + + if (hwparams.format == SND_PCM_FORMAT_FLOAT_LE) + f.format = LE_SHORT(WAV_FMT_IEEE_FLOAT); + else + f.format = LE_SHORT(WAV_FMT_PCM); + f.channels = LE_SHORT(hwparams.channels); + f.sample_fq = LE_INT(hwparams.rate); +#if 0 + tmp2 = (samplesize == 8) ? 1 : 2; + f.byte_p_spl = LE_SHORT(tmp2); + tmp = dsp_speed * hwparams.channels * (u_int) tmp2; +#else + tmp2 = hwparams.channels * snd_pcm_format_physical_width(hwparams.format) / 8; + f.byte_p_spl = LE_SHORT(tmp2); + tmp = (u_int) tmp2 * hwparams.rate; +#endif + f.byte_p_sec = LE_INT(tmp); + f.bit_p_spl = LE_SHORT(bits); + + cd.type = WAV_DATA; + cd.length = LE_INT(cnt); + + if (write(fd, &h, sizeof(WaveHeader)) != sizeof(WaveHeader) || + write(fd, &cf, sizeof(WaveChunkHeader)) != sizeof(WaveChunkHeader) || + write(fd, &f, sizeof(WaveFmtBody)) != sizeof(WaveFmtBody) || + write(fd, &cd, sizeof(WaveChunkHeader)) != sizeof(WaveChunkHeader)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } +} + +/* write a Au-header */ +static void begin_au(int fd, size_t cnt) +{ + AuHeader ah; + + ah.magic = AU_MAGIC; + ah.hdr_size = BE_INT(24); + ah.data_size = BE_INT(cnt); + switch ((unsigned long) hwparams.format) { + case SND_PCM_FORMAT_MU_LAW: + ah.encoding = BE_INT(AU_FMT_ULAW); + break; + case SND_PCM_FORMAT_U8: + ah.encoding = BE_INT(AU_FMT_LIN8); + break; + case SND_PCM_FORMAT_S16_BE: + ah.encoding = BE_INT(AU_FMT_LIN16); + break; + default: + error(_("Sparc Audio doesn't support %s format..."), snd_pcm_format_name(hwparams.format)); + prg_exit(EXIT_FAILURE); + } + ah.sample_rate = BE_INT(hwparams.rate); + ah.channels = BE_INT(hwparams.channels); + if (write(fd, &ah, sizeof(AuHeader)) != sizeof(AuHeader)) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } +} + +/* closing .VOC */ +static void end_voc(int fd) +{ + off64_t length_seek; + VocBlockType bt; + size_t cnt; + char dummy = 0; /* Write a Terminator */ + + if (write(fd, &dummy, 1) != 1) { + error(_("write error")); + prg_exit(EXIT_FAILURE); + } + length_seek = sizeof(VocHeader); + if (hwparams.channels > 1) + length_seek += sizeof(VocBlockType) + sizeof(VocExtBlock); + bt.type = 1; + cnt = fdcount; + cnt += sizeof(VocVoiceData); /* Channel_data block follows */ + if (cnt > 0x00ffffff) + cnt = 0x00ffffff; + bt.datalen = (u_char) (cnt & 0xFF); + bt.datalen_m = (u_char) ((cnt & 0xFF00) >> 8); + bt.datalen_h = (u_char) ((cnt & 0xFF0000) >> 16); + if (lseek64(fd, length_seek, SEEK_SET) == length_seek) + write(fd, &bt, sizeof(VocBlockType)); + if (fd != 1) + close(fd); +} + +static void end_wave(int fd) +{ /* only close output */ + WaveChunkHeader cd; + off64_t length_seek; + off64_t filelen; + u_int rifflen; + + length_seek = sizeof(WaveHeader) + + sizeof(WaveChunkHeader) + + sizeof(WaveFmtBody); + cd.type = WAV_DATA; + cd.length = fdcount > 0x7fffffff ? LE_INT(0x7fffffff) : LE_INT(fdcount); + filelen = fdcount + 2*sizeof(WaveChunkHeader) + sizeof(WaveFmtBody) + 4; + rifflen = filelen > 0x7fffffff ? LE_INT(0x7fffffff) : LE_INT(filelen); + if (lseek64(fd, 4, SEEK_SET) == 4) + write(fd, &rifflen, 4); + if (lseek64(fd, length_seek, SEEK_SET) == length_seek) + write(fd, &cd, sizeof(WaveChunkHeader)); + if (fd != 1) + close(fd); +} + +static void end_au(int fd) +{ /* only close output */ + AuHeader ah; + off64_t length_seek; + + length_seek = (char *)&ah.data_size - (char *)&ah; + ah.data_size = fdcount > 0xffffffff ? 0xffffffff : BE_INT(fdcount); + if (lseek64(fd, length_seek, SEEK_SET) == length_seek) + write(fd, &ah.data_size, sizeof(ah.data_size)); + if (fd != 1) + close(fd); +} + +static void header(int rtype, char *name) +{ + if (!quiet_mode) { + if (! name) + name = (stream == SND_PCM_STREAM_PLAYBACK) ? "stdout" : "stdin"; + fprintf(stderr, "%s %s '%s' : ", + (stream == SND_PCM_STREAM_PLAYBACK) ? _("Playing") : _("Recording"), + gettext(fmt_rec_table[rtype].what), + name); + fprintf(stderr, "%s, ", snd_pcm_format_description(hwparams.format)); + fprintf(stderr, _("Rate %d Hz, "), hwparams.rate); + if (hwparams.channels == 1) + fprintf(stderr, _("Mono")); + else if (hwparams.channels == 2) + fprintf(stderr, _("Stereo")); + else + fprintf(stderr, _("Channels %i"), hwparams.channels); + fprintf(stderr, "\n"); + } +} + +/* playing raw data */ + +static void playback_go(int fd, size_t loaded, off64_t count, int rtype, char *name) +{ + int l, r; + off64_t written = 0; + off64_t c; + + header(rtype, name); + set_params(); + + while (loaded > chunk_bytes && written < count) { + if (pcm_write(audiobuf + written, chunk_size) <= 0) + return; + written += chunk_bytes; + loaded -= chunk_bytes; + } + if (written > 0 && loaded > 0) + memmove(audiobuf, audiobuf + written, loaded); + + l = loaded; + while (written < count) { + do { + c = count - written; + if (c > chunk_bytes) + c = chunk_bytes; + c -= l; + + if (c == 0) + break; + r = safe_read(fd, audiobuf + l, c); + if (r < 0) { + perror(name); + prg_exit(EXIT_FAILURE); + } + fdcount += r; + if (r == 0) + break; + l += r; + } while ((size_t)l < chunk_bytes); + l = l * 8 / bits_per_frame; + r = pcm_write(audiobuf, l); + if (r != l) + break; + r = r * bits_per_frame / 8; + written += r; + l = 0; + } + snd_pcm_nonblock(handle, 0); + snd_pcm_drain(handle); + snd_pcm_nonblock(handle, nonblock); +} + + +/* + * let's play or capture it (capture_type says VOC/WAVE/raw) + */ + +static void playback(char *name) +{ + int ofs; + size_t dta; + ssize_t dtawave; + + pbrec_count = LLONG_MAX; + fdcount = 0; + if (!name || !strcmp(name, "-")) { + fd = fileno(stdin); + name = "stdin"; + } else { + init_stdin(); + if ((fd = open64(name, O_RDONLY, 0)) == -1) { + perror(name); + prg_exit(EXIT_FAILURE); + } + } + /* read the file header */ + dta = sizeof(AuHeader); + if ((size_t)safe_read(fd, audiobuf, dta) != dta) { + error(_("read error")); + prg_exit(EXIT_FAILURE); + } + if (test_au(fd, audiobuf) >= 0) { + rhwparams.format = hwparams.format; + pbrec_count = calc_count(); + playback_go(fd, 0, pbrec_count, FORMAT_AU, name); + goto __end; + } + dta = sizeof(VocHeader); + if ((size_t)safe_read(fd, audiobuf + sizeof(AuHeader), + dta - sizeof(AuHeader)) != dta - sizeof(AuHeader)) { + error(_("read error")); + prg_exit(EXIT_FAILURE);; + } + if ((ofs = test_vocfile(audiobuf)) >= 0) { + pbrec_count = calc_count(); + voc_play(fd, ofs, name); + goto __end; + } + /* read bytes for WAVE-header */ + if ((dtawave = test_wavefile(fd, audiobuf, dta)) >= 0) { + pbrec_count = calc_count(); + playback_go(fd, dtawave, pbrec_count, FORMAT_WAVE, name); + } else { + /* should be raw data */ + init_raw_data(); + pbrec_count = calc_count(); + playback_go(fd, dta, pbrec_count, FORMAT_RAW, name); + } + __end: + if (fd != 0) + close(fd); +} + +/** + * mystrftime + * + * Variant of strftime(3) that supports additional format + * specifiers in the format string. + * + * Parameters: + * + * s - destination string + * max - max number of bytes to write + * userformat - format string + * tm - time information + * filenumber - the number of the file, starting at 1 + * + * Returns: number of bytes written to the string s + */ +size_t mystrftime(char *s, size_t max, const char *userformat, + const struct tm *tm, const int filenumber) +{ + char formatstring[PATH_MAX] = ""; + char tempstring[PATH_MAX] = ""; + char *format, *tempstr; + const char *pos_userformat; + + format = formatstring; + + /* if mystrftime is called with userformat = NULL we return a zero length string */ + if (userformat == NULL) { + *s = '\0'; + return 0; + } + + for (pos_userformat = userformat; *pos_userformat; ++pos_userformat) { + if (*pos_userformat == '%') { + tempstr = tempstring; + tempstr[0] = '\0'; + switch (*++pos_userformat) { + + case '\0': // end of string + --pos_userformat; + break; + + case 'v': // file number + sprintf(tempstr, "%02d", filenumber); + break; + + default: // All other codes will be handled by strftime + *format++ = '%'; + *format++ = *pos_userformat; + continue; + } + + /* If a format specifier was found and used, copy the result. */ + if (tempstr[0]) { + while ((*format = *tempstr++) != '\0') + ++format; + continue; + } + } + + /* For any other character than % we simply copy the character */ + *format++ = *pos_userformat; + } + + *format = '\0'; + format = formatstring; + return strftime(s, max, format, tm); +} + +static int new_capture_file(char *name, char *namebuf, size_t namelen, + int filecount) +{ + char *s; + char buf[PATH_MAX+1]; + time_t t; + struct tm *tmp; + + if (use_strftime) { + t = time(NULL); + tmp = localtime(&t); + if (tmp == NULL) { + perror("localtime"); + prg_exit(EXIT_FAILURE); + } + if (mystrftime(namebuf, namelen, name, tmp, filecount+1) == 0) { + fprintf(stderr, "mystrftime returned 0"); + prg_exit(EXIT_FAILURE); + } + return filecount; + } + + /* get a copy of the original filename */ + strncpy(buf, name, sizeof(buf)); + + /* separate extension from filename */ + s = buf + strlen(buf); + while (s > buf && *s != '.' && *s != '/') + --s; + if (*s == '.') + *s++ = 0; + else if (*s == '/') + s = buf + strlen(buf); + + /* upon first jump to this if block rename the first file */ + if (filecount == 1) { + if (*s) + snprintf(namebuf, namelen, "%s-01.%s", buf, s); + else + snprintf(namebuf, namelen, "%s-01", buf); + remove(namebuf); + rename(name, namebuf); + filecount = 2; + } + + /* name of the current file */ + if (*s) + snprintf(namebuf, namelen, "%s-%02i.%s", buf, filecount, s); + else + snprintf(namebuf, namelen, "%s-%02i", buf, filecount); + + return filecount; +} + +/** + * create_path + * + * This function creates a file path, like mkdir -p. + * + * Parameters: + * + * path - the path to create + * + * Returns: 0 on success, -1 on failure + * On failure, a message has been printed to stderr. + */ +int create_path(const char *path) +{ + char *start; + mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; + + if (path[0] == '/') + start = strchr(path + 1, '/'); + else + start = strchr(path, '/'); + + while (start) { + char *buffer = strdup(path); + buffer[start-path] = 0x00; + + if (mkdir(buffer, mode) == -1 && errno != EEXIST) { + fprintf(stderr, "Problem creating directory %s", buffer); + perror(" "); + free(buffer); + return -1; + } + free(buffer); + start = strchr(start + 1, '/'); + } + return 0; +} + +static int safe_open(const char *name) +{ + int fd; + + fd = open64(name, O_WRONLY | O_CREAT, 0644); + if (fd == -1) { + if (errno != ENOENT || !use_strftime) + return -1; + if (create_path(name) == 0) + fd = open64(name, O_WRONLY | O_CREAT, 0644); + } + return fd; +} + +static void capture(char *orig_name) +{ + int tostdout=0; /* boolean which describes output stream */ + int filecount=0; /* number of files written */ + char *name = orig_name; /* current filename */ + char namebuf[PATH_MAX+1]; + off64_t count, rest; /* number of bytes to capture */ + + /* get number of bytes to capture */ + count = calc_count(); + if (count == 0) + count = LLONG_MAX; + /* compute the number of bytes per file */ + max_file_size = max_file_time * + snd_pcm_format_size(hwparams.format, + hwparams.rate * hwparams.channels); + /* WAVE-file should be even (I'm not sure), but wasting one byte + isn't a problem (this can only be in 8 bit mono) */ + if (count < LLONG_MAX) + count += count % 2; + else + count -= count % 2; + + /* display verbose output to console */ + header(file_type, name); + + /* setup sound hardware */ + set_params(); + + /* write to stdout? */ + if (!name || !strcmp(name, "-")) { + fd = fileno(stdout); + name = "stdout"; + tostdout=1; + if (count > fmt_rec_table[file_type].max_filesize) + count = fmt_rec_table[file_type].max_filesize; + } + init_stdin(); + + do { + /* open a file to write */ + if(!tostdout) { + /* upon the second file we start the numbering scheme */ + if (filecount || use_strftime) { + filecount = new_capture_file(orig_name, namebuf, + sizeof(namebuf), + filecount); + name = namebuf; + } + + /* open a new file */ + remove(name); + fd = safe_open(name); + if (fd < 0) { + perror(name); + prg_exit(EXIT_FAILURE); + } + filecount++; + } + + rest = count; + if (rest > fmt_rec_table[file_type].max_filesize) + rest = fmt_rec_table[file_type].max_filesize; + if (max_file_size && (rest > max_file_size)) + rest = max_file_size; + + /* setup sample header */ + if (fmt_rec_table[file_type].start) + fmt_rec_table[file_type].start(fd, rest); + + /* capture */ + fdcount = 0; + while (rest > 0 && recycle_capture_file == 0) { + size_t c = (rest <= (off64_t)chunk_bytes) ? + (size_t)rest : chunk_bytes; + size_t f = c * 8 / bits_per_frame; + if (pcm_read(audiobuf, f) != f) + break; + if (write(fd, audiobuf, c) != c) { + perror(name); + prg_exit(EXIT_FAILURE); + } + count -= c; + rest -= c; + fdcount += c; + } + + /* re-enable SIGUSR1 signal */ + if (recycle_capture_file) { + recycle_capture_file = 0; + signal(SIGUSR1, signal_handler_recycle); + } + + /* finish sample container */ + if (fmt_rec_table[file_type].end && !tostdout) { + fmt_rec_table[file_type].end(fd); + fd = -1; + } + + /* repeat the loop when format is raw without timelimit or + * requested counts of data are recorded + */ + } while ((file_type == FORMAT_RAW && !timelimit) || count > 0); +} + +static void playbackv_go(int* fds, unsigned int channels, size_t loaded, off64_t count, int rtype, char **names) +{ + int r; + size_t vsize; + + unsigned int channel; + u_char *bufs[channels]; + + header(rtype, names[0]); + set_params(); + + vsize = chunk_bytes / channels; + + // Not yet implemented + assert(loaded == 0); + + for (channel = 0; channel < channels; ++channel) + bufs[channel] = audiobuf + vsize * channel; + + while (count > 0) { + size_t c = 0; + size_t expected = count / channels; + if (expected > vsize) + expected = vsize; + do { + r = safe_read(fds[0], bufs[0], expected); + if (r < 0) { + perror(names[channel]); + prg_exit(EXIT_FAILURE); + } + for (channel = 1; channel < channels; ++channel) { + if (safe_read(fds[channel], bufs[channel], r) != r) { + perror(names[channel]); + prg_exit(EXIT_FAILURE); + } + } + if (r == 0) + break; + c += r; + } while (c < expected); + c = c * 8 / bits_per_sample; + r = pcm_writev(bufs, channels, c); + if ((size_t)r != c) + break; + r = r * bits_per_frame / 8; + count -= r; + } + snd_pcm_nonblock(handle, 0); + snd_pcm_drain(handle); + snd_pcm_nonblock(handle, nonblock); +} + +static void capturev_go(int* fds, unsigned int channels, off64_t count, int rtype, char **names) +{ + size_t c; + ssize_t r; + unsigned int channel; + size_t vsize; + u_char *bufs[channels]; + + header(rtype, names[0]); + set_params(); + + vsize = chunk_bytes / channels; + + for (channel = 0; channel < channels; ++channel) + bufs[channel] = audiobuf + vsize * channel; + + while (count > 0) { + size_t rv; + c = count; + if (c > chunk_bytes) + c = chunk_bytes; + c = c * 8 / bits_per_frame; + if ((size_t)(r = pcm_readv(bufs, channels, c)) != c) + break; + rv = r * bits_per_sample / 8; + for (channel = 0; channel < channels; ++channel) { + if ((size_t)write(fds[channel], bufs[channel], rv) != rv) { + perror(names[channel]); + prg_exit(EXIT_FAILURE); + } + } + r = r * bits_per_frame / 8; + count -= r; + fdcount += r; + } +} + +static void playbackv(char **names, unsigned int count) +{ + int ret = 0; + unsigned int channel; + unsigned int channels = rhwparams.channels; + int alloced = 0; + int fds[channels]; + for (channel = 0; channel < channels; ++channel) + fds[channel] = -1; + + if (count == 1 && channels > 1) { + size_t len = strlen(names[0]); + char format[1024]; + memcpy(format, names[0], len); + strcpy(format + len, ".%d"); + len += 4; + names = malloc(sizeof(*names) * channels); + for (channel = 0; channel < channels; ++channel) { + names[channel] = malloc(len); + sprintf(names[channel], format, channel); + } + alloced = 1; + } else if (count != channels) { + error(_("You need to specify %d files"), channels); + prg_exit(EXIT_FAILURE); + } + + for (channel = 0; channel < channels; ++channel) { + fds[channel] = open(names[channel], O_RDONLY, 0); + if (fds[channel] < 0) { + perror(names[channel]); + ret = EXIT_FAILURE; + goto __end; + } + } + /* should be raw data */ + init_raw_data(); + pbrec_count = calc_count(); + playbackv_go(fds, channels, 0, pbrec_count, FORMAT_RAW, names); + + __end: + for (channel = 0; channel < channels; ++channel) { + if (fds[channel] >= 0) + close(fds[channel]); + if (alloced) + free(names[channel]); + } + if (alloced) + free(names); + if (ret) + prg_exit(ret); +} + +static void capturev(char **names, unsigned int count) +{ + int ret = 0; + unsigned int channel; + unsigned int channels = rhwparams.channels; + int alloced = 0; + int fds[channels]; + for (channel = 0; channel < channels; ++channel) + fds[channel] = -1; + + if (count == 1) { + size_t len = strlen(names[0]); + char format[1024]; + memcpy(format, names[0], len); + strcpy(format + len, ".%d"); + len += 4; + names = malloc(sizeof(*names) * channels); + for (channel = 0; channel < channels; ++channel) { + names[channel] = malloc(len); + sprintf(names[channel], format, channel); + } + alloced = 1; + } else if (count != channels) { + error(_("You need to specify %d files"), channels); + prg_exit(EXIT_FAILURE); + } + + for (channel = 0; channel < channels; ++channel) { + fds[channel] = open(names[channel], O_WRONLY + O_CREAT, 0644); + if (fds[channel] < 0) { + perror(names[channel]); + ret = EXIT_FAILURE; + goto __end; + } + } + /* should be raw data */ + init_raw_data(); + pbrec_count = calc_count(); + capturev_go(fds, channels, pbrec_count, FORMAT_RAW, names); + + __end: + for (channel = 0; channel < channels; ++channel) { + if (fds[channel] >= 0) + close(fds[channel]); + if (alloced) + free(names[channel]); + } + if (alloced) + free(names); + if (ret) + prg_exit(ret); +} diff --git a/aplay/arecord.1 b/aplay/arecord.1 new file mode 100644 index 0000000..b6caf0b --- /dev/null +++ b/aplay/arecord.1 @@ -0,0 +1,237 @@ +.TH APLAY 1 "1 January 2010" +.SH NAME +arecord, aplay \- command-line sound recorder and player for ALSA +soundcard driver +.SH SYNOPSIS +\fBarecord\fP [\fIflags\fP] [filename] +.br +\fBaplay\fP [\fIflags\fP] [filename [filename]] ... + +.SH DESCRIPTION +\fBarecord\fP is a command-line soundfile recorder for the ALSA soundcard +driver. It supports several file formats and multiple soundcards with +multiple devices. If recording with interleaved mode samples the file is +automatically split before the 2GB filesize. + +\fBaplay\fP is much the same, only it plays instead of recording. For +supported soundfile formats, the sampling rate, bit depth, and so +forth can be automatically determined from the soundfile header. + +If filename is not specified, the standard output or input is used. The \fBaplay\fP utility accepts multiple filenames. + +.SH OPTIONS +.TP +\fI\-h, \-\-help\fP +Help: show syntax. +.TP +\fI\-\-version\fP +Print current version. +.TP +\fI\-l, \-\-list\-devices\fP +List all soundcards and digital audio devices +.TP +\fI\-L, \-\-list\-pcms\fP +List all PCMs defined +.TP +\fI\-D, \-\-device=NAME\fP +Select PCM by name +.TP +\fI\-q \-\-quiet\fP +Quiet mode. Suppress messages (not sound :)) +.TP +\fI\-t, \-\-file\-type TYPE\fP +File type (voc, wav, raw or au). +If this parameter is omitted the WAVE format is used. +.TP +\fI\-c, \-\-channels=#\fP +The number of channels. +The default is one channel. +Valid values are 1 through 32. +.TP +\fI\-f \-\-format=FORMAT\fP +Sample format +.br +Recognized sample formats are: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE +S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE +FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW +A_LAW IMA_ADPCM MPEG GSM SPECIAL S24_3LE S24_3BE U24_3LE U24_3BE S20_3LE +S20_3BE U20_3LE U20_3BE S18_3LE S18_3BE U18_3LE +.br +Some of these may not be available on selected hardware +.br +The available format shortcuts are: +.nf +\-f cd (16 bit little endian, 44100, stereo) [\-f S16_LE \-c2 \-r44100] +\-f cdr (16 bit big endian, 44100, stereo) [\-f S16_BE \-c2 \-f44100] +\-f dat (16 bit little endian, 48000, stereo) [\-f S16_LE \-c2 \-r48000] +.fi +If no format is given U8 is used. +.TP +\fI\-r, \-\-rate=#\fP +Sampling rate in Hertz. The default rate is 8000 Hertz. +If the value specified is less than 300, it is taken as the rate in kilohertz. +Valid values are 2000 through 192000 Hertz. +.TP +\fI\-d, \-\-duration=#\fP +Interrupt after # seconds. +A value of zero means infinity. +The default is zero, so if this option is omitted then the arecord process will run until it is killed. +.TP +\fI\-s, \-\-sleep\-min=#\fP +Min ticks to sleep. The default is not to sleep. +.TP +\fI\-M, \-\-mmap\fP +Use memory-mapped (mmap) I/O mode for the audio stream. +If this option is not set, the read/write I/O mode will be used. +.TP +\fI\-N, \-\-nonblock\fP +Open the audio device in non-blocking mode. If the device is busy the program will exit immediately. +If this option is not set the program will block until the audio device is available again. +.TP +\fI\-F, \-\-period\-time=#\fP +Distance between interrupts is # microseconds. +If no period time and no period size is given then a quarter of the buffer time is set. +.TP +\fI\-B, \-\-buffer\-time=#\fP +Buffer duration is # microseconds +If no buffer time and no buffer size is given then the maximal allowed buffer time but not more than 500ms is set. +.TP +\fI\-\-period\-size=#\fP +Distance between interrupts is # frames +If no period size and no period time is given then a quarter of the buffer size is set. +.TP +\fI\-\-buffer\-size=#\fP +Buffer duration is # frames +If no buffer time and no buffer size is given then the maximal allowed buffer time but not more than 500ms is set. +.TP +\fI\-A, \-\-avail\-min=#\fP +Min available space for wakeup is # microseconds +.TP +\fI\-R, \-\-start\-delay=#\fP +Delay for automatic PCM start is # microseconds +(relative to buffer size if <= 0) +.TP +\fI\-T, \-\-stop\-delay=#\fP +Delay for automatic PCM stop is # microseconds from xrun +.TP +\fI\-v, \-\-verbose\fP +Show PCM structure and setup. +This option is accumulative. The VU meter is displayed when this +is given twice or three times. +.TP +\fI\-V, \-\-vumeter=TYPE\fP +Specifies the VU-meter type, either \fIstereo\fP or \fImono\fP. +The stereo VU-meter is available only for 2-channel stereo samples +with interleaved format. +.TP +\fI\-I, \-\-separate\-channels\fP +One file for each channel. This option disables max\-file\-time +and use\-strftime, and ignores SIGUSR1. The stereo VU meter is +not available with separate channels. +.TP +\fI\-P\fP +Playback. This is the default if the program is invoked +by typing aplay. +.TP +\fI\-C\fP +Record. This is the default if the program is invoked +by typing arecord. +.TP +\fI\-\-disable\-resample\fP +Disable automatic rate resample. +.TP +\fI\-\-disable\-channels\fP +Disable automatic channel conversions. +.TP +\fI\-\-disable\-format\fP +Disable automatic format conversions. +.TP +\fI\-\-disable\-softvol\fP +Disable software volume control (softvol). +.TP +\fI\-\-test\-position\fP +Test ring buffer position. +.TP +\fI\-\-test\-coef=\fP +Test coefficient for ring buffer position; default is 8. +Expression for validation is: coef * (buffer_size / 2). +Minimum value is 1. +.TP +\fI\-\-test\-nowait\fP +Do not wait for the ring buffer--eats the whole CPU. +.TP +\fI\-\-max\-file\-time\fP +While recording, when the output file has been accumulating +sound for this long, +close it and open a new output file. Default is the maximum +size supported by the file format: 2 GiB for WAV files. +This option has no effect if \-\-separate\-channels is +specified. +.TP +\fI\-\-process\-id\-file \fP +aplay writes its process ID here, so other programs can +send signals to it. +.TP +\fI\-\-use\-strftime\fP +When recording, interpret %-codes in the file name parameter using +the strftime facility whenever the output file is opened. The +important strftime codes are: %Y is the year, %m month, %d day of +the month, %H hour, %M minute and %S second. In addition, %v is +the file number, starting at 1. When this option is specified, +intermediate directories for the output file are created automatically. +This option has no effect if \-\-separate\-channels is specified. + +.SH SIGNALS +When recording, SIGINT, SIGTERM and SIGABRT will close the output +file and exit. SIGUSR1 will close the output file, open a new one, +and continue recording. However, SIGUSR1 does not work with +\-\-separate\-channels. + +.SH EXAMPLES + +.TP +\fBaplay \-c 1 \-t raw \-r 22050 \-f mu_law foobar\fR +will play the raw file "foobar" as a +22050-Hz, mono, 8-bit, Mu-Law .au file. + +.TP +\fBarecord \-d 10 \-f cd \-t wav \-D copy foobar.wav\fP +will record foobar.wav as a 10-second, CD-quality wave file, using the +PCM "copy" (which might be defined in the user's .asoundrc file as: +.nf +pcm.copy { + type plug + slave { + pcm hw + } + route_policy copy +} +.fi + +.TP +\fBarecord \-t wav \-max-file_time 30 mon.wav\fP +Record from the default audio source in monaural, 8,000 samples +per second, 8 bits per sample. Start a new file every +30 seconds. File names are mon-nn.wav, where nn increases +from 01. The file after mon-99.wav is mon-100.wav. + +.TP +\fBarecord \-f cd \-t wav \-max-file-time 3600 --use-strftime %Y/%m/%d/listen-%H-%M-%v.wav\fP +Record in stereo from the default audio source. Create a new file +every hour. The files are placed in directories based on their start dates +and have names which include their start times and file numbers. + +.SH SEE ALSO +\fB +alsamixer(1), +amixer(1) +\fP + +.SH BUGS +Note that .aiff files are not currently supported. + +.SH AUTHOR +\fBarecord\fP and \fBaplay\fP are by Jaroslav Kysela +This document is by Paul Winkler . +Updated for Alsa 0.9 by James Tappin + diff --git a/aplay/formats.h b/aplay/formats.h new file mode 100644 index 0000000..b5314f9 --- /dev/null +++ b/aplay/formats.h @@ -0,0 +1,127 @@ +#ifndef FORMATS_H +#define FORMATS_H 1 + +#include +#include + +/* Definitions for .VOC files */ + +#define VOC_MAGIC_STRING "Creative Voice File\x1A" +#define VOC_ACTUAL_VERSION 0x010A +#define VOC_SAMPLESIZE 8 + +#define VOC_MODE_MONO 0 +#define VOC_MODE_STEREO 1 + +#define VOC_DATALEN(bp) ((u_long)(bp->datalen) | \ + ((u_long)(bp->datalen_m) << 8) | \ + ((u_long)(bp->datalen_h) << 16) ) + +typedef struct voc_header { + u_char magic[20]; /* must be MAGIC_STRING */ + u_short headerlen; /* Headerlength, should be 0x1A */ + u_short version; /* VOC-file version */ + u_short coded_ver; /* 0x1233-version */ +} VocHeader; + +typedef struct voc_blocktype { + u_char type; + u_char datalen; /* low-byte */ + u_char datalen_m; /* medium-byte */ + u_char datalen_h; /* high-byte */ +} VocBlockType; + +typedef struct voc_voice_data { + u_char tc; + u_char pack; +} VocVoiceData; + +typedef struct voc_ext_block { + u_short tc; + u_char pack; + u_char mode; +} VocExtBlock; + +/* Definitions for Microsoft WAVE format */ + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define COMPOSE_ID(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24)) +#define LE_SHORT(v) (v) +#define LE_INT(v) (v) +#define BE_SHORT(v) bswap_16(v) +#define BE_INT(v) bswap_32(v) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define COMPOSE_ID(a,b,c,d) ((d) | ((c)<<8) | ((b)<<16) | ((a)<<24)) +#define LE_SHORT(v) bswap_16(v) +#define LE_INT(v) bswap_32(v) +#define BE_SHORT(v) (v) +#define BE_INT(v) (v) +#else +#error "Wrong endian" +#endif + +#define WAV_RIFF COMPOSE_ID('R','I','F','F') +#define WAV_WAVE COMPOSE_ID('W','A','V','E') +#define WAV_FMT COMPOSE_ID('f','m','t',' ') +#define WAV_DATA COMPOSE_ID('d','a','t','a') + +/* WAVE fmt block constants from Microsoft mmreg.h header */ +#define WAV_FMT_PCM 0x0001 +#define WAV_FMT_IEEE_FLOAT 0x0003 +#define WAV_FMT_DOLBY_AC3_SPDIF 0x0092 +#define WAV_FMT_EXTENSIBLE 0xfffe + +/* Used with WAV_FMT_EXTENSIBLE format */ +#define WAV_GUID_TAG "\x00\x00\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71" + +/* it's in chunks like .voc and AMIGA iff, but my source say there + are in only in this combination, so I combined them in one header; + it works on all WAVE-file I have + */ +typedef struct { + u_int magic; /* 'RIFF' */ + u_int length; /* filelen */ + u_int type; /* 'WAVE' */ +} WaveHeader; + +typedef struct { + u_short format; /* see WAV_FMT_* */ + u_short channels; + u_int sample_fq; /* frequence of sample */ + u_int byte_p_sec; + u_short byte_p_spl; /* samplesize; 1 or 2 bytes */ + u_short bit_p_spl; /* 8, 12 or 16 bit */ +} WaveFmtBody; + +typedef struct { + WaveFmtBody format; + u_short ext_size; + u_short bit_p_spl; + u_int channel_mask; + u_short guid_format; /* WAV_FMT_* */ + u_char guid_tag[14]; /* WAV_GUID_TAG */ +} WaveFmtExtensibleBody; + +typedef struct { + u_int type; /* 'data' */ + u_int length; /* samplecount */ +} WaveChunkHeader; + +/* Definitions for Sparc .au header */ + +#define AU_MAGIC COMPOSE_ID('.','s','n','d') + +#define AU_FMT_ULAW 1 +#define AU_FMT_LIN8 2 +#define AU_FMT_LIN16 3 + +typedef struct au_header { + u_int magic; /* '.snd' */ + u_int hdr_size; /* size of header (min 24) */ + u_int data_size; /* size of data */ + u_int encoding; /* see to AU_FMT_XXXX */ + u_int sample_rate; /* sample rate */ + u_int channels; /* number of channels (voices) */ +} AuHeader; + +#endif /* FORMATS */ diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..dc84c68 --- /dev/null +++ b/config.guess @@ -0,0 +1,1501 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.rpath b/config.rpath new file mode 100755 index 0000000..c492a93 --- /dev/null +++ b/config.rpath @@ -0,0 +1,614 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2006 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's _LT_CC_BASENAME. + +for cc_temp in $CC""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + darwin*) + case $cc_basename in + xlc*) + wl='-Wl,' + ;; + esac + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $cc_basename in + icc* | ecc*) + wl='-Wl,' + ;; + pgcc | pgf77 | pgf90) + wl='-Wl,' + ;; + ccc*) + wl='-Wl,' + ;; + como) + wl='-lopt=' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + wl='-Wl,' + ;; + esac + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + sco3.2v5*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we cannot use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + interix3*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + hardcode_direct=no + if test "$GCC" = yes ; then + : + else + case $cc_basename in + xlc*) + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + hpux11*) + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + ;; + *) + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +libname_spec='lib$name' +case "$host_os" in + aix3*) + ;; + aix4* | aix5*) + ;; + amigaos*) + ;; + beos*) + ;; + bsdi[45]*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + kfreebsd*-gnu) + ;; + freebsd* | dragonfly*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + interix3*) + ;; + irix5* | irix6* | nonstopux*) + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux*) + ;; + knetbsd*-gnu) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx*) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.3*) + ;; + sysv4*MP*) + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + ;; + uts4*) + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..cd0b71e --- /dev/null +++ b/configure @@ -0,0 +1,9722 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="aplay/aplay.c" +ac_default_prefix=/usr +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +ASOUND_STATE_DIR +HAVE_SYSTEMD_FALSE +HAVE_SYSTEMD_TRUE +systemdsystemunitdir +PKG_CONFIG +LIBRT +SND_UTIL_SUBMINOR +SND_UTIL_MINOR +SND_UTIL_MAJOR +SND_UTIL_VERSION +TESTSOUND +CURSES_CFLAGS +CURSESLIB +CURSESINC +ncurses5_config +ncursesw5_config +EGREP +GREP +CPP +udevrulesdir +USE_XMLTO_FALSE +USE_XMLTO_TRUE +xmlto +ALSALOOP_FALSE +ALSALOOP_TRUE +ALSACONF_FALSE +ALSACONF_TRUE +ALSAMIXER_FALSE +ALSAMIXER_TRUE +HAVE_SAMPLERATE_FALSE +HAVE_SAMPLERATE_TRUE +HAVE_SEQ_FALSE +HAVE_SEQ_TRUE +HAVE_RAWMIDI_FALSE +HAVE_RAWMIDI_TRUE +HAVE_MIXER_FALSE +HAVE_MIXER_TRUE +HAVE_PCM_FALSE +HAVE_PCM_TRUE +ALSA_LIBS +ALSA_CFLAGS +LN_S +POSUB +LTLIBINTL +LIBINTL +INTLLIBS +LTLIBICONV +LIBICONV +INTL_MACOSX_LIBS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MSGMERGE +XGETTEXT_015 +XGETTEXT +GMSGFMT_015 +MSGFMT_015 +GMSGFMT +MSGFMT +USE_NLS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_nls +enable_dependency_tracking +with_gnu_ld +enable_rpath +with_libiconv_prefix +with_libintl_prefix +with_alsa_prefix +with_alsa_inc_prefix +enable_alsatest +with_librt +enable_alsamixer +enable_alsaconf +enable_alsaloop +enable_xmlto +with_udev_rules_dir +with_curses +with_testsound +enable_largefile +with_systemdsystemunitdir +with_asound_state_dir +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PKG_CONFIG' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-nls do not use Native Language Support + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-rpath do not hardcode runtime library paths + --disable-alsatest Do not try to compile and run a test Alsa program + --disable-alsamixer Disable alsamixer compilation + --disable-alsaconf Disable alsaconf packaging + --disable-alsaloop Disable alsaloop packaging + --disable-xmlto Disable man page creation via xmlto + --disable-largefile omit support for large files + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + --with-alsa-prefix=PFX Prefix where Alsa library is installed(optional) + --with-alsa-inc-prefix=PFX Prefix where include libraries are (optional) + --with-librt Use librt for monotonic clock (default = yes) + --with-udev-rules-dir Directory where to install udev rules to (defaults + to /lib/udev/rules.d) + --with-curses libname Specify the curses library to use (default=auto) + --with-testsound=file give the path of test sound file for alsaconf + --with-systemdsystemunitdir=DIR + Directory for systemd service files + --with-asound-state-dir=DIR + Directory to place asound.state file in + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + PKG_CONFIG path to pkg-config utility + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=alsa-utils + VERSION=1.0.24.2 + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac + + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + rm -f messages.po + + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&5 + if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$localedir" || localedir='${datadir}/locale' + + + ac_config_commands="$ac_config_commands po-directories" + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${acl_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if ${acl_cv_rpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 +$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } +if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFPreferencesCopyAppValue(NULL, NULL) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFPreferencesCopyAppValue=yes +else + gt_cv_func_CFPreferencesCopyAppValue=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 +$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + +$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 +$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } +if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CFLocaleCopyCurrent(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_CFLocaleCopyCurrent=yes +else + gt_cv_func_CFLocaleCopyCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 +$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + +$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h + + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + + + + + + + LIBINTL= + LTLIBINTL= + POSUB= + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 +$as_echo_n "checking for GNU gettext in libc... " >&6; } +if ${gt_cv_func_gnugettext1_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_gnugettext1_libc=yes +else + gt_cv_func_gnugettext1_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libc" >&5 +$as_echo "$gt_cv_func_gnugettext1_libc" >&6; } + + if test "$gt_cv_func_gnugettext1_libc" != "yes"; then + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then : + withval=$with_libintl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi + +fi + + LIBINTL= + LTLIBINTL= + INCINTL= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 +$as_echo_n "checking for GNU gettext in libintl... " >&6; } +if ${gt_cv_func_gnugettext1_libintl+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_gnugettext1_libintl=yes +else + gt_cv_func_gnugettext1_libintl=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *); +int +main () +{ +bindtextdomain ("", ""); +return * gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias ("") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext1_libintl=yes + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 +$as_echo "$gt_cv_func_gnugettext1_libintl" >&6; } + fi + + if test "$gt_cv_func_gnugettext1_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + else + USE_NLS=no + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 +$as_echo_n "checking whether to use NLS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 +$as_echo_n "checking where the gettext function comes from... " >&6; } + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 +$as_echo "$gt_source" >&6; } + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 +$as_echo_n "checking how to link with libintl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 +$as_echo "$LIBINTL" >&6; } + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + + + +if test "x$target" != "x$host" -a -z "`echo $CC | grep -e '-gcc'`"; +then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compiler" >&5 +$as_echo_n "checking for cross-compiler... " >&6; } + + which ${program_prefix}gcc >/dev/null 2>&1 && CC=${program_prefix}gcc + which ${target_cpu}-${target_os}-gcc >/dev/null 2>&1 \ + && CC=${target_cpu}-${target-os}-gcc + which ${target_cpu}-${target_vendor}-${target_os}-gcc >/dev/null 2>&1 \ + && CC=${target_cpu}-${target_vendor}-${target_os}-gcc + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +alsa_save_CFLAGS="$CFLAGS" +alsa_save_LDFLAGS="$LDFLAGS" +alsa_save_LIBS="$LIBS" +alsa_found=yes + + +# Check whether --with-alsa-prefix was given. +if test "${with_alsa_prefix+set}" = set; then : + withval=$with_alsa_prefix; alsa_prefix="$withval" +else + alsa_prefix="" +fi + + + +# Check whether --with-alsa-inc-prefix was given. +if test "${with_alsa_inc_prefix+set}" = set; then : + withval=$with_alsa_inc_prefix; alsa_inc_prefix="$withval" +else + alsa_inc_prefix="" +fi + + +# Check whether --enable-alsatest was given. +if test "${enable_alsatest+set}" = set; then : + enableval=$enable_alsatest; enable_alsatest="$enableval" +else + enable_alsatest=yes +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA CFLAGS" >&5 +$as_echo_n "checking for ALSA CFLAGS... " >&6; } +if test "$alsa_inc_prefix" != "" ; then + ALSA_CFLAGS="$ALSA_CFLAGS -I$alsa_inc_prefix" + CFLAGS="$CFLAGS -I$alsa_inc_prefix" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_CFLAGS" >&5 +$as_echo "$ALSA_CFLAGS" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ALSA LDFLAGS" >&5 +$as_echo_n "checking for ALSA LDFLAGS... " >&6; } +if test "$alsa_prefix" != "" ; then + ALSA_LIBS="$ALSA_LIBS -L$alsa_prefix" + LDFLAGS="$LDFLAGS $ALSA_LIBS" +fi + +ALSA_LIBS="$ALSA_LIBS -lasound -lm -ldl -lpthread" +LIBS="$ALSA_LIBS $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALSA_LIBS" >&5 +$as_echo "$ALSA_LIBS" >&6; } + +min_alsa_version=1.0.16 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libasound headers version >= $min_alsa_version" >&5 +$as_echo_n "checking for libasound headers version >= $min_alsa_version... " >&6; } +no_alsa="" + alsa_min_major_version=`echo $min_alsa_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + alsa_min_minor_version=`echo $min_alsa_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + alsa_min_micro_version=`echo $min_alsa_version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ + +/* ensure backward compatibility */ +#if !defined(SND_LIB_MAJOR) && defined(SOUNDLIB_VERSION_MAJOR) +#define SND_LIB_MAJOR SOUNDLIB_VERSION_MAJOR +#endif +#if !defined(SND_LIB_MINOR) && defined(SOUNDLIB_VERSION_MINOR) +#define SND_LIB_MINOR SOUNDLIB_VERSION_MINOR +#endif +#if !defined(SND_LIB_SUBMINOR) && defined(SOUNDLIB_VERSION_SUBMINOR) +#define SND_LIB_SUBMINOR SOUNDLIB_VERSION_SUBMINOR +#endif + +# if(SND_LIB_MAJOR > $alsa_min_major_version) + exit(0); +# else +# if(SND_LIB_MAJOR < $alsa_min_major_version) +# error not present +# endif + +# if(SND_LIB_MINOR > $alsa_min_minor_version) + exit(0); +# else +# if(SND_LIB_MINOR < $alsa_min_minor_version) +# error not present +# endif + +# if(SND_LIB_SUBMINOR < $alsa_min_micro_version) +# error not present +# endif +# endif +# endif +exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found." >&5 +$as_echo "found." >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present." >&5 +$as_echo "not present." >&6; } + as_fn_error $? "Sufficiently new version of libasound not found." "$LINENO" 5 + alsa_found=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +if test "x$enable_alsatest" = "xyes"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_ctl_open in -lasound" >&5 +$as_echo_n "checking for snd_ctl_open in -lasound... " >&6; } +if ${ac_cv_lib_asound_snd_ctl_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lasound $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char snd_ctl_open (); +int +main () +{ +return snd_ctl_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_asound_snd_ctl_open=yes +else + ac_cv_lib_asound_snd_ctl_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_snd_ctl_open" >&5 +$as_echo "$ac_cv_lib_asound_snd_ctl_open" >&6; } +if test "x$ac_cv_lib_asound_snd_ctl_open" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBASOUND 1 +_ACEOF + + LIBS="-lasound $LIBS" + +else + as_fn_error $? "No linkable libasound was found." "$LINENO" 5 + alsa_found=no + +fi + +fi + +if test "x$alsa_found" = "xyes" ; then + : + LIBS=`echo $LIBS | sed 's/-lasound//g'` + LIBS=`echo $LIBS | sed 's/ //'` + LIBS="-lasound $LIBS" +fi +if test "x$alsa_found" = "xno" ; then + : + CFLAGS="$alsa_save_CFLAGS" + LDFLAGS="$alsa_save_LDFLAGS" + LIBS="$alsa_save_LIBS" + ALSA_CFLAGS="" + ALSA_LIBS="" +fi + + + + + +for ac_header in alsa/pcm.h +do : + ac_fn_c_check_header_compile "$LINENO" "alsa/pcm.h" "ac_cv_header_alsa_pcm_h" "#include +" +if test "x$ac_cv_header_alsa_pcm_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALSA_PCM_H 1 +_ACEOF + have_pcm="yes" +else + have_pcm="no" +fi + +done + +for ac_header in alsa/mixer.h +do : + ac_fn_c_check_header_compile "$LINENO" "alsa/mixer.h" "ac_cv_header_alsa_mixer_h" "#include +" +if test "x$ac_cv_header_alsa_mixer_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALSA_MIXER_H 1 +_ACEOF + have_mixer="yes" +else + have_mixer="no" +fi + +done + +for ac_header in alsa/rawmidi.h +do : + ac_fn_c_check_header_compile "$LINENO" "alsa/rawmidi.h" "ac_cv_header_alsa_rawmidi_h" "#include +" +if test "x$ac_cv_header_alsa_rawmidi_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALSA_RAWMIDI_H 1 +_ACEOF + have_rawmidi="yes" +else + have_rawmidi="no" +fi + +done + +for ac_header in alsa/seq.h +do : + ac_fn_c_check_header_compile "$LINENO" "alsa/seq.h" "ac_cv_header_alsa_seq_h" "#include +" +if test "x$ac_cv_header_alsa_seq_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALSA_SEQ_H 1 +_ACEOF + have_seq="yes" +else + have_seq="no" +fi + +done + +for ac_header in samplerate.h +do : + ac_fn_c_check_header_compile "$LINENO" "samplerate.h" "ac_cv_header_samplerate_h" "#include +" +if test "x$ac_cv_header_samplerate_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SAMPLERATE_H 1 +_ACEOF + have_samplerate="yes" +else + have_samplerate="no" +fi + +done + + + if test "$have_pcm" = "yes"; then + HAVE_PCM_TRUE= + HAVE_PCM_FALSE='#' +else + HAVE_PCM_TRUE='#' + HAVE_PCM_FALSE= +fi + + if test "$have_mixer" = "yes"; then + HAVE_MIXER_TRUE= + HAVE_MIXER_FALSE='#' +else + HAVE_MIXER_TRUE='#' + HAVE_MIXER_FALSE= +fi + + if test "$have_rawmidi" = "yes"; then + HAVE_RAWMIDI_TRUE= + HAVE_RAWMIDI_FALSE='#' +else + HAVE_RAWMIDI_TRUE='#' + HAVE_RAWMIDI_FALSE= +fi + + if test "$have_seq" = "yes"; then + HAVE_SEQ_TRUE= + HAVE_SEQ_FALSE='#' +else + HAVE_SEQ_TRUE='#' + HAVE_SEQ_FALSE= +fi + + if test "$have_samplerate" = "yes"; then + HAVE_SAMPLERATE_TRUE= + HAVE_SAMPLERATE_FALSE='#' +else + HAVE_SAMPLERATE_TRUE='#' + HAVE_SAMPLERATE_FALSE= +fi + + +LIBRT="" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for librt" >&5 +$as_echo_n "checking for librt... " >&6; } + +# Check whether --with-librt was given. +if test "${with_librt+set}" = set; then : + withval=$with_librt; have_librt="$withval" +else + have_librt="yes" +fi + +if test "$have_librt" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 +$as_echo_n "checking for clock_gettime in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_gettime=yes +else + ac_cv_lib_rt_clock_gettime=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } +if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : + HAVE_LIBRT="yes" +fi + + if test "$HAVE_LIBRT" = "yes" ; then + LIBRT="-lrt" + +$as_echo "#define HAVE_LIBRT 1" >>confdefs.h + + +$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +CURSESINC="" +CURSESLIB="" +CURSES_CFLAGS="" +alsamixer= +if test "$have_mixer" = "yes"; then +# Check whether --enable-alsamixer was given. +if test "${enable_alsamixer+set}" = set; then : + enableval=$enable_alsamixer; case "${enableval}" in + yes) alsamixer=true ;; + no) alsamixer=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-alsamixer" "$LINENO" 5 ;; + esac +else + alsamixer=true +fi + +fi + if test x$alsamixer = xtrue; then + ALSAMIXER_TRUE= + ALSAMIXER_FALSE='#' +else + ALSAMIXER_TRUE='#' + ALSAMIXER_FALSE= +fi + + +# Check whether --enable-alsaconf was given. +if test "${enable_alsaconf+set}" = set; then : + enableval=$enable_alsaconf; case "${enableval}" in + yes) alsaconf=true ;; + no) alsaconf=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-alsaconf" "$LINENO" 5 ;; + esac +else + alsaconf=true +fi + + if test x$alsaconf = xtrue; then + ALSACONF_TRUE= + ALSACONF_FALSE='#' +else + ALSACONF_TRUE='#' + ALSACONF_FALSE= +fi + + +# Check whether --enable-alsaloop was given. +if test "${enable_alsaloop+set}" = set; then : + enableval=$enable_alsaloop; case "${enableval}" in + yes) alsaloop=true ;; + no) alsaloop=false ;; + *) as_fn_error $? "bad value ${enableval} for --enable-alsaloop" "$LINENO" 5 ;; + esac +else + alsaloop=true +fi + + if test x$alsaloop = xtrue; then + ALSALOOP_TRUE= + ALSALOOP_FALSE='#' +else + ALSALOOP_TRUE='#' + ALSALOOP_FALSE= +fi + + +xmlto="" +# Check whether --enable-xmlto was given. +if test "${enable_xmlto+set}" = set; then : + enableval=$enable_xmlto; xmlto="$enableval" +else + xmlto="yes" +fi + +if test "$xmlto" = "yes"; then + # Extract the first word of "xmlto", so it can be a program name with args. +set dummy xmlto; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_xmlto+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$xmlto"; then + ac_cv_prog_xmlto="$xmlto" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_xmlto="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +xmlto=$ac_cv_prog_xmlto +if test -n "$xmlto"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xmlto" >&5 +$as_echo "$xmlto" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi + if test x"$xmlto" = xyes; then + USE_XMLTO_TRUE= + USE_XMLTO_FALSE='#' +else + USE_XMLTO_TRUE='#' + USE_XMLTO_FALSE= +fi + + + +# Check whether --with-udev-rules-dir was given. +if test "${with_udev_rules_dir+set}" = set; then : + withval=$with_udev_rules_dir; udevrulesdir=$withval +else + udevrulesdir="/lib/udev/rules.d" +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +if test x$alsamixer = xtrue; then + +# Check whether --with-curses was given. +if test "${with_curses+set}" = set; then : + withval=$with_curses; curseslib="$withval" +else + curseslib="auto" +fi + + CURSESLIBDIR="" + NCURSESLIBSUFFIX="" + CURSES_NLS="no" + if test "$curseslib" = "ncursesw" -o \( "$curseslib" = "auto" -a "$USE_NLS" = "yes" \); then + # Extract the first word of "ncursesw5-config", so it can be a program name with args. +set dummy ncursesw5-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ncursesw5_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ncursesw5_config"; then + ac_cv_prog_ncursesw5_config="$ncursesw5_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ncursesw5_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ncursesw5_config=$ac_cv_prog_ncursesw5_config +if test -n "$ncursesw5_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ncursesw5_config" >&5 +$as_echo "$ncursesw5_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$ncursesw5_config" = "yes"; then + CURSESINC="" + CURSESLIB=`ncursesw5-config --libs` + CURSESLIBDIR=`ncursesw5-config --libdir` + CURSES_CFLAGS=`ncursesw5-config --cflags` + curseslib="ncursesw" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncursesw" >&5 +$as_echo_n "checking for initscr in -lncursesw... " >&6; } +if ${ac_cv_lib_ncursesw_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncursesw $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ncursesw_initscr=yes +else + ac_cv_lib_ncursesw_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_initscr" >&5 +$as_echo "$ac_cv_lib_ncursesw_initscr" >&6; } +if test "x$ac_cv_lib_ncursesw_initscr" = xyes; then : + CURSESINC=''; CURSESLIB='-lncursesw'; curseslib="ncursesw" +fi + + fi + if test -n "$CURSESINC"; then + NCURSESLIBSUFFIX="w" + CURSES_NLS="yes" + fi + fi + if test "$curseslib" = "ncurses" -o "$curseslib" = "auto"; then + # Extract the first word of "ncurses5-config", so it can be a program name with args. +set dummy ncurses5-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ncurses5_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ncurses5_config"; then + ac_cv_prog_ncurses5_config="$ncurses5_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ncurses5_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ncurses5_config=$ac_cv_prog_ncurses5_config +if test -n "$ncurses5_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ncurses5_config" >&5 +$as_echo "$ncurses5_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$ncurses5_config" = "yes"; then + CURSESINC="" + CURSESLIB=`ncurses5-config --libs` + CURSESLIBDIR=`ncurses5-config --libdir` + CURSES_CFLAGS=`ncurses5-config --cflags` + curseslib="ncurses" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 +$as_echo_n "checking for initscr in -lncurses... " >&6; } +if ${ac_cv_lib_ncurses_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ncurses_initscr=yes +else + ac_cv_lib_ncurses_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_initscr" >&5 +$as_echo "$ac_cv_lib_ncurses_initscr" >&6; } +if test "x$ac_cv_lib_ncurses_initscr" = xyes; then : + CURSESINC=''; CURSESLIB='-lncurses'; curseslib="ncurses" +fi + + fi + fi + if test "$curseslib" = "curses" -o "$curseslib" = "auto"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lcurses" >&5 +$as_echo_n "checking for initscr in -lcurses... " >&6; } +if ${ac_cv_lib_curses_initscr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_curses_initscr=yes +else + ac_cv_lib_curses_initscr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_initscr" >&5 +$as_echo "$ac_cv_lib_curses_initscr" >&6; } +if test "x$ac_cv_lib_curses_initscr" = xyes; then : + CURSESINC=''; CURSESLIB='-lcurses'; curseslib="curses" +fi + + fi + if test -z "$CURSESINC"; then + as_fn_error $? "this packages requires a curses library" "$LINENO" 5 + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curses library" >&5 +$as_echo_n "checking for curses library... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $curseslib" >&5 +$as_echo "$curseslib" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curses header name" >&5 +$as_echo_n "checking for curses header name... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CURSESINC" >&5 +$as_echo "$CURSESINC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curses compiler flags" >&5 +$as_echo_n "checking for curses compiler flags... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CURSES_CFLAGS" >&5 +$as_echo "$CURSES_CFLAGS" >&6; } + + if test -n "$CURSESLIBDIR"; then + if test "-L$CURSESLIBDIR " = "$(echo $CURSESLIB | cut -c-$((${#CURSESLIBDIR}+3)) )"; then + CURSESLIB="$(echo $CURSESLIB | cut -c$((${#CURSESLIBDIR}+4))-)" + fi + fi + + saved_CFLAGS="$CFLAGS" + saved_LDFLAGS="$LDFLAGS" + saved_LIBS="$LIBS" + CFLAGS="$CFLAGS $CURSES_CFLAGS" + if test -n "$CURSESLIBDIR"; then + LDFLAGS="$LDFLAGS -L$CURSESLIBDIR" + fi + LIBS="$CURSESLIB $LIBS" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +set_escdelay(100); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + HAVE_CURSES_ESCDELAY="yes" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$HAVE_CURSES_ESCDELAY" = "yes"; then + +$as_echo "#define HAVE_CURSES_ESCDELAY 1" >>confdefs.h + + fi + + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curses NLS support" >&5 +$as_echo_n "checking for curses NLS support... " >&6; } + if test "$curseslib" = "curses"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE 1 + #define _XOPEN_SOURCE_EXTENDED 1 + #include + +int +main () +{ + + cchar_t wc; + setcchar(&wc, L"x", A_NORMAL, 0, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CURSES_NLS="yes" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CURSES_NLS" >&5 +$as_echo "$CURSES_NLS" >&6; } + if test "$CURSES_NLS" = "yes"; then + +$as_echo "#define ENABLE_NLS_IN_CURSES 1" >>confdefs.h + + fi + fi + + # On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in panel.h menu.h form.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +else + as_fn_error $? "required curses helper header not found" "$LINENO" 5 +fi + +done + + as_ac_Lib=`$as_echo "ac_cv_lib_panel$NCURSESLIBSUFFIX''_new_panel" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for new_panel in -lpanel$NCURSESLIBSUFFIX" >&5 +$as_echo_n "checking for new_panel in -lpanel$NCURSESLIBSUFFIX... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpanel$NCURSESLIBSUFFIX $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char new_panel (); +int +main () +{ +return new_panel (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + CURSESLIB="-lpanel$NCURSESLIBSUFFIX $CURSESLIB" +else + as_fn_error $? "panel$NCURSESLIBSUFFIX library not found" "$LINENO" 5 +fi + + as_ac_Lib=`$as_echo "ac_cv_lib_menu$NCURSESLIBSUFFIX''_new_menu" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for new_menu in -lmenu$NCURSESLIBSUFFIX" >&5 +$as_echo_n "checking for new_menu in -lmenu$NCURSESLIBSUFFIX... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmenu$NCURSESLIBSUFFIX $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char new_menu (); +int +main () +{ +return new_menu (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + CURSESLIB="-lmenu$NCURSESLIBSUFFIX $CURSESLIB" +else + as_fn_error $? "menu$NCURSESLIBSUFFIX library not found" "$LINENO" 5 +fi + + as_ac_Lib=`$as_echo "ac_cv_lib_form$NCURSESLIBSUFFIX''_new_form" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for new_form in -lform$NCURSESLIBSUFFIX" >&5 +$as_echo_n "checking for new_form in -lform$NCURSESLIBSUFFIX... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lform$NCURSESLIBSUFFIX $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char new_form (); +int +main () +{ +return new_form (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + CURSESLIB="-lform$NCURSESLIBSUFFIX $CURSESLIB" +else + as_fn_error $? "form$NCURSESLIBSUFFIX library not found" "$LINENO" 5 +fi + + + CFLAGS="$saved_CFLAGS" + LDFLAGS="$saved_LDFLAGS" + LIBS="$saved_LIBS" + + if test -n "$CURSESLIBDIR"; then + CURSESLIB="-L$CURSESLIBDIR $CURSESLIB" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curses linker flags" >&5 +$as_echo_n "checking for curses linker flags... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CURSESLIB" >&5 +$as_echo "$CURSESLIB" >&6; } +fi + + + + + +test "x$prefix" = xNONE && prefix=$ac_default_prefix + +eval dir="$datadir" +case "$dir" in +/*) ;; +*) dir="$prefix/share" +esac + +soundsdir="$dir/sounds/alsa" + +cat >>confdefs.h <<_ACEOF +#define SOUNDSDIR "$soundsdir" +_ACEOF + + +mydatadir="$dir/alsa" + +cat >>confdefs.h <<_ACEOF +#define DATADIR "$mydatadir" +_ACEOF + + + +# Check whether --with-testsound was given. +if test "${with_testsound+set}" = set; then : + withval=$with_testsound; TESTSOUND="$withval" +else + TESTSOUND="$dir/test.wav" +fi + + + +ac_config_headers="$ac_config_headers include/aconfig.h" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + + +if test $ac_cv_c_compiler_gnu = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +$as_echo_n "checking whether $CC needs -traditional... " >&6; } +if ${ac_cv_prog_gcc_traditional+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_pattern="Autoconf.*'x'" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then : + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then : + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +$as_echo "$ac_cv_prog_gcc_traditional" >&6; } + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi +fi + + + +SND_UTIL_VERSION=$VERSION +echo $VERSION > $srcdir/version + +cat >>confdefs.h <<_ACEOF +#define VERSION "$SND_UTIL_VERSION" +_ACEOF + + +SND_UTIL_MAJOR=`echo $VERSION | cut -d . -f 1` + +SND_UTIL_MINOR=`echo $VERSION | cut -d . -f 2` + +SND_UTIL_SUBMINOR=`echo $VERSION | cut -d . -f 3 | sed -e 's/pre[0-9]*//g'` + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi + +# Check whether --with-systemdsystemunitdir was given. +if test "${with_systemdsystemunitdir+set}" = set; then : + withval=$with_systemdsystemunitdir; +else + with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd) +fi + +if test "x$with_systemdsystemunitdir" != xno; then + systemdsystemunitdir=$with_systemdsystemunitdir + +fi + if test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ; then + HAVE_SYSTEMD_TRUE= + HAVE_SYSTEMD_FALSE='#' +else + HAVE_SYSTEMD_TRUE='#' + HAVE_SYSTEMD_FALSE= +fi + + + +# Check whether --with-asound-state-dir was given. +if test "${with_asound_state_dir+set}" = set; then : + withval=$with_asound_state_dir; ASOUND_STATE_DIR="$withval" +else + ASOUND_STATE_DIR="/var/lib/alsa" +fi + + + +ac_config_files="$ac_config_files Makefile alsactl/Makefile alsactl/init/Makefile alsamixer/Makefile amidi/Makefile amixer/Makefile m4/Makefile po/Makefile.in alsaconf/alsaconf alsaconf/Makefile alsaconf/po/Makefile alsaucm/Makefile aplay/Makefile include/Makefile iecset/Makefile utils/Makefile utils/alsa-utils.spec seq/Makefile seq/aconnect/Makefile seq/aplaymidi/Makefile seq/aseqdump/Makefile seq/aseqnet/Makefile speaker-test/Makefile speaker-test/samples/Makefile alsaloop/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_PCM_TRUE}" && test -z "${HAVE_PCM_FALSE}"; then + as_fn_error $? "conditional \"HAVE_PCM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MIXER_TRUE}" && test -z "${HAVE_MIXER_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MIXER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_RAWMIDI_TRUE}" && test -z "${HAVE_RAWMIDI_FALSE}"; then + as_fn_error $? "conditional \"HAVE_RAWMIDI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SEQ_TRUE}" && test -z "${HAVE_SEQ_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SEQ\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SAMPLERATE_TRUE}" && test -z "${HAVE_SAMPLERATE_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SAMPLERATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ALSAMIXER_TRUE}" && test -z "${ALSAMIXER_FALSE}"; then + as_fn_error $? "conditional \"ALSAMIXER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ALSACONF_TRUE}" && test -z "${ALSACONF_FALSE}"; then + as_fn_error $? "conditional \"ALSACONF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ALSALOOP_TRUE}" && test -z "${ALSALOOP_FALSE}"; then + as_fn_error $? "conditional \"ALSALOOP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_XMLTO_TRUE}" && test -z "${USE_XMLTO_FALSE}"; then + as_fn_error $? "conditional \"USE_XMLTO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SYSTEMD_TRUE}" && test -z "${HAVE_SYSTEMD_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SYSTEMD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "include/aconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS include/aconfig.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "alsactl/Makefile") CONFIG_FILES="$CONFIG_FILES alsactl/Makefile" ;; + "alsactl/init/Makefile") CONFIG_FILES="$CONFIG_FILES alsactl/init/Makefile" ;; + "alsamixer/Makefile") CONFIG_FILES="$CONFIG_FILES alsamixer/Makefile" ;; + "amidi/Makefile") CONFIG_FILES="$CONFIG_FILES amidi/Makefile" ;; + "amixer/Makefile") CONFIG_FILES="$CONFIG_FILES amixer/Makefile" ;; + "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "alsaconf/alsaconf") CONFIG_FILES="$CONFIG_FILES alsaconf/alsaconf" ;; + "alsaconf/Makefile") CONFIG_FILES="$CONFIG_FILES alsaconf/Makefile" ;; + "alsaconf/po/Makefile") CONFIG_FILES="$CONFIG_FILES alsaconf/po/Makefile" ;; + "alsaucm/Makefile") CONFIG_FILES="$CONFIG_FILES alsaucm/Makefile" ;; + "aplay/Makefile") CONFIG_FILES="$CONFIG_FILES aplay/Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "iecset/Makefile") CONFIG_FILES="$CONFIG_FILES iecset/Makefile" ;; + "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; + "utils/alsa-utils.spec") CONFIG_FILES="$CONFIG_FILES utils/alsa-utils.spec" ;; + "seq/Makefile") CONFIG_FILES="$CONFIG_FILES seq/Makefile" ;; + "seq/aconnect/Makefile") CONFIG_FILES="$CONFIG_FILES seq/aconnect/Makefile" ;; + "seq/aplaymidi/Makefile") CONFIG_FILES="$CONFIG_FILES seq/aplaymidi/Makefile" ;; + "seq/aseqdump/Makefile") CONFIG_FILES="$CONFIG_FILES seq/aseqdump/Makefile" ;; + "seq/aseqnet/Makefile") CONFIG_FILES="$CONFIG_FILES seq/aseqnet/Makefile" ;; + "speaker-test/Makefile") CONFIG_FILES="$CONFIG_FILES speaker-test/Makefile" ;; + "speaker-test/samples/Makefile") CONFIG_FILES="$CONFIG_FILES speaker-test/samples/Makefile" ;; + "alsaloop/Makefile") CONFIG_FILES="$CONFIG_FILES alsaloop/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "po-directories":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..9ec1fac --- /dev/null +++ b/configure.in @@ -0,0 +1,312 @@ +dnl Process this file with autoconf to produce a configure script. +AC_PREREQ(2.59) +AC_INIT(aplay/aplay.c) +AC_PREFIX_DEFAULT(/usr) +AM_INIT_AUTOMAKE(alsa-utils, 1.0.24.2) + +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION([0.15]) + +dnl Checks for programs. + +dnl try to gues cross-compiler if not set +if test "x$target" != "x$host" -a -z "`echo $CC | grep -e '-gcc'`"; +then + AC_MSG_CHECKING(for cross-compiler) + + which ${program_prefix}gcc >/dev/null 2>&1 && CC=${program_prefix}gcc + which ${target_cpu}-${target_os}-gcc >/dev/null 2>&1 \ + && CC=${target_cpu}-${target-os}-gcc + which ${target_cpu}-${target_vendor}-${target_os}-gcc >/dev/null 2>&1 \ + && CC=${target_cpu}-${target_vendor}-${target_os}-gcc + + AC_MSG_RESULT($CC) +fi + +AC_PROG_CC +dnl AC_PROG_CXX +AC_PROG_INSTALL +AC_PROG_MKDIR_P +AC_PROG_LN_S +AM_PATH_ALSA(1.0.16) + +dnl Check components +AC_CHECK_HEADERS([alsa/pcm.h], [have_pcm="yes"], [have_pcm="no"], + [#include ]) +AC_CHECK_HEADERS([alsa/mixer.h], [have_mixer="yes"], [have_mixer="no"], + [#include ]) +AC_CHECK_HEADERS([alsa/rawmidi.h], [have_rawmidi="yes"], [have_rawmidi="no"], + [#include ]) +AC_CHECK_HEADERS([alsa/seq.h], [have_seq="yes"], [have_seq="no"], + [#include ]) +AC_CHECK_HEADERS([samplerate.h], [have_samplerate="yes"], [have_samplerate="no"], + [#include ]) + +AM_CONDITIONAL(HAVE_PCM, test "$have_pcm" = "yes") +AM_CONDITIONAL(HAVE_MIXER, test "$have_mixer" = "yes") +AM_CONDITIONAL(HAVE_RAWMIDI, test "$have_rawmidi" = "yes") +AM_CONDITIONAL(HAVE_SEQ, test "$have_seq" = "yes") +AM_CONDITIONAL(HAVE_SAMPLERATE, test "$have_samplerate" = "yes") + +dnl Check for librt +LIBRT="" +AC_MSG_CHECKING(for librt) +AC_ARG_WITH(librt, + AS_HELP_STRING([--with-librt], [Use librt for monotonic clock (default = yes)]), + [ have_librt="$withval" ], [ have_librt="yes" ]) +if test "$have_librt" = "yes"; then + AC_CHECK_LIB([rt], [clock_gettime], [HAVE_LIBRT="yes"]) + if test "$HAVE_LIBRT" = "yes" ; then + LIBRT="-lrt" + AC_DEFINE([HAVE_LIBRT], 1, [Have librt]) + AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [Have clock gettime]) + fi +else + AC_MSG_RESULT(no) +fi + +dnl Disable alsamixer +CURSESINC="" +CURSESLIB="" +CURSES_CFLAGS="" +alsamixer= +if test "$have_mixer" = "yes"; then +AC_ARG_ENABLE(alsamixer, + [ --disable-alsamixer Disable alsamixer compilation], + [case "${enableval}" in + yes) alsamixer=true ;; + no) alsamixer=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-alsamixer) ;; + esac],[alsamixer=true]) +fi +AM_CONDITIONAL(ALSAMIXER, test x$alsamixer = xtrue) + +dnl Disable alsaconf +AC_ARG_ENABLE(alsaconf, + [ --disable-alsaconf Disable alsaconf packaging], + [case "${enableval}" in + yes) alsaconf=true ;; + no) alsaconf=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-alsaconf) ;; + esac],[alsaconf=true]) +AM_CONDITIONAL(ALSACONF, test x$alsaconf = xtrue) + +dnl Disable alsaloop +AC_ARG_ENABLE(alsaloop, + [ --disable-alsaloop Disable alsaloop packaging], + [case "${enableval}" in + yes) alsaloop=true ;; + no) alsaloop=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-alsaloop) ;; + esac],[alsaloop=true]) +AM_CONDITIONAL(ALSALOOP, test x$alsaloop = xtrue) + +xmlto="" +AC_ARG_ENABLE(xmlto, + AS_HELP_STRING([--disable-xmlto], [Disable man page creation via xmlto]), + xmlto="$enableval", xmlto="yes") +if test "$xmlto" = "yes"; then + AC_CHECK_PROG([xmlto], [xmlto], [yes]) +fi +AM_CONDITIONAL(USE_XMLTO, test x"$xmlto" = xyes) + +AC_ARG_WITH( + [udev-rules-dir], + AS_HELP_STRING([--with-udev-rules-dir],[Directory where to install udev rules to (defaults to /lib/udev/rules.d)]), + [udevrulesdir=$withval], [udevrulesdir="/lib/udev/rules.d"]) +AC_SUBST(udevrulesdir) + +dnl Checks for header files. +AC_HEADER_STDC +if test x$alsamixer = xtrue; then + AC_ARG_WITH(curses, + [ --with-curses libname Specify the curses library to use (default=auto)], + curseslib="$withval", + curseslib="auto") + CURSESLIBDIR="" + NCURSESLIBSUFFIX="" + CURSES_NLS="no" + if test "$curseslib" = "ncursesw" -o \( "$curseslib" = "auto" -a "$USE_NLS" = "yes" \); then + AC_CHECK_PROG([ncursesw5_config], [ncursesw5-config], [yes]) + if test "$ncursesw5_config" = "yes"; then + CURSESINC="" + CURSESLIB=`ncursesw5-config --libs` + CURSESLIBDIR=`ncursesw5-config --libdir` + CURSES_CFLAGS=`ncursesw5-config --cflags` + curseslib="ncursesw" + else + AC_CHECK_LIB(ncursesw, initscr, + [ CURSESINC=''; CURSESLIB='-lncursesw'; curseslib="ncursesw"]) + fi + if test -n "$CURSESINC"; then + NCURSESLIBSUFFIX="w" + CURSES_NLS="yes" + fi + fi + if test "$curseslib" = "ncurses" -o "$curseslib" = "auto"; then + AC_CHECK_PROG([ncurses5_config], [ncurses5-config], [yes]) + if test "$ncurses5_config" = "yes"; then + CURSESINC="" + CURSESLIB=`ncurses5-config --libs` + CURSESLIBDIR=`ncurses5-config --libdir` + CURSES_CFLAGS=`ncurses5-config --cflags` + curseslib="ncurses" + else + AC_CHECK_LIB(ncurses, initscr, + [ CURSESINC=''; CURSESLIB='-lncurses'; curseslib="ncurses"]) + fi + fi + if test "$curseslib" = "curses" -o "$curseslib" = "auto"; then + AC_CHECK_LIB(curses, initscr, + [ CURSESINC=''; CURSESLIB='-lcurses'; curseslib="curses"]) + fi + if test -z "$CURSESINC"; then + AC_MSG_ERROR(this packages requires a curses library) + fi + + AC_MSG_CHECKING([for curses library]) + AC_MSG_RESULT([$curseslib]) + AC_MSG_CHECKING([for curses header name]) + AC_MSG_RESULT([$CURSESINC]) + AC_MSG_CHECKING([for curses compiler flags]) + AC_MSG_RESULT([$CURSES_CFLAGS]) + + dnl CURSESLIBS might have the library path at the beginning. If so, we cut it + dnl off so that we can insert the other curses libraries before the ncurses + dnl library but after the library path (which is later again prepended below). + if test -n "$CURSESLIBDIR"; then + if test "-L$CURSESLIBDIR " = "$(echo $CURSESLIB | cut -c-$((${#CURSESLIBDIR}+3)) )"; then + CURSESLIB="$(echo $CURSESLIB | cut -c$((${#CURSESLIBDIR}+4))-)" + fi + fi + + saved_CFLAGS="$CFLAGS" + saved_LDFLAGS="$LDFLAGS" + saved_LIBS="$LIBS" + CFLAGS="$CFLAGS $CURSES_CFLAGS" + if test -n "$CURSESLIBDIR"; then + LDFLAGS="$LDFLAGS -L$CURSESLIBDIR" + fi + LIBS="$CURSESLIB $LIBS" + + AC_TRY_LINK([#include ], [set_escdelay(100);],[HAVE_CURSES_ESCDELAY="yes"]) + if test "$HAVE_CURSES_ESCDELAY" = "yes"; then + AC_DEFINE([HAVE_CURSES_ESCDELAY], 1, [Have curses set_escdelay]) + fi + + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([for curses NLS support]) + dnl In theory, a single-byte curses works just fine in ISO 8859-* locales. + dnl In practice, however, everybody uses UTF-8 nowadays, so we'd better + dnl check for wide-character support. + dnl For ncurses/ncursesw, CURSES_NLS was already set above. + if test "$curseslib" = "curses"; then + AC_TRY_LINK([ + #define _XOPEN_SOURCE 1 + #define _XOPEN_SOURCE_EXTENDED 1 + #include + ], [ + cchar_t wc; + setcchar(&wc, L"x", A_NORMAL, 0, 0); + ], + [CURSES_NLS="yes"]) + fi + AC_MSG_RESULT([$CURSES_NLS]) + if test "$CURSES_NLS" = "yes"; then + AC_DEFINE([ENABLE_NLS_IN_CURSES], [1], + [Define if curses-based programs can show translated messages.]) + fi + fi + + AC_CHECK_HEADERS([panel.h menu.h form.h], [], + [AC_MSG_ERROR([required curses helper header not found])]) + AC_CHECK_LIB([panel$NCURSESLIBSUFFIX], [new_panel], + [CURSESLIB="-lpanel$NCURSESLIBSUFFIX $CURSESLIB"], + [AC_MSG_ERROR([panel$NCURSESLIBSUFFIX library not found])]) + AC_CHECK_LIB([menu$NCURSESLIBSUFFIX], [new_menu], + [CURSESLIB="-lmenu$NCURSESLIBSUFFIX $CURSESLIB"], + [AC_MSG_ERROR([menu$NCURSESLIBSUFFIX library not found])]) + AC_CHECK_LIB([form$NCURSESLIBSUFFIX], [new_form], + [CURSESLIB="-lform$NCURSESLIBSUFFIX $CURSESLIB"], + [AC_MSG_ERROR([form$NCURSESLIBSUFFIX library not found])]) + + CFLAGS="$saved_CFLAGS" + LDFLAGS="$saved_LDFLAGS" + LIBS="$saved_LIBS" + + if test -n "$CURSESLIBDIR"; then + CURSESLIB="-L$CURSESLIBDIR $CURSESLIB" + fi + + AC_MSG_CHECKING([for curses linker flags]) + AC_MSG_RESULT([$CURSESLIB]) +fi + +AC_SUBST(CURSESINC) +AC_SUBST(CURSESLIB) +AC_SUBST(CURSES_CFLAGS) + +test "x$prefix" = xNONE && prefix=$ac_default_prefix + +eval dir="$datadir" +case "$dir" in +/*) ;; +*) dir="$prefix/share" +esac + +soundsdir="$dir/sounds/alsa" +AC_DEFINE_UNQUOTED(SOUNDSDIR, "$soundsdir", [directory containing sample data]) + +mydatadir="$dir/alsa" +AC_DEFINE_UNQUOTED(DATADIR, "$mydatadir", [directory containing alsa configuration]) + +AC_ARG_WITH(testsound, + [ --with-testsound=file give the path of test sound file for alsaconf], + TESTSOUND="$withval", + TESTSOUND="$dir/test.wav") +AC_SUBST(TESTSOUND) + +AM_CONFIG_HEADER(include/aconfig.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_HEADER_TIME + +dnl Checks for library functions. +AC_PROG_GCC_TRADITIONAL + +dnl Enable largefile support +AC_SYS_LARGEFILE + +SAVE_UTIL_VERSION + +AC_SUBST(LIBRT) + +dnl Check for systemd +PKG_PROG_PKG_CONFIG +AC_ARG_WITH([systemdsystemunitdir], + AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]), + [], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)]) +if test "x$with_systemdsystemunitdir" != xno; then + AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir]) +fi +AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ]) + +AC_ARG_WITH([asound-state-dir], + AS_HELP_STRING([--with-asound-state-dir=DIR], [Directory to place asound.state file in]), + [ASOUND_STATE_DIR="$withval"], + [ASOUND_STATE_DIR="/var/lib/alsa"]) +AC_SUBST(ASOUND_STATE_DIR) + +AC_OUTPUT(Makefile alsactl/Makefile alsactl/init/Makefile \ + alsamixer/Makefile amidi/Makefile amixer/Makefile \ + m4/Makefile po/Makefile.in \ + alsaconf/alsaconf alsaconf/Makefile \ + alsaconf/po/Makefile \ + alsaucm/Makefile \ + aplay/Makefile include/Makefile iecset/Makefile utils/Makefile \ + utils/alsa-utils.spec seq/Makefile seq/aconnect/Makefile \ + seq/aplaymidi/Makefile seq/aseqdump/Makefile seq/aseqnet/Makefile \ + speaker-test/Makefile speaker-test/samples/Makefile \ + alsaloop/Makefile) diff --git a/debian/alsa-utils.install b/debian/alsa-utils.install new file mode 100644 index 0000000..862779b --- /dev/null +++ b/debian/alsa-utils.install @@ -0,0 +1,4 @@ +/usr/bin/* +/usr/sbin/* +/usr/share/alsa/* +/usr/share/sounds/* diff --git a/debian/alsa-utils.install.in b/debian/alsa-utils.install.in new file mode 100644 index 0000000..87aa6ef --- /dev/null +++ b/debian/alsa-utils.install.in @@ -0,0 +1,4 @@ +@PREFIX@/bin/* +@PREFIX@/sbin/* +@PREFIX@/share/alsa/* +@PREFIX@/share/sounds/* diff --git a/debian/changelog b/debian/changelog new file mode 100755 index 0000000..6f2a242 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,73 @@ +alsa-utils (1.0.24.2-0) unstable; urgency=low + + * Version upgrade from 1.0.21 to 1.0.24.2 + * Git: pkgs/a/alsa-utils + * Tag: alsa-utils_1.0.24.2-0 + + -- Seungbae Shin Tue, 03 Jan 2012 14:07:28 +0900 + +alsa-utils (1.0.21-1slp2) unstable; urgency=low + + * remove man page in binary package + * Git: 165.213.180.234:/git/slp/pkgs/alsa-utils + * Tag: alsa-utils_1.0.21-1slp2 + + -- KwangHui Cho Fri, 12 Nov 2010 15:12:28 +0900 + +alsa-utils (1.0.21-0slp4) unstable; urgency=low + + * Update for git repository changes + * Git: 165.213.180.234:/git/slp/pkgs/alsa-utils + * Tag: alsa-utils_1.0.21-0slp4 + + -- Seungbae Shin Fri, 12 Nov 2010 11:54:04 +0900 + +alsa-utils (1.0.21-0slp3) unstable; urgency=low + + * Change maintainer + * Git: 165.213.180.234:/git/slp2.0/slp2.0-pkgs/alsa-utils-1.0.16 + * Tag: alsa-utils_1.0.21-0slp3 + + -- Seungbae Shin Thu, 08 Jul 2010 14:49:19 +0900 + +alsa-utils (1.0.21-0slp2) unstable; urgency=low + + * import alsa utils 1.0.21 to slp2 + + -- KwangHui Cho Tue, 06 Apr 2010 13:40:32 +0900 + +alsa-utils (1.0.16-4slp2) unstable; urgency=low + + * Change package naming rule + + -- Seungbae Shin Thu, 25 Mar 2010 14:54:29 +0900 + +alsa-utils (1.0.16-4) unstable; urgency=low + + * Modified configure option in rules file. + + -- Yunchan Cho Thu, 04 Mar 2010 12:20:43 +0900 + +alsa-utils (1.0.16-3) unstable; urgency=low + + * remove .git directory + + -- Yunchan Cho Fri, 20 Nov 2009 16:17:19 +0900 + +alsa-utils (1.0.16-2) unstable; urgency=low + + * update debianize + + -- Yunchan Cho Thu, 19 Nov 2009 17:15:35 +0900 + +alsa-utils (1.0.16-1) unstable; urgency=low + + * uncommnet dh_makeshlibs + + -- Yunchan Cho Mon, 16 Nov 2009 22:25:32 +0900 + +alsa-utils (1.0.16-0) unstable; urgency=low + + * Initial Release. + + -- Yunchan Cho Thu, 12 Nov 2009 20:12:25 +0900 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..c6163a5 --- /dev/null +++ b/debian/control @@ -0,0 +1,13 @@ +Source: alsa-utils +Priority: optional +Maintainer: Seungbae Shin , JongHyuk Choi +Uploaders: Seungbae Shin +Build-Depends: debhelper (>= 5), autotools-dev, libasound2-dev +Standards-Version: 3.7.2 +Section: libs + +Package: alsa-utils +Section: utils +Architecture: any +Depends: ${shlibs:Depends}, libasound2 +Description: ALSA utility package for multimedia framework middleware package diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..eb0a817 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,5 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. +Copyright (c) 2011 Seongho Jeong + +and is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License version 2.1. diff --git a/debian/dirs b/debian/dirs new file mode 100644 index 0000000..ca882bb --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..724e084 --- /dev/null +++ b/debian/docs @@ -0,0 +1,2 @@ +README +TODO diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..6abcf59 --- /dev/null +++ b/debian/rules @@ -0,0 +1,115 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS ?= -Wall -g +LDFLAGS ?= -L/usr/lib +PREFIX ?= /usr +DATADIR ?= /opt + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +config.status: configure + dh_testdir + # Add here commands to configure the package. + ./configure --prefix=$(PREFIX) CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" --disable-nls --disable-xmlto --disable-alsamixer --disable-alsatest + + +build: build-stamp + +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + #docbook-to-man debian/ncurses.sgml > ncurses.1 + + for f in `find $(CURDIR)/debian/ -name "*.in"`; do \ + cat $$f > $${f%.in}; \ + sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \ + sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \ + done + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/ncurses. + $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +# Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/gitcompile b/gitcompile new file mode 100755 index 0000000..513ef72 --- /dev/null +++ b/gitcompile @@ -0,0 +1,25 @@ +#!/bin/bash + +if test -d ../alsa-lib/utils && ! test -r `aclocal --print-ac-dir`/alsa.m4; then + alsa_m4_flags="-I ../alsa-lib/utils" +fi +aclocal $alsa_m4_flags $ACLOCAL_FLAGS +# save original files to avoid stupid modifications by gettextize +cp Makefile.am Makefile.am.ok +cp configure.in configure.in.ok +gettextize -c -f --no-changelog +echo "EXTRA_DIST = gettext.m4" > m4/Makefile.am +cp Makefile.am.ok Makefile.am +cp configure.in.ok configure.in +autoheader +automake --foreign --copy --add-missing +touch depcomp # for older automake +autoconf +export CFLAGS='-O2 -Wall -pipe -g' +echo "CFLAGS=$CFLAGS" +echo "./configure $@" +./configure $@ || exit 1 +unset CFLAGS +if [ -z "$GITCOMPILE_NO_MAKE" ]; then + make +fi diff --git a/iecset/Makefile.am b/iecset/Makefile.am new file mode 100644 index 0000000..c03a7f1 --- /dev/null +++ b/iecset/Makefile.am @@ -0,0 +1,9 @@ +INCLUDES = -I$(top_srcdir)/include +LDADD = -lm +# LDFLAGS = -static +# CFLAGS += -g -Wall + +bin_PROGRAMS = iecset +iecset_SOURCES = iecset.c iecbits.c +man_MANS = iecset.1 +EXTRA_DIST = iecset.1 diff --git a/iecset/Makefile.in b/iecset/Makefile.in new file mode 100644 index 0000000..35eb173 --- /dev/null +++ b/iecset/Makefile.in @@ -0,0 +1,582 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = iecset$(EXEEXT) +subdir = iecset +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_iecset_OBJECTS = iecset.$(OBJEXT) iecbits.$(OBJEXT) +iecset_OBJECTS = $(am_iecset_OBJECTS) +iecset_LDADD = $(LDADD) +iecset_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(iecset_SOURCES) +DIST_SOURCES = $(iecset_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +LDADD = -lm +iecset_SOURCES = iecset.c iecbits.c +man_MANS = iecset.1 +EXTRA_DIST = iecset.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign iecset/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign iecset/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +iecset$(EXEEXT): $(iecset_OBJECTS) $(iecset_DEPENDENCIES) + @rm -f iecset$(EXEEXT) + $(LINK) $(iecset_OBJECTS) $(iecset_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iecbits.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iecset.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/iecset/iecbits.c b/iecset/iecbits.c new file mode 100644 index 0000000..edea932 --- /dev/null +++ b/iecset/iecbits.c @@ -0,0 +1,259 @@ +/* + iecdump - dump IEC958 status bits on ALSA + Copyright (C) 2003 by Takashi Iwai + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +struct category_str { + int val; + const char *name; +}; + +static const struct category_str con_category[] = { + { IEC958_AES1_CON_GENERAL, "general" }, + + { IEC958_AES1_CON_IEC908_CD, "CD" }, + { IEC958_AES1_CON_NON_IEC908_CD, "non-IEC908 CD" }, + { IEC958_AES1_CON_MINI_DISC, "Mini-Disc" }, + { IEC958_AES1_CON_DVD, "DVD" }, + + { IEC958_AES1_CON_PCM_CODER, "PCM coder" }, + { IEC958_AES1_CON_MIXER, "digital signal mixer" }, + { IEC958_AES1_CON_RATE_CONVERTER, "rate converter" }, + { IEC958_AES1_CON_SAMPLER, "sampler" }, + { IEC958_AES1_CON_DSP, "digital sound processor" }, + + { IEC958_AES1_CON_DAT, "DAT" }, + { IEC958_AES1_CON_VCR, "VCR" }, + { IEC958_AES1_CON_DCC, "DCC" }, + { IEC958_AES1_CON_MAGNETIC_DISC, "magnetic disc" }, + + { IEC958_AES1_CON_DAB_JAPAN, "digital audio broadcast (Japan)" }, + { IEC958_AES1_CON_DAB_EUROPE, "digital audio broadcast (Europe)" }, + { IEC958_AES1_CON_DAB_USA, "digital audio broadcast (USA)" }, + { IEC958_AES1_CON_SOFTWARE, "software delivery" }, + + { IEC958_AES1_CON_SYNTHESIZER, "synthesizer" }, + { IEC958_AES1_CON_MICROPHONE, "microphone" }, + + { IEC958_AES1_CON_ADC, "ADC without copyright information" }, + + { IEC958_AES1_CON_ADC_COPYRIGHT, "ADC with copyright information" }, + + { IEC958_AES1_CON_SOLIDMEM_DIGITAL_RECORDER_PLAYER, "flash memory recorder/player" }, + + { IEC958_AES1_CON_EXPERIMENTAL, "experimental" }, +}; + + +#define ARRAY_SIZE(x) (int)(sizeof(x)/sizeof(x[0])) + +void dump_iec958(snd_aes_iec958_t *iec) +{ + int i; + + if (! (iec->status[0] & IEC958_AES0_PROFESSIONAL)) { + /* consumer */ + printf("Mode: consumer\n"); + printf("Data: "); + if (!(iec->status[0] & IEC958_AES0_NONAUDIO)) { + printf("audio\n"); + } else { + printf("non-audio\n"); + } + printf("Rate: "); + switch (iec->status[3] & IEC958_AES3_CON_FS) { + case IEC958_AES3_CON_FS_22050: + printf("22050 Hz\n"); + break; + case IEC958_AES3_CON_FS_24000: + printf("24000 Hz\n"); + break; + case IEC958_AES3_CON_FS_32000: + printf("32000 Hz\n"); + break; + case IEC958_AES3_CON_FS_44100: + printf("44100 Hz\n"); + break; + case IEC958_AES3_CON_FS_48000: + printf("48000 Hz\n"); + break; + case IEC958_AES3_CON_FS_88200: + printf("88200 Hz\n"); + break; + case IEC958_AES3_CON_FS_96000: + printf("96000 Hz\n"); + break; + case IEC958_AES3_CON_FS_176400: + printf("176400 Hz\n"); + break; + case IEC958_AES3_CON_FS_192000: + printf("192000 Hz\n"); + break; + case IEC958_AES3_CON_FS_768000: + printf("768000 Hz\n"); + break; + case IEC958_AES3_CON_FS_NOTID: + printf("not indicated\n"); + break; + default: + printf("unknown\n"); + break; + } + printf("Copyright: "); + if (iec->status[0] & IEC958_AES0_CON_NOT_COPYRIGHT) { + printf("permitted\n"); + } else { + printf("protected\n"); + } + printf("Emphasis: "); + if ((iec->status[0] & IEC958_AES0_CON_EMPHASIS) != IEC958_AES0_CON_EMPHASIS_5015) { + printf("none\n"); + } else { + printf("50/15us\n"); + } + printf("Category: "); + for (i = 0; i < ARRAY_SIZE(con_category); i++) { + if ((iec->status[1] & IEC958_AES1_CON_CATEGORY) == con_category[i].val) { + printf("%s\n", con_category[i].name); + break; + } + } + if (i >= ARRAY_SIZE(con_category)) { + printf("unknown 0x%x\n", iec->status[1] & IEC958_AES1_CON_CATEGORY); + } + printf("Original: "); + if (iec->status[1] & IEC958_AES1_CON_ORIGINAL) { + printf("original\n"); + } else { + printf("1st generation\n"); + } + printf("Clock: "); + switch (iec->status[3] & IEC958_AES3_CON_CLOCK) { + case IEC958_AES3_CON_CLOCK_1000PPM: + printf("1000 ppm\n"); + break; + case IEC958_AES3_CON_CLOCK_50PPM: + printf("50 ppm\n"); + break; + case IEC958_AES3_CON_CLOCK_VARIABLE: + printf("variable pitch\n"); + break; + default: + printf("unknown\n"); + break; + } + } else { + printf("Mode: professional\n"); + printf("Data: "); + if (!(iec->status[0] & IEC958_AES0_NONAUDIO)) { + printf("audio\n"); + } else { + printf("non-audio\n"); + } + printf("Rate: "); + switch (iec->status[0] & IEC958_AES0_PRO_FS) { + case IEC958_AES0_PRO_FS_44100: + printf("44100 Hz\n"); + break; + case IEC958_AES0_PRO_FS_48000: + printf("48000 Hz\n"); + break; + case IEC958_AES0_PRO_FS_32000: + printf("32000 Hz\n"); + break; + default: + printf("unknown\n"); + break; + } + printf("Rate Locked: "); + if (iec->status[0] & IEC958_AES0_PRO_FREQ_UNLOCKED) + printf("no\n"); + else + printf("yes\n"); + printf("Emphasis: "); + switch (iec->status[0] & IEC958_AES0_PRO_EMPHASIS) { + case IEC958_AES0_PRO_EMPHASIS_CCITT: + printf("CCITT J.17\n"); + break; + case IEC958_AES0_PRO_EMPHASIS_NONE: + printf("none\n"); + break; + case IEC958_AES0_PRO_EMPHASIS_5015: + printf("50/15us\n"); + break; + case IEC958_AES0_PRO_EMPHASIS_NOTID: + default: + printf("unknown\n"); + break; + } + printf("Stereophonic: "); + if ((iec->status[1] & IEC958_AES1_PRO_MODE) == IEC958_AES1_PRO_MODE_STEREOPHONIC) { + printf("stereo\n"); + } else { + printf("not indicated\n"); + } + printf("Userbits: "); + switch (iec->status[1] & IEC958_AES1_PRO_USERBITS) { + case IEC958_AES1_PRO_USERBITS_192: + printf("192bit\n"); + break; + case IEC958_AES1_PRO_USERBITS_UDEF: + printf("user-defined\n"); + break; + default: + printf("unkown\n"); + break; + } + printf("Sample Bits: "); + switch (iec->status[2] & IEC958_AES2_PRO_SBITS) { + case IEC958_AES2_PRO_SBITS_20: + printf("20 bit\n"); + break; + case IEC958_AES2_PRO_SBITS_24: + printf("24 bit\n"); + break; + case IEC958_AES2_PRO_SBITS_UDEF: + printf("user defined\n"); + break; + default: + printf("unknown\n"); + break; + } + printf("Word Length: "); + switch (iec->status[2] & IEC958_AES2_PRO_WORDLEN) { + case IEC958_AES2_PRO_WORDLEN_22_18: + printf("22 bit or 18 bit\n"); + break; + case IEC958_AES2_PRO_WORDLEN_23_19: + printf("23 bit or 19 bit\n"); + break; + case IEC958_AES2_PRO_WORDLEN_24_20: + printf("24 bit or 20 bit\n"); + break; + case IEC958_AES2_PRO_WORDLEN_20_16: + printf("20 bit or 16 bit\n"); + break; + default: + printf("unknown\n"); + break; + } + } +} + diff --git a/iecset/iecset.1 b/iecset/iecset.1 new file mode 100644 index 0000000..dec4ac0 --- /dev/null +++ b/iecset/iecset.1 @@ -0,0 +1,104 @@ +.TH iecset 1 "23 Oct 2003" +.SH NAME +iecset \- Set or dump IEC958 status bits + +.SH SYNOPSIS +\fBiecset\fP [\fIoptions\fP] [\fIcmd\fP \fIarg\fP...] + +.SH DESCRIPTION +\fBiecset\fP is a small utility to set or dump the IEC958 (or so-called +"S/PDIF") status bits of the specified sound card via ALSA control API. + +When \fBiecset\fP is started without arguments except for options, +it will show the current IEC958 status in a human-readable form. +When the commands are given in the arguments, they are parsed +and the IEC958 status bits are updated. The resultant status is +shown as well. + +The commands consist of the command directive and the argument. +As the boolean argument, \fIyes\fP, \fIno\fP, \fItrue\fP, \fIfalse\fP, +or a digit number is allowed. + +.SH EXAMPLES +.TP +.BI iecset\ \-Dhw:1 +Displays the current IEC958 status bits on the second card. +This is equivalent with \fI\-c 1\fP. +.TP +.BI iecset\ \-x +Displays the current IEC958 status bits in a style of the arguments +for the PCM stream. The output string can be passed to the \fIiec958\fP +(or \fIspdif\fP) PCM type as the optional argument. +.TP +.BI iecset\ pro\ off\ audio\ off +Sets the current status to the consumer-mode and turns on the +non-audio bit. The modified status will be shown, too. + +.SH OPTIONS +.TP +\fI\-D\fP device +Specifies the device name of the control to open +.TP +\fI\-c\fP card +Specifies the card index to open. Equivalent with \fI\-Dhw:x\fP. +.TP +\fI\-n\fP index +Specifies the IEC958 control element index, in case you have multiple +IEC958 devices and need to choose one of them. +.TP +\fI\-x\fP +Dumps the status in the form of AESx bytes. +.TP +\fI\-i\fP +Reads the command sequences from stdin. +Each line has single command. + +.SH COMMANDS +.TP +\fIprofessional\fP +The professional mode (true) or consumer mode (false). + +.TP +\fIaudio\fP +The audio mode (true) or non-audio mode (false). + +.TP +\fIrate\fP +The sample rate in Hz. + +.TP +\fIemphasis\fP +The emphasis: 0 = none, 1 = 50/15us, 2 = CCITT. + +.TP +\fIlock\fP +Rate lock: locked (true), unlocked (false). +This command is for the professional mode only. + +.TP +\fIsbits\fP +Sample bits: 2 = 20bit, 4 = 24bit, 6 = undefined. +This command is for the professional mode only. + +.TP +\fIwordlength\fP +Wordlength: 0 = No, 2 = 22-18 bit, 4 = 23-19 bit, 5 = 24-20 bit, 6 = 20-16 bit. +This command is for the professional mode only. + +.TP +\fIcategory\fP +Category: the value is from 0 to 0x7f. +This command is for the consumer mode only. + +.TP +\fIcopyright\fP +Copyright: copyrighted (true), non-copyrighted (false). +This command is for the consumer mode only. + +.TP +\fIoriginal\fP +Original flag: original (true), 1st generation (false). +This command is for the consumer mode only. + +.SH AUTHOR +Takashi Iwai diff --git a/iecset/iecset.c b/iecset/iecset.c new file mode 100644 index 0000000..92a93e8 --- /dev/null +++ b/iecset/iecset.c @@ -0,0 +1,432 @@ +/* + iecset - change IEC958 status bits on ALSA + Copyright (C) 2003 by Takashi Iwai + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +void dump_iec958(snd_aes_iec958_t *iec); + +static int get_bool(const char *str) +{ + if (strncmp(str, "yes", 3) == 0 || + strncmp(str, "YES", 3) == 0 || + strncmp(str, "on", 2) == 0 || + strncmp(str, "ON", 2) == 0 || + strncmp(str, "true", 4) == 0 || + strncmp(str, "TRUE", 4) == 0 || + *str == '1') + return 1; + return 0; +} + +enum { + CMD_BOOL, CMD_BOOL_INV, CMD_INT +}; + +enum { + IDX_PRO, IDX_NOAUDIO, IDX_RATE, IDX_UNLOCK, IDX_SBITS, IDX_WORD, IDX_EMP, IDX_CAT, IDX_NOCOPY, IDX_ORIG, + IDX_LAST +}; + +struct cmdtbl { + const char *name; + int idx; + int type; + const char *desc; +}; + +static const struct cmdtbl cmds[] = { + { "pro", IDX_PRO, CMD_BOOL, + "professional (common)\n\toff = consumer mode, on = professional mode" }, + { "aud", IDX_NOAUDIO, CMD_BOOL_INV, + "audio (common)\n\ton = audio mode, off = non-audio mode" }, + { "rat", IDX_RATE, CMD_INT, + "rate (common)\n\tsample rate in Hz (0 = not indicated)" }, + { "emp", IDX_EMP, CMD_INT, + "emphasis (common)\n\t0 = none, 1 = 50/15us, 2 = CCITT" }, + { "loc", IDX_UNLOCK, CMD_BOOL_INV, + "lock (prof.)\n\toff = rate unlocked, on = rate locked" }, + { "sbi", IDX_SBITS, CMD_INT, + "sbits (prof.)\n\tsample bits 2 = 20bit, 4 = 24bit, 6 = undef" }, + { "wor", IDX_WORD, CMD_INT, + "wordlength (prof.)\n\t0=no, 2=22-18bit, 4=23-19bit, 5=24-20bit, 6=20-16bit" }, + { "cat", IDX_CAT, CMD_INT, + "category (consumer)\n\t0-0x7f" }, + { "cop", IDX_NOCOPY, CMD_BOOL_INV, + "copyright (consumer)\n\toff = non-copyright, on = copyright" }, + { "ori", IDX_ORIG, CMD_BOOL, + "original (consumer)\n\toff = 1st-gen, on = original" }, +}; + + +static void error(const char *s, int err) +{ + fprintf(stderr, "%s: %s\n", s, snd_strerror(err)); +} + + +static void usage(void) +{ + int i; + + printf("Usage: iecset [options] [cmd arg...]\n"); + printf("Options:\n"); + printf(" -D device specifies the control device to use\n"); + printf(" -c card specifies the card number to use (equiv. with -Dhw:#)\n"); + printf(" -n number specifies the control index number (default = 0)\n"); + printf(" -x dump the dump the AESx hex code for IEC958 PCM parameters\n"); + printf(" -i read commands from stdin\n"); + printf("Commands:\n"); + for (i = 0; i < (int)(sizeof(cmds)/sizeof(cmds[0])); i++) { + printf(" %s\n", cmds[i].desc); + } +} + + +/* + * parse iecset commands + */ +static void parse_command(int *parms, const char *c, const char *arg) +{ + int i; + + for (i = 0; i < (int)(sizeof(cmds)/sizeof(cmds[0])); i++) { + if (strncmp(c, cmds[i].name, strlen(cmds[i].name)) == 0) { + int val; + switch (cmds[i].type) { + case CMD_BOOL: + val = get_bool(arg); + break; + case CMD_BOOL_INV: + val = !get_bool(arg); + break; + case CMD_INT: + default: + val = (int)strtol(arg, NULL, 0); + break; + } + parms[cmds[i].idx] = val; + return; + } + } +} + +static char *skipspace(char *line) +{ + char *p; + for (p = line; *p && isspace(*p); p++) + ; + return p; +} + +/* + * parse iecset commands from the file + */ +static void parse_file(int *parms, FILE *fp) +{ + char line[1024], *cmd, *arg; + while (fgets(line, sizeof(line), fp) != NULL) { + cmd = skipspace(line); + if (*cmd == '#' || ! *cmd) + continue; + for (arg = cmd; *arg && !isspace(*arg); arg++) + ; + if (! *arg) + continue; + *arg++ = 0; + arg = skipspace(arg); + if (! *arg) + continue; + parse_command(parms, cmd, arg); + } +} + +/* update iec958 status values + * return non-zero if the values are modified + */ +static int update_iec958_status(snd_aes_iec958_t *iec958, int *parms) +{ + int changed = 0; + if (parms[IDX_PRO] >= 0) { + if (parms[IDX_PRO]) + iec958->status[0] |= IEC958_AES0_PROFESSIONAL; + else + iec958->status[0] &= ~IEC958_AES0_PROFESSIONAL; + changed = 1; + } + if (parms[IDX_NOAUDIO] >= 0) { + if (parms[IDX_NOAUDIO]) + iec958->status[0] |= IEC958_AES0_NONAUDIO; + else + iec958->status[0] &= ~IEC958_AES0_NONAUDIO; + changed = 1; + } + if (parms[IDX_RATE] >= 0) { + if (iec958->status[0] & IEC958_AES0_PROFESSIONAL) { + iec958->status[0] &= ~IEC958_AES0_PRO_FS; + switch (parms[IDX_RATE]) { + case 44100: + iec958->status[0] |= IEC958_AES0_PRO_FS_44100; + break; + case 48000: + iec958->status[0] |= IEC958_AES0_PRO_FS_48000; + break; + case 32000: + iec958->status[0] |= IEC958_AES0_PRO_FS_32000; + break; + } + } else { + iec958->status[3] &= ~IEC958_AES3_CON_FS; + switch (parms[IDX_RATE]) { + case 22050: + iec958->status[3] |= IEC958_AES3_CON_FS_22050; + break; + case 24000: + iec958->status[3] |= IEC958_AES3_CON_FS_24000; + break; + case 32000: + iec958->status[3] |= IEC958_AES3_CON_FS_32000; + break; + case 44100: + iec958->status[3] |= IEC958_AES3_CON_FS_44100; + break; + case 48000: + iec958->status[3] |= IEC958_AES3_CON_FS_48000; + break; + case 88200: + iec958->status[3] |= IEC958_AES3_CON_FS_88200;; + break; + case 96000: + iec958->status[3] |= IEC958_AES3_CON_FS_96000; + break; + case 176400: + iec958->status[3] |= IEC958_AES3_CON_FS_176400; + break; + case 192000: + iec958->status[3] |= IEC958_AES3_CON_FS_192000; + break; + case 768000: + iec958->status[3] |= IEC958_AES3_CON_FS_768000; + break; + default: + iec958->status[3] |= IEC958_AES3_CON_FS_NOTID; + break; + } + } + changed = 1; + } + if (parms[IDX_NOCOPY] >= 0) { + if (! (iec958->status[0] & IEC958_AES0_PROFESSIONAL)) { + if (parms[IDX_NOCOPY]) + iec958->status[0] |= IEC958_AES0_CON_NOT_COPYRIGHT; + else + iec958->status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT; + } + changed = 1; + } + if (parms[IDX_ORIG] >= 0) { + if (! (iec958->status[0] & IEC958_AES0_PROFESSIONAL)) { + if (parms[IDX_ORIG]) + iec958->status[1] |= IEC958_AES1_CON_ORIGINAL; + else + iec958->status[1] &= ~IEC958_AES1_CON_ORIGINAL; + } + changed = 1; + } + if (parms[IDX_EMP] >= 0) { + if (iec958->status[0] & IEC958_AES0_PROFESSIONAL) { + iec958->status[0] &= ~IEC958_AES0_PRO_EMPHASIS; + switch (parms[IDX_EMP]) { + case 0: + iec958->status[0] |= IEC958_AES0_PRO_EMPHASIS_NONE; + break; + case 1: + iec958->status[0] |= IEC958_AES0_PRO_EMPHASIS_5015; + break; + case 2: + iec958->status[0] |= IEC958_AES0_PRO_EMPHASIS_CCITT; + break; + } + } else { + if (parms[IDX_EMP]) + iec958->status[0] |= IEC958_AES0_CON_EMPHASIS_5015; + else + iec958->status[0] &= ~IEC958_AES0_CON_EMPHASIS_5015; + } + changed = 1; + } + if (parms[IDX_UNLOCK] >= 0) { + if (iec958->status[0] & IEC958_AES0_PROFESSIONAL) { + if (parms[IDX_UNLOCK]) + iec958->status[0] |= IEC958_AES0_PRO_FREQ_UNLOCKED; + else + iec958->status[0] &= ~IEC958_AES0_PRO_FREQ_UNLOCKED; + } + changed = 1; + } + if (parms[IDX_SBITS] >= 0) { + if (iec958->status[0] & IEC958_AES0_PROFESSIONAL) { + iec958->status[2] &= ~IEC958_AES2_PRO_SBITS; + iec958->status[2] |= parms[IDX_SBITS] & 7; + } + changed = 1; + } + if (parms[IDX_WORD] >= 0) { + if (iec958->status[0] & IEC958_AES0_PROFESSIONAL) { + iec958->status[2] &= ~IEC958_AES2_PRO_WORDLEN; + iec958->status[2] |= (parms[IDX_WORD] & 7) << 3; + } + changed = 1; + } + if (parms[IDX_CAT] >= 0) { + if (! (iec958->status[0] & IEC958_AES0_PROFESSIONAL)) { + iec958->status[1] &= ~IEC958_AES1_CON_CATEGORY; + iec958->status[1] |= parms[IDX_CAT] & 0x7f; + } + changed = 1; + } + + return changed; +} + + +int main(int argc, char **argv) +{ + const char *dev = "default"; + const char *spdif_str = SND_CTL_NAME_IEC958("", PLAYBACK, DEFAULT); + int spdif_index = -1; + snd_ctl_t *ctl; + snd_ctl_elem_list_t *clist; + snd_ctl_elem_id_t *cid; + snd_ctl_elem_value_t *cval; + snd_aes_iec958_t iec958; + int from_stdin = 0; + int dumphex = 0; + int i, c, err; + unsigned int controls, cidx; + char tmpname[32]; + int parms[IDX_LAST]; + + for (i = 0; i < IDX_LAST; i++) + parms[i] = -1; /* not set */ + + while ((c = getopt(argc, argv, "D:c:n:xhi")) != -1) { + switch (c) { + case 'D': + dev = optarg; + break; + case 'c': + i = atoi(optarg); + if (i < 0 || i >= 32) { + fprintf(stderr, "invalid card index %d\n", i); + return 1; + } + sprintf(tmpname, "hw:%d", i); + dev = tmpname; + break; + case 'n': + spdif_index = atoi(optarg); + break; + case 'x': + dumphex = 1; + break; + case 'i': + from_stdin = 1; + break; + default: + usage(); + return 1; + } + } + + if ((err = snd_ctl_open(&ctl, dev, 0)) < 0) { + error("snd_ctl_open", err); + return 1; + } + + snd_ctl_elem_list_alloca(&clist); + if ((err = snd_ctl_elem_list(ctl, clist)) < 0) { + error("snd_ctl_elem_list", err); + return 1; + } + if ((err = snd_ctl_elem_list_alloc_space(clist, snd_ctl_elem_list_get_count(clist))) < 0) { + error("snd_ctl_elem_list_alloc_space", err); + return 1; + } + if ((err = snd_ctl_elem_list(ctl, clist)) < 0) { + error("snd_ctl_elem_list", err); + return 1; + } + + controls = snd_ctl_elem_list_get_used(clist); + for (cidx = 0; cidx < controls; cidx++) { + if (!strcmp(snd_ctl_elem_list_get_name(clist, cidx), spdif_str)) + if (spdif_index < 0 || + snd_ctl_elem_list_get_index(clist, cidx) == spdif_index) + break; + } + if (cidx >= controls) { + fprintf(stderr, "control \"%s\" (index %d) not found\n", + spdif_str, spdif_index); + return 1; + } + + snd_ctl_elem_id_alloca(&cid); + snd_ctl_elem_list_get_id(clist, cidx, cid); + snd_ctl_elem_value_alloca(&cval); + snd_ctl_elem_value_set_id(cval, cid); + if ((err = snd_ctl_elem_read(ctl, cval)) < 0) { + error("snd_ctl_elem_read", err); + return 1; + } + + snd_ctl_elem_value_get_iec958(cval, &iec958); + + /* parse from stdin */ + if (from_stdin) + parse_file(parms, stdin); + + /* parse commands */ + for (c = optind; c < argc - 1; c += 2) + parse_command(parms, argv[c], argv[c + 1]); + + if (update_iec958_status(&iec958, parms)) { + /* store the values */ + snd_ctl_elem_value_set_iec958(cval, &iec958); + if ((err = snd_ctl_elem_write(ctl, cval)) < 0) { + error("snd_ctl_elem_write", err); + return 1; + } + if ((err = snd_ctl_elem_read(ctl, cval)) < 0) { + error("snd_ctl_elem_write", err); + return 1; + } + snd_ctl_elem_value_get_iec958(cval, &iec958); + } + + if (dumphex) + printf("AES0=0x%02x,AES1=0x%02x,AES2=0x%02x,AES3=0x%02x\n", + iec958.status[0], iec958.status[1], iec958.status[2], iec958.status[3]); + else + dump_iec958(&iec958); + + snd_ctl_close(ctl); + return 0; +} diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..7a3968d --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,25 @@ +noinst_HEADERS=version.h gettext.h gettext_curses.h + +version.h: stamp-vh + @: + +stamp-vh: $(top_builddir)/configure.in + @echo "/*" > ver.tmp + @echo " * version.h" >> ver.tmp + @echo " */" >> ver.tmp + @echo "" >> ver.tmp + @echo "#define SND_UTIL_MAJOR $(SND_UTIL_MAJOR)" >> ver.tmp + @echo "#define SND_UTIL_MINOR $(SND_UTIL_MINOR)" >> ver.tmp + @echo "#define SND_UTIL_SUBMINOR $(SND_UTIL_SUBMINOR)" >> ver.tmp + @echo "#define SND_UTIL_VERSION ((SND_UTIL_MAJOR<<16)|\\" >> ver.tmp + @echo " (SND_UTIL_MINOR<<8)|\\" >> ver.tmp + @echo " SND_UTIL_SUBMINOR)" >> ver.tmp + @echo "#define SND_UTIL_VERSION_STR \"$(SND_UTIL_VERSION)\"" >> ver.tmp + @echo >> ver.tmp + @cmp -s version.h ver.tmp \ + || (echo "Updating version.h"; \ + cp ver.tmp version.h; \ + echo timestamp > stamp-vh) + -@rm -f ver.tmp + +INCLUDES=-I$(top_srcdir)/include diff --git a/include/Makefile.in b/include/Makefile.in new file mode 100644 index 0000000..150b9d6 --- /dev/null +++ b/include/Makefile.in @@ -0,0 +1,457 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = include +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/aconfig.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +noinst_HEADERS = version.h gettext.h gettext_curses.h +INCLUDES = -I$(top_srcdir)/include +all: aconfig.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +aconfig.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/aconfig.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status include/aconfig.h +$(srcdir)/aconfig.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f aconfig.h stamp-h1 + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) aconfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) aconfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) aconfig.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) aconfig.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) aconfig.h +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + ctags distclean distclean-generic distclean-hdr distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + + +version.h: stamp-vh + @: + +stamp-vh: $(top_builddir)/configure.in + @echo "/*" > ver.tmp + @echo " * version.h" >> ver.tmp + @echo " */" >> ver.tmp + @echo "" >> ver.tmp + @echo "#define SND_UTIL_MAJOR $(SND_UTIL_MAJOR)" >> ver.tmp + @echo "#define SND_UTIL_MINOR $(SND_UTIL_MINOR)" >> ver.tmp + @echo "#define SND_UTIL_SUBMINOR $(SND_UTIL_SUBMINOR)" >> ver.tmp + @echo "#define SND_UTIL_VERSION ((SND_UTIL_MAJOR<<16)|\\" >> ver.tmp + @echo " (SND_UTIL_MINOR<<8)|\\" >> ver.tmp + @echo " SND_UTIL_SUBMINOR)" >> ver.tmp + @echo "#define SND_UTIL_VERSION_STR \"$(SND_UTIL_VERSION)\"" >> ver.tmp + @echo >> ver.tmp + @cmp -s version.h ver.tmp \ + || (echo "Updating version.h"; \ + cp ver.tmp version.h; \ + echo timestamp > stamp-vh) + -@rm -f ver.tmp + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/include/aconfig.h.in b/include/aconfig.h.in new file mode 100644 index 0000000..ca9e5e2 --- /dev/null +++ b/include/aconfig.h.in @@ -0,0 +1,140 @@ +/* include/aconfig.h.in. Generated from configure.in by autoheader. */ + +/* directory containing alsa configuration */ +#undef DATADIR + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define if curses-based programs can show translated messages. */ +#undef ENABLE_NLS_IN_CURSES + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALSA_MIXER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALSA_PCM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALSA_RAWMIDI_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALSA_SEQ_H + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +#undef HAVE_CFLOCALECOPYCURRENT + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +#undef HAVE_CFPREFERENCESCOPYAPPVALUE + +/* Have clock gettime */ +#undef HAVE_CLOCK_GETTIME + +/* Have curses set_escdelay */ +#undef HAVE_CURSES_ESCDELAY + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the header file. */ +#undef HAVE_FORM_H + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `asound' library (-lasound). */ +#undef HAVE_LIBASOUND + +/* Have librt */ +#undef HAVE_LIBRT + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MENU_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PANEL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SAMPLERATE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* directory containing sample data */ +#undef SOUNDSDIR + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* ALSA util version */ +#undef VERSION + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/include/gettext.h b/include/gettext.h new file mode 100644 index 0000000..d8a1467 --- /dev/null +++ b/include/gettext.h @@ -0,0 +1,22 @@ +#ifndef __MY_GETTEXT_H +#define __MY_GETTEXT_H + +#ifdef USES_CURSES +#define ENABLE_NLS_TEST ENABLE_NLS_IN_CURSES +#else +#define ENABLE_NLS_TEST ENABLE_NLS +#endif + +#if ENABLE_NLS_TEST +# include +#else +# define gettext(msgid) (msgid) +# define textdomain(domain) +# define bindtextdomain(domain, dir) +#endif + +#define _(msgid) gettext (msgid) +#define gettext_noop(msgid) msgid +#define N_(msgid) gettext_noop (msgid) + +#endif /* __MY_GETTEXT_H */ diff --git a/include/gettext_curses.h b/include/gettext_curses.h new file mode 100644 index 0000000..f1c4041 --- /dev/null +++ b/include/gettext_curses.h @@ -0,0 +1,2 @@ +#define USES_CURSES +#include "gettext.h" diff --git a/include/version.h b/include/version.h new file mode 100644 index 0000000..0b2448c --- /dev/null +++ b/include/version.h @@ -0,0 +1,12 @@ +/* + * version.h + */ + +#define SND_UTIL_MAJOR 1 +#define SND_UTIL_MINOR 0 +#define SND_UTIL_SUBMINOR 24 +#define SND_UTIL_VERSION ((SND_UTIL_MAJOR<<16)|\ + (SND_UTIL_MINOR<<8)|\ + SND_UTIL_SUBMINOR) +#define SND_UTIL_VERSION_STR "1.0.24.2" + diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/m4/Makefile.am b/m4/Makefile.am new file mode 100644 index 0000000..15df0b1 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = codeset.m4 gettext.m4 glibc2.m4 glibc21.m4 iconv.m4 intdiv0.m4 intmax.m4 inttypes_h.m4 inttypes-h.m4 inttypes-pri.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 lock.m4 longdouble.m4 longlong.m4 nls.m4 po.m4 printf-posix.m4 progtest.m4 signed.m4 size_max.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 visibility.m4 wchar_t.m4 wint_t.m4 xsize.m4 gettext.m4 diff --git a/m4/Makefile.in b/m4/Makefile.in new file mode 100644 index 0000000..89c35b0 --- /dev/null +++ b/m4/Makefile.in @@ -0,0 +1,363 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = m4 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +EXTRA_DIST = codeset.m4 gettext.m4 glibc2.m4 glibc21.m4 iconv.m4 intdiv0.m4 intmax.m4 inttypes_h.m4 inttypes-h.m4 inttypes-pri.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 lock.m4 longdouble.m4 longlong.m4 nls.m4 po.m4 printf-posix.m4 progtest.m4 signed.m4 size_max.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 visibility.m4 wchar_t.m4 wint_t.m4 xsize.m4 gettext.m4 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign m4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/m4/codeset.m4 b/m4/codeset.m4 new file mode 100644 index 0000000..a6e67ec --- /dev/null +++ b/m4/codeset.m4 @@ -0,0 +1,21 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..dae3d81 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,631 @@ +# gettext.m4 serial 53 (gettext-0.15) +dnl Copyright (C) 1995-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2005. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define([gt_included_intl], ifelse([$1], [external], [no], [yes])) + define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. + gt_INTL_MACOSX + + dnl Set USE_NLS. + AC_REQUIRE([AM_NLS]) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +]], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +]], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +]], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")]ifelse([$2], [need-ngettext], [ + * ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + CATOBJEXT= + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Some extra flags are needed during linking. + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLOBJS= + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([gt_GLIBC2])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([gl_VISIBILITY])dnl + AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl + AC_REQUIRE([bh_C_SIGNED])dnl + AC_REQUIRE([gl_AC_TYPE_LONG_LONG])dnl + AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl + AC_REQUIRE([gt_TYPE_WCHAR_T])dnl + AC_REQUIRE([gt_TYPE_WINT_T])dnl + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gt_TYPE_INTMAX_T]) + AC_REQUIRE([gt_PRINTF_POSIX]) + AC_REQUIRE([gl_GLIBC21])dnl + AC_REQUIRE([gl_XSIZE])dnl + AC_REQUIRE([gt_INTL_MACOSX])dnl + + AC_CHECK_TYPE([ptrdiff_t], , + [AC_DEFINE([ptrdiff_t], [long], + [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) + ]) + AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) + AC_CHECK_FUNCS([asprintf fwprintf putenv setenv setlocale snprintf wcslen]) + + dnl Use the _snprintf function only if it is declared (because on NetBSD it + dnl is defined as a weak alias of snprintf; we prefer to use the latter). + gt_CHECK_DECL(_snprintf, [#include ]) + gt_CHECK_DECL(_snwprintf, [#include ]) + + dnl Use the *_unlocked functions only if they are declared. + dnl (because some of them were defined without being declared in Solaris + dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built + dnl on Solaris 2.5.1 to run on Solaris 2.6). + dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. + gt_CHECK_DECL(getc_unlocked, [#include ]) + + case $gt_cv_func_printf_posix in + *yes) HAVE_POSIX_PRINTF=1 ;; + *) HAVE_POSIX_PRINTF=0 ;; + esac + AC_SUBST([HAVE_POSIX_PRINTF]) + if test "$ac_cv_func_asprintf" = yes; then + HAVE_ASPRINTF=1 + else + HAVE_ASPRINTF=0 + fi + AC_SUBST([HAVE_ASPRINTF]) + if test "$ac_cv_func_snprintf" = yes; then + HAVE_SNPRINTF=1 + else + HAVE_SNPRINTF=0 + fi + AC_SUBST([HAVE_SNPRINTF]) + if test "$ac_cv_func_wprintf" = yes; then + HAVE_WPRINTF=1 + else + HAVE_WPRINTF=0 + fi + AC_SUBST([HAVE_WPRINTF]) + + AM_LANGINFO_CODESET + gt_LC_MESSAGES + + dnl Compilation on mingw and Cygwin needs special Makefile rules, because + dnl 1. when we install a shared library, we must arrange to export + dnl auxiliary pointer variables for every exported variable, + dnl 2. when we install a shared library and a static library simultaneously, + dnl the include file specifies __declspec(dllimport) and therefore we + dnl must arrange to define the auxiliary pointer variables for the + dnl exported variables _also_ in the static library. + if test "$enable_shared" = yes; then + case "$host_os" in + cygwin*) is_woe32dll=yes ;; + *) is_woe32dll=no ;; + esac + else + is_woe32dll=no + fi + WOE32DLL=$is_woe32dll + AC_SUBST([WOE32DLL]) + + dnl Rename some macros and functions used for locking. + AH_BOTTOM([ +#define __libc_lock_t gl_lock_t +#define __libc_lock_define gl_lock_define +#define __libc_lock_define_initialized gl_lock_define_initialized +#define __libc_lock_init gl_lock_init +#define __libc_lock_lock gl_lock_lock +#define __libc_lock_unlock gl_lock_unlock +#define __libc_lock_recursive_t gl_recursive_lock_t +#define __libc_lock_define_recursive gl_recursive_lock_define +#define __libc_lock_define_initialized_recursive gl_recursive_lock_define_initialized +#define __libc_lock_init_recursive gl_recursive_lock_init +#define __libc_lock_lock_recursive gl_recursive_lock_lock +#define __libc_lock_unlock_recursive gl_recursive_lock_unlock +#define glthread_in_use libintl_thread_in_use +#define glthread_lock_init libintl_lock_init +#define glthread_lock_lock libintl_lock_lock +#define glthread_lock_unlock libintl_lock_unlock +#define glthread_lock_destroy libintl_lock_destroy +#define glthread_rwlock_init libintl_rwlock_init +#define glthread_rwlock_rdlock libintl_rwlock_rdlock +#define glthread_rwlock_wrlock libintl_rwlock_wrlock +#define glthread_rwlock_unlock libintl_rwlock_unlock +#define glthread_rwlock_destroy libintl_rwlock_destroy +#define glthread_recursive_lock_init libintl_recursive_lock_init +#define glthread_recursive_lock_lock libintl_recursive_lock_lock +#define glthread_recursive_lock_unlock libintl_recursive_lock_unlock +#define glthread_recursive_lock_destroy libintl_recursive_lock_destroy +#define glthread_once libintl_once +#define glthread_once_call libintl_once_call +#define glthread_once_singlethreaded libintl_once_singlethreaded +]) +]) + + +dnl Checks for the core files of the intl subdirectory: +dnl dcigettext.c +dnl eval-plural.h +dnl explodename.c +dnl finddomain.c +dnl gettextP.h +dnl gmo.h +dnl hash-string.h hash-string.c +dnl l10nflist.c +dnl libgnuintl.h.in (except the *printf stuff) +dnl loadinfo.h +dnl loadmsgcat.c +dnl localealias.c +dnl log.c +dnl plural-exp.h plural-exp.c +dnl plural.y +dnl Used by libglocale. +AC_DEFUN([gt_INTL_SUBDIR_CORE], +[ + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gl_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + AC_REQUIRE([gl_LOCK])dnl + + AC_TRY_LINK( + [int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }], + [], + [AC_DEFINE([HAVE_BUILTIN_EXPECT], 1, + [Define to 1 if the compiler understands __builtin_expect.])]) + + AC_CHECK_HEADERS([argz.h limits.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \ + stpcpy strcasecmp strdup strtoul tsearch argz_count argz_stringify \ + argz_next __fsetlocking]) + + dnl Use the *_unlocked functions only if they are declared. + dnl (because some of them were defined without being declared in Solaris + dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built + dnl on Solaris 2.5.1 to run on Solaris 2.6). + dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. + gt_CHECK_DECL(feof_unlocked, [#include ]) + gt_CHECK_DECL(fgets_unlocked, [#include ]) + + AM_ICONV + + dnl glibc >= 2.4 has a NL_LOCALE_NAME macro when _GNU_SOURCE is defined, + dnl and a _NL_LOCALE_NAME macro always. + AC_CACHE_CHECK([for NL_LOCALE_NAME macro], gt_cv_nl_locale_name, + [AC_TRY_LINK([#include +#include ], + [char* cs = nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES));], + gt_cv_nl_locale_name=yes, + gt_cv_nl_locale_name=no) + ]) + if test $gt_cv_nl_locale_name = yes; then + AC_DEFINE(HAVE_NL_LOCALE_NAME, 1, + [Define if you have and it defines the NL_LOCALE_NAME macro if _GNU_SOURCE is defined.]) + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +dnl Checks for special options needed on MacOS X. +dnl Defines INTL_MACOSX_LIBS. +AC_DEFUN([gt_INTL_MACOSX], +[ + dnl Check for API introduced in MacOS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + gt_cv_func_CFPreferencesCopyAppValue, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include ], + [CFPreferencesCopyAppValue(NULL, NULL)], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, + [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in MacOS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, + [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) + + +dnl gt_CHECK_DECL(FUNC, INCLUDES) +dnl Check whether a function is declared. +AC_DEFUN([gt_CHECK_DECL], +[ + AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, + [AC_TRY_COMPILE([$2], [ +#ifndef $1 + char *p = (char *) $1; +#endif +], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) + if test $ac_cv_have_decl_$1 = yes; then + gt_value=1 + else + gt_value=0 + fi + AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], + [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/glibc2.m4 b/m4/glibc2.m4 new file mode 100644 index 0000000..e8f5bfe --- /dev/null +++ b/m4/glibc2.m4 @@ -0,0 +1,30 @@ +# glibc2.m4 serial 1 +dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Test for the GNU C Library, version 2.0 or newer. +# From Bruno Haible. + +AC_DEFUN([gt_GLIBC2], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2 or newer, + ac_cv_gnu_library_2, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ >= 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2=yes, + ac_cv_gnu_library_2=no) + ] + ) + AC_SUBST(GLIBC2) + GLIBC2="$ac_cv_gnu_library_2" + ] +) diff --git a/m4/glibc21.m4 b/m4/glibc21.m4 new file mode 100644 index 0000000..d95fd98 --- /dev/null +++ b/m4/glibc21.m4 @@ -0,0 +1,30 @@ +# glibc21.m4 serial 3 +dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([gl_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..654c415 --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,101 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4 new file mode 100644 index 0000000..b8d7817 --- /dev/null +++ b/m4/intdiv0.m4 @@ -0,0 +1,70 @@ +# intdiv0.m4 serial 1 (gettext-0.11.3) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([gt_INTDIV0], +[ + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + + AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], + gt_cv_int_divbyzero_sigfpe, + [ + AC_TRY_RUN([ +#include +#include + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} +], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, + [ + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i[34567]86 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + ]) + ]) + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, + [Define if integer division by zero raises signal SIGFPE.]) +]) diff --git a/m4/intmax.m4 b/m4/intmax.m4 new file mode 100644 index 0000000..d99c999 --- /dev/null +++ b/m4/intmax.m4 @@ -0,0 +1,30 @@ +# intmax.m4 serial 2 (gettext-0.14.2) +dnl Copyright (C) 2002-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether the system has the 'intmax_t' type, but don't attempt to +dnl find a replacement if it is lacking. + +AC_DEFUN([gt_TYPE_INTMAX_T], +[ + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, + [AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif +], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) + if test $gt_cv_c_intmax_t = yes; then + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + fi +]) diff --git a/m4/inttypes-h.m4 b/m4/inttypes-h.m4 new file mode 100644 index 0000000..d7ec94c --- /dev/null +++ b/m4/inttypes-h.m4 @@ -0,0 +1,25 @@ +# inttypes-h.m4 serial 1 (gettext-0.15) +dnl Copyright (C) 1997-2002, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H if exists and doesn't clash with +# . + +AC_DEFUN([gl_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, + [ + AC_TRY_COMPILE( + [#include +#include ], + [], gl_cv_header_inttypes_h=yes, gl_cv_header_inttypes_h=no) + ]) + if test $gl_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, + [Define if exists and doesn't clash with .]) + fi +]) diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4 new file mode 100644 index 0000000..ef00da7 --- /dev/null +++ b/m4/inttypes-pri.m4 @@ -0,0 +1,30 @@ +# inttypes-pri.m4 serial 2 (gettext-0.15) +dnl Copyright (C) 1997-2002, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +# Define PRI_MACROS_BROKEN if exists and defines the PRI* +# macros to non-string values. This is the case on AIX 4.3.3. + +AC_DEFUN([gt_INTTYPES_PRI], +[ + AC_REQUIRE([gl_HEADER_INTTYPES_H]) + if test $gl_cv_header_inttypes_h = yes; then + AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], + gt_cv_inttypes_pri_broken, + [ + AC_TRY_COMPILE([#include +#ifdef PRId32 +char *p = PRId32; +#endif +], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) + ]) + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, + [Define if exists and defines unusable PRI* macros.]) + fi +]) diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4 new file mode 100644 index 0000000..a5d075d --- /dev/null +++ b/m4/inttypes_h.m4 @@ -0,0 +1,26 @@ +# inttypes_h.m4 serial 6 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([gl_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + gl_cv_header_inttypes_h=yes, + gl_cv_header_inttypes_h=no)]) + if test $gl_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4 new file mode 100644 index 0000000..19aa77e --- /dev/null +++ b/m4/lcmessage.m4 @@ -0,0 +1,30 @@ +# lcmessage.m4 serial 4 (gettext-0.14.2) +dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995. + +# Check whether LC_MESSAGES is available in . + +AC_DEFUN([gt_LC_MESSAGES], +[ + AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)]) + if test $gt_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi +]) diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..96c4e2c --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,110 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..9292919 --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,630 @@ +# lib-link.m4 serial 8 (gettext-0.15) +dnl Copyright (C) 2001-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_PREREQ(2.50) + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + dnl Tell automake >= 1.10 to complain if config.rpath is missing. + m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */$acl_libdirstem | */$acl_libdirstem/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +dnl For those cases where a variable contains several -L and -l options +dnl referring to unknown libraries and directories, this macro determines the +dnl necessary additional linker options for the runtime path. +dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) +dnl sets LDADDVAR to linker options needed together with LIBSVALUE. +dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, +dnl otherwise linking without libtool is assumed. +AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], +[ + AC_REQUIRE([AC_LIB_RPATH]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + $1= + if test "$enable_rpath" != no; then + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode directories into the resulting + dnl binary. + rpathdirs= + next= + for opt in $2; do + if test -n "$next"; then + dir="$next" + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= + else + case $opt in + -L) next=yes ;; + -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` + dnl No need to hardcode the standard /usr/lib. + if test "X$dir" != "X/usr/$acl_libdirstem"; then + rpathdirs="$rpathdirs $dir" + fi + next= ;; + *) next= ;; + esac + fi + done + if test "X$rpathdirs" != "X"; then + if test -n ""$3""; then + dnl libtool is used for linking. Use -R options. + for dir in $rpathdirs; do + $1="${$1}${$1:+ }-R$dir" + done + else + dnl The linker is used for linking directly. + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user + dnl must pass all path elements in one option. + alldirs= + for dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="$flag" + else + dnl The -rpath options are cumulative. + for dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + $1="${$1}${$1:+ }$flag" + done + fi + fi + fi + fi + fi + AC_SUBST([$1]) +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..a8684e1 --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,185 @@ +# lib-prefix.m4 serial 5 (gettext-0.15) +dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/$acl_libdirstem" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux* | gnu* | k*bsd*-gnu) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing +dnl the basename of the libdir, either "lib" or "lib64". +AC_DEFUN([AC_LIB_PREPARE_MULTILIB], +[ + dnl There is no formal standard regarding lib and lib64. The current + dnl practice is that on a system supporting 32-bit and 64-bit instruction + dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit + dnl libraries go under $prefix/lib. We determine the compiler's default + dnl mode by looking at the compiler's library search path. If at least + dnl of its elements ends in /lib64 or points to a directory whose absolute + dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the + dnl default, namely "lib". + acl_libdirstem=lib + searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` + if test -n "$searchpath"; then + acl_save_IFS="${IFS= }"; IFS=":" + for searchdir in $searchpath; do + if test -d "$searchdir"; then + case "$searchdir" in + */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; + *) searchdir=`cd "$searchdir" && pwd` + case "$searchdir" in + */lib64 ) acl_libdirstem=lib64 ;; + esac ;; + esac + fi + done + IFS="$acl_save_IFS" + fi +]) diff --git a/m4/lock.m4 b/m4/lock.m4 new file mode 100644 index 0000000..d1ea1ca --- /dev/null +++ b/m4/lock.m4 @@ -0,0 +1,289 @@ +# lock.m4 serial 2 (gettext-0.15) +dnl Copyright (C) 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl Tests for a multithreading library to be used. +dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS, +dnl USE_PTH_THREADS, USE_WIN32_THREADS +dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use +dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with +dnl libtool). +dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for +dnl programs that really need multithread functionality. The difference +dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak +dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread". +dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for +dnl multithread-safe programs. + +AC_DEFUN([gl_LOCK], +[ + AC_REQUIRE([gl_LOCK_BODY]) +]) + +dnl The guts of gl_LOCK. Needs to be expanded only once. + +AC_DEFUN([gl_LOCK_BODY], +[ + dnl Ordering constraints: This macro modifies CPPFLAGS in a way that + dnl influences the result of the autoconf tests that test for *_unlocked + dnl declarations, on AIX 5 at least. Therefore it must come early. + AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl + AC_BEFORE([$0], [gl_ARGP])dnl + + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_GNU_SOURCE]) dnl needed for pthread_rwlock_t on glibc systems + dnl Check for multithreading. + AC_ARG_ENABLE(threads, +AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API]) +AC_HELP_STRING([--disable-threads], [build without multithread safety]), + gl_use_threads=$enableval, gl_use_threads=yes) + gl_threads_api=none + LIBTHREAD= + LTLIBTHREAD= + LIBMULTITHREAD= + LTLIBMULTITHREAD= + if test "$gl_use_threads" != no; then + dnl Check whether the compiler and linker support weak declarations. + AC_MSG_CHECKING([whether imported symbols can be declared weak]) + gl_have_weak=no + AC_TRY_LINK([extern void xyzzy (); +#pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes]) + AC_MSG_RESULT([$gl_have_weak]) + if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then + # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that + # it groks . + gl_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_REENTRANT" + AC_CHECK_HEADER(pthread.h, gl_have_pthread_h=yes, gl_have_pthread_h=no) + CPPFLAGS="$gl_save_CPPFLAGS" + if test "$gl_have_pthread_h" = yes; then + # Other possible tests: + # -lpthreads (FSU threads, PCthreads) + # -lgthreads + case "$host_os" in + osf*) + # On OSF/1, the compiler needs the flag -D_REENTRANT so that it + # groks . cc also understands the flag -pthread, but + # we don't use it because 1. gcc-2.95 doesn't understand -pthread, + # 2. putting a flag into CPPFLAGS that has an effect on the linker + # causes the AC_TRY_LINK test below to succeed unexpectedly, + # leading to wrong values of LIBTHREAD and LTLIBTHREAD. + CPPFLAGS="$CPPFLAGS -D_REENTRANT" + ;; + esac + gl_have_pthread= + # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist + # in libc. IRIX 6.5 has the first one in both libc and libpthread, but + # the second one only in libpthread, and lock.c needs it. + AC_TRY_LINK([#include ], + [pthread_mutex_lock((pthread_mutex_t*)0); + pthread_mutexattr_init((pthread_mutexattr_t*)0);], + [gl_have_pthread=yes]) + # Test for libpthread by looking for pthread_kill. (Not pthread_self, + # since it is defined as a macro on OSF/1.) + if test -n "$gl_have_pthread"; then + # The program links fine without libpthread. But it may actually + # need to link with libpthread in order to create multiple threads. + AC_CHECK_LIB(pthread, pthread_kill, + [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread + # On Solaris and HP-UX, most pthread functions exist also in libc. + # Therefore pthread_in_use() needs to actually try to create a + # thread: pthread_create from libc will fail, whereas + # pthread_create will actually create a thread. + case "$host_os" in + solaris* | hpux*) + AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], 1, + [Define if the pthread_in_use() detection is hard.]) + esac + ]) + else + # Some library is needed. Try libpthread and libc_r. + AC_CHECK_LIB(pthread, pthread_kill, + [gl_have_pthread=yes + LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread + LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread]) + if test -z "$gl_have_pthread"; then + # For FreeBSD 4. + AC_CHECK_LIB(c_r, pthread_kill, + [gl_have_pthread=yes + LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r + LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r]) + fi + fi + if test -n "$gl_have_pthread"; then + gl_threads_api=posix + AC_DEFINE([USE_POSIX_THREADS], 1, + [Define if the POSIX multithreading library can be used.]) + if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then + if test $gl_have_weak = yes; then + AC_DEFINE([USE_POSIX_THREADS_WEAK], 1, + [Define if references to the POSIX multithreading library should be made weak.]) + LIBTHREAD= + LTLIBTHREAD= + fi + fi + # OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the + # pthread_rwlock_* functions. + AC_CHECK_TYPE([pthread_rwlock_t], + [AC_DEFINE([HAVE_PTHREAD_RWLOCK], 1, + [Define if the POSIX multithreading library has read/write locks.])], + [], + [#include ]) + # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro. + AC_TRY_COMPILE([#include ], + [#if __FreeBSD__ == 4 +error "No, in FreeBSD 4.0 recursive mutexes actually don't work." +#else +int x = (int)PTHREAD_MUTEX_RECURSIVE; +#endif], + [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], 1, + [Define if the defines PTHREAD_MUTEX_RECURSIVE.])]) + # Some systems optimize for single-threaded programs by default, and + # need special flags to disable these optimizations. For example, the + # definition of 'errno' in . + case "$host_os" in + aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; + solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; + esac + fi + fi + fi + if test -z "$gl_have_pthread"; then + if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then + gl_have_solaristhread= + gl_save_LIBS="$LIBS" + LIBS="$LIBS -lthread" + AC_TRY_LINK([#include +#include ], + [thr_self();], + [gl_have_solaristhread=yes]) + LIBS="$gl_save_LIBS" + if test -n "$gl_have_solaristhread"; then + gl_threads_api=solaris + LIBTHREAD=-lthread + LTLIBTHREAD=-lthread + LIBMULTITHREAD="$LIBTHREAD" + LTLIBMULTITHREAD="$LTLIBTHREAD" + AC_DEFINE([USE_SOLARIS_THREADS], 1, + [Define if the old Solaris multithreading library can be used.]) + if test $gl_have_weak = yes; then + AC_DEFINE([USE_SOLARIS_THREADS_WEAK], 1, + [Define if references to the old Solaris multithreading library should be made weak.]) + LIBTHREAD= + LTLIBTHREAD= + fi + fi + fi + fi + if test "$gl_use_threads" = pth; then + gl_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_LINKFLAGS(pth) + gl_have_pth= + gl_save_LIBS="$LIBS" + LIBS="$LIBS -lpth" + AC_TRY_LINK([#include ], [pth_self();], gl_have_pth=yes) + LIBS="$gl_save_LIBS" + if test -n "$gl_have_pth"; then + gl_threads_api=pth + LIBTHREAD="$LIBPTH" + LTLIBTHREAD="$LTLIBPTH" + LIBMULTITHREAD="$LIBTHREAD" + LTLIBMULTITHREAD="$LTLIBTHREAD" + AC_DEFINE([USE_PTH_THREADS], 1, + [Define if the GNU Pth multithreading library can be used.]) + if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then + if test $gl_have_weak = yes; then + AC_DEFINE([USE_PTH_THREADS_WEAK], 1, + [Define if references to the GNU Pth multithreading library should be made weak.]) + LIBTHREAD= + LTLIBTHREAD= + fi + fi + else + CPPFLAGS="$gl_save_CPPFLAGS" + fi + fi + if test -z "$gl_have_pthread"; then + if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then + if { case "$host_os" in + mingw*) true;; + *) false;; + esac + }; then + gl_threads_api=win32 + AC_DEFINE([USE_WIN32_THREADS], 1, + [Define if the Win32 multithreading API can be used.]) + fi + fi + fi + fi + AC_MSG_CHECKING([for multithread API to use]) + AC_MSG_RESULT([$gl_threads_api]) + AC_SUBST(LIBTHREAD) + AC_SUBST(LTLIBTHREAD) + AC_SUBST(LIBMULTITHREAD) + AC_SUBST(LTLIBMULTITHREAD) + gl_PREREQ_LOCK +]) + +# Prerequisites of lib/lock.c. +AC_DEFUN([gl_PREREQ_LOCK], [ + AC_REQUIRE([AC_C_INLINE]) +]) + +dnl Survey of platforms: +dnl +dnl Platform Available Compiler Supports test-lock +dnl flavours option weak result +dnl --------------- --------- --------- -------- --------- +dnl Linux 2.4/glibc posix -lpthread Y OK +dnl +dnl GNU Hurd/glibc posix +dnl +dnl FreeBSD 5.3 posix -lc_r Y +dnl posix -lkse ? Y +dnl posix -lpthread ? Y +dnl posix -lthr Y +dnl +dnl FreeBSD 5.2 posix -lc_r Y +dnl posix -lkse Y +dnl posix -lthr Y +dnl +dnl FreeBSD 4.0,4.10 posix -lc_r Y OK +dnl +dnl NetBSD 1.6 -- +dnl +dnl OpenBSD 3.4 posix -lpthread Y OK +dnl +dnl MacOS X 10.[123] posix -lpthread Y OK +dnl +dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK +dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK +dnl +dnl HP-UX 11 posix -lpthread N (cc) OK +dnl Y (gcc) +dnl +dnl IRIX 6.5 posix -lpthread Y 0.5 +dnl +dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK +dnl +dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK +dnl -lpthread (gcc) Y +dnl +dnl Cygwin posix -lpthread Y OK +dnl +dnl Any of the above pth -lpth 0.0 +dnl +dnl Mingw win32 N OK +dnl +dnl BeOS 5 -- +dnl +dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is +dnl turned off: +dnl OK if all three tests terminate OK, +dnl 0.5 if the first test terminates OK but the second one loops endlessly, +dnl 0.0 if the first test already loops endlessly. diff --git a/m4/longdouble.m4 b/m4/longdouble.m4 new file mode 100644 index 0000000..25590f4 --- /dev/null +++ b/m4/longdouble.m4 @@ -0,0 +1,31 @@ +# longdouble.m4 serial 2 (gettext-0.15) +dnl Copyright (C) 2002-2003, 2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether the compiler supports the 'long double' type. +dnl Prerequisite: AC_PROG_CC + +dnl This file is only needed in autoconf <= 2.59. Newer versions of autoconf +dnl have a macro AC_TYPE_LONG_DOUBLE with identical semantics. + +AC_DEFUN([gt_TYPE_LONGDOUBLE], +[ + AC_CACHE_CHECK([for long double], gt_cv_c_long_double, + [if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + AC_TRY_COMPILE([ + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + ], , + gt_cv_c_long_double=yes, gt_cv_c_long_double=no) + fi]) + if test $gt_cv_c_long_double = yes; then + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) + fi +]) diff --git a/m4/longlong.m4 b/m4/longlong.m4 new file mode 100644 index 0000000..7b399e0 --- /dev/null +++ b/m4/longlong.m4 @@ -0,0 +1,23 @@ +# longlong.m4 serial 5 +dnl Copyright (C) 1999-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([gl_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1LL; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the 'long long' type.]) + fi +]) diff --git a/m4/nls.m4 b/m4/nls.m4 new file mode 100644 index 0000000..7967cc2 --- /dev/null +++ b/m4/nls.m4 @@ -0,0 +1,31 @@ +# nls.m4 serial 3 (gettext-0.15) +dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) diff --git a/m4/po.m4 b/m4/po.m4 new file mode 100644 index 0000000..00133ef --- /dev/null +++ b/m4/po.m4 @@ -0,0 +1,428 @@ +# po.m4 serial 13 (gettext-0.15) +dnl Copyright (C) 1995-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_PREREQ(2.50) + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + AC_REQUIRE([AM_NLS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Test whether it is GNU msgfmt >= 0.15. +changequote(,)dnl + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([MSGFMT_015]) +changequote(,)dnl + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([GMSGFMT_015]) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Test whether it is GNU xgettext >= 0.15. +changequote(,)dnl + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac +changequote([,])dnl + AC_SUBST([XGETTEXT_015]) + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) + + dnl Installation directories. + dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we + dnl have to define it here, so that it can be used in po/Makefile. + test -n "$localedir" || localedir='${datadir}/locale' + AC_SUBST([localedir]) + + AC_CONFIG_COMMANDS([po-directories], [[ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + # Hide the ALL_LINGUAS assigment from automake < 1.5. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done]], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake < 1.5. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" < +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; +int main () +{ + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); +}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, + [ + AC_EGREP_CPP(notposix, [ +#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ + notposix +#endif + ], gt_cv_func_printf_posix="guessing no", + gt_cv_func_printf_posix="guessing yes") + ]) + ]) + case $gt_cv_func_printf_posix in + *yes) + AC_DEFINE(HAVE_POSIX_PRINTF, 1, + [Define if your printf() function supports format strings with positions.]) + ;; + esac +]) diff --git a/m4/progtest.m4 b/m4/progtest.m4 new file mode 100644 index 0000000..a56365c --- /dev/null +++ b/m4/progtest.m4 @@ -0,0 +1,92 @@ +# progtest.m4 serial 4 (gettext-0.14.2) +dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1996. + +AC_PREREQ(2.50) + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/m4/signed.m4 b/m4/signed.m4 new file mode 100644 index 0000000..048f593 --- /dev/null +++ b/m4/signed.m4 @@ -0,0 +1,17 @@ +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([bh_C_SIGNED], +[ + AC_CACHE_CHECK([for signed], bh_cv_c_signed, + [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) + if test $bh_cv_c_signed = no; then + AC_DEFINE(signed, , + [Define to empty if the C compiler doesn't support this keyword.]) + fi +]) diff --git a/m4/size_max.m4 b/m4/size_max.m4 new file mode 100644 index 0000000..029e471 --- /dev/null +++ b/m4/size_max.m4 @@ -0,0 +1,60 @@ +# size_max.m4 serial 4 +dnl Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +AC_DEFUN([gl_SIZE_MAX], +[ + AC_CHECK_HEADERS(stdint.h) + dnl First test whether the system already has SIZE_MAX. + AC_MSG_CHECKING([for SIZE_MAX]) + result= + AC_EGREP_CPP([Found it], [ +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif +], result=yes) + if test -z "$result"; then + dnl Define it ourselves. Here we assume that the type 'size_t' is not wider + dnl than the type 'unsigned long'. Try hard to find a definition that can + dnl be used in a preprocessor #if, i.e. doesn't contain a cast. + _AC_COMPUTE_INT([sizeof (size_t) * CHAR_BIT - 1], size_t_bits_minus_1, + [#include +#include ], size_t_bits_minus_1=) + _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, + [#include ], fits_in_uint=) + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + dnl We cannot use 'expr' to simplify this expression, because 'expr' + dnl works only with 'long' integers in the host environment, while we + dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. + if test $fits_in_uint = 1; then + result="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" + else + result="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" + fi + else + dnl Shouldn't happen, but who knows... + result='((size_t)~(size_t)0)' + fi + fi + AC_MSG_RESULT([$result]) + if test "$result" != yes; then + AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], + [Define as the maximum value of type 'size_t', if the system doesn't define it.]) + fi +]) diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4 new file mode 100644 index 0000000..3355f35 --- /dev/null +++ b/m4/stdint_h.m4 @@ -0,0 +1,26 @@ +# stdint_h.m4 serial 5 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([gl_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + gl_cv_header_stdint_h=yes, + gl_cv_header_stdint_h=no)]) + if test $gl_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4 new file mode 100644 index 0000000..bf83ed7 --- /dev/null +++ b/m4/uintmax_t.m4 @@ -0,0 +1,30 @@ +# uintmax_t.m4 serial 9 +dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define uintmax_t to 'unsigned long' or 'unsigned long long' +# if it is not already defined in or . + +AC_DEFUN([gl_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([gl_AC_HEADER_STDINT_H]) + if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then + AC_REQUIRE([gl_AC_TYPE_UNSIGNED_LONG_LONG]) + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to unsigned long or unsigned long long + if and don't define.]) + else + AC_DEFINE(HAVE_UINTMAX_T, 1, + [Define if you have the 'uintmax_t' type in or .]) + fi +]) diff --git a/m4/ulonglong.m4 b/m4/ulonglong.m4 new file mode 100644 index 0000000..dee10cc --- /dev/null +++ b/m4/ulonglong.m4 @@ -0,0 +1,23 @@ +# ulonglong.m4 serial 4 +dnl Copyright (C) 1999-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert. + +# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. + +AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the 'unsigned long long' type.]) + fi +]) diff --git a/m4/visibility.m4 b/m4/visibility.m4 new file mode 100644 index 0000000..2ff6330 --- /dev/null +++ b/m4/visibility.m4 @@ -0,0 +1,52 @@ +# visibility.m4 serial 1 (gettext-0.15) +dnl Copyright (C) 2005 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl Tests whether the compiler supports the command-line option +dnl -fvisibility=hidden and the function and variable attributes +dnl __attribute__((__visibility__("hidden"))) and +dnl __attribute__((__visibility__("default"))). +dnl Does *not* test for __visibility__("protected") - which has tricky +dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on +dnl MacOS X. +dnl Does *not* test for __visibility__("internal") - which has processor +dnl dependent semantics. +dnl Does *not* test for #pragma GCC visibility push(hidden) - which is +dnl "really only recommended for legacy code". +dnl Set the variable CFLAG_VISIBILITY. +dnl Defines and sets the variable HAVE_VISIBILITY. + +AC_DEFUN([gl_VISIBILITY], +[ + AC_REQUIRE([AC_PROG_CC]) + CFLAG_VISIBILITY= + HAVE_VISIBILITY=0 + if test -n "$GCC"; then + AC_MSG_CHECKING([for simple visibility declarations]) + AC_CACHE_VAL(gl_cv_cc_visibility, [ + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fvisibility=hidden" + AC_TRY_COMPILE( + [extern __attribute__((__visibility__("hidden"))) int hiddenvar; + extern __attribute__((__visibility__("default"))) int exportedvar; + extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); + extern __attribute__((__visibility__("default"))) int exportedfunc (void);], + [], + gl_cv_cc_visibility=yes, + gl_cv_cc_visibility=no) + CFLAGS="$gl_save_CFLAGS"]) + AC_MSG_RESULT([$gl_cv_cc_visibility]) + if test $gl_cv_cc_visibility = yes; then + CFLAG_VISIBILITY="-fvisibility=hidden" + HAVE_VISIBILITY=1 + fi + fi + AC_SUBST([CFLAG_VISIBILITY]) + AC_SUBST([HAVE_VISIBILITY]) + AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY], + [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.]) +]) diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4 new file mode 100644 index 0000000..cde2129 --- /dev/null +++ b/m4/wchar_t.m4 @@ -0,0 +1,20 @@ +# wchar_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether has the 'wchar_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WCHAR_T], +[ + AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) + if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) + fi +]) diff --git a/m4/wint_t.m4 b/m4/wint_t.m4 new file mode 100644 index 0000000..b8fff9c --- /dev/null +++ b/m4/wint_t.m4 @@ -0,0 +1,20 @@ +# wint_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. +dnl Test whether has the 'wint_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WINT_T], +[ + AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, + [AC_TRY_COMPILE([#include + wint_t foo = (wchar_t)'\0';], , + gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) + if test $gt_cv_c_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) + fi +]) diff --git a/m4/xsize.m4 b/m4/xsize.m4 new file mode 100644 index 0000000..85bb721 --- /dev/null +++ b/m4/xsize.m4 @@ -0,0 +1,13 @@ +# xsize.m4 serial 3 +dnl Copyright (C) 2003-2004 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_XSIZE], +[ + dnl Prerequisites of lib/xsize.h. + AC_REQUIRE([gl_SIZE_MAX]) + AC_REQUIRE([AC_C_INLINE]) + AC_CHECK_HEADERS(stdint.h) +]) diff --git a/missing b/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/packaging/alsa-utils.spec b/packaging/alsa-utils.spec new file mode 100644 index 0000000..b771537 --- /dev/null +++ b/packaging/alsa-utils.spec @@ -0,0 +1,73 @@ +#sbs-git:slp/pkgs/a/alsa-utils alsa-utils 1.0.21 7b8a27d87cefc0e56d80383e61a0385e88cd90fd + +Name: alsa-utils +Summary: Advanced Linux Sound Architecture (ALSA) utilities +Version: 1.0.24.3 +Release: 0 +Group: Applications/Multimedia +License: GPLv2+ +URL: http://www.alsa-project.org/ +Source0: ftp://ftp.alsa-project.org/pub/utils/alsa-utils-%{version}.tar.gz +BuildRequires: libasound-devel + + +%description +This package contains command line utilities for the Advanced Linux Sound +Architecture (ALSA). + + + +%package doc +Summary: Man pages for alsa-utils +Group: Documentation +Requires: %{name} = %{version}-%{release} + +%description doc +Man pages for alsa-utils + + + +%prep +%setup -q -n %{name}-%{version} + + +%build + +%configure --disable-static \ + --disable-nls \ + --disable-xmlto \ + --disable-alsamixer \ + --disable-alsatest \ + --disable-alsaconf \ + --with-udev-rules-dir=/usr/lib/udev/rules.d + +make %{?jobs:-j%jobs} + +exit + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +mkdir -p %{buildroot}/opt/usr/devel/usr/bin +mkdir -p %{buildroot}/opt/usr/devel/usr/sbin +cp COPYING %{buildroot}/usr/share/license/%{name} + +%make_install + +mv %{buildroot}/usr/bin/* %{buildroot}/opt/usr/devel/usr/bin +mv %{buildroot}/usr/sbin/* %{buildroot}/opt/usr/devel/usr/sbin + +%remove_docs + +%files +%manifest alsa-utils.manifest +/opt/usr/devel/usr/bin/* +/opt/usr/devel/usr/sbin/* +%{_datadir}/alsa/* +%ifarch %{arm} +%{_datadir}/sounds/* +%else +%exclude %{_datadir}/sounds/* +%endif +/usr/lib/udev/rules.d/90-alsa-restore.rules +/usr/share/license/%{name} diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..2027386 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1 @@ +de fr ja diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..2ed49e6 --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,393 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.15 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +localedir = @localedir@ +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +mkinstalldirs = $(SHELL) @install_sh@ -d +mkdir_p = @mkdir_p@ + +GMSGFMT_ = @GMSGFMT@ +GMSGFMT_no = @GMSGFMT@ +GMSGFMT_yes = @GMSGFMT_015@ +GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) +MSGFMT_ = @MSGFMT@ +MSGFMT_no = @MSGFMT@ +MSGFMT_yes = @MSGFMT_015@ +MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) +XGETTEXT_ = @XGETTEXT@ +XGETTEXT_no = @XGETTEXT@ +XGETTEXT_yes = @XGETTEXT_015@ +XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no +# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because +# we don't want to bother translators with empty POT files). We assume that +# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. +# In this case, stamp-po is a nop (i.e. a phony target). + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test ! -f $(srcdir)/$(DOMAIN).pot || \ + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @test ! -f $(srcdir)/$(DOMAIN).pot || { \ + echo "touch stamp-po" && \ + echo timestamp > stamp-poT && \ + mv stamp-poT stamp-po; \ + } + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ + msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ + else \ + msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ + fi; \ + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address="$$msgid_bugs_address" + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkdir_p) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkdir_p) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkdir_p) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: stamp-po $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + dists="$$dists $(DOMAIN).pot stamp-po"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir) || exit 1; \ + else \ + cp -p $(srcdir)/$$file $(distdir) || exit 1; \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && $(SHELL) ./config.status $(subdir)/$@.in po-directories + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/Makevars b/po/Makevars new file mode 100644 index 0000000..779d8ac --- /dev/null +++ b/po/Makevars @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = The ALSA Team + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..3d1b8ea --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,12 @@ +alsamixer/card_select.c +alsamixer/cli.c +alsamixer/device_name.c +alsamixer/die.c +alsamixer/mixer_display.c +alsamixer/mixer_widget.c +alsamixer/proc_files.c +alsamixer/textbox.c +aplay/aplay.c +seq/aconnect/aconnect.c +seq/aseqnet/aseqnet.c +speaker-test/speaker-test.c diff --git a/po/Rules-quot b/po/Rules-quot new file mode 100644 index 0000000..9c2a995 --- /dev/null +++ b/po/Rules-quot @@ -0,0 +1,47 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/po/alsa-utils.pot b/po/alsa-utils.pot new file mode 100644 index 0000000..4f101b2 --- /dev/null +++ b/po/alsa-utils.pot @@ -0,0 +1,1496 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR The ALSA Team +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-01-31 15:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +msgid "Sound Card" +msgstr "" + +#: alsamixer/card_select.c:181 +msgid "(default)" +msgstr "" + +#: alsamixer/card_select.c:191 +msgid "cannot enumerate sound cards" +msgstr "" + +#: alsamixer/card_select.c:215 +msgid "enter device name..." +msgstr "" + +#: alsamixer/cli.c:40 +msgid "Usage: alsamixer [options]" +msgstr "" + +#: alsamixer/cli.c:41 +msgid "" +"Useful options:\n" +" -h, --help this help\n" +" -c, --card=NUMBER sound card number or id\n" +" -D, --device=NAME mixer device name\n" +" -V, --view=MODE starting view mode: playback/capture/all" +msgstr "" + +#: alsamixer/cli.c:46 +msgid "" +"Debugging options:\n" +" -g, --no-color toggle using of colors\n" +" -a, --abstraction=NAME mixer abstraction level: none/basic" +msgstr "" + +#: alsamixer/cli.c:77 +#, c-format +msgid "invalid card index: %s\n" +msgstr "" + +#: alsamixer/cli.c:103 +#, c-format +msgid "unknown abstraction level: %s\n" +msgstr "" + +#: alsamixer/cli.c:108 +#, c-format +msgid "unknown option: %c\n" +msgstr "" + +#: alsamixer/cli.c:110 +msgid "try `alsamixer --help' for more information\n" +msgstr "" + +#: alsamixer/device_name.c:177 +msgid "Device name:" +msgstr "" + +#: alsamixer/die.c:37 +#, c-format +msgid "%s: %s\n" +msgstr "" + +#: alsamixer/mixer_display.c:98 +msgid "Card:" +msgstr "" + +#: alsamixer/mixer_display.c:99 +msgid "Chip:" +msgstr "" + +#: alsamixer/mixer_display.c:100 +msgid "View:" +msgstr "" + +#: alsamixer/mixer_display.c:101 +msgid "Item:" +msgstr "" + +#: alsamixer/mixer_display.c:104 +msgid "F1: Help" +msgstr "" + +#: alsamixer/mixer_display.c:105 +msgid "F2: System information" +msgstr "" + +#: alsamixer/mixer_display.c:106 +msgid "F6: Select sound card" +msgstr "" + +#: alsamixer/mixer_display.c:107 +msgid "Esc: Exit" +msgstr "" + +#: alsamixer/mixer_display.c:174 +msgid "(unplugged)" +msgstr "" + +#: alsamixer/mixer_display.c:192 +msgid "Playback" +msgstr "" + +#: alsamixer/mixer_display.c:193 +msgid "Capture" +msgstr "" + +#: alsamixer/mixer_display.c:194 +msgid "All" +msgstr "" + +#: alsamixer/mixer_display.c:234 +msgid "mute" +msgstr "" + +#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +msgid "dB gain:" +msgstr "" + +#: alsamixer/mixer_display.c:285 +#, c-format +msgid " [%s %s, %s]" +msgstr "" + +#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +msgid "Off" +msgstr "" + +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +msgid "On" +msgstr "" + +#: alsamixer/mixer_display.c:363 +msgid "The sound device was unplugged." +msgstr "" + +#: alsamixer/mixer_display.c:364 +msgid "Press F6 to select another sound card." +msgstr "" + +#: alsamixer/mixer_display.c:379 +msgid "This sound device does not have any playback controls." +msgstr "" + +#: alsamixer/mixer_display.c:381 +msgid "This sound device does not have any capture controls." +msgstr "" + +#: alsamixer/mixer_display.c:383 +msgid "This sound device does not have any controls." +msgstr "" + +#. TRANSLATORS: playback on; one character +#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +msgid "O" +msgstr "" + +#. TRANSLATORS: playback muted; one character +#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +msgid "M" +msgstr "" + +#. TRANSLATORS: "left"; no more than two characters +#: alsamixer/mixer_display.c:536 +msgid "L" +msgstr "" + +#. TRANSLATORS: "right"; no more than two characters +#: alsamixer/mixer_display.c:540 +msgid "R" +msgstr "" + +#. TRANSLATORS: no more than eight characters +#: alsamixer/mixer_display.c:542 +msgid "CAPTURE" +msgstr "" + +#: alsamixer/mixer_display.c:592 +msgid "Front" +msgstr "" + +#: alsamixer/mixer_display.c:595 +msgid "Rear" +msgstr "" + +#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:108 +msgid "Center" +msgstr "" + +#: alsamixer/mixer_display.c:601 +msgid "Woofer" +msgstr "" + +#: alsamixer/mixer_display.c:604 +msgid "Side" +msgstr "" + +#: alsamixer/mixer_widget.c:84 alsamixer/mixer_widget.c:89 +msgid "cannot open mixer" +msgstr "" + +#: alsamixer/mixer_widget.c:95 alsamixer/mixer_widget.c:172 +msgid "cannot load mixer controls" +msgstr "" + +#: alsamixer/mixer_widget.c:162 +#, c-format +msgid "Cannot open mixer device '%s'." +msgstr "" + +#: alsamixer/mixer_widget.c:183 +msgid "Esc Exit" +msgstr "" + +#: alsamixer/mixer_widget.c:184 +msgid "F1 ? H Help" +msgstr "" + +#: alsamixer/mixer_widget.c:185 +msgid "F2 / System information" +msgstr "" + +#: alsamixer/mixer_widget.c:186 +msgid "F3 Show playback controls" +msgstr "" + +#: alsamixer/mixer_widget.c:187 +msgid "F4 Show capture controls" +msgstr "" + +#: alsamixer/mixer_widget.c:188 +msgid "F5 Show all controls" +msgstr "" + +#: alsamixer/mixer_widget.c:189 +msgid "Tab Toggle view mode (F3/F4/F5)" +msgstr "" + +#: alsamixer/mixer_widget.c:190 +msgid "F6 S Select sound card" +msgstr "" + +#: alsamixer/mixer_widget.c:191 +msgid "L Redraw screen" +msgstr "" + +#: alsamixer/mixer_widget.c:193 +msgid "Left Move to the previous control" +msgstr "" + +#: alsamixer/mixer_widget.c:194 +msgid "Right Move to the next control" +msgstr "" + +#: alsamixer/mixer_widget.c:196 +msgid "Up/Down Change volume" +msgstr "" + +#: alsamixer/mixer_widget.c:197 +msgid "+ - Change volume" +msgstr "" + +#: alsamixer/mixer_widget.c:198 +msgid "Page Up/Dn Change volume in big steps" +msgstr "" + +#: alsamixer/mixer_widget.c:199 +msgid "End Set volume to 0%" +msgstr "" + +#: alsamixer/mixer_widget.c:200 +msgid "0-9 Set volume to 0%-90%" +msgstr "" + +#: alsamixer/mixer_widget.c:201 +msgid "Q W E Increase left/both/right volumes" +msgstr "" + +#. TRANSLATORS: or Y instead of Z +#: alsamixer/mixer_widget.c:203 +msgid "Z X C Decrease left/both/right volumes" +msgstr "" + +#: alsamixer/mixer_widget.c:204 +msgid "B Balance left and right volumes" +msgstr "" + +#: alsamixer/mixer_widget.c:206 +msgid "M Toggle mute" +msgstr "" + +#. TRANSLATORS: or , . +#: alsamixer/mixer_widget.c:208 +msgid "< > Toggle left/right mute" +msgstr "" + +#: alsamixer/mixer_widget.c:210 +msgid "Space Toggle capture" +msgstr "" + +#. TRANSLATORS: or Insert Delete +#: alsamixer/mixer_widget.c:212 +msgid "; ' Toggle left/right capture" +msgstr "" + +#: alsamixer/mixer_widget.c:214 +msgid "Authors:" +msgstr "" + +#: alsamixer/mixer_widget.c:215 +msgid " Tim Janik" +msgstr "" + +#: alsamixer/mixer_widget.c:216 +msgid " Jaroslav Kysela " +msgstr "" + +#: alsamixer/mixer_widget.c:217 +msgid " Clemens Ladisch " +msgstr "" + +#: alsamixer/mixer_widget.c:219 +msgid "Help" +msgstr "" + +#: alsamixer/proc_files.c:103 +msgid "Select File" +msgstr "" + +#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +msgid "Error" +msgstr "" + +#: alsamixer/textbox.c:80 +#, c-format +msgid "Cannot open file \"%s\"." +msgstr "" + +#: aplay/aplay.c:152 +msgid "raw data" +msgstr "" + +#: aplay/aplay.c:153 +msgid "VOC" +msgstr "" + +#: aplay/aplay.c:155 +msgid "WAVE" +msgstr "" + +#: aplay/aplay.c:156 +msgid "Sparc Audio" +msgstr "" + +#: aplay/aplay.c:177 +#, c-format +msgid "" +"Usage: %s [OPTION]... [FILE]...\n" +"\n" +"-h, --help help\n" +" --version print current version\n" +"-l, --list-devices list all soundcards and digital audio devices\n" +"-L, --list-pcms list device names\n" +"-D, --device=NAME select PCM by name\n" +"-q, --quiet quiet mode\n" +"-t, --file-type TYPE file type (voc, wav, raw or au)\n" +"-c, --channels=# channels\n" +"-f, --format=FORMAT sample format (case insensitive)\n" +"-r, --rate=# sample rate\n" +"-d, --duration=# interrupt after # seconds\n" +"-M, --mmap mmap stream\n" +"-N, --nonblock nonblocking mode\n" +"-F, --period-time=# distance between interrupts is # microseconds\n" +"-B, --buffer-time=# buffer duration is # microseconds\n" +" --period-size=# distance between interrupts is # frames\n" +" --buffer-size=# buffer duration is # frames\n" +"-A, --avail-min=# min available space for wakeup is # microseconds\n" +"-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +" (relative to buffer size if <= 0)\n" +"-T, --stop-delay=# delay for automatic PCM stop is # microseconds from " +"xrun\n" +"-v, --verbose show PCM structure and setup (accumulative)\n" +"-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +"-I, --separate-channels one file for each channel\n" +" --disable-resample disable automatic rate resample\n" +" --disable-channels disable automatic channel conversions\n" +" --disable-format disable automatic format conversions\n" +" --disable-softvol disable software volume control (softvol)\n" +" --test-position test ring buffer position\n" +" --test-coef=#\t test coeficient for ring buffer position (default 8)\n" +" expression for validation is: coef * (buffer_size / " +"2)\n" +" --test-nowait do not wait for ring buffer - eats whole CPU\n" +" --max-file-time=# start another output file when the old file has " +"recorded\n" +" for this many seconds\n" +" --process-id-file write the process ID here\n" +" --use-strftime apply the strftime facility to the output file name\n" +msgstr "" + +#: aplay/aplay.c:216 speaker-test/speaker-test.c:819 +#, c-format +msgid "Recognized sample formats are:" +msgstr "" + +#: aplay/aplay.c:222 +#, c-format +msgid "" +"\n" +"Some of these may not be available on selected hardware\n" +msgstr "" + +#: aplay/aplay.c:223 +#, c-format +msgid "The availabled format shortcuts are:\n" +msgstr "" + +#: aplay/aplay.c:224 +#, c-format +msgid "-f cd (16 bit little endian, 44100, stereo)\n" +msgstr "" + +#: aplay/aplay.c:225 +#, c-format +msgid "-f cdr (16 bit big endian, 44100, stereo)\n" +msgstr "" + +#: aplay/aplay.c:226 +#, c-format +msgid "-f dat (16 bit little endian, 48000, stereo)\n" +msgstr "" + +#: aplay/aplay.c:240 +msgid "no soundcards found..." +msgstr "" + +#: aplay/aplay.c:243 +#, c-format +msgid "**** List of %s Hardware Devices ****\n" +msgstr "" + +#: aplay/aplay.c:272 +#, c-format +msgid "card %i: %s [%s], device %i: %s [%s]\n" +msgstr "" + +#: aplay/aplay.c:278 +#, c-format +msgid " Subdevices: %i/%i\n" +msgstr "" + +#: aplay/aplay.c:285 +#, c-format +msgid " Subdevice #%i: %s\n" +msgstr "" + +#: aplay/aplay.c:362 +#, c-format +msgid "Aborted by signal %s...\n" +msgstr "" + +#: aplay/aplay.c:473 +msgid "command should be named either arecord or aplay" +msgstr "" + +#: aplay/aplay.c:512 +#, c-format +msgid "unrecognized file format %s" +msgstr "" + +#: aplay/aplay.c:519 +#, c-format +msgid "value %i for channels is invalid" +msgstr "" + +#: aplay/aplay.c:538 +#, c-format +msgid "wrong extended format '%s'" +msgstr "" + +#: aplay/aplay.c:549 +#, c-format +msgid "bad speed value %i" +msgstr "" + +#: aplay/aplay.c:644 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "" + +#: aplay/aplay.c:660 +#, c-format +msgid "audio open error: %s" +msgstr "" + +#: aplay/aplay.c:665 +#, c-format +msgid "info error: %s" +msgstr "" + +#: aplay/aplay.c:672 +#, c-format +msgid "nonblock setting error: %s" +msgstr "" + +#: aplay/aplay.c:682 aplay/aplay.c:806 aplay/aplay.c:1174 +msgid "not enough memory" +msgstr "" + +#: aplay/aplay.c:706 +#, c-format +msgid "Cannot create process ID file %s: %s" +msgstr "" + +#: aplay/aplay.c:796 +#, c-format +msgid "read error (called from line %i)" +msgstr "" + +#: aplay/aplay.c:854 +#, c-format +msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" + +#: aplay/aplay.c:864 +#, c-format +msgid "" +"unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" + +#: aplay/aplay.c:869 +msgid "wrong format tag in extensible 'fmt ' chunk" +msgstr "" + +#: aplay/aplay.c:876 +#, c-format +msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" +msgstr "" + +#: aplay/aplay.c:880 +#, c-format +msgid "can't play WAVE-files with %d tracks" +msgstr "" + +#: aplay/aplay.c:888 aplay/aplay.c:988 +#, c-format +msgid "Warning: format is changed to U8\n" +msgstr "" + +#: aplay/aplay.c:894 +#, c-format +msgid "Warning: format is changed to S16_LE\n" +msgstr "" + +#: aplay/aplay.c:902 +#, c-format +msgid "Warning: format is changed to S24_3LE\n" +msgstr "" + +#: aplay/aplay.c:908 +#, c-format +msgid "Warning: format is changed to S24_LE\n" +msgstr "" + +#: aplay/aplay.c:912 +#, c-format +msgid "" +" can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" +msgstr "" + +#: aplay/aplay.c:924 +#, c-format +msgid " can't play WAVE-files with sample %d bits wide" +msgstr "" + +#: aplay/aplay.c:982 +#, c-format +msgid "Warning: format is changed to MU_LAW\n" +msgstr "" + +#: aplay/aplay.c:994 +#, c-format +msgid "Warning: format is changed to S16_BE\n" +msgstr "" + +#: aplay/aplay.c:1007 aplay/aplay.c:1925 aplay/aplay.c:1932 aplay/aplay.c:2455 +#: aplay/aplay.c:2467 +msgid "read error" +msgstr "" + +#: aplay/aplay.c:1037 +msgid "Broken configuration for this PCM: no configurations available" +msgstr "" + +#: aplay/aplay.c:1054 +msgid "Access type not available" +msgstr "" + +#: aplay/aplay.c:1059 +msgid "Sample format non available" +msgstr "" + +#: aplay/aplay.c:1065 +msgid "Channels count non available" +msgstr "" + +#: aplay/aplay.c:1080 +#, c-format +msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" +msgstr "" + +#: aplay/aplay.c:1086 +#, c-format +msgid " please, try the plug plugin %s\n" +msgstr "" + +#: aplay/aplay.c:1123 +msgid "Unable to install hw params:" +msgstr "" + +#: aplay/aplay.c:1130 +#, c-format +msgid "Can't use period equal to buffer size (%lu == %lu)" +msgstr "" + +#: aplay/aplay.c:1161 +msgid "unable to install sw params:" +msgstr "" + +#: aplay/aplay.c:1192 +#, c-format +msgid "snd_pcm_mmap_begin problem: %s" +msgstr "" + +#: aplay/aplay.c:1215 +#, c-format +msgid "stdin O_NONBLOCK flag setup failed\n" +msgstr "" + +#: aplay/aplay.c:1237 +#, c-format +msgid "\rPAUSE command ignored (no hw support)\n" +msgstr "" + +#: aplay/aplay.c:1242 +#, c-format +msgid "pause push error: %s" +msgstr "" + +#: aplay/aplay.c:1251 +#, c-format +msgid "pause release error: %s" +msgstr "" + +#: aplay/aplay.c:1265 +#, c-format +msgid "" +"\r=== PAUSE === " +msgstr "" + +#: aplay/aplay.c:1307 +#, c-format +msgid "status error: %s" +msgstr "" + +#: aplay/aplay.c:1317 aplay/aplay.c:1328 +#, c-format +msgid "%s!!! (at least %.3f ms long)\n" +msgstr "" + +#: aplay/aplay.c:1318 aplay/aplay.c:1321 aplay/aplay.c:1329 +msgid "underrun" +msgstr "" + +#: aplay/aplay.c:1318 aplay/aplay.c:1329 +msgid "overrun" +msgstr "" + +#: aplay/aplay.c:1333 +#, c-format +msgid "Status:\n" +msgstr "" + +#: aplay/aplay.c:1337 +#, c-format +msgid "xrun: prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1343 +#, c-format +msgid "Status(DRAINING):\n" +msgstr "" + +#: aplay/aplay.c:1347 +#, c-format +msgid "capture stream format change? attempting recover...\n" +msgstr "" + +#: aplay/aplay.c:1349 +#, c-format +msgid "xrun(DRAINING): prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1356 +#, c-format +msgid "Status(R/W):\n" +msgstr "" + +#: aplay/aplay.c:1359 +#, c-format +msgid "read/write error, state = %s" +msgstr "" + +#: aplay/aplay.c:1369 +#, c-format +msgid "Suspended. Trying resume. " +msgstr "" + +#: aplay/aplay.c:1374 +#, c-format +msgid "Failed. Restarting stream. " +msgstr "" + +#: aplay/aplay.c:1376 +#, c-format +msgid "suspend: prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1381 +#, c-format +msgid "Done.\n" +msgstr "" + +#: aplay/aplay.c:1403 +#, c-format +msgid " !clip " +msgstr "" + +#: aplay/aplay.c:1550 +#, c-format +msgid "Unsupported bit size %d.\n" +msgstr "" + +#: aplay/aplay.c:1584 +#, c-format +msgid "Max peak (%li samples): 0x%08x " +msgstr "" + +#: aplay/aplay.c:1618 +#, c-format +msgid "" +"Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = %" +"li\n" +msgstr "" + +#: aplay/aplay.c:1682 +#, c-format +msgid "write error: %s" +msgstr "" + +#: aplay/aplay.c:1729 +#, c-format +msgid "writev error: %s" +msgstr "" + +#: aplay/aplay.c:1773 +#, c-format +msgid "read error: %s" +msgstr "" + +#: aplay/aplay.c:1817 +#, c-format +msgid "readv error: %s" +msgstr "" + +#: aplay/aplay.c:1865 +msgid "can't allocate buffer for silence" +msgstr "" + +#: aplay/aplay.c:1874 aplay/aplay.c:2100 aplay/aplay.c:2105 aplay/aplay.c:2152 +#: aplay/aplay.c:2161 aplay/aplay.c:2168 aplay/aplay.c:2178 aplay/aplay.c:2184 +#: aplay/aplay.c:2256 aplay/aplay.c:2286 aplay/aplay.c:2300 +msgid "write error" +msgstr "" + +#: aplay/aplay.c:1887 +#, c-format +msgid "voc_pcm_flush - silence error" +msgstr "" + +#: aplay/aplay.c:1890 +msgid "voc_pcm_flush error" +msgstr "" + +#: aplay/aplay.c:1916 +msgid "malloc error" +msgstr "" + +#: aplay/aplay.c:1920 +#, c-format +msgid "Playing Creative Labs Channel file '%s'...\n" +msgstr "" + +#: aplay/aplay.c:1988 aplay/aplay.c:2080 +msgid "can't play packed .voc files" +msgstr "" + +#: aplay/aplay.c:2040 +#, c-format +msgid "can't play loops; %s isn't seekable\n" +msgstr "" + +#: aplay/aplay.c:2089 +#, c-format +msgid "unknown blocktype %d. terminate." +msgstr "" + +#: aplay/aplay.c:2220 +#, c-format +msgid "Wave doesn't support %s format..." +msgstr "" + +#: aplay/aplay.c:2280 +#, c-format +msgid "Sparc Audio doesn't support %s format..." +msgstr "" + +#: aplay/aplay.c:2361 +msgid "Playing" +msgstr "" + +#: aplay/aplay.c:2361 +msgid "Recording" +msgstr "" + +#: aplay/aplay.c:2365 +#, c-format +msgid "Rate %d Hz, " +msgstr "" + +#: aplay/aplay.c:2367 +#, c-format +msgid "Mono" +msgstr "" + +#: aplay/aplay.c:2369 +#, c-format +msgid "Stereo" +msgstr "" + +#: aplay/aplay.c:2371 +#, c-format +msgid "Channels %i" +msgstr "" + +#: aplay/aplay.c:2882 aplay/aplay.c:2935 +#, c-format +msgid "You need to specify %d files" +msgstr "" + +#: seq/aconnect/aconnect.c:49 +#, c-format +msgid "aconnect - ALSA sequencer connection manager\n" +msgstr "" + +#: seq/aconnect/aconnect.c:50 +#, c-format +msgid "Copyright (C) 1999-2000 Takashi Iwai\n" +msgstr "" + +#: seq/aconnect/aconnect.c:51 +#, c-format +msgid "Usage:\n" +msgstr "" + +#: seq/aconnect/aconnect.c:52 +#, c-format +msgid " * Connection/disconnection between two ports\n" +msgstr "" + +#: seq/aconnect/aconnect.c:53 +#, c-format +msgid " aconnect [-options] sender receiver\n" +msgstr "" + +#: seq/aconnect/aconnect.c:54 +#, c-format +msgid " sender, receiver = client:port pair\n" +msgstr "" + +#: seq/aconnect/aconnect.c:55 +#, c-format +msgid " -d,--disconnect disconnect\n" +msgstr "" + +#: seq/aconnect/aconnect.c:56 +#, c-format +msgid " -e,--exclusive exclusive connection\n" +msgstr "" + +#: seq/aconnect/aconnect.c:57 +#, c-format +msgid " -r,--real # convert real-time-stamp on queue\n" +msgstr "" + +#: seq/aconnect/aconnect.c:58 +#, c-format +msgid " -t,--tick # convert tick-time-stamp on queue\n" +msgstr "" + +#: seq/aconnect/aconnect.c:59 +#, c-format +msgid " * List connected ports (no subscription action)\n" +msgstr "" + +#: seq/aconnect/aconnect.c:60 +#, c-format +msgid " aconnect -i|-o [-options]\n" +msgstr "" + +#: seq/aconnect/aconnect.c:61 +#, c-format +msgid " -i,--input list input (readable) ports\n" +msgstr "" + +#: seq/aconnect/aconnect.c:62 +#, c-format +msgid " -o,--output list output (writable) ports\n" +msgstr "" + +#: seq/aconnect/aconnect.c:63 +#, c-format +msgid " -l,--list list current connections of each port\n" +msgstr "" + +#: seq/aconnect/aconnect.c:64 +#, c-format +msgid " * Remove all exported connections\n" +msgstr "" + +#: seq/aconnect/aconnect.c:65 +#, c-format +msgid " -x, --removeall\n" +msgstr "" + +#: seq/aconnect/aconnect.c:132 +msgid "Connecting To" +msgstr "" + +#: seq/aconnect/aconnect.c:133 +msgid "Connected From" +msgstr "" + +#: seq/aconnect/aconnect.c:169 +#, c-format +msgid "client %d: '%s' [type=%s]\n" +msgstr "" + +#: seq/aconnect/aconnect.c:173 +msgid "user" +msgstr "" + +#: seq/aconnect/aconnect.c:173 +msgid "kernel" +msgstr "" + +#: seq/aconnect/aconnect.c:307 +#, c-format +msgid "can't open sequencer\n" +msgstr "" + +#: seq/aconnect/aconnect.c:335 +#, c-format +msgid "can't get client id\n" +msgstr "" + +#: seq/aconnect/aconnect.c:342 +#, c-format +msgid "can't set client info\n" +msgstr "" + +#: seq/aconnect/aconnect.c:349 +#, c-format +msgid "invalid sender address %s\n" +msgstr "" + +#: seq/aconnect/aconnect.c:354 seq/aseqnet/aseqnet.c:290 +#, c-format +msgid "invalid destination address %s\n" +msgstr "" + +#: seq/aconnect/aconnect.c:368 +#, c-format +msgid "No subscription is found\n" +msgstr "" + +#: seq/aconnect/aconnect.c:373 +#, c-format +msgid "Disconnection failed (%s)\n" +msgstr "" + +#: seq/aconnect/aconnect.c:379 +#, c-format +msgid "Connection is already subscribed\n" +msgstr "" + +#: seq/aconnect/aconnect.c:384 +#, c-format +msgid "Connection failed (%s)\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:164 +#, c-format +msgid "aseqnet - network client/server on ALSA sequencer\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:165 +#, c-format +msgid " Copyright (C) 1999 Takashi Iwai\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:166 +#, c-format +msgid "usage:\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:167 +#, c-format +msgid " server mode: aseqnet [-options]\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:168 +#, c-format +msgid " client mode: aseqnet [-options] server_host\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:169 +#, c-format +msgid "options:\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:170 +#, c-format +msgid " -p,--port # : sepcify TCP port (digit or service name)\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:171 +#, c-format +msgid " -s,--source addr : read from given addr (client:port)\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:172 +#, c-format +msgid " -d,--dest addr : write to given addr (client:port)\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:173 +#, c-format +msgid " -v, --verbose : print verbose messages\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:174 +#, c-format +msgid " -i, --info : print certain received events\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:188 +#, c-format +msgid "can't malloc\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:213 +#, c-format +msgid "closing files..\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:272 +#, c-format +msgid "sequencer opened: %d:%d\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:279 +#, c-format +msgid "invalid source address %s\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:309 +#, c-format +msgid "service '%s' is not found in /etc/services\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:377 +#, c-format +msgid "too many connections!\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:388 +#, c-format +msgid "accepted[%d]\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:411 +#, c-format +msgid "can't get address %s\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:422 +#, c-format +msgid "ok.. connected\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:518 +#, c-format +msgid "Channel %2d: Control event : %5d\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:522 +#, c-format +msgid "Channel %2d: Pitchbender : %5d\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:526 +#, c-format +msgid "Channel %2d: Note On event : %5d\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:530 +#, c-format +msgid "Channel %2d: Note Off event: %5d\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:585 +#, c-format +msgid "disconnected\n" +msgstr "" + +#: speaker-test/speaker-test.c:104 +msgid "Front Left" +msgstr "" + +#: speaker-test/speaker-test.c:105 +msgid "Front Right" +msgstr "" + +#: speaker-test/speaker-test.c:106 +msgid "Rear Left" +msgstr "" + +#: speaker-test/speaker-test.c:107 +msgid "Rear Right" +msgstr "" + +#: speaker-test/speaker-test.c:109 +msgid "LFE" +msgstr "" + +#: speaker-test/speaker-test.c:110 +msgid "Side Left" +msgstr "" + +#: speaker-test/speaker-test.c:111 +msgid "Side Right" +msgstr "" + +#: speaker-test/speaker-test.c:112 +msgid "Channel 9" +msgstr "" + +#: speaker-test/speaker-test.c:113 +msgid "Channel 10" +msgstr "" + +#: speaker-test/speaker-test.c:114 +msgid "Channel 11" +msgstr "" + +#: speaker-test/speaker-test.c:115 +msgid "Channel 12" +msgstr "" + +#: speaker-test/speaker-test.c:116 +msgid "Channel 13" +msgstr "" + +#: speaker-test/speaker-test.c:117 +msgid "Channel 14" +msgstr "" + +#: speaker-test/speaker-test.c:118 +msgid "Channel 15" +msgstr "" + +#: speaker-test/speaker-test.c:119 +msgid "Channel 16" +msgstr "" + +#: speaker-test/speaker-test.c:383 +#, c-format +msgid "Broken configuration for playback: no configurations available: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:390 +#, c-format +msgid "Access type not available for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:397 +#, c-format +msgid "Sample format not available for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:404 +#, c-format +msgid "Channels count (%i) not available for playbacks: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:412 +#, c-format +msgid "Rate %iHz not available for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:417 +#, c-format +msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" +msgstr "" + +#: speaker-test/speaker-test.c:421 +#, c-format +msgid "Rate set to %iHz (requested %iHz)\n" +msgstr "" + +#: speaker-test/speaker-test.c:427 +#, c-format +msgid "Buffer size range from %lu to %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:428 +#, c-format +msgid "Period size range from %lu to %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:430 +#, c-format +msgid "Requested period time %u us\n" +msgstr "" + +#: speaker-test/speaker-test.c:433 +#, c-format +msgid "Unable to set period time %u us for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:439 +#, c-format +msgid "Requested buffer time %u us\n" +msgstr "" + +#: speaker-test/speaker-test.c:442 +#, c-format +msgid "Unable to set buffer time %u us for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:451 +#, c-format +msgid "Using max buffer size %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:454 +#, c-format +msgid "Unable to set buffer size %lu for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:460 +#, c-format +msgid "Periods = %u\n" +msgstr "" + +#: speaker-test/speaker-test.c:463 +#, c-format +msgid "Unable to set nperiods %u for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:472 +#, c-format +msgid "Unable to set hw params for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:478 +#, c-format +msgid "was set period_size = %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:479 +#, c-format +msgid "was set buffer_size = %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:481 +#, c-format +msgid "buffer to small, could not use\n" +msgstr "" + +#: speaker-test/speaker-test.c:494 +#, c-format +msgid "Unable to determine current swparams for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:501 +#, c-format +msgid "Unable to set start threshold mode for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:508 +#, c-format +msgid "Unable to set avail min for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:515 +#, c-format +msgid "Unable to set sw params for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:530 +#, c-format +msgid "Can't recovery from underrun, prepare failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:541 +#, c-format +msgid "Can't recovery from suspend, prepare failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:605 speaker-test/speaker-test.c:1025 +#, c-format +msgid "No enough memory\n" +msgstr "" + +#: speaker-test/speaker-test.c:610 +#, c-format +msgid "Cannot open WAV file %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:614 speaker-test/speaker-test.c:643 +#, c-format +msgid "Invalid WAV file %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:619 +#, c-format +msgid "Not a WAV file: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:623 +#, c-format +msgid "Unsupported WAV format %d for %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:628 +#, c-format +msgid "%s is not a mono stream (%d channels)\n" +msgstr "" + +#: speaker-test/speaker-test.c:633 +#, c-format +msgid "Sample rate doesn't match (%d) for %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:638 +#, c-format +msgid "Unsupported sample format bits %d for %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:688 +#, c-format +msgid "Undefined channel %d\n" +msgstr "" + +#: speaker-test/speaker-test.c:739 +#, c-format +msgid "Write error: %d,%s\n" +msgstr "" + +#: speaker-test/speaker-test.c:741 +#, c-format +msgid "xrun_recovery failed: %d,%s\n" +msgstr "" + +#: speaker-test/speaker-test.c:803 +#, c-format +msgid "" +"Usage: speaker-test [OPTION]... \n" +"-h,--help\thelp\n" +"-D,--device\tplayback device\n" +"-r,--rate\tstream rate in Hz\n" +"-c,--channels\tcount of channels in stream\n" +"-f,--frequency\tsine wave frequency in Hz\n" +"-F,--format\tsample format\n" +"-b,--buffer\tring buffer size in us\n" +"-p,--period\tperiod size in us\n" +"-P,--nperiods\tnumber of periods\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +"-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +"-w,--wavfile\tUse the given WAV file as a test sound\n" +"-W,--wavdir\tSpecify the directory containing WAV files\n" +"\n" +msgstr "" + +#: speaker-test/speaker-test.c:921 +#, c-format +msgid "Invalid number of periods %d\n" +msgstr "" + +#: speaker-test/speaker-test.c:937 speaker-test/speaker-test.c:941 +#, c-format +msgid "Invalid test type %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:953 +#, c-format +msgid "Invalid parameter for -s option.\n" +msgstr "" + +#: speaker-test/speaker-test.c:967 +#, c-format +msgid "Unknown option '%c'\n" +msgstr "" + +#: speaker-test/speaker-test.c:981 +#, c-format +msgid "Playback device is %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 +#, c-format +msgid "Stream parameters are %iHz, %s, %i channels\n" +msgstr "" + +#: speaker-test/speaker-test.c:985 +#, c-format +msgid "Using 16 octaves of pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:988 +#, c-format +msgid "Sine wave rate is %.4fHz\n" +msgstr "" + +#: speaker-test/speaker-test.c:991 +#, c-format +msgid "WAV file(s)\n" +msgstr "" + +#: speaker-test/speaker-test.c:997 +#, c-format +msgid "Playback open error: %d,%s\n" +msgstr "" + +#: speaker-test/speaker-test.c:1002 +#, c-format +msgid "Setting of hwparams failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:1007 +#, c-format +msgid "Setting of swparams failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:1056 speaker-test/speaker-test.c:1078 +#, c-format +msgid "Transfer failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:1066 +#, c-format +msgid "Time per period = %lf\n" +msgstr "" diff --git a/po/boldquot.sed b/po/boldquot.sed new file mode 100644 index 0000000..4b937aa --- /dev/null +++ b/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g +s/“/“/g +s/”/”/g +s/‘/‘/g +s/’/’/g diff --git a/po/de.gmo b/po/de.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6dfd60ce73f52ca4329d15b5f1c4130485107e6e GIT binary patch literal 30841 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 SZ3U}7I6*vh1oC+u_5T92Zx~bn literal 0 HcmV?d00001 diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..0dd0795 --- /dev/null +++ b/po/de.po @@ -0,0 +1,1577 @@ +# German translations for the alsa-utils package. +# Copyright (C) 2009 The ALSA Team +# This file is distributed under the same license as the alsa-utils package. +# Clemens Ladisch , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: alsa-utils 1.0.23\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-01-31 15:27+0100\n" +"PO-Revision-Date: 2010-11-09 21:12+0100\n" +"Last-Translator: Clemens Ladisch \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +msgid "Sound Card" +msgstr "Soundkarte" + +#: alsamixer/card_select.c:181 +msgid "(default)" +msgstr "(Standard)" + +#: alsamixer/card_select.c:191 +msgid "cannot enumerate sound cards" +msgstr "Fehler beim Aufzählen der Soundkarten" + +#: alsamixer/card_select.c:215 +msgid "enter device name..." +msgstr "Gerätenamen eingeben..." + +#: alsamixer/cli.c:40 +msgid "Usage: alsamixer [options]" +msgstr "Verwendung: alsamixer [Optionen]" + +#: alsamixer/cli.c:41 +msgid "" +"Useful options:\n" +" -h, --help this help\n" +" -c, --card=NUMBER sound card number or id\n" +" -D, --device=NAME mixer device name\n" +" -V, --view=MODE starting view mode: playback/capture/all" +msgstr "" +"Optionen:\n" +" -h, --help Hilfe\n" +" -c, --card=NUMMER Soundkarten-Nummer oder -ID\n" +" -D, --device=NAME Mixer-Gerätename\n" +" -V, --view=MODUS Ansicht beim Starten: playback=Wiedergabe, " +"capture=Aufnahme, all=alle" + +#: alsamixer/cli.c:46 +msgid "" +"Debugging options:\n" +" -g, --no-color toggle using of colors\n" +" -a, --abstraction=NAME mixer abstraction level: none/basic" +msgstr "" +"Debugging-Optionen:\n" +" -g, --no-color keine Farben\n" +" -a, --abstraction=NAME Mixer-Abstraktion: none/basic" + +#: alsamixer/cli.c:77 +#, c-format +msgid "invalid card index: %s\n" +msgstr "ungültige Karten-Nummer: %s\n" + +#: alsamixer/cli.c:103 +#, c-format +msgid "unknown abstraction level: %s\n" +msgstr "unbekannte Abstraktion: %s\n" + +#: alsamixer/cli.c:108 +#, c-format +msgid "unknown option: %c\n" +msgstr "unbekannte Option: %c\n" + +#: alsamixer/cli.c:110 +msgid "try `alsamixer --help' for more information\n" +msgstr "siehe `alsamixer --help' für mehr Informationen\n" + +#: alsamixer/device_name.c:177 +msgid "Device name:" +msgstr "Gerätename:" + +#: alsamixer/die.c:37 +#, c-format +msgid "%s: %s\n" +msgstr "%s: %s\n" + +#: alsamixer/mixer_display.c:98 +msgid "Card:" +msgstr "Gerät:" + +#: alsamixer/mixer_display.c:99 +msgid "Chip:" +msgstr "Chip:" + +#: alsamixer/mixer_display.c:100 +msgid "View:" +msgstr "Ansicht:" + +#: alsamixer/mixer_display.c:101 +msgid "Item:" +msgstr "Element:" + +#: alsamixer/mixer_display.c:104 +msgid "F1: Help" +msgstr "F1: Hilfe" + +#: alsamixer/mixer_display.c:105 +msgid "F2: System information" +msgstr "F2: System-Informationen" + +#: alsamixer/mixer_display.c:106 +msgid "F6: Select sound card" +msgstr "F6: Soundkarte auswählen" + +#: alsamixer/mixer_display.c:107 +msgid "Esc: Exit" +msgstr "Esc: Beenden" + +#: alsamixer/mixer_display.c:174 +msgid "(unplugged)" +msgstr "(entfernt)" + +#: alsamixer/mixer_display.c:192 +msgid "Playback" +msgstr "Wiedergabe" + +#: alsamixer/mixer_display.c:193 +msgid "Capture" +msgstr "Aufnahme" + +#: alsamixer/mixer_display.c:194 +msgid "All" +msgstr "Alle" + +#: alsamixer/mixer_display.c:234 +msgid "mute" +msgstr "stumm" + +#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +msgid "dB gain:" +msgstr "dB-Änderung:" + +#: alsamixer/mixer_display.c:285 +#, c-format +msgid " [%s %s, %s]" +msgstr " [%s %s; %s]" + +#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +msgid "Off" +msgstr "Aus" + +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +msgid "On" +msgstr "An" + +#: alsamixer/mixer_display.c:363 +msgid "The sound device was unplugged." +msgstr "Das Gerät wurde entfernt." + +#: alsamixer/mixer_display.c:364 +msgid "Press F6 to select another sound card." +msgstr "Drücken Sie F6, um eine andere Soundkarte auszuwählen." + +#: alsamixer/mixer_display.c:379 +msgid "This sound device does not have any playback controls." +msgstr "Dieses Gerät hat keine Wiedergabe-Regler." + +#: alsamixer/mixer_display.c:381 +msgid "This sound device does not have any capture controls." +msgstr "Dieses Gerät hat keine Aufnahme-Regler." + +#: alsamixer/mixer_display.c:383 +msgid "This sound device does not have any controls." +msgstr "Dieses Gerät hat keine Regler." + +#. TRANSLATORS: playback on; one character +#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +msgid "O" +msgstr "O" + +#. TRANSLATORS: playback muted; one character +#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +msgid "M" +msgstr "M" + +#. TRANSLATORS: "left"; no more than two characters +#: alsamixer/mixer_display.c:536 +msgid "L" +msgstr "L" + +#. TRANSLATORS: "right"; no more than two characters +#: alsamixer/mixer_display.c:540 +msgid "R" +msgstr "R" + +#. TRANSLATORS: no more than eight characters +#: alsamixer/mixer_display.c:542 +msgid "CAPTURE" +msgstr "AUFNAHME" + +#: alsamixer/mixer_display.c:592 +msgid "Front" +msgstr "Vorne" + +#: alsamixer/mixer_display.c:595 +msgid "Rear" +msgstr "Hinten" + +#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:108 +msgid "Center" +msgstr "Mitte" + +#: alsamixer/mixer_display.c:601 +msgid "Woofer" +msgstr "Bass" + +#: alsamixer/mixer_display.c:604 +msgid "Side" +msgstr "Seiten" + +#: alsamixer/mixer_widget.c:84 alsamixer/mixer_widget.c:89 +msgid "cannot open mixer" +msgstr "Fehler beim Öffen des Mixer-Gerätes" + +#: alsamixer/mixer_widget.c:95 alsamixer/mixer_widget.c:172 +msgid "cannot load mixer controls" +msgstr "Fehler beim Laden der Mixer-Regler" + +#: alsamixer/mixer_widget.c:162 +#, c-format +msgid "Cannot open mixer device '%s'." +msgstr "Fehler beim Öffnen des Mixer-Gerätes '%s'." + +#: alsamixer/mixer_widget.c:183 +msgid "Esc Exit" +msgstr "Esc Beenden" + +#: alsamixer/mixer_widget.c:184 +msgid "F1 ? H Help" +msgstr "F1 ? H Hilfe" + +#: alsamixer/mixer_widget.c:185 +msgid "F2 / System information" +msgstr "F2 / System-Informationen" + +#: alsamixer/mixer_widget.c:186 +msgid "F3 Show playback controls" +msgstr "F3 Ansicht Wiedergabe-Regler" + +#: alsamixer/mixer_widget.c:187 +msgid "F4 Show capture controls" +msgstr "F4 Ansicht Aufnahme-Regler" + +#: alsamixer/mixer_widget.c:188 +msgid "F5 Show all controls" +msgstr "F5 Ansicht alle Regler" + +#: alsamixer/mixer_widget.c:189 +msgid "Tab Toggle view mode (F3/F4/F5)" +msgstr "Tab Ansichts-Modus umschalten (F3/F4/F5)" + +#: alsamixer/mixer_widget.c:190 +msgid "F6 S Select sound card" +msgstr "F6 S Soundkarte auswählen" + +#: alsamixer/mixer_widget.c:191 +msgid "L Redraw screen" +msgstr "L Bildschirm neu darstellen" + +#: alsamixer/mixer_widget.c:193 +msgid "Left Move to the previous control" +msgstr "Links gehe zum vorherigen Regler" + +#: alsamixer/mixer_widget.c:194 +msgid "Right Move to the next control" +msgstr "Rechts gehe zum nächsten Regler" + +#: alsamixer/mixer_widget.c:196 +msgid "Up/Down Change volume" +msgstr "Oben/Unten Lautstärke ändern" + +#: alsamixer/mixer_widget.c:197 +msgid "+ - Change volume" +msgstr "+ - Lautstärke ändern" + +#: alsamixer/mixer_widget.c:198 +msgid "Page Up/Dn Change volume in big steps" +msgstr "Bild ^/v Lautstärke in großen Schritten ändern" + +#: alsamixer/mixer_widget.c:199 +msgid "End Set volume to 0%" +msgstr "Ende Lautstärke auf 0% setzen" + +#: alsamixer/mixer_widget.c:200 +msgid "0-9 Set volume to 0%-90%" +msgstr "0-9 Lautstärke auf 0%-90% setzen" + +#: alsamixer/mixer_widget.c:201 +msgid "Q W E Increase left/both/right volumes" +msgstr "Q W E linke/beide/rechte Lautstärke erhöhen" + +#. TRANSLATORS: or Y instead of Z +#: alsamixer/mixer_widget.c:203 +msgid "Z X C Decrease left/both/right volumes" +msgstr "Y X C linke/beide/rechte Lautstärke verringern" + +#: alsamixer/mixer_widget.c:204 +msgid "B Balance left and right volumes" +msgstr "B linke und rechte Lautstärke angleichen" + +#: alsamixer/mixer_widget.c:206 +msgid "M Toggle mute" +msgstr "M stumm umschalten" + +#. TRANSLATORS: or , . +#: alsamixer/mixer_widget.c:208 +msgid "< > Toggle left/right mute" +msgstr ", . stumm links/rechts umschalten" + +#: alsamixer/mixer_widget.c:210 +msgid "Space Toggle capture" +msgstr "Leertaste Aufnahme umschalten" + +#. TRANSLATORS: or Insert Delete +#: alsamixer/mixer_widget.c:212 +msgid "; ' Toggle left/right capture" +msgstr "Einfg Entf Aufnahme links/rechts umschalten" + +#: alsamixer/mixer_widget.c:214 +msgid "Authors:" +msgstr "Autoren:" + +#: alsamixer/mixer_widget.c:215 +msgid " Tim Janik" +msgstr " Tim Janik" + +#: alsamixer/mixer_widget.c:216 +msgid " Jaroslav Kysela " +msgstr " Jaroslav Kysela " + +#: alsamixer/mixer_widget.c:217 +msgid " Clemens Ladisch " +msgstr " Clemens Ladisch " + +#: alsamixer/mixer_widget.c:219 +msgid "Help" +msgstr "Hilfe" + +#: alsamixer/proc_files.c:103 +msgid "Select File" +msgstr "Datei wählen" + +#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +msgid "Error" +msgstr "Fehler" + +#: alsamixer/textbox.c:80 +#, c-format +msgid "Cannot open file \"%s\"." +msgstr "Fehler beim Öffnen der Datei \"%s\"." + +#: aplay/aplay.c:152 +msgid "raw data" +msgstr "Rohdaten" + +#: aplay/aplay.c:153 +msgid "VOC" +msgstr "VOC" + +#: aplay/aplay.c:155 +msgid "WAVE" +msgstr "WAVE" + +#: aplay/aplay.c:156 +msgid "Sparc Audio" +msgstr "Sparc-Audio" + +#: aplay/aplay.c:177 +#, c-format +msgid "" +"Usage: %s [OPTION]... [FILE]...\n" +"\n" +"-h, --help help\n" +" --version print current version\n" +"-l, --list-devices list all soundcards and digital audio devices\n" +"-L, --list-pcms list device names\n" +"-D, --device=NAME select PCM by name\n" +"-q, --quiet quiet mode\n" +"-t, --file-type TYPE file type (voc, wav, raw or au)\n" +"-c, --channels=# channels\n" +"-f, --format=FORMAT sample format (case insensitive)\n" +"-r, --rate=# sample rate\n" +"-d, --duration=# interrupt after # seconds\n" +"-M, --mmap mmap stream\n" +"-N, --nonblock nonblocking mode\n" +"-F, --period-time=# distance between interrupts is # microseconds\n" +"-B, --buffer-time=# buffer duration is # microseconds\n" +" --period-size=# distance between interrupts is # frames\n" +" --buffer-size=# buffer duration is # frames\n" +"-A, --avail-min=# min available space for wakeup is # microseconds\n" +"-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +" (relative to buffer size if <= 0)\n" +"-T, --stop-delay=# delay for automatic PCM stop is # microseconds from " +"xrun\n" +"-v, --verbose show PCM structure and setup (accumulative)\n" +"-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +"-I, --separate-channels one file for each channel\n" +" --disable-resample disable automatic rate resample\n" +" --disable-channels disable automatic channel conversions\n" +" --disable-format disable automatic format conversions\n" +" --disable-softvol disable software volume control (softvol)\n" +" --test-position test ring buffer position\n" +" --test-coef=#\t test coeficient for ring buffer position (default 8)\n" +" expression for validation is: coef * (buffer_size / " +"2)\n" +" --test-nowait do not wait for ring buffer - eats whole CPU\n" +" --max-file-time=# start another output file when the old file has " +"recorded\n" +" for this many seconds\n" +" --process-id-file write the process ID here\n" +" --use-strftime apply the strftime facility to the output file name\n" +msgstr "" +"Verwendung: %s [Option]... [Datei]...\n" +"\n" +"-h, --help Hilfe\n" +" --version Version anzeigen\n" +"-l, --list-devices alle Soundkarten und -Geräte auflisten\n" +"-L, --list-pcms ALSA-Gerätenamen auflisten\n" +"-D, --device=NAME PCM-Gerät wählen\n" +"-q, --quiet weniger Programmausgaben\n" +"-t, --file-type TYP Dateityp (voc, wav, raw oder au)\n" +"-c, --channels=# Kanäle\n" +"-f, --format=FORMAT Sample-Format\n" +"-r, --rate=# Sample-Rate\n" +"-d, --duration=# Beenden nach # Sekunden\n" +"-M, --mmap mmap-Modus\n" +"-N, --nonblock nonblocking-Modus\n" +"-F, --period-time=# Abstand zwischen Interrupts ist # µs\n" +"-B, --buffer-time=# Puffer-Länge ist # µs\n" +" --period-size=# Abstand zwischen Interrupts ist # Frames\n" +" --buffer-size=# Puffer-Länge ist # Frames\n" +"-A, --avail-min=# freier Pufferspeicher für Wakeup ist # µs\n" +"-R, --start-delay=# Puffer-Füllgrad zum automatischen PCM-Start, in µs\n" +" (wenn <= 0, freier Puffer-Speicher)\n" +"-T, --stop-delay=# Zeit vor xrun zum automatischen PCM-Stop, in µs\n" +"-v, --verbose zeige PCM-Struktur und -Konfiguration (akkumulativ)\n" +"-V, --vumeter=TYP VU-Anzeige (TYP: mono oder stereo)\n" +"-I, --separate-channels eine Datei pro Kanal\n" +" --disable-resample keine automatische Sample-Rate-Anpassung\n" +" --disable-channels keine automatische Kanal-Anzahl-Anpassung\n" +" --disable-format keine automatische Format-Anpassung\n" +" --disable-softvol kein Software-Lautstärke-Regler (softvol)\n" +" --test-position überprüfe Position im Ring-Puffer\n" +" --test-coef=# Test-Koeffizient für Positionsprüfung (Standard 8)\n" +" Formel für Prüfung ist: Koeffizient * (Puffergröße / " +"2)\n" +" --test-nowait kein Warten auf Ringpuffer; beansprucht volle CPU-" +"Leistung\n" +" --max-file-time=# erzeuge mehrere Dateien; Wechsel nach # Sekunden\n" +" --process-id-file=# schreibe Prozess-ID in diese Datei\n" +" --use-strftime formatiere Dateiname mit strftime; %%v=Dateinummer\n" + +#: aplay/aplay.c:216 speaker-test/speaker-test.c:819 +#, c-format +msgid "Recognized sample formats are:" +msgstr "Unterstützte Sample-Formate:" + +#: aplay/aplay.c:222 +#, c-format +msgid "" +"\n" +"Some of these may not be available on selected hardware\n" +msgstr "" +"\n" +"Nicht alle davon sind auf jeder Hardware verfügbar.\n" + +#: aplay/aplay.c:223 +#, c-format +msgid "The availabled format shortcuts are:\n" +msgstr "Unterstütze Format-Abkürzungen:\n" + +#: aplay/aplay.c:224 +#, c-format +msgid "-f cd (16 bit little endian, 44100, stereo)\n" +msgstr "-f cd (16 Bits, Little Endian, 44100 Hz, stereo)\n" + +#: aplay/aplay.c:225 +#, c-format +msgid "-f cdr (16 bit big endian, 44100, stereo)\n" +msgstr "-f cdr (16 Bits, Big Endian, 44100 Hz, stereo)\n" + +#: aplay/aplay.c:226 +#, c-format +msgid "-f dat (16 bit little endian, 48000, stereo)\n" +msgstr "-f dat (16 Bits, Little Endian, 48000 Hz, stereo)\n" + +#: aplay/aplay.c:240 +msgid "no soundcards found..." +msgstr "keine Soundkarten gefunden ..." + +#: aplay/aplay.c:243 +#, c-format +msgid "**** List of %s Hardware Devices ****\n" +msgstr "**** Liste der Hardware-Geräte (%s) ****\n" + +#: aplay/aplay.c:272 +#, c-format +msgid "card %i: %s [%s], device %i: %s [%s]\n" +msgstr "Karte %i: %s [%s], Gerät %i: %s [%s]\n" + +#: aplay/aplay.c:278 +#, c-format +msgid " Subdevices: %i/%i\n" +msgstr " Sub-Geräte: %i/%i\n" + +#: aplay/aplay.c:285 +#, c-format +msgid " Subdevice #%i: %s\n" +msgstr " Sub-Gerät #%i: %s\n" + +#: aplay/aplay.c:362 +#, c-format +msgid "Aborted by signal %s...\n" +msgstr "Abbruch durch Signal %s ...\n" + +#: aplay/aplay.c:473 +msgid "command should be named either arecord or aplay" +msgstr "Befehl sollte arecord oder aplay sein" + +#: aplay/aplay.c:512 +#, c-format +msgid "unrecognized file format %s" +msgstr "unbekanntes Dateiformat %s" + +#: aplay/aplay.c:519 +#, c-format +msgid "value %i for channels is invalid" +msgstr "Kanalanzahl %i ist ungültig" + +#: aplay/aplay.c:538 +#, c-format +msgid "wrong extended format '%s'" +msgstr "erweitertes Format '%s' ist ungültig" + +#: aplay/aplay.c:549 +#, c-format +msgid "bad speed value %i" +msgstr "ungültige Rate %i" + +#: aplay/aplay.c:644 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Siehe `%s --help' für mehr Informationen.\n" + +#: aplay/aplay.c:660 +#, c-format +msgid "audio open error: %s" +msgstr "Fehler beim Öffnen des Gerätes: %s" + +#: aplay/aplay.c:665 +#, c-format +msgid "info error: %s" +msgstr "Fehler beim Lesen der Geräteinformationen: %s" + +#: aplay/aplay.c:672 +#, c-format +msgid "nonblock setting error: %s" +msgstr "Fehler beim Setzen des nonblock-Modus: %s" + +#: aplay/aplay.c:682 aplay/aplay.c:806 aplay/aplay.c:1174 +msgid "not enough memory" +msgstr "nicht genug Speicher" + +#: aplay/aplay.c:706 +#, c-format +msgid "Cannot create process ID file %s: %s" +msgstr "Fehler beim Schreiben der Prozess-ID-Datei %s: %s" + +#: aplay/aplay.c:796 +#, c-format +msgid "read error (called from line %i)" +msgstr "Lesefehler (aufgerufen von Zeile %i)" + +#: aplay/aplay.c:854 +#, c-format +msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" +"unbekannte Länge des 'fmt '-Blocks (gelesen: %u, sollte mindestens %u sein)" + +#: aplay/aplay.c:864 +#, c-format +msgid "" +"unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" +"unbekannte Länge des erweiterten 'fmt '-Blocks (gelesen: %u, sollte " +"mindestens %u sein)" + +#: aplay/aplay.c:869 +msgid "wrong format tag in extensible 'fmt ' chunk" +msgstr "ungültiger Format-Wert im erweiterten 'fmt '-Block" + +#: aplay/aplay.c:876 +#, c-format +msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" +msgstr "" +"kann WAVE-Datei-Format 0x%04x nicht abspielen; ist weder PCM noch FLOAT" + +#: aplay/aplay.c:880 +#, c-format +msgid "can't play WAVE-files with %d tracks" +msgstr "kann WAVE-Datei mit %d Kanälen nicht abspielen" + +#: aplay/aplay.c:888 aplay/aplay.c:988 +#, c-format +msgid "Warning: format is changed to U8\n" +msgstr "Warnung: benutztes Format ist U8\n" + +#: aplay/aplay.c:894 +#, c-format +msgid "Warning: format is changed to S16_LE\n" +msgstr "Warnung: benutztes Format ist S16_LE\n" + +#: aplay/aplay.c:902 +#, c-format +msgid "Warning: format is changed to S24_3LE\n" +msgstr "Warnung: benutztes Format ist S24_3LE\n" + +#: aplay/aplay.c:908 +#, c-format +msgid "Warning: format is changed to S24_LE\n" +msgstr "Warnung: benutztes Format ist S24_LE\n" + +#: aplay/aplay.c:912 +#, c-format +msgid "" +" can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" +msgstr "" +"kann WAVE-Datei mit %d-Bit-Samples in %d Bytes (%d Kanäle) nicht abspielen" + +#: aplay/aplay.c:924 +#, c-format +msgid " can't play WAVE-files with sample %d bits wide" +msgstr "kann WAVE-Datei mit %d-Bit-Samples nicht abspielen" + +#: aplay/aplay.c:982 +#, c-format +msgid "Warning: format is changed to MU_LAW\n" +msgstr "Warnung: benutztes Format ist MU_LAW\n" + +#: aplay/aplay.c:994 +#, c-format +msgid "Warning: format is changed to S16_BE\n" +msgstr "Warnung: benutztes Format ist S16_BE\n" + +#: aplay/aplay.c:1007 aplay/aplay.c:1925 aplay/aplay.c:1932 aplay/aplay.c:2455 +#: aplay/aplay.c:2467 +msgid "read error" +msgstr "Lesefehler" + +#: aplay/aplay.c:1037 +msgid "Broken configuration for this PCM: no configurations available" +msgstr "" +"ungültige Konfiguration für dieses Gerät: keine unterstützte Konfiguration" + +#: aplay/aplay.c:1054 +msgid "Access type not available" +msgstr "Zugriffs-Modus nicht unterstützt" + +#: aplay/aplay.c:1059 +msgid "Sample format non available" +msgstr "Sample-Format nicht unterstützt" + +#: aplay/aplay.c:1065 +msgid "Channels count non available" +msgstr "Kanalanzahl nicht unterstützt" + +#: aplay/aplay.c:1080 +#, c-format +msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" +msgstr "" +"Warnung: Rate ist nicht exakt (angefordert: %i Hz, unterstützt: %i Hz)\n" + +#: aplay/aplay.c:1086 +#, c-format +msgid " please, try the plug plugin %s\n" +msgstr " probieren Sie bitte das plug-Plugin: %s\n" + +#: aplay/aplay.c:1123 +msgid "Unable to install hw params:" +msgstr "Fehler beim Setzen der Hardware-Parameter:" + +#: aplay/aplay.c:1130 +#, c-format +msgid "Can't use period equal to buffer size (%lu == %lu)" +msgstr "Periode gleich der Puffer-Größe wird nicht unterstützt (%lu == %lu)" + +#: aplay/aplay.c:1161 +msgid "unable to install sw params:" +msgstr "Fehler beim Setzen der Software-Parameter:" + +#: aplay/aplay.c:1192 +#, c-format +msgid "snd_pcm_mmap_begin problem: %s" +msgstr "Fehler bei snd_pcm_mmap_begin: %s" + +#: aplay/aplay.c:1215 +#, c-format +msgid "stdin O_NONBLOCK flag setup failed\n" +msgstr "Fehler beim Setzen von O_NONBLOCK in stdin\n" + +#: aplay/aplay.c:1237 +#, c-format +msgid "\rPAUSE command ignored (no hw support)\n" +msgstr "\rPause-Kommando ignoriert (keine HW-Unterstützung)\n" + +#: aplay/aplay.c:1242 +#, c-format +msgid "pause push error: %s" +msgstr "Fehler beim Pausieren: %s" + +#: aplay/aplay.c:1251 +#, c-format +msgid "pause release error: %s" +msgstr "Fehler beim Beenden der Pause: %s" + +#: aplay/aplay.c:1265 +#, c-format +msgid "" +"\r=== PAUSE === " +msgstr "" +"\r=== PAUSE === " + +#: aplay/aplay.c:1307 +#, c-format +msgid "status error: %s" +msgstr "Status-Fehler: %s" + +#: aplay/aplay.c:1317 aplay/aplay.c:1328 +#, c-format +msgid "%s!!! (at least %.3f ms long)\n" +msgstr "%s!!! (mindestens %.3f ms)\n" + +#: aplay/aplay.c:1318 aplay/aplay.c:1321 aplay/aplay.c:1329 +msgid "underrun" +msgstr "Unterlauf" + +#: aplay/aplay.c:1318 aplay/aplay.c:1329 +msgid "overrun" +msgstr "Überlauf" + +#: aplay/aplay.c:1333 +#, c-format +msgid "Status:\n" +msgstr "Status:\n" + +#: aplay/aplay.c:1337 +#, c-format +msgid "xrun: prepare error: %s" +msgstr "Unter-/Überlauf: Fehler beim Re-Initialisieren des Gerätes: %s" + +#: aplay/aplay.c:1343 +#, c-format +msgid "Status(DRAINING):\n" +msgstr "Status (DRAINING):\n" + +#: aplay/aplay.c:1347 +#, c-format +msgid "capture stream format change? attempting recover...\n" +msgstr "Format-Wechsel der Aufnahme-Daten? Versuche Wiederherstellung ...\n" + +#: aplay/aplay.c:1349 +#, c-format +msgid "xrun(DRAINING): prepare error: %s" +msgstr "XRUN (DRAINING): Fehler beim Re-Initialisieren des Gerätes: %s" + +#: aplay/aplay.c:1356 +#, c-format +msgid "Status(R/W):\n" +msgstr "Status (R/W):\n" + +#: aplay/aplay.c:1359 +#, c-format +msgid "read/write error, state = %s" +msgstr "Lese-/Schreibfehler, Status = %s" + +#: aplay/aplay.c:1369 +#, c-format +msgid "Suspended. Trying resume. " +msgstr "Ruhezustand. Versuche, aufzuwecken. " + +#: aplay/aplay.c:1374 +#, c-format +msgid "Failed. Restarting stream. " +msgstr "Fehlgeschlagen. Re-Initialisierung. " + +#: aplay/aplay.c:1376 +#, c-format +msgid "suspend: prepare error: %s" +msgstr "Ruhezustand: Fehler beim Re-Initialisieren: %s" + +#: aplay/aplay.c:1381 +#, c-format +msgid "Done.\n" +msgstr "Fertig.\n" + +#: aplay/aplay.c:1403 +#, c-format +msgid " !clip " +msgstr " !clip " + +#: aplay/aplay.c:1550 +#, c-format +msgid "Unsupported bit size %d.\n" +msgstr "%d-Bit-Samples werden nicht unterstützt.\n" + +#: aplay/aplay.c:1584 +#, c-format +msgid "Max peak (%li samples): 0x%08x " +msgstr "Höchstwert (%li Samples): 0x%08x " + +#: aplay/aplay.c:1618 +#, c-format +msgid "" +"Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = %" +"li\n" +msgstr "" +"verdächtige Puffer-Position (total %li): avail = %li, delay = %li, buffer = %" +"li\n" + +#: aplay/aplay.c:1682 +#, c-format +msgid "write error: %s" +msgstr "Schreibfehler: %s" + +#: aplay/aplay.c:1729 +#, c-format +msgid "writev error: %s" +msgstr "Vektor-Schreib-Fehler: %s" + +#: aplay/aplay.c:1773 +#, c-format +msgid "read error: %s" +msgstr "Lesefehler: %s" + +#: aplay/aplay.c:1817 +#, c-format +msgid "readv error: %s" +msgstr "Vektor-Lese-Fehler: %s" + +#: aplay/aplay.c:1865 +msgid "can't allocate buffer for silence" +msgstr "nicht genug Speicher für Stille-Block" + +#: aplay/aplay.c:1874 aplay/aplay.c:2100 aplay/aplay.c:2105 aplay/aplay.c:2152 +#: aplay/aplay.c:2161 aplay/aplay.c:2168 aplay/aplay.c:2178 aplay/aplay.c:2184 +#: aplay/aplay.c:2256 aplay/aplay.c:2286 aplay/aplay.c:2300 +msgid "write error" +msgstr "Schreibfehler" + +#: aplay/aplay.c:1887 +#, c-format +msgid "voc_pcm_flush - silence error" +msgstr "voc_pcm_flush - Fehler in set_silence" + +#: aplay/aplay.c:1890 +msgid "voc_pcm_flush error" +msgstr "Schreibfehler" + +#: aplay/aplay.c:1916 +msgid "malloc error" +msgstr "nicht genug Speicher" + +#: aplay/aplay.c:1920 +#, c-format +msgid "Playing Creative Labs Channel file '%s'...\n" +msgstr "Spiele Creative Labs Channel-Datei '%s'...\n" + +#: aplay/aplay.c:1988 aplay/aplay.c:2080 +msgid "can't play packed .voc files" +msgstr "kann komprimierte .voc-Dateien nicht abspielen" + +#: aplay/aplay.c:2040 +#, c-format +msgid "can't play loops; %s isn't seekable\n" +msgstr "" +"kann Schleife nicht abspielen; Dateiposition in %s ist nicht änderbar\n" + +#: aplay/aplay.c:2089 +#, c-format +msgid "unknown blocktype %d. terminate." +msgstr "Unbekannter Block-Typ %d. Abbruch." + +#: aplay/aplay.c:2220 +#, c-format +msgid "Wave doesn't support %s format..." +msgstr "Format %s wird in WAVE nicht unterstützt ..." + +#: aplay/aplay.c:2280 +#, c-format +msgid "Sparc Audio doesn't support %s format..." +msgstr "Format %s wird in Sparc-Audio nicht unterstützt ..." + +#: aplay/aplay.c:2361 +msgid "Playing" +msgstr "Wiedergabe:" + +#: aplay/aplay.c:2361 +msgid "Recording" +msgstr "Aufnahme:" + +#: aplay/aplay.c:2365 +#, c-format +msgid "Rate %d Hz, " +msgstr "Rate: %d Hz, " + +#: aplay/aplay.c:2367 +#, c-format +msgid "Mono" +msgstr "mono" + +#: aplay/aplay.c:2369 +#, c-format +msgid "Stereo" +msgstr "stereo" + +#: aplay/aplay.c:2371 +#, c-format +msgid "Channels %i" +msgstr "%i Kanäle" + +#: aplay/aplay.c:2882 aplay/aplay.c:2935 +#, c-format +msgid "You need to specify %d files" +msgstr "Es werden %d Dateien benötigt." + +#: seq/aconnect/aconnect.c:49 +#, c-format +msgid "aconnect - ALSA sequencer connection manager\n" +msgstr "aconnect - ALSA Sequenzer Verbindungs-Manager\n" + +#: seq/aconnect/aconnect.c:50 +#, c-format +msgid "Copyright (C) 1999-2000 Takashi Iwai\n" +msgstr "Copyright © 1999-2000 Takashi Iwai\n" + +#: seq/aconnect/aconnect.c:51 +#, c-format +msgid "Usage:\n" +msgstr "Verwendung:\n" + +#: seq/aconnect/aconnect.c:52 +#, c-format +msgid " * Connection/disconnection between two ports\n" +msgstr " * Verbindung zwischen zwei Ports herstellen/trennen\n" + +#: seq/aconnect/aconnect.c:53 +#, c-format +msgid " aconnect [-options] sender receiver\n" +msgstr " aconnect [Optionen] Sender Empfänger\n" + +#: seq/aconnect/aconnect.c:54 +#, c-format +msgid " sender, receiver = client:port pair\n" +msgstr " Sender, Empfänger = Client:Port\n" + +#: seq/aconnect/aconnect.c:55 +#, c-format +msgid " -d,--disconnect disconnect\n" +msgstr " -d,--disconnect Verbindung trennen\n" + +#: seq/aconnect/aconnect.c:56 +#, c-format +msgid " -e,--exclusive exclusive connection\n" +msgstr " -e,--exclusive exklusive Verbindung\n" + +#: seq/aconnect/aconnect.c:57 +#, c-format +msgid " -r,--real # convert real-time-stamp on queue\n" +msgstr " -r,--real # benutze Zeitstempel der Queue #\n" + +#: seq/aconnect/aconnect.c:58 +#, c-format +msgid " -t,--tick # convert tick-time-stamp on queue\n" +msgstr " -t,--tick # benutze Tick-Zeitstempel der Queue #\n" + +#: seq/aconnect/aconnect.c:59 +#, c-format +msgid " * List connected ports (no subscription action)\n" +msgstr " * Ports und Verbindungen auflisten\n" + +#: seq/aconnect/aconnect.c:60 +#, c-format +msgid " aconnect -i|-o [-options]\n" +msgstr " aconnect -i|-o [Optionen]\n" + +#: seq/aconnect/aconnect.c:61 +#, c-format +msgid " -i,--input list input (readable) ports\n" +msgstr " -i,--input Eingabe-Ports (lesbar) auflisten\n" + +#: seq/aconnect/aconnect.c:62 +#, c-format +msgid " -o,--output list output (writable) ports\n" +msgstr " -o,--output Ausgabe-Ports (schreibbar) auflisten\n" + +#: seq/aconnect/aconnect.c:63 +#, c-format +msgid " -l,--list list current connections of each port\n" +msgstr " -l,--list Verbindungen der Ports auflisten\n" + +#: seq/aconnect/aconnect.c:64 +#, c-format +msgid " * Remove all exported connections\n" +msgstr " * alle Verbindungen trennen\n" + +#: seq/aconnect/aconnect.c:65 +#, c-format +msgid " -x, --removeall\n" +msgstr " -x,--removeall\n" + +#: seq/aconnect/aconnect.c:132 +msgid "Connecting To" +msgstr "verbunden zu" + +#: seq/aconnect/aconnect.c:133 +msgid "Connected From" +msgstr "verbunden von" + +#: seq/aconnect/aconnect.c:169 +#, c-format +msgid "client %d: '%s' [type=%s]\n" +msgstr "Client %d: '%s' [Typ=%s]\n" + +#: seq/aconnect/aconnect.c:173 +msgid "user" +msgstr "User" + +#: seq/aconnect/aconnect.c:173 +msgid "kernel" +msgstr "Kernel" + +#: seq/aconnect/aconnect.c:307 +#, c-format +msgid "can't open sequencer\n" +msgstr "Fehler beim Öffnen des Sequenzers\n" + +#: seq/aconnect/aconnect.c:335 +#, c-format +msgid "can't get client id\n" +msgstr "Fehler beim Lesen der Client-ID\n" + +#: seq/aconnect/aconnect.c:342 +#, c-format +msgid "can't set client info\n" +msgstr "Fehler beim Setzen des Client-Namens\n" + +#: seq/aconnect/aconnect.c:349 +#, c-format +msgid "invalid sender address %s\n" +msgstr "ungültige Sender-Adresse %s\n" + +#: seq/aconnect/aconnect.c:354 seq/aseqnet/aseqnet.c:290 +#, c-format +msgid "invalid destination address %s\n" +msgstr "ungültige Ziel-Adresse %s\n" + +#: seq/aconnect/aconnect.c:368 +#, c-format +msgid "No subscription is found\n" +msgstr "keine Verbindung gefunden\n" + +#: seq/aconnect/aconnect.c:373 +#, c-format +msgid "Disconnection failed (%s)\n" +msgstr "Verbindungs-Trennung fehlgeschlagen (%s)\n" + +#: seq/aconnect/aconnect.c:379 +#, c-format +msgid "Connection is already subscribed\n" +msgstr "Verbindung ist bereits vorhanden\n" + +#: seq/aconnect/aconnect.c:384 +#, c-format +msgid "Connection failed (%s)\n" +msgstr "Verbindung fehlgeschlagen (%s)\n" + +#: seq/aseqnet/aseqnet.c:164 +#, c-format +msgid "aseqnet - network client/server on ALSA sequencer\n" +msgstr "aseqnet - Netzwerk-Client/Server für ALSA Sequenzer\n" + +#: seq/aseqnet/aseqnet.c:165 +#, c-format +msgid " Copyright (C) 1999 Takashi Iwai\n" +msgstr " Copyright © 1999 Takashi Iwai\n" + +#: seq/aseqnet/aseqnet.c:166 +#, c-format +msgid "usage:\n" +msgstr "Verwendung:\n" + +#: seq/aseqnet/aseqnet.c:167 +#, c-format +msgid " server mode: aseqnet [-options]\n" +msgstr " Server-Modus: aseqnet [Optionen]\n" + +#: seq/aseqnet/aseqnet.c:168 +#, c-format +msgid " client mode: aseqnet [-options] server_host\n" +msgstr " Client-Modus: aseqnet [Optionen] ServerHost\n" + +#: seq/aseqnet/aseqnet.c:169 +#, c-format +msgid "options:\n" +msgstr "Optionen:\n" + +#: seq/aseqnet/aseqnet.c:170 +#, c-format +msgid " -p,--port # : sepcify TCP port (digit or service name)\n" +msgstr " -p,--port # : TCP-Port (Zahl oder Service-Name)\n" + +#: seq/aseqnet/aseqnet.c:171 +#, c-format +msgid " -s,--source addr : read from given addr (client:port)\n" +msgstr " -s,--source # : lese von Sequenzer-Port (Client:Port)\n" + +#: seq/aseqnet/aseqnet.c:172 +#, c-format +msgid " -d,--dest addr : write to given addr (client:port)\n" +msgstr " -d,--dest # : schreibe auf Sequenzer-Port (Client:Port)\n" + +#: seq/aseqnet/aseqnet.c:173 +#, c-format +msgid " -v, --verbose : print verbose messages\n" +msgstr " -v,--verbose : ausführliche Meldungen\n" + +#: seq/aseqnet/aseqnet.c:174 +#, c-format +msgid " -i, --info : print certain received events\n" +msgstr " -i,--info : Ausgabe bestimmter empfangener Ereignisse\n" + +#: seq/aseqnet/aseqnet.c:188 +#, c-format +msgid "can't malloc\n" +msgstr "nicht genug Speicher\n" + +#: seq/aseqnet/aseqnet.c:213 +#, c-format +msgid "closing files..\n" +msgstr "schließe Dateien ...\n" + +#: seq/aseqnet/aseqnet.c:272 +#, c-format +msgid "sequencer opened: %d:%d\n" +msgstr "Sequenzer geöffnet: %d:%d\n" + +#: seq/aseqnet/aseqnet.c:279 +#, c-format +msgid "invalid source address %s\n" +msgstr "ungültige Quell-Adresse %s\n" + +#: seq/aseqnet/aseqnet.c:309 +#, c-format +msgid "service '%s' is not found in /etc/services\n" +msgstr "Service '%s' in /etc/services nicht gefunden\n" + +#: seq/aseqnet/aseqnet.c:377 +#, c-format +msgid "too many connections!\n" +msgstr "zu viele Verbindungen\n" + +#: seq/aseqnet/aseqnet.c:388 +#, c-format +msgid "accepted[%d]\n" +msgstr "angenommen[%d]\n" + +#: seq/aseqnet/aseqnet.c:411 +#, c-format +msgid "can't get address %s\n" +msgstr "kann Adresse für %s nicht bestimmen\n" + +#: seq/aseqnet/aseqnet.c:422 +#, c-format +msgid "ok.. connected\n" +msgstr "OK ... verbunden\n" + +#: seq/aseqnet/aseqnet.c:518 +#, c-format +msgid "Channel %2d: Control event : %5d\n" +msgstr "Channel %2d: Control event : %5d\n" + +#: seq/aseqnet/aseqnet.c:522 +#, c-format +msgid "Channel %2d: Pitchbender : %5d\n" +msgstr "Channel %2d: Pitchbender : %5d\n" + +#: seq/aseqnet/aseqnet.c:526 +#, c-format +msgid "Channel %2d: Note On event : %5d\n" +msgstr "Channel %2d: Note On evenet : %5d\n" + +#: seq/aseqnet/aseqnet.c:530 +#, c-format +msgid "Channel %2d: Note Off event: %5d\n" +msgstr "Channel %2d: Note Off event: %5d\n" + +#: seq/aseqnet/aseqnet.c:585 +#, c-format +msgid "disconnected\n" +msgstr "Verbindung getrennt\n" + +#: speaker-test/speaker-test.c:104 +msgid "Front Left" +msgstr "Vorne links" + +#: speaker-test/speaker-test.c:105 +msgid "Front Right" +msgstr "Vorne rechts" + +#: speaker-test/speaker-test.c:106 +msgid "Rear Left" +msgstr "Hinten links" + +#: speaker-test/speaker-test.c:107 +msgid "Rear Right" +msgstr "Hinten rechts" + +#: speaker-test/speaker-test.c:109 +msgid "LFE" +msgstr "Bass" + +#: speaker-test/speaker-test.c:110 +msgid "Side Left" +msgstr "Seitlich links" + +#: speaker-test/speaker-test.c:111 +msgid "Side Right" +msgstr "Seitlich rechts" + +#: speaker-test/speaker-test.c:112 +msgid "Channel 9" +msgstr "Kanal 9" + +#: speaker-test/speaker-test.c:113 +msgid "Channel 10" +msgstr "Kanal 10" + +#: speaker-test/speaker-test.c:114 +msgid "Channel 11" +msgstr "Kanal 11" + +#: speaker-test/speaker-test.c:115 +msgid "Channel 12" +msgstr "Kanal 12" + +#: speaker-test/speaker-test.c:116 +msgid "Channel 13" +msgstr "Kanal 13" + +#: speaker-test/speaker-test.c:117 +msgid "Channel 14" +msgstr "Kanal 14" + +#: speaker-test/speaker-test.c:118 +msgid "Channel 15" +msgstr "Kanal 15" + +#: speaker-test/speaker-test.c:119 +msgid "Channel 16" +msgstr "Kanal 16" + +#: speaker-test/speaker-test.c:383 +#, c-format +msgid "Broken configuration for playback: no configurations available: %s\n" +msgstr "Ungültige Konfiguration: keine unterstützte Konfiguration: %s\n" + +#: speaker-test/speaker-test.c:390 +#, c-format +msgid "Access type not available for playback: %s\n" +msgstr "Zugriffsmodus nicht unterstützt: %s\n" + +#: speaker-test/speaker-test.c:397 +#, c-format +msgid "Sample format not available for playback: %s\n" +msgstr "Sample-Format nicht unterstützt: %s\n" + +#: speaker-test/speaker-test.c:404 +#, c-format +msgid "Channels count (%i) not available for playbacks: %s\n" +msgstr "Kanal-Anzahl %i nicht unterstützt: %s\n" + +#: speaker-test/speaker-test.c:412 +#, c-format +msgid "Rate %iHz not available for playback: %s\n" +msgstr "Rate %i Hz nicht unterstützt: %s\n" + +#: speaker-test/speaker-test.c:417 +#, c-format +msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" +msgstr "" +"Rate ist nicht exakt (angefordert: %i Hz, unterstützt: %i Hz, Fehlercode %" +"d)\n" + +#: speaker-test/speaker-test.c:421 +#, c-format +msgid "Rate set to %iHz (requested %iHz)\n" +msgstr "Rate ist %i Hz (angefordert: %i Hz)\n" + +#: speaker-test/speaker-test.c:427 +#, c-format +msgid "Buffer size range from %lu to %lu\n" +msgstr "Puffergröße von %lu bis %lu\n" + +#: speaker-test/speaker-test.c:428 +#, c-format +msgid "Period size range from %lu to %lu\n" +msgstr "Periodengröße von %lu bis %lu\n" + +#: speaker-test/speaker-test.c:430 +#, c-format +msgid "Requested period time %u us\n" +msgstr "Angeforderte Periodenzeit %u µs\n" + +#: speaker-test/speaker-test.c:433 +#, c-format +msgid "Unable to set period time %u us for playback: %s\n" +msgstr "Fehler beim Setzen der Periodenzeit %u µs: %s\n" + +#: speaker-test/speaker-test.c:439 +#, c-format +msgid "Requested buffer time %u us\n" +msgstr "Angeforderte Pufferlänge %u µs\n" + +#: speaker-test/speaker-test.c:442 +#, c-format +msgid "Unable to set buffer time %u us for playback: %s\n" +msgstr "Fehler beim Setzen der Pufferlänge %u µs: %s\n" + +#: speaker-test/speaker-test.c:451 +#, c-format +msgid "Using max buffer size %lu\n" +msgstr "Verwende maximale Puffergröße %lu\n" + +#: speaker-test/speaker-test.c:454 +#, c-format +msgid "Unable to set buffer size %lu for playback: %s\n" +msgstr "Fehler beim Setzen der Puffergröße %lu: %s\n" + +#: speaker-test/speaker-test.c:460 +#, c-format +msgid "Periods = %u\n" +msgstr "Perioden = %u\n" + +#: speaker-test/speaker-test.c:463 +#, c-format +msgid "Unable to set nperiods %u for playback: %s\n" +msgstr "Fehler beim Setzen der Periodenanzahl %u: %s\n" + +#: speaker-test/speaker-test.c:472 +#, c-format +msgid "Unable to set hw params for playback: %s\n" +msgstr "Fehler beim Setzen der Hardware-Parameter: %s\n" + +#: speaker-test/speaker-test.c:478 +#, c-format +msgid "was set period_size = %lu\n" +msgstr "gesetzt: period_size = %lu\n" + +#: speaker-test/speaker-test.c:479 +#, c-format +msgid "was set buffer_size = %lu\n" +msgstr "gesetzt: buffer_size = %lu\n" + +#: speaker-test/speaker-test.c:481 +#, c-format +msgid "buffer to small, could not use\n" +msgstr "Puffer zu klein, kann nicht benutzt werden\n" + +#: speaker-test/speaker-test.c:494 +#, c-format +msgid "Unable to determine current swparams for playback: %s\n" +msgstr "Fehler beim Lesen der Software-Parameter: %s\n" + +#: speaker-test/speaker-test.c:501 +#, c-format +msgid "Unable to set start threshold mode for playback: %s\n" +msgstr "Fehler beim Setzen des Start-Schwellenwertes: %s\n" + +#: speaker-test/speaker-test.c:508 +#, c-format +msgid "Unable to set avail min for playback: %s\n" +msgstr "Fehler beim Setzen des Mindest-verfügbar-Wertes: %s\n" + +#: speaker-test/speaker-test.c:515 +#, c-format +msgid "Unable to set sw params for playback: %s\n" +msgstr "Fehler beim Setzen der Software-Parameter: %s\n" + +#: speaker-test/speaker-test.c:530 +#, c-format +msgid "Can't recovery from underrun, prepare failed: %s\n" +msgstr "" +"Fehler bei Unterlauf-Behandlung, Re-Initialisierung fehlgeschlagen: %s\n" + +#: speaker-test/speaker-test.c:541 +#, c-format +msgid "Can't recovery from suspend, prepare failed: %s\n" +msgstr "" +"Fehler beim Aufwachen aus dem Ruhezustand, Re-Initialisierung " +"fehlgeschlagen: %s\n" + +#: speaker-test/speaker-test.c:605 speaker-test/speaker-test.c:1025 +#, c-format +msgid "No enough memory\n" +msgstr "Nicht genug Speicher\n" + +#: speaker-test/speaker-test.c:610 +#, c-format +msgid "Cannot open WAV file %s\n" +msgstr "Kann WAV-Datei %s nicht öffnen\n" + +#: speaker-test/speaker-test.c:614 speaker-test/speaker-test.c:643 +#, c-format +msgid "Invalid WAV file %s\n" +msgstr "Ungültige WAV-Datei %s\n" + +#: speaker-test/speaker-test.c:619 +#, c-format +msgid "Not a WAV file: %s\n" +msgstr "Keine WAV-Datei: %s\n" + +#: speaker-test/speaker-test.c:623 +#, c-format +msgid "Unsupported WAV format %d for %s\n" +msgstr "Nicht unterstütztes WAV-Format %d in %s\n" + +#: speaker-test/speaker-test.c:628 +#, c-format +msgid "%s is not a mono stream (%d channels)\n" +msgstr "%s ist keine Mono-Datei (%d Kanäle)\n" + +#: speaker-test/speaker-test.c:633 +#, c-format +msgid "Sample rate doesn't match (%d) for %s\n" +msgstr "Sample-Rate (%d) stimmt nicht überein in %s\n" + +#: speaker-test/speaker-test.c:638 +#, c-format +msgid "Unsupported sample format bits %d for %s\n" +msgstr "Nicht unterstütztes Sample-Format mit %d Bits in %s\n" + +#: speaker-test/speaker-test.c:688 +#, c-format +msgid "Undefined channel %d\n" +msgstr "Kanal %d nicht definiert\n" + +#: speaker-test/speaker-test.c:739 +#, c-format +msgid "Write error: %d,%s\n" +msgstr "Schreibfehler: %d, %s\n" + +#: speaker-test/speaker-test.c:741 +#, c-format +msgid "xrun_recovery failed: %d,%s\n" +msgstr "xrun_recovery fehlgeschlagen: %d, %s\n" + +#: speaker-test/speaker-test.c:803 +#, c-format +msgid "" +"Usage: speaker-test [OPTION]... \n" +"-h,--help\thelp\n" +"-D,--device\tplayback device\n" +"-r,--rate\tstream rate in Hz\n" +"-c,--channels\tcount of channels in stream\n" +"-f,--frequency\tsine wave frequency in Hz\n" +"-F,--format\tsample format\n" +"-b,--buffer\tring buffer size in us\n" +"-p,--period\tperiod size in us\n" +"-P,--nperiods\tnumber of periods\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +"-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +"-w,--wavfile\tUse the given WAV file as a test sound\n" +"-W,--wavdir\tSpecify the directory containing WAV files\n" +"\n" +msgstr "" +"Verwendung: speaker-test [Option]...\n" +"-h,--help Hilfe\n" +"-D,--device Wiedergabe-Gerät\n" +"-r,--rate Sample-Rate in Hz\n" +"-c,--channels Anzahl der Kanäle\n" +"-f,--frequency Frequenz der Sinuswelle in Hz\n" +"-F,--format Sample-Format\n" +"-b,--buffer Ringpufferlänge in µs\n" +"-p,--period Periodenlänge in µs\n" +"-P,--nperiods Anzahl der Perioden\n" +"-t,--test pink=rosa Rauschen, sine=Sinuswelle, wav=WAV-Datei\n" +"-l,--nloops Anzahl der Wiederholungen, 0 = unendlich\n" +"-s,--speaker teste einen einzelnen Lautsprecher; 1=links, 2=rechts, usw.\n" +"-w,--wavfile benutze WAV-Datei als Testton\n" +"-W,--wavdir benutze Verzeichnis mit darin enthaltenen WAV-Dateien\n" +"\n" + +#: speaker-test/speaker-test.c:921 +#, c-format +msgid "Invalid number of periods %d\n" +msgstr "Ungültige Periodenanzahl %d\n" + +#: speaker-test/speaker-test.c:937 speaker-test/speaker-test.c:941 +#, c-format +msgid "Invalid test type %s\n" +msgstr "Ungültiger Test-Typ %s\n" + +#: speaker-test/speaker-test.c:953 +#, c-format +msgid "Invalid parameter for -s option.\n" +msgstr "Ungültiger Wert für Option -s\n" + +#: speaker-test/speaker-test.c:967 +#, c-format +msgid "Unknown option '%c'\n" +msgstr "Unbekannte Options '%c'\n" + +#: speaker-test/speaker-test.c:981 +#, c-format +msgid "Playback device is %s\n" +msgstr "Wiedergabe-Gerät ist %s\n" + +#: speaker-test/speaker-test.c:982 +#, c-format +msgid "Stream parameters are %iHz, %s, %i channels\n" +msgstr "Stream-Parameter sind %i Hz, %s, %i Kanäle\n" + +#: speaker-test/speaker-test.c:985 +#, c-format +msgid "Using 16 octaves of pink noise\n" +msgstr "Verwende 16 Oktaven rosa Rauschen\n" + +#: speaker-test/speaker-test.c:988 +#, c-format +msgid "Sine wave rate is %.4fHz\n" +msgstr "Sinuswelle mit Frequenz %.4f Hz\n" + +#: speaker-test/speaker-test.c:991 +#, c-format +msgid "WAV file(s)\n" +msgstr "WAV-Datei(en)\n" + +#: speaker-test/speaker-test.c:997 +#, c-format +msgid "Playback open error: %d,%s\n" +msgstr "Fehler beim Öffnen des Gerätes: %d, %s\n" + +#: speaker-test/speaker-test.c:1002 +#, c-format +msgid "Setting of hwparams failed: %s\n" +msgstr "Fehler beim Setzen der Hardware-Parameter: %s\n" + +#: speaker-test/speaker-test.c:1007 +#, c-format +msgid "Setting of swparams failed: %s\n" +msgstr "Fehler beim Setzen der Software-Parameter: %s\n" + +#: speaker-test/speaker-test.c:1056 speaker-test/speaker-test.c:1078 +#, c-format +msgid "Transfer failed: %s\n" +msgstr "Schreibfehler: %s\n" + +#: speaker-test/speaker-test.c:1066 +#, c-format +msgid "Time per period = %lf\n" +msgstr "Zeit pro Periode = %lf\n" diff --git a/po/en@boldquot.header b/po/en@boldquot.header new file mode 100644 index 0000000..fedb6a0 --- /dev/null +++ b/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/po/en@quot.header b/po/en@quot.header new file mode 100644 index 0000000..a9647fc --- /dev/null +++ b/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/po/fr.gmo b/po/fr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f170f630123b5b4e4eaf06ad6c384ac3aaa5f0c3 GIT binary patch literal 30067 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, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: alsa-utils 1.0.23\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-01-31 15:27+0100\n" +"PO-Revision-Date: 2011-01-07 06:23+0100\n" +"Last-Translator: Christoph J. Thompson \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +msgid "Sound Card" +msgstr "Carte Son" + +#: alsamixer/card_select.c:181 +msgid "(default)" +msgstr "(par défaut)" + +#: alsamixer/card_select.c:191 +msgid "cannot enumerate sound cards" +msgstr "les cartes son n'ont pas pu être énumérées" + +#: alsamixer/card_select.c:215 +msgid "enter device name..." +msgstr "entrez le nom du périphérique..." + +#: alsamixer/cli.c:40 +msgid "Usage: alsamixer [options]" +msgstr "Utilisation: alsamixer [options]" + +#: alsamixer/cli.c:41 +msgid "" +"Useful options:\n" +" -h, --help this help\n" +" -c, --card=NUMBER sound card number or id\n" +" -D, --device=NAME mixer device name\n" +" -V, --view=MODE starting view mode: playback/capture/all" +msgstr "" +"Options utiles:\n" +" -h, --help cette aide\n" +" -c, --card=NUMÉRO numéro ou identifiant de la carte son\n" +" -D, --device=NOM nom du périphérique de mixage\n" +" -V, --view=MODE mode de visualisation par défaut: lecture/capture/tous" + +#: alsamixer/cli.c:46 +msgid "" +"Debugging options:\n" +" -g, --no-color toggle using of colors\n" +" -a, --abstraction=NAME mixer abstraction level: none/basic" +msgstr "" +"Options de débogage:\n" +" -g, --no-color supprimer la couleur\n" +" -a, --abstraction=NOM niveau d'abstraction du mixeur: aucun/basique" + +#: alsamixer/cli.c:77 +#, c-format +msgid "invalid card index: %s\n" +msgstr "index de carte invalide: %s\n" + +#: alsamixer/cli.c:103 +#, c-format +msgid "unknown abstraction level: %s\n" +msgstr "niveau d'abstraction inconnu: %s\n" + +#: alsamixer/cli.c:108 +#, c-format +msgid "unknown option: %c\n" +msgstr "option inconnue: %c\n" + +#: alsamixer/cli.c:110 +msgid "try `alsamixer --help' for more information\n" +msgstr "essayez `alsamixer --help' pour plus d'information\n" + +#: alsamixer/device_name.c:177 +msgid "Device name:" +msgstr "Nom du périphérique:" + +#: alsamixer/die.c:37 +#, c-format +msgid "%s: %s\n" +msgstr "%s: %s\n" + +#: alsamixer/mixer_display.c:98 +msgid "Card:" +msgstr "Carte:" + +#: alsamixer/mixer_display.c:99 +msgid "Chip:" +msgstr "Puce:" + +#: alsamixer/mixer_display.c:100 +msgid "View:" +msgstr "Vue:" + +#: alsamixer/mixer_display.c:101 +msgid "Item:" +msgstr "Contrôle:" + +#: alsamixer/mixer_display.c:104 +msgid "F1: Help" +msgstr "F1: Aide" + +#: alsamixer/mixer_display.c:105 +msgid "F2: System information" +msgstr "F2: Informations Système" + +#: alsamixer/mixer_display.c:106 +msgid "F6: Select sound card" +msgstr "F6: Choisir la carte son" + +#: alsamixer/mixer_display.c:107 +msgid "Esc: Exit" +msgstr "Esc: Quitter" + +#: alsamixer/mixer_display.c:174 +msgid "(unplugged)" +msgstr "(non branché)" + +#: alsamixer/mixer_display.c:192 +msgid "Playback" +msgstr "Lecture" + +#: alsamixer/mixer_display.c:193 +msgid "Capture" +msgstr "Capture" + +#: alsamixer/mixer_display.c:194 +msgid "All" +msgstr "Tout" + +#: alsamixer/mixer_display.c:234 +msgid "mute" +msgstr "muet" + +#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +msgid "dB gain:" +msgstr "gain dB:" + +#: alsamixer/mixer_display.c:285 +#, c-format +msgid " [%s %s, %s]" +msgstr " [%s %s, %s]" + +#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +msgid "Off" +msgstr "Fermé" + +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +msgid "On" +msgstr "Ouvert" + +#: alsamixer/mixer_display.c:363 +msgid "The sound device was unplugged." +msgstr "Le périphérique a été débranché" + +#: alsamixer/mixer_display.c:364 +msgid "Press F6 to select another sound card." +msgstr "Appuyez sur F6 pour choisir une autre carte son." + +#: alsamixer/mixer_display.c:379 +msgid "This sound device does not have any playback controls." +msgstr "Ce périphérique n'a pas de commandes de lecture." + +#: alsamixer/mixer_display.c:381 +msgid "This sound device does not have any capture controls." +msgstr "Ce périphérique n'a pas de commandes de capture." + +#: alsamixer/mixer_display.c:383 +msgid "This sound device does not have any controls." +msgstr "Ce périphérique n'a pas de commandes." + +#. TRANSLATORS: playback on; one character +#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +msgid "O" +msgstr "O" + +#. TRANSLATORS: playback muted; one character +#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +msgid "M" +msgstr "M" + +#. TRANSLATORS: "left"; no more than two characters +#: alsamixer/mixer_display.c:536 +msgid "L" +msgstr "G" + +#. TRANSLATORS: "right"; no more than two characters +#: alsamixer/mixer_display.c:540 +msgid "R" +msgstr "D" + +#. TRANSLATORS: no more than eight characters +#: alsamixer/mixer_display.c:542 +msgid "CAPTURE" +msgstr "CAPTURE" + +#: alsamixer/mixer_display.c:592 +msgid "Front" +msgstr "Avant" + +#: alsamixer/mixer_display.c:595 +msgid "Rear" +msgstr "Arrière" + +#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:108 +msgid "Center" +msgstr "Centre" + +#: alsamixer/mixer_display.c:601 +msgid "Woofer" +msgstr "Basses" + +#: alsamixer/mixer_display.c:604 +msgid "Side" +msgstr "Côté" + +#: alsamixer/mixer_widget.c:84 alsamixer/mixer_widget.c:89 +msgid "cannot open mixer" +msgstr "le mixeur ne peut pas être ouvert" + +#: alsamixer/mixer_widget.c:95 alsamixer/mixer_widget.c:172 +msgid "cannot load mixer controls" +msgstr "les commandes de mixage ne peuvent pas être chargés" + +#: alsamixer/mixer_widget.c:162 +#, c-format +msgid "Cannot open mixer device '%s'." +msgstr "Le périphérique de mixage '%s' ne peut pas être ouvert." + +#: alsamixer/mixer_widget.c:183 +msgid "Esc Exit" +msgstr "Esc Quitter" + +#: alsamixer/mixer_widget.c:184 +msgid "F1 ? H Help" +msgstr "F1 ? H Aide" + +#: alsamixer/mixer_widget.c:185 +msgid "F2 / System information" +msgstr "F2 / Informations système" + +#: alsamixer/mixer_widget.c:186 +msgid "F3 Show playback controls" +msgstr "F3 Afficher les commandes de lecture" + +#: alsamixer/mixer_widget.c:187 +msgid "F4 Show capture controls" +msgstr "F4 Afficher les commandes de capture" + +#: alsamixer/mixer_widget.c:188 +msgid "F5 Show all controls" +msgstr "F5 Afficher toutes les commandes" + +#: alsamixer/mixer_widget.c:189 +msgid "Tab Toggle view mode (F3/F4/F5)" +msgstr "Tab Choisir le mode de visualisation (F3/F4/F5)" + +#: alsamixer/mixer_widget.c:190 +msgid "F6 S Select sound card" +msgstr "F6 S Choisir la carte son" + +#: alsamixer/mixer_widget.c:191 +msgid "L Redraw screen" +msgstr "L Actualiser l'écran" + +#: alsamixer/mixer_widget.c:193 +msgid "Left Move to the previous control" +msgstr "Gauche Aller à la commande précédente" + +#: alsamixer/mixer_widget.c:194 +msgid "Right Move to the next control" +msgstr "Droite Aller à la commande suivante" + +#: alsamixer/mixer_widget.c:196 +msgid "Up/Down Change volume" +msgstr "Haut/Bas Ajuster le volume" + +#: alsamixer/mixer_widget.c:197 +msgid "+ - Change volume" +msgstr "+ - Ajuster le volume" + +#: alsamixer/mixer_widget.c:198 +msgid "Page Up/Dn Change volume in big steps" +msgstr "Page Préc./Suiv. Ajuster le volume en grandes intervalles" + +#: alsamixer/mixer_widget.c:199 +msgid "End Set volume to 0%" +msgstr "Fin Couper le volume" + +#: alsamixer/mixer_widget.c:200 +msgid "0-9 Set volume to 0%-90%" +msgstr "0-9 Ajuster le volume entre 0 et 90%" + +#: alsamixer/mixer_widget.c:201 +msgid "Q W E Increase left/both/right volumes" +msgstr "Q W E Augmenter les volumes de gauche/centre/droite" + +#. TRANSLATORS: or Y instead of Z +#: alsamixer/mixer_widget.c:203 +msgid "Z X C Decrease left/both/right volumes" +msgstr "Z X C Baisser les volumes de gauche/centre/droite" + +#: alsamixer/mixer_widget.c:204 +msgid "B Balance left and right volumes" +msgstr "B Égaliser les volumes de gauche et droite" + +#: alsamixer/mixer_widget.c:206 +msgid "M Toggle mute" +msgstr "M (Dés)activer le mode muet" + +#. TRANSLATORS: or , . +#: alsamixer/mixer_widget.c:208 +msgid "< > Toggle left/right mute" +msgstr "< > (Dés)activer le mode muet à gauche et à droite" + +#: alsamixer/mixer_widget.c:210 +msgid "Space Toggle capture" +msgstr "Espace (Dés)activer la capture" + +#. TRANSLATORS: or Insert Delete +#: alsamixer/mixer_widget.c:212 +msgid "; ' Toggle left/right capture" +msgstr "; (Dés)activer la capture à gauche et à droite" + +#: alsamixer/mixer_widget.c:214 +msgid "Authors:" +msgstr "Auteurs:" + +#: alsamixer/mixer_widget.c:215 +msgid " Tim Janik" +msgstr "" + +#: alsamixer/mixer_widget.c:216 +msgid " Jaroslav Kysela " +msgstr "" + +#: alsamixer/mixer_widget.c:217 +msgid " Clemens Ladisch " +msgstr "" + +#: alsamixer/mixer_widget.c:219 +msgid "Help" +msgstr "Aide" + +#: alsamixer/proc_files.c:103 +msgid "Select File" +msgstr "Choisir un Fichier" + +#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +msgid "Error" +msgstr "Erreur" + +#: alsamixer/textbox.c:80 +#, c-format +msgid "Cannot open file \"%s\"." +msgstr "Le fichier \"%s\" n'a pas pu être ouvert." + +#: aplay/aplay.c:152 +msgid "raw data" +msgstr "données brutes" + +#: aplay/aplay.c:153 +msgid "VOC" +msgstr "" + +#: aplay/aplay.c:155 +msgid "WAVE" +msgstr "" + +#: aplay/aplay.c:156 +msgid "Sparc Audio" +msgstr "" + +#: aplay/aplay.c:177 +#, c-format +msgid "" +"Usage: %s [OPTION]... [FILE]...\n" +"\n" +"-h, --help help\n" +" --version print current version\n" +"-l, --list-devices list all soundcards and digital audio devices\n" +"-L, --list-pcms list device names\n" +"-D, --device=NAME select PCM by name\n" +"-q, --quiet quiet mode\n" +"-t, --file-type TYPE file type (voc, wav, raw or au)\n" +"-c, --channels=# channels\n" +"-f, --format=FORMAT sample format (case insensitive)\n" +"-r, --rate=# sample rate\n" +"-d, --duration=# interrupt after # seconds\n" +"-M, --mmap mmap stream\n" +"-N, --nonblock nonblocking mode\n" +"-F, --period-time=# distance between interrupts is # microseconds\n" +"-B, --buffer-time=# buffer duration is # microseconds\n" +" --period-size=# distance between interrupts is # frames\n" +" --buffer-size=# buffer duration is # frames\n" +"-A, --avail-min=# min available space for wakeup is # microseconds\n" +"-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +" (relative to buffer size if <= 0)\n" +"-T, --stop-delay=# delay for automatic PCM stop is # microseconds from " +"xrun\n" +"-v, --verbose show PCM structure and setup (accumulative)\n" +"-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +"-I, --separate-channels one file for each channel\n" +" --disable-resample disable automatic rate resample\n" +" --disable-channels disable automatic channel conversions\n" +" --disable-format disable automatic format conversions\n" +" --disable-softvol disable software volume control (softvol)\n" +" --test-position test ring buffer position\n" +" --test-coef=#\t test coeficient for ring buffer position (default 8)\n" +" expression for validation is: coef * (buffer_size / " +"2)\n" +" --test-nowait do not wait for ring buffer - eats whole CPU\n" +" --max-file-time=# start another output file when the old file has " +"recorded\n" +" for this many seconds\n" +" --process-id-file write the process ID here\n" +" --use-strftime apply the strftime facility to the output file name\n" +msgstr "" +"Utilisation: %s [OPTION]... [FICHIER]...\n" +"\n" +"-h, --help aide\n" +" --version afficher la version du programme\n" +"-l, --list-devices afficher la listes des périphériques\n" +"-L, --list-pcms afficher la liste des noms de périphériques\n" +"-D, --device=NOM choisir le périphérique PCM par son nom\n" +"-Q, --quiet mode silencieux\n" +"-t, --file-type TYPE type de fichier (voc, wav, raw ou au)\n" +"-c, --channels=# canaux\n" +"-f, --format=FORMAT format d'échantillonage (insensible à la casse)\n" +"-r, --rate=# fréquence d'échantillonage\n" +"-d, --duration=# interrompre après # secondes\n" +"-M, --mmap charger le flux en mémoire avec mmap\n" +"-N, --nonblock mode non-bloquant\n" +"-F, --period-time=# # microsecondes entre chaque interruption\n" +"-B, --buffer-time=# la durée du tampon est de # microsecondes\n" +" --period-size=# # trames entre chaque interruption\n" +" --buffer-size=# la durée du tampon est de # trames\n" +"-A, --avail-min=# # microsecondes min. disponibles entre chaque " +"réveil\n" +"-R, --start-delay=# # microsecondes de délai avant le démarrage\n" +" automatique du périphérique PCM (relatif à la " +"taille\n" +" du tampon si <= 0)\n" +"-T, --stop-delay=# # microsecondes de délai depuis xrun avant l'arrêt\n" +" automatique du périphérique PCM \n" +"-v, --verbose afficher la structure et la configuration du\n" +" périphérique PCM (accumulatif)\n" +"-V, --vumeter=TYPE activer le VU-mètre (TYPE: mono ou stereo)\n" +"-I, --separate-channels un fichier par canal\n" +" --disable-resample désactiver le rééchantillonage de fréquence\n" +" automatique\n" +" --disable-channels désactiver les conversions automatiques de canal\n" +" --disable-format désactiver les conversions automatiques de format\n" +" --disable-softvol désactiver la commande du volume logicielle\n" +" --test-position tester la position du tampon circulaire\n" +" --test-coef=# test coefficient pour la position du tampon\n" +" circulaire (par défaut 8). L'expression pour la\n" +" validation est : coef * (taille_tampon / 2)\n" +" --test-nowait ne pas attendre le tampon circulaire - prend toutes\n" +" les resources du processeur\n" +" --max-file-time=# commencer un autre fichier de capture quand " +"l'ancien\n" +" fichier a enregistré pendant # secondes\n" +" --process-id-file écrire l'identifiant du processus ici\n" +" --use-strftime utiliser strftime pour le nom du fichier de capture\n" + +#: aplay/aplay.c:216 speaker-test/speaker-test.c:819 +#, c-format +msgid "Recognized sample formats are:" +msgstr "Les formats d'échantillonage connus sont:" + +#: aplay/aplay.c:222 +#, c-format +msgid "" +"\n" +"Some of these may not be available on selected hardware\n" +msgstr "" +"\n" +"Certains de ceux-ci ne sont peut être pas disponibles avec ce matériel\n" + +#: aplay/aplay.c:223 +#, c-format +msgid "The availabled format shortcuts are:\n" +msgstr "Les raccourcis format disponibles sont:\n" + +#: aplay/aplay.c:224 +#, c-format +msgid "-f cd (16 bit little endian, 44100, stereo)\n" +msgstr "-f cd (16 bit petit boutiste, 44100, stéréo)\n" + +#: aplay/aplay.c:225 +#, c-format +msgid "-f cdr (16 bit big endian, 44100, stereo)\n" +msgstr "-f cdr (16 bit gros boutiste, 44100, stéréo)\n" + +#: aplay/aplay.c:226 +#, c-format +msgid "-f dat (16 bit little endian, 48000, stereo)\n" +msgstr "-f dat (16 bit petit boutiste, 48000, stéréo)\n" + +#: aplay/aplay.c:240 +msgid "no soundcards found..." +msgstr "aucune carte son n'a été trouvée..." + +#: aplay/aplay.c:243 +#, c-format +msgid "**** List of %s Hardware Devices ****\n" +msgstr "**** Liste des Périphériques Matériels %s ****\n" + +#: aplay/aplay.c:272 +#, c-format +msgid "card %i: %s [%s], device %i: %s [%s]\n" +msgstr "carte %i: %s [%s], périphérique %i: %s [%s]\n" + +#: aplay/aplay.c:278 +#, c-format +msgid " Subdevices: %i/%i\n" +msgstr " Sous-périphériques: %i/%i\n" + +#: aplay/aplay.c:285 +#, c-format +msgid " Subdevice #%i: %s\n" +msgstr " Sous-périphérique #%i: %s\n" + +#: aplay/aplay.c:362 +#, c-format +msgid "Aborted by signal %s...\n" +msgstr "Interrompu par le signal %s...\n" + +#: aplay/aplay.c:473 +msgid "command should be named either arecord or aplay" +msgstr "la commande doit être nommée arecord ou aplay" + +#: aplay/aplay.c:512 +#, c-format +msgid "unrecognized file format %s" +msgstr "format de fichier inconnu %s" + +#: aplay/aplay.c:519 +#, c-format +msgid "value %i for channels is invalid" +msgstr "la valeur %i pour les canaux est incorrecte" + +#: aplay/aplay.c:538 +#, c-format +msgid "wrong extended format '%s'" +msgstr "format étendu '%s' erronné" + +#: aplay/aplay.c:549 +#, c-format +msgid "bad speed value %i" +msgstr "mauvaise valeur de vitesse %i" + +#: aplay/aplay.c:644 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Essayez `%s --help' pour plus d'informations.\n" + +#: aplay/aplay.c:660 +#, c-format +msgid "audio open error: %s" +msgstr "erreur à l'ouverture audio: %s" + +#: aplay/aplay.c:665 +#, c-format +msgid "info error: %s" +msgstr "erreur info: %s" + +#: aplay/aplay.c:672 +#, c-format +msgid "nonblock setting error: %s" +msgstr "paramètre de non-blocage erronné: %s" + +#: aplay/aplay.c:682 aplay/aplay.c:806 aplay/aplay.c:1174 +msgid "not enough memory" +msgstr "pas assez de mémoire" + +#: aplay/aplay.c:706 +#, c-format +msgid "Cannot create process ID file %s: %s" +msgstr "Le fichier de numéro de processus %s n'a pas pu être créé: %s" + +#: aplay/aplay.c:796 +#, c-format +msgid "read error (called from line %i)" +msgstr "erreur de lecture (appelé à la ligne %i)" + +#: aplay/aplay.c:854 +#, c-format +msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" +msgstr "longueur du morceau 'fmt ' inconnue (lu %u, devrait être au moins %u)" + +#: aplay/aplay.c:864 +#, c-format +msgid "" +"unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" +"longueur du morceau 'fmt ' extensible inconnue (lu %u, devrait être au moins " +"%u)" + +#: aplay/aplay.c:869 +msgid "wrong format tag in extensible 'fmt ' chunk" +msgstr "libellé de format erronné dans le morceau extensible 'fmt '" + +#: aplay/aplay.c:876 +#, c-format +msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" +msgstr "" +"Les formats de ficher WAVE 0x%04x qui ne sont pas encodés en PCM ouFLOAT ne " +"sont pas supportés" + +#: aplay/aplay.c:880 +#, c-format +msgid "can't play WAVE-files with %d tracks" +msgstr "Les fichiers WAVE avec %d pistes ne sont pas supportés" + +#: aplay/aplay.c:888 aplay/aplay.c:988 +#, c-format +msgid "Warning: format is changed to U8\n" +msgstr "Avertissement: le format est changé en U8\n" + +#: aplay/aplay.c:894 +#, c-format +msgid "Warning: format is changed to S16_LE\n" +msgstr "Avertissement: le format est changé en S16_LE\n" + +#: aplay/aplay.c:902 +#, c-format +msgid "Warning: format is changed to S24_3LE\n" +msgstr "Avertissement: le format est changé en S24_3LE\n" + +#: aplay/aplay.c:908 +#, c-format +msgid "Warning: format is changed to S24_LE\n" +msgstr "Avertissement: le format est changé en S24_LE\n" + +#: aplay/aplay.c:912 +#, c-format +msgid "" +" can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" +msgstr "" +" les fichiers WAVE échantillonés %d bits par %d octets en largeur (%d canaux)" +"ne sont pas supportés" + +#: aplay/aplay.c:924 +#, c-format +msgid " can't play WAVE-files with sample %d bits wide" +msgstr "" +" les fichiers WAVES échantillonés %d bits en largeur ne sont passupportés" + +#: aplay/aplay.c:982 +#, c-format +msgid "Warning: format is changed to MU_LAW\n" +msgstr "Avertissement: le format est changé en MU_LAW\n" + +#: aplay/aplay.c:994 +#, c-format +msgid "Warning: format is changed to S16_BE\n" +msgstr "Avertissement: le format est changé en S16_BE\n" + +#: aplay/aplay.c:1007 aplay/aplay.c:1925 aplay/aplay.c:1932 aplay/aplay.c:2455 +#: aplay/aplay.c:2467 +msgid "read error" +msgstr "erreur de lecture" + +#: aplay/aplay.c:1037 +msgid "Broken configuration for this PCM: no configurations available" +msgstr "Configuration erronée pour ce périphérique PCM: pas de configuration" + +#: aplay/aplay.c:1054 +msgid "Access type not available" +msgstr "Ce type d'accès n'est pas disponible" + +#: aplay/aplay.c:1059 +msgid "Sample format non available" +msgstr "Ce format d'échantillonage n'est pas disponible" + +#: aplay/aplay.c:1065 +msgid "Channels count non available" +msgstr "Nombre de canaux non disponible" + +#: aplay/aplay.c:1080 +#, c-format +msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" +msgstr "" +"Avertissement: la fréquence n'est pas précise (demandé = %iHz,\n" +"obtenu = %iHz)\n" + +#: aplay/aplay.c:1086 +#, c-format +msgid " please, try the plug plugin %s\n" +msgstr " veuillez essayez le greffon de branchement %s\n" + +#: aplay/aplay.c:1123 +msgid "Unable to install hw params:" +msgstr "Les paramètres matériel n'ont pas pu être installés:" + +#: aplay/aplay.c:1130 +#, c-format +msgid "Can't use period equal to buffer size (%lu == %lu)" +msgstr "" +"Une période égale à la taille du tampon (%lu == %lu) ne peut êtreutilisée" + +#: aplay/aplay.c:1161 +msgid "unable to install sw params:" +msgstr "Les paramètres logiciel n'ont pas pu être installés:" + +#: aplay/aplay.c:1192 +#, c-format +msgid "snd_pcm_mmap_begin problem: %s" +msgstr "" + +#: aplay/aplay.c:1215 +#, c-format +msgid "stdin O_NONBLOCK flag setup failed\n" +msgstr "" + +#: aplay/aplay.c:1237 +#, c-format +msgid "\rPAUSE command ignored (no hw support)\n" +msgstr "" + +#: aplay/aplay.c:1242 +#, fuzzy, c-format +msgid "pause push error: %s" +msgstr "erreur d'état: %s" + +#: aplay/aplay.c:1251 +#, fuzzy, c-format +msgid "pause release error: %s" +msgstr "suspension: prepare error: %s" + +#: aplay/aplay.c:1265 +#, c-format +msgid "" +"\r=== PAUSE === " +msgstr "" + +#: aplay/aplay.c:1307 +#, c-format +msgid "status error: %s" +msgstr "erreur d'état: %s" + +#: aplay/aplay.c:1317 aplay/aplay.c:1328 +#, c-format +msgid "%s!!! (at least %.3f ms long)\n" +msgstr "%s!!! (au moins longue de %.3f ms)\n" + +#: aplay/aplay.c:1318 aplay/aplay.c:1321 aplay/aplay.c:1329 +msgid "underrun" +msgstr "perte" + +#: aplay/aplay.c:1318 aplay/aplay.c:1329 +msgid "overrun" +msgstr "dépassement" + +#: aplay/aplay.c:1333 +#, c-format +msgid "Status:\n" +msgstr "État:\n" + +#: aplay/aplay.c:1337 +#, c-format +msgid "xrun: prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1343 +#, c-format +msgid "Status(DRAINING):\n" +msgstr "" + +#: aplay/aplay.c:1347 +#, c-format +msgid "capture stream format change? attempting recover...\n" +msgstr "" +"changement de format de flux de capture? tentative de récupération...\n" + +#: aplay/aplay.c:1349 +#, c-format +msgid "xrun(DRAINING): prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1356 +#, c-format +msgid "Status(R/W):\n" +msgstr "" + +#: aplay/aplay.c:1359 +#, c-format +msgid "read/write error, state = %s" +msgstr "erreur de lecture/écriture, état = %s" + +#: aplay/aplay.c:1369 +#, c-format +msgid "Suspended. Trying resume. " +msgstr "Suspendu. Tentative de reprise. " + +#: aplay/aplay.c:1374 +#, c-format +msgid "Failed. Restarting stream. " +msgstr "Échec. Redémarrage du flux." + +#: aplay/aplay.c:1376 +#, c-format +msgid "suspend: prepare error: %s" +msgstr "suspension: prepare error: %s" + +#: aplay/aplay.c:1381 +#, c-format +msgid "Done.\n" +msgstr "Terminé.\n" + +#: aplay/aplay.c:1403 +#, c-format +msgid " !clip " +msgstr "" + +#: aplay/aplay.c:1550 +#, c-format +msgid "Unsupported bit size %d.\n" +msgstr "%d bit(s) non supporté(s).\n" + +#: aplay/aplay.c:1584 +#, c-format +msgid "Max peak (%li samples): 0x%08x " +msgstr "Pic max. (%li échantillons): 0x%08x " + +#: aplay/aplay.c:1618 +#, c-format +msgid "" +"Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = %" +"li\n" +msgstr "" +"Position de tampon suspicieuse (total %li): dispo = %li, délai = %li, tampon " +"= %li\n" + +#: aplay/aplay.c:1682 +#, c-format +msgid "write error: %s" +msgstr "erreur en écriture: %s" + +#: aplay/aplay.c:1729 +#, c-format +msgid "writev error: %s" +msgstr "erreur de writev: %s" + +#: aplay/aplay.c:1773 +#, c-format +msgid "read error: %s" +msgstr "erreur en lecture: %s" + +#: aplay/aplay.c:1817 +#, c-format +msgid "readv error: %s" +msgstr "erreur de readv: %s" + +#: aplay/aplay.c:1865 +msgid "can't allocate buffer for silence" +msgstr "Un tampon pour silence n'a pas pu être alloué" + +#: aplay/aplay.c:1874 aplay/aplay.c:2100 aplay/aplay.c:2105 aplay/aplay.c:2152 +#: aplay/aplay.c:2161 aplay/aplay.c:2168 aplay/aplay.c:2178 aplay/aplay.c:2184 +#: aplay/aplay.c:2256 aplay/aplay.c:2286 aplay/aplay.c:2300 +msgid "write error" +msgstr "erreur en écriture" + +#: aplay/aplay.c:1887 +#, c-format +msgid "voc_pcm_flush - silence error" +msgstr "voc_pcm_flush - erreur de silence" + +#: aplay/aplay.c:1890 +msgid "voc_pcm_flush error" +msgstr "erreur voc_pcm_flush" + +#: aplay/aplay.c:1916 +msgid "malloc error" +msgstr "erreur malloc" + +#: aplay/aplay.c:1920 +#, c-format +msgid "Playing Creative Labs Channel file '%s'...\n" +msgstr "Lecture du ficher de canaux Creative Labs '%s'...\n" + +#: aplay/aplay.c:1988 aplay/aplay.c:2080 +msgid "can't play packed .voc files" +msgstr "les fichiers .voc de type 'packed' ne sont pas supportés" + +#: aplay/aplay.c:2040 +#, c-format +msgid "can't play loops; %s isn't seekable\n" +msgstr "%s n'est pas navigable; les motifs n'ont pas pu être lus\n" + +#: aplay/aplay.c:2089 +#, c-format +msgid "unknown blocktype %d. terminate." +msgstr "type de bloc %d inconnu. fin." + +#: aplay/aplay.c:2220 +#, c-format +msgid "Wave doesn't support %s format..." +msgstr "Le format wave %s n'est pas supporté..." + +#: aplay/aplay.c:2280 +#, c-format +msgid "Sparc Audio doesn't support %s format..." +msgstr "Le format %s Sparc Audio n'est pas supporté..." + +#: aplay/aplay.c:2361 +msgid "Playing" +msgstr "Lecture" + +#: aplay/aplay.c:2361 +msgid "Recording" +msgstr "Capture" + +#: aplay/aplay.c:2365 +#, c-format +msgid "Rate %d Hz, " +msgstr "Fréquence %d Hz, " + +#: aplay/aplay.c:2367 +#, c-format +msgid "Mono" +msgstr "" + +#: aplay/aplay.c:2369 +#, c-format +msgid "Stereo" +msgstr "Stéréo" + +#: aplay/aplay.c:2371 +#, c-format +msgid "Channels %i" +msgstr "%i Canaux" + +#: aplay/aplay.c:2882 aplay/aplay.c:2935 +#, c-format +msgid "You need to specify %d files" +msgstr "Vous devez spécifier %d fichiers" + +#: seq/aconnect/aconnect.c:49 +#, c-format +msgid "aconnect - ALSA sequencer connection manager\n" +msgstr "aconnect - gestionnaire de connection séquenceur ALSA\n" + +#: seq/aconnect/aconnect.c:50 +#, c-format +msgid "Copyright (C) 1999-2000 Takashi Iwai\n" +msgstr "" + +#: seq/aconnect/aconnect.c:51 +#, c-format +msgid "Usage:\n" +msgstr "Utilisation:\n" + +#: seq/aconnect/aconnect.c:52 +#, c-format +msgid " * Connection/disconnection between two ports\n" +msgstr " * Connexion/déconnexion entre deux ports\n" + +#: seq/aconnect/aconnect.c:53 +#, c-format +msgid " aconnect [-options] sender receiver\n" +msgstr " aconnect [-options] envoyeur destinataire\n" + +#: seq/aconnect/aconnect.c:54 +#, c-format +msgid " sender, receiver = client:port pair\n" +msgstr " envoyeur, destinataire = couple client:port\n" + +#: seq/aconnect/aconnect.c:55 +#, c-format +msgid " -d,--disconnect disconnect\n" +msgstr " -d,--disconnect déconnecter\n" + +#: seq/aconnect/aconnect.c:56 +#, c-format +msgid " -e,--exclusive exclusive connection\n" +msgstr " -e,--exclusive connexion exclusive\n" + +#: seq/aconnect/aconnect.c:57 +#, c-format +msgid " -r,--real # convert real-time-stamp on queue\n" +msgstr "" + +#: seq/aconnect/aconnect.c:58 +#, c-format +msgid " -t,--tick # convert tick-time-stamp on queue\n" +msgstr "" + +#: seq/aconnect/aconnect.c:59 +#, c-format +msgid " * List connected ports (no subscription action)\n" +msgstr " * Afficher la liste des ports connectés (pas de souscription)\n" + +#: seq/aconnect/aconnect.c:60 +#, c-format +msgid " aconnect -i|-o [-options]\n" +msgstr " aconnect -i|-o [-options]\n" + +#: seq/aconnect/aconnect.c:61 +#, c-format +msgid " -i,--input list input (readable) ports\n" +msgstr " -i,--input afficher la liste des ports d'entrée\n" + +#: seq/aconnect/aconnect.c:62 +#, c-format +msgid " -o,--output list output (writable) ports\n" +msgstr " -o,--output afficher la liste des ports de sortie\n" + +#: seq/aconnect/aconnect.c:63 +#, c-format +msgid " -l,--list list current connections of each port\n" +msgstr "" +" -l,--list afficher la liste des connexions en cours\n" +" sur chaque port\n" + +#: seq/aconnect/aconnect.c:64 +#, c-format +msgid " * Remove all exported connections\n" +msgstr " * Retirer toutes les connexions exportées\n" + +#: seq/aconnect/aconnect.c:65 +#, c-format +msgid " -x, --removeall\n" +msgstr " -x, --removeall\n" + +#: seq/aconnect/aconnect.c:132 +msgid "Connecting To" +msgstr "Connexion À" + +#: seq/aconnect/aconnect.c:133 +msgid "Connected From" +msgstr "Connecté Depuis" + +#: seq/aconnect/aconnect.c:169 +#, c-format +msgid "client %d: '%s' [type=%s]\n" +msgstr "client %d: '%s' [type=%s]\n" + +#: seq/aconnect/aconnect.c:173 +msgid "user" +msgstr "utilisateur" + +#: seq/aconnect/aconnect.c:173 +msgid "kernel" +msgstr "noyau" + +#: seq/aconnect/aconnect.c:307 +#, c-format +msgid "can't open sequencer\n" +msgstr "le séquenceur n'a pas pu être ouvert\n" + +#: seq/aconnect/aconnect.c:335 +#, c-format +msgid "can't get client id\n" +msgstr "l'identifiant du client n'as pas pu être obtenu\n" + +#: seq/aconnect/aconnect.c:342 +#, c-format +msgid "can't set client info\n" +msgstr "les infos du client n'ont pas pu être définies\n" + +#: seq/aconnect/aconnect.c:349 +#, c-format +msgid "invalid sender address %s\n" +msgstr "l'addresse envoyeur %s est incorrecte\n" + +#: seq/aconnect/aconnect.c:354 seq/aseqnet/aseqnet.c:290 +#, c-format +msgid "invalid destination address %s\n" +msgstr "l'addresse destinataire %s est incorrecte\n" + +#: seq/aconnect/aconnect.c:368 +#, c-format +msgid "No subscription is found\n" +msgstr "Aucune souscription trouvée\n" + +#: seq/aconnect/aconnect.c:373 +#, c-format +msgid "Disconnection failed (%s)\n" +msgstr "La déconnexion a échoué (%s)\n" + +#: seq/aconnect/aconnect.c:379 +#, c-format +msgid "Connection is already subscribed\n" +msgstr "La connexion a déjà été souscrite\n" + +#: seq/aconnect/aconnect.c:384 +#, c-format +msgid "Connection failed (%s)\n" +msgstr "Échec de connexion (%s)\n" + +#: seq/aseqnet/aseqnet.c:164 +#, c-format +msgid "aseqnet - network client/server on ALSA sequencer\n" +msgstr "aseqnet - client/serveur réseau sur le séquenceur ALSA\n" + +#: seq/aseqnet/aseqnet.c:165 +#, c-format +msgid " Copyright (C) 1999 Takashi Iwai\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:166 +#, c-format +msgid "usage:\n" +msgstr "utilisation:\n" + +#: seq/aseqnet/aseqnet.c:167 +#, c-format +msgid " server mode: aseqnet [-options]\n" +msgstr " mode serveur: aseqnet [-options]\n" + +#: seq/aseqnet/aseqnet.c:168 +#, c-format +msgid " client mode: aseqnet [-options] server_host\n" +msgstr " mode client: aseqnet [-options] hôte_serveur\n" + +#: seq/aseqnet/aseqnet.c:169 +#, c-format +msgid "options:\n" +msgstr "options:\n" + +#: seq/aseqnet/aseqnet.c:170 +#, c-format +msgid " -p,--port # : sepcify TCP port (digit or service name)\n" +msgstr " -p,--port # : spécifier le port TCP (numéro ou nom de service)\n" + +#: seq/aseqnet/aseqnet.c:171 +#, c-format +msgid " -s,--source addr : read from given addr (client:port)\n" +msgstr " -s,--source addr : lire à partir de l'addr. donnée (client:port)\n" + +#: seq/aseqnet/aseqnet.c:172 +#, c-format +msgid " -d,--dest addr : write to given addr (client:port)\n" +msgstr " -d,--dest addr : écrire à l'addr. donnée (client:port)\n" + +#: seq/aseqnet/aseqnet.c:173 +#, c-format +msgid " -v, --verbose : print verbose messages\n" +msgstr " -v, --verbose : affichage locace de messages\n" + +#: seq/aseqnet/aseqnet.c:174 +#, c-format +msgid " -i, --info : print certain received events\n" +msgstr " -i, --info : afficher certains évènements reçus\n" + +#: seq/aseqnet/aseqnet.c:188 +#, c-format +msgid "can't malloc\n" +msgstr "échec allocation mémoire (malloc)\n" + +#: seq/aseqnet/aseqnet.c:213 +#, c-format +msgid "closing files..\n" +msgstr "fermeture des fichiers...\n" + +#: seq/aseqnet/aseqnet.c:272 +#, c-format +msgid "sequencer opened: %d:%d\n" +msgstr "séquenceur ouvert: %d:%d\n" + +#: seq/aseqnet/aseqnet.c:279 +#, c-format +msgid "invalid source address %s\n" +msgstr "addresse source %s incorrecte\n" + +#: seq/aseqnet/aseqnet.c:309 +#, c-format +msgid "service '%s' is not found in /etc/services\n" +msgstr "le service '%s' n'as pas été trouvé dans /etc/services\n" + +#: seq/aseqnet/aseqnet.c:377 +#, c-format +msgid "too many connections!\n" +msgstr "trop de connexions!\n" + +#: seq/aseqnet/aseqnet.c:388 +#, c-format +msgid "accepted[%d]\n" +msgstr "accepté[%d]\n" + +#: seq/aseqnet/aseqnet.c:411 +#, c-format +msgid "can't get address %s\n" +msgstr "l'addresse %s na pas pu être obtenue\n" + +#: seq/aseqnet/aseqnet.c:422 +#, c-format +msgid "ok.. connected\n" +msgstr "ok.. connecté\n" + +#: seq/aseqnet/aseqnet.c:518 +#, c-format +msgid "Channel %2d: Control event : %5d\n" +msgstr "Canal %2d: Évènement de contrôle: %5d\n" + +#: seq/aseqnet/aseqnet.c:522 +#, c-format +msgid "Channel %2d: Pitchbender : %5d\n" +msgstr "Canal %2d: Pitchbender : %5d\n" + +#: seq/aseqnet/aseqnet.c:526 +#, c-format +msgid "Channel %2d: Note On event : %5d\n" +msgstr "Canal %2d: évènement Note On : %5d\n" + +#: seq/aseqnet/aseqnet.c:530 +#, c-format +msgid "Channel %2d: Note Off event: %5d\n" +msgstr "Canal %2d: évènement Note Off : %5d\n" + +#: seq/aseqnet/aseqnet.c:585 +#, c-format +msgid "disconnected\n" +msgstr "déconnecté\n" + +#: speaker-test/speaker-test.c:104 +msgid "Front Left" +msgstr "Avant Gauche" + +#: speaker-test/speaker-test.c:105 +msgid "Front Right" +msgstr "Avant Droit" + +#: speaker-test/speaker-test.c:106 +msgid "Rear Left" +msgstr "Arrière Gauche" + +#: speaker-test/speaker-test.c:107 +msgid "Rear Right" +msgstr "Arrière Droit" + +#: speaker-test/speaker-test.c:109 +msgid "LFE" +msgstr "" + +#: speaker-test/speaker-test.c:110 +msgid "Side Left" +msgstr "Côté Gauche" + +#: speaker-test/speaker-test.c:111 +msgid "Side Right" +msgstr "Côté Droit" + +#: speaker-test/speaker-test.c:112 +msgid "Channel 9" +msgstr "Canal 9" + +#: speaker-test/speaker-test.c:113 +msgid "Channel 10" +msgstr "Canal 10" + +#: speaker-test/speaker-test.c:114 +msgid "Channel 11" +msgstr "Canal 11" + +#: speaker-test/speaker-test.c:115 +msgid "Channel 12" +msgstr "Canal 12" + +#: speaker-test/speaker-test.c:116 +msgid "Channel 13" +msgstr "Canal 13" + +#: speaker-test/speaker-test.c:117 +msgid "Channel 14" +msgstr "Canal 14" + +#: speaker-test/speaker-test.c:118 +msgid "Channel 15" +msgstr "Canal 15" + +#: speaker-test/speaker-test.c:119 +msgid "Channel 16" +msgstr "Canal 16" + +#: speaker-test/speaker-test.c:383 +#, c-format +msgid "Broken configuration for playback: no configurations available: %s\n" +msgstr "Configuration erronée pour la lecture: pas de configuration: %s\n" + +#: speaker-test/speaker-test.c:390 +#, c-format +msgid "Access type not available for playback: %s\n" +msgstr "Le type d'accès est indisponible à la lecture: %s\n" + +#: speaker-test/speaker-test.c:397 +#, c-format +msgid "Sample format not available for playback: %s\n" +msgstr "Le format d'échantillonage est indisponible à la lecture: %s\n" + +#: speaker-test/speaker-test.c:404 +#, c-format +msgid "Channels count (%i) not available for playbacks: %s\n" +msgstr "Le nombre (%i) de canaux est indisponible à la lecture: %s\n" + +#: speaker-test/speaker-test.c:412 +#, c-format +msgid "Rate %iHz not available for playback: %s\n" +msgstr "La fréquence %iHz est indisponible à la lecture: %s\n" + +#: speaker-test/speaker-test.c:417 +#, c-format +msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" +msgstr "" +"La fréquence ne correspond pas (demandée: %iHz, obtenue %iHz, err %d)\n" + +#: speaker-test/speaker-test.c:421 +#, c-format +msgid "Rate set to %iHz (requested %iHz)\n" +msgstr "La fréquence est %iHz (demandée %iHz)\n" + +#: speaker-test/speaker-test.c:427 +#, c-format +msgid "Buffer size range from %lu to %lu\n" +msgstr "L'intervalle de la taille du tampon est de %lu à %lu\n" + +#: speaker-test/speaker-test.c:428 +#, c-format +msgid "Period size range from %lu to %lu\n" +msgstr "L'intervalle de la taille de la période est de %lu à %lu\n" + +#: speaker-test/speaker-test.c:430 +#, c-format +msgid "Requested period time %u us\n" +msgstr "Temps de période demandé %u µs\n" + +#: speaker-test/speaker-test.c:433 +#, c-format +msgid "Unable to set period time %u us for playback: %s\n" +msgstr "Le temps de période %u µs n'a pas pu être défini pour la lecture: %s\n" + +#: speaker-test/speaker-test.c:439 +#, c-format +msgid "Requested buffer time %u us\n" +msgstr "Temps tampon demandé %u µs\n" + +#: speaker-test/speaker-test.c:442 +#, c-format +msgid "Unable to set buffer time %u us for playback: %s\n" +msgstr "Le temps tampon de %u µs n'a pas pu être définie pour la lecture: %s\n" + +#: speaker-test/speaker-test.c:451 +#, c-format +msgid "Using max buffer size %lu\n" +msgstr "Taille max. de tampon %lu utilisée\n" + +#: speaker-test/speaker-test.c:454 +#, c-format +msgid "Unable to set buffer size %lu for playback: %s\n" +msgstr "La taile de tampon %lu n'a pas pu être définie pour la lecture: %s\n" + +#: speaker-test/speaker-test.c:460 +#, c-format +msgid "Periods = %u\n" +msgstr "Périodes = %u\n" + +#: speaker-test/speaker-test.c:463 +#, c-format +msgid "Unable to set nperiods %u for playback: %s\n" +msgstr "nperiods %u n'a pas pu être défini pour la lecture: %s\n" + +#: speaker-test/speaker-test.c:472 +#, c-format +msgid "Unable to set hw params for playback: %s\n" +msgstr "" +"Les paramètres matériel n'ont pas pu être définis pour la lecture: %s\n" + +#: speaker-test/speaker-test.c:478 +#, c-format +msgid "was set period_size = %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:479 +#, c-format +msgid "was set buffer_size = %lu\n" +msgstr "" + +#: speaker-test/speaker-test.c:481 +#, c-format +msgid "buffer to small, could not use\n" +msgstr "tampon trop petit, il n'a pas pu être utilisé\n" + +#: speaker-test/speaker-test.c:494 +#, c-format +msgid "Unable to determine current swparams for playback: %s\n" +msgstr "" +"Les paramètres logiciels actuels n'ont pas pu être déterminés pour la " +"lecture: %s\n" + +#: speaker-test/speaker-test.c:501 +#, c-format +msgid "Unable to set start threshold mode for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:508 +#, c-format +msgid "Unable to set avail min for playback: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:515 +#, c-format +msgid "Unable to set sw params for playback: %s\n" +msgstr "" +"Les paramètres logiciel n'ont pas pu être définis pour la lecture: %s\n" + +#: speaker-test/speaker-test.c:530 +#, c-format +msgid "Can't recovery from underrun, prepare failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:541 +#, c-format +msgid "Can't recovery from suspend, prepare failed: %s\n" +msgstr "" + +#: speaker-test/speaker-test.c:605 speaker-test/speaker-test.c:1025 +#, c-format +msgid "No enough memory\n" +msgstr "Pas assez de mémoire\n" + +#: speaker-test/speaker-test.c:610 +#, c-format +msgid "Cannot open WAV file %s\n" +msgstr "Le fichier WAV %s n'a pas pu être ouvert\n" + +#: speaker-test/speaker-test.c:614 speaker-test/speaker-test.c:643 +#, c-format +msgid "Invalid WAV file %s\n" +msgstr "Fichier WAV incorrect %s\n" + +#: speaker-test/speaker-test.c:619 +#, c-format +msgid "Not a WAV file: %s\n" +msgstr "Le fichier %s n'est pas au format WAV\n" + +#: speaker-test/speaker-test.c:623 +#, c-format +msgid "Unsupported WAV format %d for %s\n" +msgstr "Format WAV %d non supporté pour %s\n" + +#: speaker-test/speaker-test.c:628 +#, c-format +msgid "%s is not a mono stream (%d channels)\n" +msgstr "%s n'est pas un flux en mono (%d canaux)\n" + +#: speaker-test/speaker-test.c:633 +#, c-format +msgid "Sample rate doesn't match (%d) for %s\n" +msgstr "La fréquence d'échantillonage (%d) ne correspond pas à %s\n" + +#: speaker-test/speaker-test.c:638 +#, c-format +msgid "Unsupported sample format bits %d for %s\n" +msgstr "Le format d'échantillonage %d bits n'est pas supporté pour %s\n" + +#: speaker-test/speaker-test.c:688 +#, c-format +msgid "Undefined channel %d\n" +msgstr "Canal non-défini %d\n" + +#: speaker-test/speaker-test.c:739 +#, c-format +msgid "Write error: %d,%s\n" +msgstr "Erreur en écriture: %d,%s\n" + +#: speaker-test/speaker-test.c:741 +#, c-format +msgid "xrun_recovery failed: %d,%s\n" +msgstr "" + +#: speaker-test/speaker-test.c:803 +#, c-format +msgid "" +"Usage: speaker-test [OPTION]... \n" +"-h,--help\thelp\n" +"-D,--device\tplayback device\n" +"-r,--rate\tstream rate in Hz\n" +"-c,--channels\tcount of channels in stream\n" +"-f,--frequency\tsine wave frequency in Hz\n" +"-F,--format\tsample format\n" +"-b,--buffer\tring buffer size in us\n" +"-p,--period\tperiod size in us\n" +"-P,--nperiods\tnumber of periods\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +"-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +"-w,--wavfile\tUse the given WAV file as a test sound\n" +"-W,--wavdir\tSpecify the directory containing WAV files\n" +"\n" +msgstr "" +"Utilisation: speaker-test [OPTION]...\n" +"-h,--help\taide\n" +"-D,--device\tpériphérique de lecture\n" +"-r,--rate\tfréquence du flux en Hz\n" +"-c,--channels\tnombre de canaux du flux\n" +"-f,--frequency\tfréquence courbe sinus en Hz\n" +"-F,--format\tformat d'échantillonage\n" +"-b,--buffer\ttaille en µs du tampon circulaire\n" +"-p,--period\ttaille de la période en µs\n" +"-P,--nperiods\tnombre de périodes\n" +"-t,--test\tpink=pink noise, sine=courbe sinus, wav=fichier WAV\n" +"-l,--nloops\tspécifier le nombre de motifs à tester, 0 = infini\n" +"-s,--speaker\ttest sur une seule enceinte.\n" +"\t\tValeurs 1=Gauche, 2=Droite, et c.\n" +"-w,--wavfile\tUtiliser le fichier WAV spécifié pour le test\n" +"-w,--wavdir\tSpécifier le répertoire contenant les fichiers WAV\n" +"\n" + +#: speaker-test/speaker-test.c:921 +#, c-format +msgid "Invalid number of periods %d\n" +msgstr "Nombre de périodes %d incorrect\n" + +#: speaker-test/speaker-test.c:937 speaker-test/speaker-test.c:941 +#, c-format +msgid "Invalid test type %s\n" +msgstr "Type de test %s incorrect\n" + +#: speaker-test/speaker-test.c:953 +#, c-format +msgid "Invalid parameter for -s option.\n" +msgstr "Paramètre incorrect pour l'option -s.\n" + +#: speaker-test/speaker-test.c:967 +#, c-format +msgid "Unknown option '%c'\n" +msgstr "Option '%c' inconnue\n" + +#: speaker-test/speaker-test.c:981 +#, c-format +msgid "Playback device is %s\n" +msgstr "Le périphérique de lecture est %s\n" + +#: speaker-test/speaker-test.c:982 +#, c-format +msgid "Stream parameters are %iHz, %s, %i channels\n" +msgstr "Les paramètres du flux sont %iHz, %s, %i canaux\n" + +#: speaker-test/speaker-test.c:985 +#, c-format +msgid "Using 16 octaves of pink noise\n" +msgstr "Utilisation de 16 octaves de 'pink noise'\n" + +#: speaker-test/speaker-test.c:988 +#, c-format +msgid "Sine wave rate is %.4fHz\n" +msgstr "La fréquence de la courbe sinus est %.4fHz\n" + +#: speaker-test/speaker-test.c:991 +#, c-format +msgid "WAV file(s)\n" +msgstr "fichier(s) WAV\n" + +#: speaker-test/speaker-test.c:997 +#, c-format +msgid "Playback open error: %d,%s\n" +msgstr "Erreur d'ouverture à la lecture: %d,%s\n" + +#: speaker-test/speaker-test.c:1002 +#, c-format +msgid "Setting of hwparams failed: %s\n" +msgstr "Échec de la configuration des paramètres matériel: %s\n" + +#: speaker-test/speaker-test.c:1007 +#, c-format +msgid "Setting of swparams failed: %s\n" +msgstr "Échec de la configuration des paramètres logiciel: %s\n" + +#: speaker-test/speaker-test.c:1056 speaker-test/speaker-test.c:1078 +#, c-format +msgid "Transfer failed: %s\n" +msgstr "Échec du transfer: %s\n" + +#: speaker-test/speaker-test.c:1066 +#, c-format +msgid "Time per period = %lf\n" +msgstr "Temps par période = %lf\n" diff --git a/po/insert-header.sin b/po/insert-header.sin new file mode 100644 index 0000000..b26de01 --- /dev/null +++ b/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/ja.gmo b/po/ja.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b9de2f9e5e705201ba6022cdd749eedbf76f2151 GIT binary patch literal 24675 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 literal 0 HcmV?d00001 diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..88440de --- /dev/null +++ b/po/ja.po @@ -0,0 +1,1561 @@ +# Japanese translations for alsa-utils package +# alsa-utils パッケージに対する英訳. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the alsa-utils package. +# Takashi Iwai , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: alsa-utils 1.0.9a\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-01-31 15:27+0100\n" +"PO-Revision-Date: 2009-05-27 15:08+0200\n" +"Last-Translator: Takashi Iwai \n" +"Language-Team: Japanese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +msgid "Sound Card" +msgstr "サウンドカード" + +#: alsamixer/card_select.c:181 +msgid "(default)" +msgstr "(デフォルト)" + +#: alsamixer/card_select.c:191 +msgid "cannot enumerate sound cards" +msgstr "サウンドカードを検出できません" + +#: alsamixer/card_select.c:215 +msgid "enter device name..." +msgstr "デバイス名入力..." + +#: alsamixer/cli.c:40 +msgid "Usage: alsamixer [options]" +msgstr "使用法: alsamixer [オプション]" + +#: alsamixer/cli.c:41 +msgid "" +"Useful options:\n" +" -h, --help this help\n" +" -c, --card=NUMBER sound card number or id\n" +" -D, --device=NAME mixer device name\n" +" -V, --view=MODE starting view mode: playback/capture/all" +msgstr "" +"主なオプション:\n" +" -h, --help このヘルプ画面\n" +" -c, --card=番号 サウンドカード番号またはID\n" +" -D, --device=名前 ミキサーデバイス名\n" +" -V, --view=表示モード 開始時の表示モード: playback/capture/all" + +#: alsamixer/cli.c:46 +msgid "" +"Debugging options:\n" +" -g, --no-color toggle using of colors\n" +" -a, --abstraction=NAME mixer abstraction level: none/basic" +msgstr "" +"デバッグオプション:\n" +" -g, --no-color カラー/モノクロ表示\n" +" -a, --abstraction=名前 ミキサー抽象レベル: none/basic" + +#: alsamixer/cli.c:77 +#, c-format +msgid "invalid card index: %s\n" +msgstr "不正なカード番号: %s\n" + +#: alsamixer/cli.c:103 +#, c-format +msgid "unknown abstraction level: %s\n" +msgstr "未知の抽象レベル: %s\n" + +#: alsamixer/cli.c:108 +#, c-format +msgid "unknown option: %c\n" +msgstr "未知のオプション '%c'\n" + +#: alsamixer/cli.c:110 +msgid "try `alsamixer --help' for more information\n" +msgstr "より詳しい情報は「alsamixer --help」を実行してください\n" + +#: alsamixer/device_name.c:177 +msgid "Device name:" +msgstr "デバイス名:" + +#: alsamixer/die.c:37 +#, c-format +msgid "%s: %s\n" +msgstr "" + +#: alsamixer/mixer_display.c:98 +msgid "Card:" +msgstr "カード:" + +#: alsamixer/mixer_display.c:99 +msgid "Chip:" +msgstr "チップ:" + +#: alsamixer/mixer_display.c:100 +msgid "View:" +msgstr "表示:" + +#: alsamixer/mixer_display.c:101 +msgid "Item:" +msgstr "項目:" + +#: alsamixer/mixer_display.c:104 +msgid "F1: Help" +msgstr "F1: ヘルプ" + +#: alsamixer/mixer_display.c:105 +msgid "F2: System information" +msgstr "F2: システム情報" + +#: alsamixer/mixer_display.c:106 +msgid "F6: Select sound card" +msgstr "F6: サウンドカード選択" + +#: alsamixer/mixer_display.c:107 +msgid "Esc: Exit" +msgstr "Esc: 終了" + +#: alsamixer/mixer_display.c:174 +msgid "(unplugged)" +msgstr "" + +#: alsamixer/mixer_display.c:192 +msgid "Playback" +msgstr "再生" + +#: alsamixer/mixer_display.c:193 +msgid "Capture" +msgstr "録音" + +#: alsamixer/mixer_display.c:194 +msgid "All" +msgstr "全て" + +#: alsamixer/mixer_display.c:234 +msgid "mute" +msgstr "ミュート" + +#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +msgid "dB gain:" +msgstr "dBゲイン:" + +#: alsamixer/mixer_display.c:285 +#, c-format +msgid " [%s %s, %s]" +msgstr "" + +#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +msgid "Off" +msgstr "オフ" + +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +msgid "On" +msgstr "オン" + +#: alsamixer/mixer_display.c:363 +msgid "The sound device was unplugged." +msgstr "デバイスが接続されていません" + +#: alsamixer/mixer_display.c:364 +msgid "Press F6 to select another sound card." +msgstr "他のカードを選択するにはF6を押して下さい" + +#: alsamixer/mixer_display.c:379 +msgid "This sound device does not have any playback controls." +msgstr "このカードには再生ミキサーがありません" + +#: alsamixer/mixer_display.c:381 +msgid "This sound device does not have any capture controls." +msgstr "このカードには録音ミキサーがありません" + +#: alsamixer/mixer_display.c:383 +msgid "This sound device does not have any controls." +msgstr "このカードには制御可能なミキサーがありません" + +#. TRANSLATORS: playback on; one character +#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +msgid "O" +msgstr "" + +#. TRANSLATORS: playback muted; one character +#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +msgid "M" +msgstr "" + +#. TRANSLATORS: "left"; no more than two characters +#: alsamixer/mixer_display.c:536 +msgid "L" +msgstr "" + +#. TRANSLATORS: "right"; no more than two characters +#: alsamixer/mixer_display.c:540 +msgid "R" +msgstr "" + +#. TRANSLATORS: no more than eight characters +#: alsamixer/mixer_display.c:542 +msgid "CAPTURE" +msgstr "録音" + +#: alsamixer/mixer_display.c:592 +msgid "Front" +msgstr "フロント" + +#: alsamixer/mixer_display.c:595 +msgid "Rear" +msgstr "リア" + +#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:108 +msgid "Center" +msgstr "センター" + +#: alsamixer/mixer_display.c:601 +msgid "Woofer" +msgstr "低音" + +#: alsamixer/mixer_display.c:604 +msgid "Side" +msgstr "サイド" + +#: alsamixer/mixer_widget.c:84 alsamixer/mixer_widget.c:89 +msgid "cannot open mixer" +msgstr "ミキサーを開けません" + +#: alsamixer/mixer_widget.c:95 alsamixer/mixer_widget.c:172 +msgid "cannot load mixer controls" +msgstr "ミキサーをロードできません" + +#: alsamixer/mixer_widget.c:162 +#, c-format +msgid "Cannot open mixer device '%s'." +msgstr "ミキサーデバイス'%s'を開けません" + +#: alsamixer/mixer_widget.c:183 +msgid "Esc Exit" +msgstr "Esc 終了" + +#: alsamixer/mixer_widget.c:184 +msgid "F1 ? H Help" +msgstr "F1 ? H ヘルプ" + +#: alsamixer/mixer_widget.c:185 +msgid "F2 / System information" +msgstr "F2 / システム情報" + +#: alsamixer/mixer_widget.c:186 +msgid "F3 Show playback controls" +msgstr "F3 再生ミキサー表示" + +#: alsamixer/mixer_widget.c:187 +msgid "F4 Show capture controls" +msgstr "F4 録音ミキサー表示" + +#: alsamixer/mixer_widget.c:188 +msgid "F5 Show all controls" +msgstr "F5 全て表示" + +#: alsamixer/mixer_widget.c:189 +msgid "Tab Toggle view mode (F3/F4/F5)" +msgstr "Tab 表示モード変更 (F3/F4/F5)" + +#: alsamixer/mixer_widget.c:190 +msgid "F6 S Select sound card" +msgstr "F5 S サウンドカード選択" + +#: alsamixer/mixer_widget.c:191 +msgid "L Redraw screen" +msgstr "L 画面再描画" + +#: alsamixer/mixer_widget.c:193 +msgid "Left Move to the previous control" +msgstr "← 前の項目に移る" + +#: alsamixer/mixer_widget.c:194 +msgid "Right Move to the next control" +msgstr "→ 次の項目に移る" + +# ↑ +#: alsamixer/mixer_widget.c:196 +msgid "Up/Down Change volume" +msgstr "↑/↓ 音量変更" + +#: alsamixer/mixer_widget.c:197 +msgid "+ - Change volume" +msgstr "+ - 音量変更" + +#: alsamixer/mixer_widget.c:198 +msgid "Page Up/Dn Change volume in big steps" +msgstr "Page Up/dn 音量変更" + +#: alsamixer/mixer_widget.c:199 +msgid "End Set volume to 0%" +msgstr "End 音量 0%" + +#: alsamixer/mixer_widget.c:200 +msgid "0-9 Set volume to 0%-90%" +msgstr "0-9 音量 0%-90%" + +#: alsamixer/mixer_widget.c:201 +msgid "Q W E Increase left/both/right volumes" +msgstr "Q W E 左/両/右音量アップ" + +#. TRANSLATORS: or Y instead of Z +#: alsamixer/mixer_widget.c:203 +msgid "Z X C Decrease left/both/right volumes" +msgstr "Z X C 左/両/右音量ダウン" + +#: alsamixer/mixer_widget.c:204 +msgid "B Balance left and right volumes" +msgstr "B 左右音量を平均化する" + +#: alsamixer/mixer_widget.c:206 +msgid "M Toggle mute" +msgstr "M ミュートをトグル" + +#. TRANSLATORS: or , . +#: alsamixer/mixer_widget.c:208 +msgid "< > Toggle left/right mute" +msgstr "< > 左/右ミュートをトグル" + +#: alsamixer/mixer_widget.c:210 +msgid "Space Toggle capture" +msgstr "スペース 録音をトグル" + +#. TRANSLATORS: or Insert Delete +#: alsamixer/mixer_widget.c:212 +msgid "; ' Toggle left/right capture" +msgstr "; ' 左/右録音をトグル" + +#: alsamixer/mixer_widget.c:214 +msgid "Authors:" +msgstr "作者:" + +#: alsamixer/mixer_widget.c:215 +msgid " Tim Janik" +msgstr "" + +#: alsamixer/mixer_widget.c:216 +msgid " Jaroslav Kysela " +msgstr "" + +#: alsamixer/mixer_widget.c:217 +msgid " Clemens Ladisch " +msgstr "" + +#: alsamixer/mixer_widget.c:219 +msgid "Help" +msgstr "ヘルプ" + +#: alsamixer/proc_files.c:103 +msgid "Select File" +msgstr "ファイル選択" + +#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +msgid "Error" +msgstr "エラー" + +#: alsamixer/textbox.c:80 +#, c-format +msgid "Cannot open file \"%s\"." +msgstr "\"%s\"をオープンできません" + +#: aplay/aplay.c:152 +msgid "raw data" +msgstr "raw データ" + +#: aplay/aplay.c:153 +msgid "VOC" +msgstr "VOC" + +#: aplay/aplay.c:155 +msgid "WAVE" +msgstr "WAVE" + +#: aplay/aplay.c:156 +msgid "Sparc Audio" +msgstr "Sparc オーディオ" + +#: aplay/aplay.c:177 +#, fuzzy, c-format +msgid "" +"Usage: %s [OPTION]... [FILE]...\n" +"\n" +"-h, --help help\n" +" --version print current version\n" +"-l, --list-devices list all soundcards and digital audio devices\n" +"-L, --list-pcms list device names\n" +"-D, --device=NAME select PCM by name\n" +"-q, --quiet quiet mode\n" +"-t, --file-type TYPE file type (voc, wav, raw or au)\n" +"-c, --channels=# channels\n" +"-f, --format=FORMAT sample format (case insensitive)\n" +"-r, --rate=# sample rate\n" +"-d, --duration=# interrupt after # seconds\n" +"-M, --mmap mmap stream\n" +"-N, --nonblock nonblocking mode\n" +"-F, --period-time=# distance between interrupts is # microseconds\n" +"-B, --buffer-time=# buffer duration is # microseconds\n" +" --period-size=# distance between interrupts is # frames\n" +" --buffer-size=# buffer duration is # frames\n" +"-A, --avail-min=# min available space for wakeup is # microseconds\n" +"-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +" (relative to buffer size if <= 0)\n" +"-T, --stop-delay=# delay for automatic PCM stop is # microseconds from " +"xrun\n" +"-v, --verbose show PCM structure and setup (accumulative)\n" +"-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +"-I, --separate-channels one file for each channel\n" +" --disable-resample disable automatic rate resample\n" +" --disable-channels disable automatic channel conversions\n" +" --disable-format disable automatic format conversions\n" +" --disable-softvol disable software volume control (softvol)\n" +" --test-position test ring buffer position\n" +" --test-coef=#\t test coeficient for ring buffer position (default 8)\n" +" expression for validation is: coef * (buffer_size / " +"2)\n" +" --test-nowait do not wait for ring buffer - eats whole CPU\n" +" --max-file-time=# start another output file when the old file has " +"recorded\n" +" for this many seconds\n" +" --process-id-file write the process ID here\n" +" --use-strftime apply the strftime facility to the output file name\n" +msgstr "" +"使用法: %s [オプション]... [ファイル]...\n" +"\n" +"-h, --help ヘルプ\n" +" --version 現在のバージョンを表示\n" +"-l, --list-devices 全てのサウンドカードとオーディオデバイスを表示\n" +"-L, --list-pcms 全ての定義された PCM を表示\n" +"-D, --device=NAME 使用する PCM を指定\n" +"-q, --quiet quiet モード\n" +"-t, --file-type TYPE ファイルタイプ (voc, wav, raw または au)\n" +"-c, --channels=# チャネル数\n" +"-f, --format=FORMAT サンプルフォーマット (大/小文字区別)\n" +"-r, --rate=# サンプルレート\n" +"-d, --duration=# 指定の秒数後に終了\n" +"-M, --mmap mmap ストリーム\n" +"-N, --nonblock 非ブロックモード\n" +"-F, --period-time=# 割り込み間隔をμ秒で指定\n" +"-B, --buffer-time=# バッファの大きさをμ秒で指定\n" +" --period-size=# 割り込み間隔をフレーム数で指定\n" +" --buffer-size=# バッファの大きさをフレーム数で指定\n" +"-A, --avail-min=# wakeup の最少スペースをμ秒で指定\n" +"-R, --start-delay=# 指定のμ秒後に PCM を自動スタート\n" +" (0 以下の場合はバッファサイズより)\n" +"-T, --stop-delay=# XRUN から指定のμ秒後に PCM の自動停止\n" +"-v, --verbose PCM の設定を表示 (複数指定可能)\n" +"-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +"-I, --separate-channels 各チャネルに一つのファイルを用いる\n" +" --disable-resample 自動レート変換を禁止する\n" +" --disable-channels 自動チャネル変換を禁止する\n" +" --disable-format 自動フォーマット変換を禁止する\n" +" --disable-softvol ソフト音量制御(softvol)を禁止する\n" +" --test-position リングバッファ位置をテストする\n" +" --test-coef=# リングバッファ位置テストの係数 (デフォルト 8)\n" +" テスト範囲: coef * (buffer_size / 2)\n" +" --test-nowait リングバッファのウエイトを禁止 - 注意:高CPU負荷\n" + +#: aplay/aplay.c:216 speaker-test/speaker-test.c:819 +#, c-format +msgid "Recognized sample formats are:" +msgstr "認識されるサンプルフォーマット:" + +#: aplay/aplay.c:222 +#, c-format +msgid "" +"\n" +"Some of these may not be available on selected hardware\n" +msgstr "" +"\n" +"これらのいくつかは指定のハードウェアで使用不可能な場合があります\n" + +#: aplay/aplay.c:223 +#, c-format +msgid "The availabled format shortcuts are:\n" +msgstr "可能なフォーマットの省略形:\n" + +#: aplay/aplay.c:224 +#, c-format +msgid "-f cd (16 bit little endian, 44100, stereo)\n" +msgstr "-f cd (16 ビット、リトルエンディアン、44100、ステレオ)\n" + +#: aplay/aplay.c:225 +#, c-format +msgid "-f cdr (16 bit big endian, 44100, stereo)\n" +msgstr "-f cdr (16 ビット、ビッグエンディアン、44100、ステレオ)\n" + +#: aplay/aplay.c:226 +#, c-format +msgid "-f dat (16 bit little endian, 48000, stereo)\n" +msgstr "-f dat (16 ビット、リトルエンディアン、48000、ステレオ)\n" + +#: aplay/aplay.c:240 +msgid "no soundcards found..." +msgstr "サウンドカードが見つかりません..." + +#: aplay/aplay.c:243 +#, c-format +msgid "**** List of %s Hardware Devices ****\n" +msgstr "**** ハードウェアデバイス %s のリスト ****\n" + +#: aplay/aplay.c:272 +#, c-format +msgid "card %i: %s [%s], device %i: %s [%s]\n" +msgstr "カード %i: %s [%s], デバイス %i: %s [%s]\n" + +#: aplay/aplay.c:278 +#, c-format +msgid " Subdevices: %i/%i\n" +msgstr " サブデバイス: %i/%i\n" + +#: aplay/aplay.c:285 +#, c-format +msgid " Subdevice #%i: %s\n" +msgstr " サブデバイス #%i: %s\n" + +#: aplay/aplay.c:362 +#, c-format +msgid "Aborted by signal %s...\n" +msgstr "シグナル %s で中断...\n" + +#: aplay/aplay.c:473 +msgid "command should be named either arecord or aplay" +msgstr "arecord または aplay コマンドのみ可能" + +#: aplay/aplay.c:512 +#, c-format +msgid "unrecognized file format %s" +msgstr "不正なファイルフォーマット %s" + +#: aplay/aplay.c:519 +#, c-format +msgid "value %i for channels is invalid" +msgstr "不正なチャネル数 %i" + +#: aplay/aplay.c:538 +#, c-format +msgid "wrong extended format '%s'" +msgstr "不正な拡張フォーマット '%s'" + +#: aplay/aplay.c:549 +#, c-format +msgid "bad speed value %i" +msgstr "不正なレート値 %i" + +#: aplay/aplay.c:644 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "より詳しい情報は「%s --help」を実行してください\n" + +#: aplay/aplay.c:660 +#, c-format +msgid "audio open error: %s" +msgstr "" + +#: aplay/aplay.c:665 +#, c-format +msgid "info error: %s" +msgstr "" + +#: aplay/aplay.c:672 +#, c-format +msgid "nonblock setting error: %s" +msgstr "" + +#: aplay/aplay.c:682 aplay/aplay.c:806 aplay/aplay.c:1174 +msgid "not enough memory" +msgstr "メモリが足りません" + +#: aplay/aplay.c:706 +#, fuzzy, c-format +msgid "Cannot create process ID file %s: %s" +msgstr "WAVファイルがオープンできません: %s\n" + +#: aplay/aplay.c:796 +#, c-format +msgid "read error (called from line %i)" +msgstr "リードエラー (%i 行)" + +#: aplay/aplay.c:854 +#, c-format +msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" + +#: aplay/aplay.c:864 +#, c-format +msgid "" +"unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" +msgstr "" + +#: aplay/aplay.c:869 +msgid "wrong format tag in extensible 'fmt ' chunk" +msgstr "" + +#: aplay/aplay.c:876 +#, c-format +msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" +msgstr "" + +#: aplay/aplay.c:880 +#, c-format +msgid "can't play WAVE-files with %d tracks" +msgstr "%d トラックを含む WAVE ファイルは再生できません" + +#: aplay/aplay.c:888 aplay/aplay.c:988 +#, c-format +msgid "Warning: format is changed to U8\n" +msgstr "警告: フォーマットは U8 に変更されます\n" + +#: aplay/aplay.c:894 +#, c-format +msgid "Warning: format is changed to S16_LE\n" +msgstr "警告: フォーマットは S16_LE に変更されます\n" + +#: aplay/aplay.c:902 +#, c-format +msgid "Warning: format is changed to S24_3LE\n" +msgstr "警告: フォーマットは S24_3LE に変更されます\n" + +#: aplay/aplay.c:908 +#, c-format +msgid "Warning: format is changed to S24_LE\n" +msgstr "警告: フォーマットは S24_LE に変更されます\n" + +#: aplay/aplay.c:912 +#, c-format +msgid "" +" can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" +msgstr "" +"%2$d バイト長 %1$d サンプルビット (%3$d チャネル) の WAVE ファイルは再生でき" +"ません" + +#: aplay/aplay.c:924 +#, c-format +msgid " can't play WAVE-files with sample %d bits wide" +msgstr "%d ビット長のサンプルの WAVE ファイルは再生できません" + +#: aplay/aplay.c:982 +#, c-format +msgid "Warning: format is changed to MU_LAW\n" +msgstr "警告: フォーマットは MU_LAW に変更されます\n" + +#: aplay/aplay.c:994 +#, c-format +msgid "Warning: format is changed to S16_BE\n" +msgstr "警告: フォーマットは S16_BE に変更されます\n" + +#: aplay/aplay.c:1007 aplay/aplay.c:1925 aplay/aplay.c:1932 aplay/aplay.c:2455 +#: aplay/aplay.c:2467 +msgid "read error" +msgstr "リードエラー" + +#: aplay/aplay.c:1037 +msgid "Broken configuration for this PCM: no configurations available" +msgstr "指定の PCM を使用できません: 設定がありません" + +#: aplay/aplay.c:1054 +msgid "Access type not available" +msgstr "アクセスタイプが使用不可能" + +#: aplay/aplay.c:1059 +msgid "Sample format non available" +msgstr "サンプルフォーマットが使用不可能" + +#: aplay/aplay.c:1065 +msgid "Channels count non available" +msgstr "チャネル数が使用不可能" + +#: aplay/aplay.c:1080 +#, c-format +msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" +msgstr "警告: レートが不正確です (要求値 = %iHz, 使用値 = %iHz)\n" + +#: aplay/aplay.c:1086 +#, c-format +msgid " please, try the plug plugin %s\n" +msgstr " plug プラグイン%s を使用してください\n" + +#: aplay/aplay.c:1123 +msgid "Unable to install hw params:" +msgstr "hw params のインストールに失敗しました:" + +#: aplay/aplay.c:1130 +#, c-format +msgid "Can't use period equal to buffer size (%lu == %lu)" +msgstr "period と buffer サイズには同じ値を使用できません (%lu == %lu)" + +#: aplay/aplay.c:1161 +msgid "unable to install sw params:" +msgstr "sw params のインストールに失敗しました:" + +#: aplay/aplay.c:1192 +#, c-format +msgid "snd_pcm_mmap_begin problem: %s" +msgstr "" + +#: aplay/aplay.c:1215 +#, c-format +msgid "stdin O_NONBLOCK flag setup failed\n" +msgstr "" + +#: aplay/aplay.c:1237 +#, c-format +msgid "\rPAUSE command ignored (no hw support)\n" +msgstr "" + +#: aplay/aplay.c:1242 +#, fuzzy, c-format +msgid "pause push error: %s" +msgstr "ステータスエラー: %s" + +#: aplay/aplay.c:1251 +#, fuzzy, c-format +msgid "pause release error: %s" +msgstr "サスペンド: prepare エラー: %s" + +#: aplay/aplay.c:1265 +#, c-format +msgid "" +"\r=== PAUSE === " +msgstr "" + +#: aplay/aplay.c:1307 +#, c-format +msgid "status error: %s" +msgstr "ステータスエラー: %s" + +#: aplay/aplay.c:1317 aplay/aplay.c:1328 +#, c-format +msgid "%s!!! (at least %.3f ms long)\n" +msgstr "%s!!! (少なくとも %.3f ms)\n" + +#: aplay/aplay.c:1318 aplay/aplay.c:1321 aplay/aplay.c:1329 +msgid "underrun" +msgstr "アンダーラン" + +#: aplay/aplay.c:1318 aplay/aplay.c:1329 +msgid "overrun" +msgstr "オーバーラン" + +#: aplay/aplay.c:1333 +#, c-format +msgid "Status:\n" +msgstr "ステータス:\n" + +#: aplay/aplay.c:1337 +#, c-format +msgid "xrun: prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1343 +#, c-format +msgid "Status(DRAINING):\n" +msgstr "ステータス(DRAINING):\n" + +#: aplay/aplay.c:1347 +#, c-format +msgid "capture stream format change? attempting recover...\n" +msgstr "録音ストリームのフォーマットが変更? 修復を試みます...\n" + +#: aplay/aplay.c:1349 +#, c-format +msgid "xrun(DRAINING): prepare error: %s" +msgstr "" + +#: aplay/aplay.c:1356 +#, c-format +msgid "Status(R/W):\n" +msgstr "ステータス(R/W):\n" + +#: aplay/aplay.c:1359 +#, c-format +msgid "read/write error, state = %s" +msgstr "読み書きエラー, ステータス = %s" + +#: aplay/aplay.c:1369 +#, c-format +msgid "Suspended. Trying resume. " +msgstr "サスペンド中です。レジュームします。" + +#: aplay/aplay.c:1374 +#, c-format +msgid "Failed. Restarting stream. " +msgstr "失敗しました。ストリームを再スタートします。" + +#: aplay/aplay.c:1376 +#, c-format +msgid "suspend: prepare error: %s" +msgstr "サスペンド: prepare エラー: %s" + +#: aplay/aplay.c:1381 +#, c-format +msgid "Done.\n" +msgstr "終了\n" + +#: aplay/aplay.c:1403 +#, c-format +msgid " !clip " +msgstr "" + +#: aplay/aplay.c:1550 +#, c-format +msgid "Unsupported bit size %d.\n" +msgstr "" + +#: aplay/aplay.c:1584 +#, c-format +msgid "Max peak (%li samples): 0x%08x " +msgstr "最大ピーク (%li サンプル): 0x%08x " + +#: aplay/aplay.c:1618 +#, c-format +msgid "" +"Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = %" +"li\n" +msgstr "" + +#: aplay/aplay.c:1682 +#, c-format +msgid "write error: %s" +msgstr "書込エラー: %s" + +#: aplay/aplay.c:1729 +#, c-format +msgid "writev error: %s" +msgstr "書込(writev)エラー: %s" + +#: aplay/aplay.c:1773 +#, c-format +msgid "read error: %s" +msgstr "読込エラー: %s" + +#: aplay/aplay.c:1817 +#, c-format +msgid "readv error: %s" +msgstr "読込(readv)エラー: %s" + +#: aplay/aplay.c:1865 +msgid "can't allocate buffer for silence" +msgstr "サイレンス用のバッファの取得に失敗しました" + +#: aplay/aplay.c:1874 aplay/aplay.c:2100 aplay/aplay.c:2105 aplay/aplay.c:2152 +#: aplay/aplay.c:2161 aplay/aplay.c:2168 aplay/aplay.c:2178 aplay/aplay.c:2184 +#: aplay/aplay.c:2256 aplay/aplay.c:2286 aplay/aplay.c:2300 +msgid "write error" +msgstr "書込エラー" + +#: aplay/aplay.c:1887 +#, c-format +msgid "voc_pcm_flush - silence error" +msgstr "" + +#: aplay/aplay.c:1890 +msgid "voc_pcm_flush error" +msgstr "" + +#: aplay/aplay.c:1916 +msgid "malloc error" +msgstr "malloc エラー" + +#: aplay/aplay.c:1920 +#, c-format +msgid "Playing Creative Labs Channel file '%s'...\n" +msgstr "Creative Labs Channel ファイル '%s' を演奏中...\n" + +#: aplay/aplay.c:1988 aplay/aplay.c:2080 +msgid "can't play packed .voc files" +msgstr "packed .voc ファイルは演奏できません" + +#: aplay/aplay.c:2040 +#, c-format +msgid "can't play loops; %s isn't seekable\n" +msgstr "ループ演奏できません。%s はシーク不可能です\n" + +#: aplay/aplay.c:2089 +#, c-format +msgid "unknown blocktype %d. terminate." +msgstr "未知のブロックタイプ %d: 終了します。" + +#: aplay/aplay.c:2220 +#, c-format +msgid "Wave doesn't support %s format..." +msgstr "WAVE は %s フォーマットをサポートしません..." + +#: aplay/aplay.c:2280 +#, c-format +msgid "Sparc Audio doesn't support %s format..." +msgstr "Sparc オーディオは %s フォーマットをサポートしません..." + +#: aplay/aplay.c:2361 +msgid "Playing" +msgstr "再生中" + +#: aplay/aplay.c:2361 +msgid "Recording" +msgstr "録音中" + +#: aplay/aplay.c:2365 +#, c-format +msgid "Rate %d Hz, " +msgstr "レート %d Hz, " + +#: aplay/aplay.c:2367 +#, c-format +msgid "Mono" +msgstr "モノラル" + +#: aplay/aplay.c:2369 +#, c-format +msgid "Stereo" +msgstr "ステレオ" + +#: aplay/aplay.c:2371 +#, c-format +msgid "Channels %i" +msgstr "チャネル数 %i" + +#: aplay/aplay.c:2882 aplay/aplay.c:2935 +#, c-format +msgid "You need to specify %d files" +msgstr "%d 個のファイルを指定してください" + +#: seq/aconnect/aconnect.c:49 +#, c-format +msgid "aconnect - ALSA sequencer connection manager\n" +msgstr "aconnect - ALSA sequencer 接続マネージャ\n" + +#: seq/aconnect/aconnect.c:50 +#, c-format +msgid "Copyright (C) 1999-2000 Takashi Iwai\n" +msgstr "" + +#: seq/aconnect/aconnect.c:51 +#, c-format +msgid "Usage:\n" +msgstr "使用法:\n" + +#: seq/aconnect/aconnect.c:52 +#, c-format +msgid " * Connection/disconnection between two ports\n" +msgstr " * 二つのポートの接続/切り離し\n" + +#: seq/aconnect/aconnect.c:53 +#, c-format +msgid " aconnect [-options] sender receiver\n" +msgstr " aconnect [-オプション] 送信 受信\n" + +#: seq/aconnect/aconnect.c:54 +#, c-format +msgid " sender, receiver = client:port pair\n" +msgstr " 送信, 受信 = クライアント:ポートの組\n" + +#: seq/aconnect/aconnect.c:55 +#, c-format +msgid " -d,--disconnect disconnect\n" +msgstr " -d,--disconnect 切り離し\n" + +#: seq/aconnect/aconnect.c:56 +#, c-format +msgid " -e,--exclusive exclusive connection\n" +msgstr " -e,--exclusive 排他接続\n" + +#: seq/aconnect/aconnect.c:57 +#, c-format +msgid " -r,--real # convert real-time-stamp on queue\n" +msgstr " -r,--real # キューのリアルタイムスタンプに変換\n" + +#: seq/aconnect/aconnect.c:58 +#, c-format +msgid " -t,--tick # convert tick-time-stamp on queue\n" +msgstr " -t,--tick # キューのティックタイムスタンプに変換\n" + +#: seq/aconnect/aconnect.c:59 +#, c-format +msgid " * List connected ports (no subscription action)\n" +msgstr " * 接続済みのポートの一覧\n" + +#: seq/aconnect/aconnect.c:60 +#, c-format +msgid " aconnect -i|-o [-options]\n" +msgstr " aconnect -i|-o [-オプション]\n" + +#: seq/aconnect/aconnect.c:61 +#, c-format +msgid " -i,--input list input (readable) ports\n" +msgstr " -i,--input 入力 (読込) ポートの一覧\n" + +#: seq/aconnect/aconnect.c:62 +#, c-format +msgid " -o,--output list output (writable) ports\n" +msgstr " -o,--output 主力 (書込) ポートの一覧\n" + +#: seq/aconnect/aconnect.c:63 +#, c-format +msgid " -l,--list list current connections of each port\n" +msgstr " -l,--list 各ポートの現在の接続を表示\n" + +#: seq/aconnect/aconnect.c:64 +#, c-format +msgid " * Remove all exported connections\n" +msgstr " * 全てのエクスポートされた接続を切り離す\n" + +#: seq/aconnect/aconnect.c:65 +#, c-format +msgid " -x, --removeall\n" +msgstr " -x, --removall\n" + +#: seq/aconnect/aconnect.c:132 +msgid "Connecting To" +msgstr "接続先" + +#: seq/aconnect/aconnect.c:133 +msgid "Connected From" +msgstr "接続元" + +#: seq/aconnect/aconnect.c:169 +#, c-format +msgid "client %d: '%s' [type=%s]\n" +msgstr "クライアント %d: '%s' [タイプ=%s]\n" + +#: seq/aconnect/aconnect.c:173 +msgid "user" +msgstr "ユーザ" + +#: seq/aconnect/aconnect.c:173 +msgid "kernel" +msgstr "カーネル" + +#: seq/aconnect/aconnect.c:307 +#, c-format +msgid "can't open sequencer\n" +msgstr "sequencer をオープンできません\n" + +#: seq/aconnect/aconnect.c:335 +#, c-format +msgid "can't get client id\n" +msgstr "クライアント ID を取得できません\n" + +#: seq/aconnect/aconnect.c:342 +#, c-format +msgid "can't set client info\n" +msgstr "クライアント情報を取得できません\n" + +#: seq/aconnect/aconnect.c:349 +#, c-format +msgid "invalid sender address %s\n" +msgstr "送信アドレスが不正です: %s\n" + +#: seq/aconnect/aconnect.c:354 seq/aseqnet/aseqnet.c:290 +#, c-format +msgid "invalid destination address %s\n" +msgstr "受信アドレスが不正です: %s\n" + +#: seq/aconnect/aconnect.c:368 +#, c-format +msgid "No subscription is found\n" +msgstr "接続が見つかりません\n" + +#: seq/aconnect/aconnect.c:373 +#, c-format +msgid "Disconnection failed (%s)\n" +msgstr "切り離しに失敗 (%s)\n" + +#: seq/aconnect/aconnect.c:379 +#, c-format +msgid "Connection is already subscribed\n" +msgstr "既に接続されています\n" + +#: seq/aconnect/aconnect.c:384 +#, c-format +msgid "Connection failed (%s)\n" +msgstr "接続に失敗 (%s)\n" + +#: seq/aseqnet/aseqnet.c:164 +#, c-format +msgid "aseqnet - network client/server on ALSA sequencer\n" +msgstr "aseqnet - ALSA sequencer 上のネットワーククライアント/サーバ\n" + +#: seq/aseqnet/aseqnet.c:165 +#, c-format +msgid " Copyright (C) 1999 Takashi Iwai\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:166 +#, c-format +msgid "usage:\n" +msgstr "使用法:\n" + +#: seq/aseqnet/aseqnet.c:167 +#, c-format +msgid " server mode: aseqnet [-options]\n" +msgstr " サーバモード: aseqnet [-オプション]\n" + +#: seq/aseqnet/aseqnet.c:168 +#, c-format +msgid " client mode: aseqnet [-options] server_host\n" +msgstr " クライアントモード: aseqnet [-オプション] サーバホスト\n" + +#: seq/aseqnet/aseqnet.c:169 +#, c-format +msgid "options:\n" +msgstr "オプション:\n" + +#: seq/aseqnet/aseqnet.c:170 +#, c-format +msgid " -p,--port # : sepcify TCP port (digit or service name)\n" +msgstr " -p,--port # : TCP ポートの指定 (数字またはサービス名)\n" + +#: seq/aseqnet/aseqnet.c:171 +#, c-format +msgid " -s,--source addr : read from given addr (client:port)\n" +msgstr " -s,--source addr : 指定のアドレス(クライアント:ポート)から読み込む\n" + +#: seq/aseqnet/aseqnet.c:172 +#, c-format +msgid " -d,--dest addr : write to given addr (client:port)\n" +msgstr " -d,--dest addr : 指定のアドレス(クライアント:ポート)に書き込む\n" + +#: seq/aseqnet/aseqnet.c:173 +#, c-format +msgid " -v, --verbose : print verbose messages\n" +msgstr " -v,--verbose : 冗長メッセージ表示\n" + +#: seq/aseqnet/aseqnet.c:174 +#, c-format +msgid " -i, --info : print certain received events\n" +msgstr " -i,--info : 受信イベントを表示する\n" + +#: seq/aseqnet/aseqnet.c:188 +#, c-format +msgid "can't malloc\n" +msgstr "malloc できません\n" + +#: seq/aseqnet/aseqnet.c:213 +#, c-format +msgid "closing files..\n" +msgstr "ファイルを閉じます..\n" + +#: seq/aseqnet/aseqnet.c:272 +#, c-format +msgid "sequencer opened: %d:%d\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:279 +#, c-format +msgid "invalid source address %s\n" +msgstr "不正な送信アドレス %s\n" + +#: seq/aseqnet/aseqnet.c:309 +#, c-format +msgid "service '%s' is not found in /etc/services\n" +msgstr "サービス '%s' が /etc/services に見つかりません\n" + +#: seq/aseqnet/aseqnet.c:377 +#, c-format +msgid "too many connections!\n" +msgstr "接続が多すぎます!\n" + +#: seq/aseqnet/aseqnet.c:388 +#, c-format +msgid "accepted[%d]\n" +msgstr "了解[%d]\n" + +#: seq/aseqnet/aseqnet.c:411 +#, c-format +msgid "can't get address %s\n" +msgstr "アドレス %s を取得できません\n" + +#: seq/aseqnet/aseqnet.c:422 +#, c-format +msgid "ok.. connected\n" +msgstr "ok.. 接続\n" + +#: seq/aseqnet/aseqnet.c:518 +#, c-format +msgid "Channel %2d: Control event : %5d\n" +msgstr "チャネル %2d: コントロール : %5d\n" + +#: seq/aseqnet/aseqnet.c:522 +#, c-format +msgid "Channel %2d: Pitchbender : %5d\n" +msgstr "チャネル %2d: ピッチベンド : %5d\n" + +#: seq/aseqnet/aseqnet.c:526 +#, c-format +msgid "Channel %2d: Note On event : %5d\n" +msgstr "チャネル %2d: ノートオン : %5d\n" + +#: seq/aseqnet/aseqnet.c:530 +#, c-format +msgid "Channel %2d: Note Off event: %5d\n" +msgstr "チャネル %2d: ノートオフ : %5d\n" + +#: seq/aseqnet/aseqnet.c:585 +#, c-format +msgid "disconnected\n" +msgstr "切り離し\n" + +#: speaker-test/speaker-test.c:104 +msgid "Front Left" +msgstr "" + +#: speaker-test/speaker-test.c:105 +msgid "Front Right" +msgstr "" + +#: speaker-test/speaker-test.c:106 +msgid "Rear Left" +msgstr "" + +#: speaker-test/speaker-test.c:107 +msgid "Rear Right" +msgstr "" + +#: speaker-test/speaker-test.c:109 +msgid "LFE" +msgstr "" + +#: speaker-test/speaker-test.c:110 +msgid "Side Left" +msgstr "" + +#: speaker-test/speaker-test.c:111 +msgid "Side Right" +msgstr "" + +#: speaker-test/speaker-test.c:112 +msgid "Channel 9" +msgstr "" + +#: speaker-test/speaker-test.c:113 +msgid "Channel 10" +msgstr "" + +#: speaker-test/speaker-test.c:114 +msgid "Channel 11" +msgstr "" + +#: speaker-test/speaker-test.c:115 +msgid "Channel 12" +msgstr "" + +#: speaker-test/speaker-test.c:116 +msgid "Channel 13" +msgstr "" + +#: speaker-test/speaker-test.c:117 +msgid "Channel 14" +msgstr "" + +#: speaker-test/speaker-test.c:118 +msgid "Channel 15" +msgstr "" + +#: speaker-test/speaker-test.c:119 +msgid "Channel 16" +msgstr "" + +#: speaker-test/speaker-test.c:383 +#, c-format +msgid "Broken configuration for playback: no configurations available: %s\n" +msgstr "再生用に設定できません: 設定がみつかりません: %s\n" + +#: speaker-test/speaker-test.c:390 +#, c-format +msgid "Access type not available for playback: %s\n" +msgstr "アクセスタイプが不正です: %s\n" + +#: speaker-test/speaker-test.c:397 +#, c-format +msgid "Sample format not available for playback: %s\n" +msgstr "指定のサンプルフォーマットを使用できません: %s\n" + +#: speaker-test/speaker-test.c:404 +#, c-format +msgid "Channels count (%i) not available for playbacks: %s\n" +msgstr "チャネル数 (%i) を使用できません: %s\n" + +#: speaker-test/speaker-test.c:412 +#, c-format +msgid "Rate %iHz not available for playback: %s\n" +msgstr "レート %iHz を使用できません: %s\n" + +#: speaker-test/speaker-test.c:417 +#, c-format +msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" +msgstr "設定レートが一致しません< (要求値 %iHz, 取得値 %iHz, エラー %d)\n" + +#: speaker-test/speaker-test.c:421 +#, c-format +msgid "Rate set to %iHz (requested %iHz)\n" +msgstr "レート %iHz (要求値 %iHz)\n" + +#: speaker-test/speaker-test.c:427 +#, c-format +msgid "Buffer size range from %lu to %lu\n" +msgstr "バッファサイズ範囲 %lu 〜 %lu\n" + +#: speaker-test/speaker-test.c:428 +#, c-format +msgid "Period size range from %lu to %lu\n" +msgstr "ピリオドサイズ範囲 %lu 〜 %lu\n" + +#: speaker-test/speaker-test.c:430 +#, c-format +msgid "Requested period time %u us\n" +msgstr "要求されたピリオド長 %u us\n" + +#: speaker-test/speaker-test.c:433 +#, c-format +msgid "Unable to set period time %u us for playback: %s\n" +msgstr "ピリオド長 %u us を設定できません: %s\n" + +#: speaker-test/speaker-test.c:439 +#, c-format +msgid "Requested buffer time %u us\n" +msgstr "要求されたバッファ長 %u us\n" + +#: speaker-test/speaker-test.c:442 +#, c-format +msgid "Unable to set buffer time %u us for playback: %s\n" +msgstr "バッファ長 %u us を設定できません: %s\n" + +#: speaker-test/speaker-test.c:451 +#, c-format +msgid "Using max buffer size %lu\n" +msgstr "最大バッファサイズ %lu を使用\n" + +#: speaker-test/speaker-test.c:454 +#, c-format +msgid "Unable to set buffer size %lu for playback: %s\n" +msgstr "バッファサイズ %lu を設定できません: %s\n" + +#: speaker-test/speaker-test.c:460 +#, c-format +msgid "Periods = %u\n" +msgstr "ピリオド数 = %u\n" + +#: speaker-test/speaker-test.c:463 +#, c-format +msgid "Unable to set nperiods %u for playback: %s\n" +msgstr "ピリオド数 %u を設定できません: %s\n" + +#: speaker-test/speaker-test.c:472 +#, c-format +msgid "Unable to set hw params for playback: %s\n" +msgstr "hw params を設定できません: %s\n" + +#: speaker-test/speaker-test.c:478 +#, c-format +msgid "was set period_size = %lu\n" +msgstr "period_size = %lu で設定\n" + +#: speaker-test/speaker-test.c:479 +#, c-format +msgid "was set buffer_size = %lu\n" +msgstr "buffer_size = %lu で設定\n" + +#: speaker-test/speaker-test.c:481 +#, c-format +msgid "buffer to small, could not use\n" +msgstr "バッファが小さすぎます\n" + +#: speaker-test/speaker-test.c:494 +#, c-format +msgid "Unable to determine current swparams for playback: %s\n" +msgstr "現在の swparams を取得できません: %s\n" + +#: speaker-test/speaker-test.c:501 +#, c-format +msgid "Unable to set start threshold mode for playback: %s\n" +msgstr "start_threshold モードを設定できません: %s\n" + +#: speaker-test/speaker-test.c:508 +#, c-format +msgid "Unable to set avail min for playback: %s\n" +msgstr "avail_min を設定できません: %s\n" + +#: speaker-test/speaker-test.c:515 +#, c-format +msgid "Unable to set sw params for playback: %s\n" +msgstr "再生用の sw params を設定できません: %s\n" + +#: speaker-test/speaker-test.c:530 +#, c-format +msgid "Can't recovery from underrun, prepare failed: %s\n" +msgstr "アンダーランから復帰失敗: %s\n" + +#: speaker-test/speaker-test.c:541 +#, c-format +msgid "Can't recovery from suspend, prepare failed: %s\n" +msgstr "サスペンドから復帰失敗: %s\n" + +#: speaker-test/speaker-test.c:605 speaker-test/speaker-test.c:1025 +#, c-format +msgid "No enough memory\n" +msgstr "メモリが足りません\n" + +#: speaker-test/speaker-test.c:610 +#, c-format +msgid "Cannot open WAV file %s\n" +msgstr "WAVファイルがオープンできません: %s\n" + +#: speaker-test/speaker-test.c:614 speaker-test/speaker-test.c:643 +#, c-format +msgid "Invalid WAV file %s\n" +msgstr "不正なWAVファイルです: %s\n" + +#: speaker-test/speaker-test.c:619 +#, c-format +msgid "Not a WAV file: %s\n" +msgstr "WAVファイルではありません: %s\n" + +#: speaker-test/speaker-test.c:623 +#, c-format +msgid "Unsupported WAV format %d for %s\n" +msgstr "未サポートのWAVフォーマット %d: %s\n" + +#: speaker-test/speaker-test.c:628 +#, c-format +msgid "%s is not a mono stream (%d channels)\n" +msgstr "%s はモノストリームではありません (%d チャネル)\n" + +#: speaker-test/speaker-test.c:633 +#, c-format +msgid "Sample rate doesn't match (%d) for %s\n" +msgstr "サンプルレートが不一致です(%d): %s\n" + +#: speaker-test/speaker-test.c:638 +#, c-format +msgid "Unsupported sample format bits %d for %s\n" +msgstr "未サポートのサンプルフォーマットビット %d: %s\n" + +#: speaker-test/speaker-test.c:688 +#, c-format +msgid "Undefined channel %d\n" +msgstr "未定義のチャネル %d\n" + +#: speaker-test/speaker-test.c:739 +#, c-format +msgid "Write error: %d,%s\n" +msgstr "書込エラー: %d,%s\n" + +#: speaker-test/speaker-test.c:741 +#, c-format +msgid "xrun_recovery failed: %d,%s\n" +msgstr "xrun_recovery 失敗: %d,%s\n" + +#: speaker-test/speaker-test.c:803 +#, c-format +msgid "" +"Usage: speaker-test [OPTION]... \n" +"-h,--help\thelp\n" +"-D,--device\tplayback device\n" +"-r,--rate\tstream rate in Hz\n" +"-c,--channels\tcount of channels in stream\n" +"-f,--frequency\tsine wave frequency in Hz\n" +"-F,--format\tsample format\n" +"-b,--buffer\tring buffer size in us\n" +"-p,--period\tperiod size in us\n" +"-P,--nperiods\tnumber of periods\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +"-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +"-w,--wavfile\tUse the given WAV file as a test sound\n" +"-W,--wavdir\tSpecify the directory containing WAV files\n" +"\n" +msgstr "" +"使用法: speaker-test [オプション]...\n" +"-h,--help ヘルプ\n" +"-D,--device 再生デバイス\n" +"-r,--rate ストリームレート (Hz)\n" +"-c,--channels チャネル数\n" +"-f,--frequency 正弦波周波数 (hz)\n" +"-F,--format サンプルフォーマット\n" +"-b,--buffer リングバッファサイズ (μs)\n" +"-p,--period ピリオドサイズ (μs)\n" +"-P,--nperiods ピリオド数\n" +"-t,--test pink=ピンクノイズを使用, sine=正弦波を使用, wav=WAVファ" +"イル再生\n" +"-l,--nloops 繰り返しテスト数, 0 = 無制限\n" +"-s,--speaker 単一スピーカーテスト 1=左 または 2=右\n" +"-w,--wavfile 指定のWAVファイルをテスト音源として使用\n" +"-W,--wavdir WAVファイルのあるディレクトリを指定\n" +"\n" + +#: speaker-test/speaker-test.c:921 +#, c-format +msgid "Invalid number of periods %d\n" +msgstr "不正なピリオド数 %d\n" + +#: speaker-test/speaker-test.c:937 speaker-test/speaker-test.c:941 +#, c-format +msgid "Invalid test type %s\n" +msgstr "不正なテストタイプ %s\n" + +#: speaker-test/speaker-test.c:953 +#, c-format +msgid "Invalid parameter for -s option.\n" +msgstr "-s オプションの値が不正です\n" + +#: speaker-test/speaker-test.c:967 +#, c-format +msgid "Unknown option '%c'\n" +msgstr "未知のオプション '%c'\n" + +#: speaker-test/speaker-test.c:981 +#, c-format +msgid "Playback device is %s\n" +msgstr "再生デバイス: %s\n" + +#: speaker-test/speaker-test.c:982 +#, c-format +msgid "Stream parameters are %iHz, %s, %i channels\n" +msgstr "ストリームパラメータ: %iHz, %s, %i チャネル\n" + +#: speaker-test/speaker-test.c:985 +#, c-format +msgid "Using 16 octaves of pink noise\n" +msgstr "16 オクターブのピンクノイズを使用\n" + +#: speaker-test/speaker-test.c:988 +#, c-format +msgid "Sine wave rate is %.4fHz\n" +msgstr "正弦波レート: %.4fHz\n" + +#: speaker-test/speaker-test.c:991 +#, c-format +msgid "WAV file(s)\n" +msgstr "WAV ファイル\n" + +#: speaker-test/speaker-test.c:997 +#, c-format +msgid "Playback open error: %d,%s\n" +msgstr "再生オープンエラー: %d,%s\n" + +#: speaker-test/speaker-test.c:1002 +#, c-format +msgid "Setting of hwparams failed: %s\n" +msgstr "hwparams の設定に失敗: %s\n" + +#: speaker-test/speaker-test.c:1007 +#, c-format +msgid "Setting of swparams failed: %s\n" +msgstr "swparams の設定に失敗: %s\n" + +#: speaker-test/speaker-test.c:1056 speaker-test/speaker-test.c:1078 +#, c-format +msgid "Transfer failed: %s\n" +msgstr "転送に失敗しました: %s\n" + +#: speaker-test/speaker-test.c:1066 +#, c-format +msgid "Time per period = %lf\n" +msgstr "ピリオド時間 = %lf\n" diff --git a/po/quot.sed b/po/quot.sed new file mode 100644 index 0000000..0122c46 --- /dev/null +++ b/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1”/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“”/""/g diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin new file mode 100644 index 0000000..2436c49 --- /dev/null +++ b/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/stamp-po b/po/stamp-po new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/seq/Makefile.am b/seq/Makefile.am new file mode 100644 index 0000000..2c84cee --- /dev/null +++ b/seq/Makefile.am @@ -0,0 +1 @@ +SUBDIRS=aconnect aplaymidi aseqdump aseqnet diff --git a/seq/Makefile.in b/seq/Makefile.in new file mode 100644 index 0000000..3e395dd --- /dev/null +++ b/seq/Makefile.in @@ -0,0 +1,565 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = seq +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +SUBDIRS = aconnect aplaymidi aseqdump aseqnet +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign seq/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign seq/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic ctags \ + ctags-recursive distclean distclean-generic distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ + tags-recursive uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/seq/aconnect/Makefile.am b/seq/aconnect/Makefile.am new file mode 100644 index 0000000..507b9fe --- /dev/null +++ b/seq/aconnect/Makefile.am @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = README.aconnect aconnect.1 +LDADD = $(LIBINTL) + +bin_PROGRAMS = aconnect +aconnect_SOURCES = aconnect.c +man_MANS = aconnect.1 diff --git a/seq/aconnect/Makefile.in b/seq/aconnect/Makefile.in new file mode 100644 index 0000000..f55d690 --- /dev/null +++ b/seq/aconnect/Makefile.in @@ -0,0 +1,582 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = aconnect$(EXEEXT) +subdir = seq/aconnect +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_aconnect_OBJECTS = aconnect.$(OBJEXT) +aconnect_OBJECTS = $(am_aconnect_OBJECTS) +aconnect_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +aconnect_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(aconnect_SOURCES) +DIST_SOURCES = $(aconnect_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = README.aconnect aconnect.1 +LDADD = $(LIBINTL) +aconnect_SOURCES = aconnect.c +man_MANS = aconnect.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign seq/aconnect/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign seq/aconnect/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +aconnect$(EXEEXT): $(aconnect_OBJECTS) $(aconnect_DEPENDENCIES) + @rm -f aconnect$(EXEEXT) + $(LINK) $(aconnect_OBJECTS) $(aconnect_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aconnect.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/seq/aconnect/README.aconnect b/seq/aconnect/README.aconnect new file mode 100644 index 0000000..1f6237a --- /dev/null +++ b/seq/aconnect/README.aconnect @@ -0,0 +1,46 @@ +================================================================ + aconnect - control subscriptions + ver.0.1.3 + Copyright (C) 1999-2000 Takashi Iwai +================================================================ + +aconnect is a utility to control subscriptions of two ports as the +third "manager" client. + +For example, the following connects two ports, from 64:0 to 65:0. + + % aconnect 64:0 65:0 + +To disconnect the existing subscription, use -d option. + + % aconnect -d 64:0 65:0 + +To see which port is available as input port, run the following +command: + + % aconnect -i + client 0: 'System' [type=kernel] + 0 'Timer ' + 1 'Announce ' + client 64: '0: MIDI Synth' [type=kernel] + 0 'card 0: synth-midi: 0' + +Similary, to see the output ports, use -o flag. + + % aconnect -o + client 64: '0: MIDI Synth' [type=kernel] + 0 'card 0: synth-midi: 0' + client 65: 'AWE Wave Table Synth : 0' [type=kernel] + 0 'Emu8000 port 0 ' + 1 'Emu8000 port 1 ' + 2 'Emu8000 port 2 ' + 3 'Emu8000 port 3 ' + +The option -l together with -i or -o shows subscribers for each port. + +Ports are connected exclusively when the option -e is specified. + +For modifying time-stamp with a queue, use -r or -t option followed by +a queue index which updates the time-stamp. Former uses real-time queue, +while the latter uses tick queue. The queue must be used (not necessarily +owned) by the receiver client. diff --git a/seq/aconnect/aconnect.1 b/seq/aconnect/aconnect.1 new file mode 100644 index 0000000..2050187 --- /dev/null +++ b/seq/aconnect/aconnect.1 @@ -0,0 +1,145 @@ +.TH aconnect 1 "August 31, 2000" +.de EX +.nf +.ft CW +.. +.de EE +.ft R +.fi +.. +.SH NAME +aconnect \- ALSA sequencer connection manager + +.SH SYNOPSIS +.B aconnect +[\-d] [\-options] sender receiver +.br +.B aconnect +\-i|\-o [\-options] +.br +.B aconnect +\-x + +.SH DESCRIPTION +.B aconnect +is a utility to connect and disconnect two existing ports on ALSA sequencer +system. +The ports with the arbitrary subscription permission, such as created +by +.B aseqview(1), +can be connected to any (MIDI) device ports using +.B aconnect. +For example, to connect from port 64:0 to 65:0, run as follows: +.IP "" 4 +% aconnect 64:0 65:0 +.PP +The connection is one-way, and the whole data to the sender port (64:0) +is redirected to the receiver port (65:0). When another port (e.g. 65:1) +is attached to the same sender port, the data is sent to both receiver +ports. +For disconnection, use +.B \-d +option. +.sp +.EX +% aconnect \-d 64:0 65:0 +.EE +.PP +The address can be given using the client's name. +.sp +.EX +% aconnect External:0 Emu8000:1 +.EE +.PP +Then the port 0 of the client matching with the string "External" is +connected to the port 1 of the client matching with the "Emu8000". +.PP +Another function of +.B aconnect +is to list the present ports +on the given condition. +The input ports, which may become +.I sender +ports, can be listed with +.B \-i +option. +.sp +.EX +% aconnect \-i +client 0: 'System' [type=kernel] + 0 'Timer ' + 1 'Announce ' +client 64: 'External MIDI\-0' [type=kernel] + 0 'MIDI 0\-0 ' +.EE +.PP +Similarly, to see the output ports, use +.B \-o +flag. +.PP +You can remove all existing exported connections using +.B \-x +option. This function is useful for terminating the ALSA drivers, +because the modules with sequencer connections cannot be unloaded +unless their connections are removed. + +.SH OPTIONS +.SS CONNECTION MANAGEMENT +.TP +.B \-d, \-\-disconnect +Disconnect the given subscription. +.TP +.B \-e, \-\-exclusive +Connect ports with exclusive mode. +Both sender and receiver ports can be no longer connected by any other ports. +.TP +.B \-r, \-\-real queue +Convert time-stamps of event packets to the current value of the given +.I real-time +queue. +This is option is, however, not so useful, since +the receiver port must use (not necessarily own) the specified queue. +.TP +.B \-t, \-\-tick queue +Like +.B \-r +option, but +time-stamps are converted to the current value of the given +.I tick +queue. + +.SS LIST PORTS +.TP +.B \-i, \-\-input +List existing input (readable) ports. +This option is exclusive to +.B \-o. +.TP +.B \-o, \-\-output +List existing output (writable) ports. +This option is exclusive to +.B \-i. +.TP +.B \-l, \-\-list +List the current connection status. The connected and connecting ports +from/to each port are listed together. +The suffix flag +.B [ex] +means the connection is exclusive. +The suffix flag +.B [real:#] +and +.B [tick:#] +mean the connection includes real-time and tick conversion on the listed +queue, respectively. + +.SS REMOVE ALL CONNECTIONS +.TP +.B \-x, \-\-removeall +Remove all exported connections. + +.SH "SEE ALSO" +aseqnet(1), aseqview(1) + +.SH AUTHOR +Takashi Iwai diff --git a/seq/aconnect/aconnect.c b/seq/aconnect/aconnect.c new file mode 100644 index 0000000..8c66cfd --- /dev/null +++ b/seq/aconnect/aconnect.c @@ -0,0 +1,392 @@ +/* + * connect / disconnect two subscriber ports + * ver.0.1.3 + * + * Copyright (C) 1999 Takashi Iwai + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "gettext.h" + +static void error_handler(const char *file, int line, const char *function, int err, const char *fmt, ...) +{ + va_list arg; + + if (err == ENOENT) /* Ignore those misleading "warnings" */ + return; + va_start(arg, fmt); + fprintf(stderr, "ALSA lib %s:%i:(%s) ", file, line, function); + vfprintf(stderr, fmt, arg); + if (err) + fprintf(stderr, ": %s", snd_strerror(err)); + putc('\n', stderr); + va_end(arg); +} + +static void usage(void) +{ + printf(_("aconnect - ALSA sequencer connection manager\n")); + printf(_("Copyright (C) 1999-2000 Takashi Iwai\n")); + printf(_("Usage:\n")); + printf(_(" * Connection/disconnection between two ports\n")); + printf(_(" aconnect [-options] sender receiver\n")); + printf(_(" sender, receiver = client:port pair\n")); + printf(_(" -d,--disconnect disconnect\n")); + printf(_(" -e,--exclusive exclusive connection\n")); + printf(_(" -r,--real # convert real-time-stamp on queue\n")); + printf(_(" -t,--tick # convert tick-time-stamp on queue\n")); + printf(_(" * List connected ports (no subscription action)\n")); + printf(_(" aconnect -i|-o [-options]\n")); + printf(_(" -i,--input list input (readable) ports\n")); + printf(_(" -o,--output list output (writable) ports\n")); + printf(_(" -l,--list list current connections of each port\n")); + printf(_(" * Remove all exported connections\n")); + printf(_(" -x, --removeall\n")); +} + +/* + * check permission (capability) of specified port + */ + +#define LIST_INPUT 1 +#define LIST_OUTPUT 2 + +#define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) + +static int check_permission(snd_seq_port_info_t *pinfo, int perm) +{ + if (perm) { + if (perm & LIST_INPUT) { + if (perm_ok(pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ)) + goto __ok; + } + if (perm & LIST_OUTPUT) { + if (perm_ok(pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE)) + goto __ok; + } + return 0; + } + __ok: + if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_NO_EXPORT) + return 0; + return 1; +} + +/* + * list subscribers of specified type + */ +static void list_each_subs(snd_seq_t *seq, snd_seq_query_subscribe_t *subs, int type, const char *msg) +{ + int count = 0; + snd_seq_query_subscribe_set_type(subs, type); + snd_seq_query_subscribe_set_index(subs, 0); + while (snd_seq_query_port_subscribers(seq, subs) >= 0) { + const snd_seq_addr_t *addr; + if (count++ == 0) + printf("\t%s: ", msg); + else + printf(", "); + addr = snd_seq_query_subscribe_get_addr(subs); + printf("%d:%d", addr->client, addr->port); + if (snd_seq_query_subscribe_get_exclusive(subs)) + printf("[ex]"); + if (snd_seq_query_subscribe_get_time_update(subs)) + printf("[%s:%d]", + (snd_seq_query_subscribe_get_time_real(subs) ? "real" : "tick"), + snd_seq_query_subscribe_get_queue(subs)); + snd_seq_query_subscribe_set_index(subs, snd_seq_query_subscribe_get_index(subs) + 1); + } + if (count > 0) + printf("\n"); +} + +/* + * list subscribers + */ +static void list_subscribers(snd_seq_t *seq, const snd_seq_addr_t *addr) +{ + snd_seq_query_subscribe_t *subs; + snd_seq_query_subscribe_alloca(&subs); + snd_seq_query_subscribe_set_root(subs, addr); + list_each_subs(seq, subs, SND_SEQ_QUERY_SUBS_READ, _("Connecting To")); + list_each_subs(seq, subs, SND_SEQ_QUERY_SUBS_WRITE, _("Connected From")); +} + +/* + * search all ports + */ +typedef void (*action_func_t)(snd_seq_t *seq, snd_seq_client_info_t *cinfo, snd_seq_port_info_t *pinfo, int count); + +static void do_search_port(snd_seq_t *seq, int perm, action_func_t do_action) +{ + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + int count; + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(seq, cinfo) >= 0) { + /* reset query info */ + snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo)); + snd_seq_port_info_set_port(pinfo, -1); + count = 0; + while (snd_seq_query_next_port(seq, pinfo) >= 0) { + if (check_permission(pinfo, perm)) { + do_action(seq, cinfo, pinfo, count); + count++; + } + } + } +} + + +static void print_port(snd_seq_t *seq, snd_seq_client_info_t *cinfo, + snd_seq_port_info_t *pinfo, int count) +{ + if (! count) { + printf(_("client %d: '%s' [type=%s]\n"), + snd_seq_client_info_get_client(cinfo), + snd_seq_client_info_get_name(cinfo), + (snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? + _("user") : _("kernel"))); + } + printf(" %3d '%-16s'\n", + snd_seq_port_info_get_port(pinfo), + snd_seq_port_info_get_name(pinfo)); +} + +static void print_port_and_subs(snd_seq_t *seq, snd_seq_client_info_t *cinfo, + snd_seq_port_info_t *pinfo, int count) +{ + print_port(seq, cinfo, pinfo, count); + list_subscribers(seq, snd_seq_port_info_get_addr(pinfo)); +} + + +/* + * remove all (exported) connections + */ +static void remove_connection(snd_seq_t *seq, snd_seq_client_info_t *cinfo, + snd_seq_port_info_t *pinfo, int count) +{ + snd_seq_query_subscribe_t *query; + snd_seq_port_info_t *port; + snd_seq_port_subscribe_t *subs; + + snd_seq_query_subscribe_alloca(&query); + snd_seq_query_subscribe_set_root(query, snd_seq_port_info_get_addr(pinfo)); + snd_seq_query_subscribe_set_type(query, SND_SEQ_QUERY_SUBS_READ); + snd_seq_query_subscribe_set_index(query, 0); + + snd_seq_port_info_alloca(&port); + snd_seq_port_subscribe_alloca(&subs); + + while (snd_seq_query_port_subscribers(seq, query) >= 0) { + const snd_seq_addr_t *sender = snd_seq_query_subscribe_get_root(query); + const snd_seq_addr_t *dest = snd_seq_query_subscribe_get_addr(query); + + if (snd_seq_get_any_port_info(seq, dest->client, dest->port, port) < 0 || + !(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_WRITE) || + (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT)) { + snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1); + continue; + } + snd_seq_port_subscribe_set_queue(subs, snd_seq_query_subscribe_get_queue(query)); + snd_seq_port_subscribe_set_sender(subs, sender); + snd_seq_port_subscribe_set_dest(subs, dest); + if (snd_seq_unsubscribe_port(seq, subs) < 0) { + snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1); + } + } +} + +static void remove_all_connections(snd_seq_t *seq) +{ + do_search_port(seq, 0, remove_connection); +} + + +/* + * main.. + */ + +enum { + SUBSCRIBE, UNSUBSCRIBE, LIST, REMOVE_ALL +}; + +static const struct option long_option[] = { + {"disconnect", 0, NULL, 'd'}, + {"input", 0, NULL, 'i'}, + {"output", 0, NULL, 'o'}, + {"real", 1, NULL, 'r'}, + {"tick", 1, NULL, 't'}, + {"exclusive", 0, NULL, 'e'}, + {"list", 0, NULL, 'l'}, + {"removeall", 0, NULL, 'x'}, + {NULL, 0, NULL, 0}, +}; + +int main(int argc, char **argv) +{ + int c; + snd_seq_t *seq; + int queue = 0, convert_time = 0, convert_real = 0, exclusive = 0; + int command = SUBSCRIBE; + int list_perm = 0; + int client; + int list_subs = 0; + snd_seq_port_subscribe_t *subs; + snd_seq_addr_t sender, dest; + +#ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + textdomain(PACKAGE); +#endif + + while ((c = getopt_long(argc, argv, "dior:t:elx", long_option, NULL)) != -1) { + switch (c) { + case 'd': + command = UNSUBSCRIBE; + break; + case 'i': + command = LIST; + list_perm |= LIST_INPUT; + break; + case 'o': + command = LIST; + list_perm |= LIST_OUTPUT; + break; + case 'e': + exclusive = 1; + break; + case 'r': + queue = atoi(optarg); + convert_time = 1; + convert_real = 1; + break; + case 't': + queue = atoi(optarg); + convert_time = 1; + convert_real = 0; + break; + case 'l': + list_subs = 1; + break; + case 'x': + command = REMOVE_ALL; + break; + default: + usage(); + exit(1); + } + } + + if (snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0) < 0) { + fprintf(stderr, _("can't open sequencer\n")); + return 1; + } + + snd_lib_error_set_handler(error_handler); + + switch (command) { + case LIST: + do_search_port(seq, list_perm, + list_subs ? print_port_and_subs : print_port); + snd_seq_close(seq); + return 0; + case REMOVE_ALL: + remove_all_connections(seq); + snd_seq_close(seq); + return 0; + } + + /* connection or disconnection */ + + if (optind + 2 > argc) { + snd_seq_close(seq); + usage(); + exit(1); + } + + if ((client = snd_seq_client_id(seq)) < 0) { + snd_seq_close(seq); + fprintf(stderr, _("can't get client id\n")); + return 1; + } + + /* set client info */ + if (snd_seq_set_client_name(seq, "ALSA Connector") < 0) { + snd_seq_close(seq); + fprintf(stderr, _("can't set client info\n")); + return 1; + } + + /* set subscription */ + if (snd_seq_parse_address(seq, &sender, argv[optind]) < 0) { + snd_seq_close(seq); + fprintf(stderr, _("invalid sender address %s\n"), argv[optind]); + return 1; + } + if (snd_seq_parse_address(seq, &dest, argv[optind + 1]) < 0) { + snd_seq_close(seq); + fprintf(stderr, _("invalid destination address %s\n"), argv[optind + 1]); + return 1; + } + snd_seq_port_subscribe_alloca(&subs); + snd_seq_port_subscribe_set_sender(subs, &sender); + snd_seq_port_subscribe_set_dest(subs, &dest); + snd_seq_port_subscribe_set_queue(subs, queue); + snd_seq_port_subscribe_set_exclusive(subs, exclusive); + snd_seq_port_subscribe_set_time_update(subs, convert_time); + snd_seq_port_subscribe_set_time_real(subs, convert_real); + + if (command == UNSUBSCRIBE) { + if (snd_seq_get_port_subscription(seq, subs) < 0) { + snd_seq_close(seq); + fprintf(stderr, _("No subscription is found\n")); + return 1; + } + if (snd_seq_unsubscribe_port(seq, subs) < 0) { + snd_seq_close(seq); + fprintf(stderr, _("Disconnection failed (%s)\n"), snd_strerror(errno)); + return 1; + } + } else { + if (snd_seq_get_port_subscription(seq, subs) == 0) { + snd_seq_close(seq); + fprintf(stderr, _("Connection is already subscribed\n")); + return 1; + } + if (snd_seq_subscribe_port(seq, subs) < 0) { + snd_seq_close(seq); + fprintf(stderr, _("Connection failed (%s)\n"), snd_strerror(errno)); + return 1; + } + } + + snd_seq_close(seq); + + return 0; +} diff --git a/seq/aplaymidi/Makefile.am b/seq/aplaymidi/Makefile.am new file mode 100644 index 0000000..bed2a0e --- /dev/null +++ b/seq/aplaymidi/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = aplaymidi.1 arecordmidi.1 + +bin_PROGRAMS = aplaymidi arecordmidi +man_MANS = aplaymidi.1 arecordmidi.1 diff --git a/seq/aplaymidi/Makefile.in b/seq/aplaymidi/Makefile.in new file mode 100644 index 0000000..4d0e88e --- /dev/null +++ b/seq/aplaymidi/Makefile.in @@ -0,0 +1,585 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = aplaymidi$(EXEEXT) arecordmidi$(EXEEXT) +subdir = seq/aplaymidi +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +aplaymidi_SOURCES = aplaymidi.c +aplaymidi_OBJECTS = aplaymidi.$(OBJEXT) +aplaymidi_LDADD = $(LDADD) +arecordmidi_SOURCES = arecordmidi.c +arecordmidi_OBJECTS = arecordmidi.$(OBJEXT) +arecordmidi_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = aplaymidi.c arecordmidi.c +DIST_SOURCES = aplaymidi.c arecordmidi.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = aplaymidi.1 arecordmidi.1 +man_MANS = aplaymidi.1 arecordmidi.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign seq/aplaymidi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign seq/aplaymidi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +aplaymidi$(EXEEXT): $(aplaymidi_OBJECTS) $(aplaymidi_DEPENDENCIES) + @rm -f aplaymidi$(EXEEXT) + $(LINK) $(aplaymidi_OBJECTS) $(aplaymidi_LDADD) $(LIBS) +arecordmidi$(EXEEXT): $(arecordmidi_OBJECTS) $(arecordmidi_DEPENDENCIES) + @rm -f arecordmidi$(EXEEXT) + $(LINK) $(arecordmidi_OBJECTS) $(arecordmidi_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aplaymidi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arecordmidi.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/seq/aplaymidi/aplaymidi.1 b/seq/aplaymidi/aplaymidi.1 new file mode 100644 index 0000000..0134129 --- /dev/null +++ b/seq/aplaymidi/aplaymidi.1 @@ -0,0 +1,55 @@ +.TH APLAYMIDI 1 "15 Feb 2004" + +.SH NAME +aplaymidi \- play Standard MIDI Files + +.SH SYNOPSIS +.B aplaymidi +\-p client:port[,...] [\-d delay] midifile ... + +.SH DESCRIPTION +.B aplaymidi +is a command-line utility that plays the specified MIDI file(s) to one +or more ALSA sequencer ports. + +.SH OPTIONS + +.TP +.I \-h, \-\-help +Prints a list of options. + +.TP +.I \-V, \-\-version +Prints the current version. + +.TP +.I \-l, \-\-list +Prints a list of possible output ports. + +.TP +.I \-p, \-\-port=client:port,... +Sets the sequencer port(s) to which the events in the MIDI file(s) are +sent. + +A client can be specified by its number, its name, or a prefix of its +name. A port is specified by its number; for port 0 of a client, the +":0" part of the port specification can be omitted. + +For compatibility with +.B pmidi(1), +the port specification is taken from the +.I ALSA_OUTPUT_PORTS +environment variable if none is given on the command line. + +.TP +.I \-d, \-\-delay=seconds +Specifies how long to wait after the end of each MIDI file, +to allow the last notes to die away. + +.SH SEE ALSO +pmidi(1) +.br +playmidi(1) + +.SH AUTHOR +Clemens Ladisch diff --git a/seq/aplaymidi/aplaymidi.c b/seq/aplaymidi/aplaymidi.c new file mode 100644 index 0000000..ad508b3 --- /dev/null +++ b/seq/aplaymidi/aplaymidi.c @@ -0,0 +1,932 @@ +/* + * aplaymidi.c - play Standard MIDI Files to sequencer port(s) + * + * Copyright (c) 2004-2006 Clemens Ladisch + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* TODO: sequencer queue timer selection */ + +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "version.h" + +/* + * 31.25 kbaud, one start bit, eight data bits, two stop bits. + * (The MIDI spec says one stop bit, but every transmitter uses two, just to be + * sure, so we better not exceed that to avoid overflowing the output buffer.) + */ +#define MIDI_BYTES_PER_SEC (31250 / (1 + 8 + 2)) + +/* + * A MIDI event after being parsed/loaded from the file. + * There could be made a case for using snd_seq_event_t instead. + */ +struct event { + struct event *next; /* linked list */ + + unsigned char type; /* SND_SEQ_EVENT_xxx */ + unsigned char port; /* port index */ + unsigned int tick; + union { + unsigned char d[3]; /* channel and data bytes */ + int tempo; + unsigned int length; /* length of sysex data */ + } data; + unsigned char sysex[0]; +}; + +struct track { + struct event *first_event; /* list of all events in this track */ + int end_tick; /* length of this track */ + + struct event *current_event; /* used while loading and playing */ +}; + +static snd_seq_t *seq; +static int client; +static int port_count; +static snd_seq_addr_t *ports; +static int queue; +static int end_delay = 2; +static const char *file_name; +static FILE *file; +static int file_offset; /* current offset in input file */ +static int num_tracks; +static struct track *tracks; +static int smpte_timing; + +/* prints an error message to stderr */ +static void errormsg(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); +} + +/* prints an error message to stderr, and dies */ +static void fatal(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +/* memory allocation error handling */ +static void check_mem(void *p) +{ + if (!p) + fatal("Out of memory"); +} + +/* error handling for ALSA functions */ +static void check_snd(const char *operation, int err) +{ + if (err < 0) + fatal("Cannot %s - %s", operation, snd_strerror(err)); +} + +static void init_seq(void) +{ + int err; + + /* open sequencer */ + err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0); + check_snd("open sequencer", err); + + /* set our name (otherwise it's "Client-xxx") */ + err = snd_seq_set_client_name(seq, "aplaymidi"); + check_snd("set client name", err); + + /* find out who we actually are */ + client = snd_seq_client_id(seq); + check_snd("get client id", client); +} + +/* parses one or more port addresses from the string */ +static void parse_ports(const char *arg) +{ + char *buf, *s, *port_name; + int err; + + /* make a copy of the string because we're going to modify it */ + buf = strdup(arg); + check_mem(buf); + + for (port_name = s = buf; s; port_name = s + 1) { + /* Assume that ports are separated by commas. We don't use + * spaces because those are valid in client names. */ + s = strchr(port_name, ','); + if (s) + *s = '\0'; + + ++port_count; + ports = realloc(ports, port_count * sizeof(snd_seq_addr_t)); + check_mem(ports); + + err = snd_seq_parse_address(seq, &ports[port_count - 1], port_name); + if (err < 0) + fatal("Invalid port %s - %s", port_name, snd_strerror(err)); + } + + free(buf); +} + +static void create_source_port(void) +{ + snd_seq_port_info_t *pinfo; + int err; + + snd_seq_port_info_alloca(&pinfo); + + /* the first created port is 0 anyway, but let's make sure ... */ + snd_seq_port_info_set_port(pinfo, 0); + snd_seq_port_info_set_port_specified(pinfo, 1); + + snd_seq_port_info_set_name(pinfo, "aplaymidi"); + + snd_seq_port_info_set_capability(pinfo, 0); /* sic */ + snd_seq_port_info_set_type(pinfo, + SND_SEQ_PORT_TYPE_MIDI_GENERIC | + SND_SEQ_PORT_TYPE_APPLICATION); + + err = snd_seq_create_port(seq, pinfo); + check_snd("create port", err); +} + +static void create_queue(void) +{ + queue = snd_seq_alloc_named_queue(seq, "aplaymidi"); + check_snd("create queue", queue); + /* the queue is now locked, which is just fine */ +} + +static void connect_ports(void) +{ + int i, err; + + /* + * We send MIDI events with explicit destination addresses, so we don't + * need any connections to the playback ports. But we connect to those + * anyway to force any underlying RawMIDI ports to remain open while + * we're playing - otherwise, ALSA would reset the port after every + * event. + */ + for (i = 0; i < port_count; ++i) { + err = snd_seq_connect_to(seq, 0, ports[i].client, ports[i].port); + if (err < 0) + fatal("Cannot connect to port %d:%d - %s", + ports[i].client, ports[i].port, snd_strerror(err)); + } +} + +static int read_byte(void) +{ + ++file_offset; + return getc(file); +} + +/* reads a little-endian 32-bit integer */ +static int read_32_le(void) +{ + int value; + value = read_byte(); + value |= read_byte() << 8; + value |= read_byte() << 16; + value |= read_byte() << 24; + return !feof(file) ? value : -1; +} + +/* reads a 4-character identifier */ +static int read_id(void) +{ + return read_32_le(); +} +#define MAKE_ID(c1, c2, c3, c4) ((c1) | ((c2) << 8) | ((c3) << 16) | ((c4) << 24)) + +/* reads a fixed-size big-endian number */ +static int read_int(int bytes) +{ + int c, value = 0; + + do { + c = read_byte(); + if (c == EOF) + return -1; + value = (value << 8) | c; + } while (--bytes); + return value; +} + +/* reads a variable-length number */ +static int read_var(void) +{ + int value, c; + + c = read_byte(); + value = c & 0x7f; + if (c & 0x80) { + c = read_byte(); + value = (value << 7) | (c & 0x7f); + if (c & 0x80) { + c = read_byte(); + value = (value << 7) | (c & 0x7f); + if (c & 0x80) { + c = read_byte(); + value = (value << 7) | c; + if (c & 0x80) + return -1; + } + } + } + return !feof(file) ? value : -1; +} + +/* allocates a new event */ +static struct event *new_event(struct track *track, int sysex_length) +{ + struct event *event; + + event = malloc(sizeof(struct event) + sysex_length); + check_mem(event); + + event->next = NULL; + + /* append at the end of the track's linked list */ + if (track->current_event) + track->current_event->next = event; + else + track->first_event = event; + track->current_event = event; + + return event; +} + +static void skip(int bytes) +{ + while (bytes > 0) + read_byte(), --bytes; +} + +/* reads one complete track from the file */ +static int read_track(struct track *track, int track_end) +{ + int tick = 0; + unsigned char last_cmd = 0; + unsigned char port = 0; + + /* the current file position is after the track ID and length */ + while (file_offset < track_end) { + unsigned char cmd; + struct event *event; + int delta_ticks, len, c; + + delta_ticks = read_var(); + if (delta_ticks < 0) + break; + tick += delta_ticks; + + c = read_byte(); + if (c < 0) + break; + + if (c & 0x80) { + /* have command */ + cmd = c; + if (cmd < 0xf0) + last_cmd = cmd; + } else { + /* running status */ + ungetc(c, file); + file_offset--; + cmd = last_cmd; + if (!cmd) + goto _error; + } + + switch (cmd >> 4) { + /* maps SMF events to ALSA sequencer events */ + static const unsigned char cmd_type[] = { + [0x8] = SND_SEQ_EVENT_NOTEOFF, + [0x9] = SND_SEQ_EVENT_NOTEON, + [0xa] = SND_SEQ_EVENT_KEYPRESS, + [0xb] = SND_SEQ_EVENT_CONTROLLER, + [0xc] = SND_SEQ_EVENT_PGMCHANGE, + [0xd] = SND_SEQ_EVENT_CHANPRESS, + [0xe] = SND_SEQ_EVENT_PITCHBEND + }; + + case 0x8: /* channel msg with 2 parameter bytes */ + case 0x9: + case 0xa: + case 0xb: + case 0xe: + event = new_event(track, 0); + event->type = cmd_type[cmd >> 4]; + event->port = port; + event->tick = tick; + event->data.d[0] = cmd & 0x0f; + event->data.d[1] = read_byte() & 0x7f; + event->data.d[2] = read_byte() & 0x7f; + break; + + case 0xc: /* channel msg with 1 parameter byte */ + case 0xd: + event = new_event(track, 0); + event->type = cmd_type[cmd >> 4]; + event->port = port; + event->tick = tick; + event->data.d[0] = cmd & 0x0f; + event->data.d[1] = read_byte() & 0x7f; + break; + + case 0xf: + switch (cmd) { + case 0xf0: /* sysex */ + case 0xf7: /* continued sysex, or escaped commands */ + len = read_var(); + if (len < 0) + goto _error; + if (cmd == 0xf0) + ++len; + event = new_event(track, len); + event->type = SND_SEQ_EVENT_SYSEX; + event->port = port; + event->tick = tick; + event->data.length = len; + if (cmd == 0xf0) { + event->sysex[0] = 0xf0; + c = 1; + } else { + c = 0; + } + for (; c < len; ++c) + event->sysex[c] = read_byte(); + break; + + case 0xff: /* meta event */ + c = read_byte(); + len = read_var(); + if (len < 0) + goto _error; + + switch (c) { + case 0x21: /* port number */ + if (len < 1) + goto _error; + port = read_byte() % port_count; + skip(len - 1); + break; + + case 0x2f: /* end of track */ + track->end_tick = tick; + skip(track_end - file_offset); + return 1; + + case 0x51: /* tempo */ + if (len < 3) + goto _error; + if (smpte_timing) { + /* SMPTE timing doesn't change */ + skip(len); + } else { + event = new_event(track, 0); + event->type = SND_SEQ_EVENT_TEMPO; + event->port = port; + event->tick = tick; + event->data.tempo = read_byte() << 16; + event->data.tempo |= read_byte() << 8; + event->data.tempo |= read_byte(); + skip(len - 3); + } + break; + + default: /* ignore all other meta events */ + skip(len); + break; + } + break; + + default: /* invalid Fx command */ + goto _error; + } + break; + + default: /* cannot happen */ + goto _error; + } + } +_error: + errormsg("%s: invalid MIDI data (offset %#x)", file_name, file_offset); + return 0; +} + +/* reads an entire MIDI file */ +static int read_smf(void) +{ + int header_len, type, time_division, i, err; + snd_seq_queue_tempo_t *queue_tempo; + + /* the curren position is immediately after the "MThd" id */ + header_len = read_int(4); + if (header_len < 6) { +invalid_format: + errormsg("%s: invalid file format", file_name); + return 0; + } + + type = read_int(2); + if (type != 0 && type != 1) { + errormsg("%s: type %d format is not supported", file_name, type); + return 0; + } + + num_tracks = read_int(2); + if (num_tracks < 1 || num_tracks > 1000) { + errormsg("%s: invalid number of tracks (%d)", file_name, num_tracks); + num_tracks = 0; + return 0; + } + tracks = calloc(num_tracks, sizeof(struct track)); + if (!tracks) { + errormsg("out of memory"); + num_tracks = 0; + return 0; + } + + time_division = read_int(2); + if (time_division < 0) + goto invalid_format; + + /* interpret and set tempo */ + snd_seq_queue_tempo_alloca(&queue_tempo); + smpte_timing = !!(time_division & 0x8000); + if (!smpte_timing) { + /* time_division is ticks per quarter */ + snd_seq_queue_tempo_set_tempo(queue_tempo, 500000); /* default: 120 bpm */ + snd_seq_queue_tempo_set_ppq(queue_tempo, time_division); + } else { + /* upper byte is negative frames per second */ + i = 0x80 - ((time_division >> 8) & 0x7f); + /* lower byte is ticks per frame */ + time_division &= 0xff; + /* now pretend that we have quarter-note based timing */ + switch (i) { + case 24: + snd_seq_queue_tempo_set_tempo(queue_tempo, 500000); + snd_seq_queue_tempo_set_ppq(queue_tempo, 12 * time_division); + break; + case 25: + snd_seq_queue_tempo_set_tempo(queue_tempo, 400000); + snd_seq_queue_tempo_set_ppq(queue_tempo, 10 * time_division); + break; + case 29: /* 30 drop-frame */ + snd_seq_queue_tempo_set_tempo(queue_tempo, 100000000); + snd_seq_queue_tempo_set_ppq(queue_tempo, 2997 * time_division); + break; + case 30: + snd_seq_queue_tempo_set_tempo(queue_tempo, 500000); + snd_seq_queue_tempo_set_ppq(queue_tempo, 15 * time_division); + break; + default: + errormsg("%s: invalid number of SMPTE frames per second (%d)", + file_name, i); + return 0; + } + } + err = snd_seq_set_queue_tempo(seq, queue, queue_tempo); + if (err < 0) { + errormsg("Cannot set queue tempo (%u/%i)", + snd_seq_queue_tempo_get_tempo(queue_tempo), + snd_seq_queue_tempo_get_ppq(queue_tempo)); + return 0; + } + + /* read tracks */ + for (i = 0; i < num_tracks; ++i) { + int len; + + /* search for MTrk chunk */ + for (;;) { + int id = read_id(); + len = read_int(4); + if (feof(file)) { + errormsg("%s: unexpected end of file", file_name); + return 0; + } + if (len < 0 || len >= 0x10000000) { + errormsg("%s: invalid chunk length %d", file_name, len); + return 0; + } + if (id == MAKE_ID('M', 'T', 'r', 'k')) + break; + skip(len); + } + if (!read_track(&tracks[i], file_offset + len)) + return 0; + } + return 1; +} + +static int read_riff(void) +{ + /* skip file length */ + read_byte(); + read_byte(); + read_byte(); + read_byte(); + + /* check file type ("RMID" = RIFF MIDI) */ + if (read_id() != MAKE_ID('R', 'M', 'I', 'D')) { +invalid_format: + errormsg("%s: invalid file format", file_name); + return 0; + } + /* search for "data" chunk */ + for (;;) { + int id = read_id(); + int len = read_32_le(); + if (feof(file)) { +data_not_found: + errormsg("%s: data chunk not found", file_name); + return 0; + } + if (id == MAKE_ID('d', 'a', 't', 'a')) + break; + if (len < 0) + goto data_not_found; + skip((len + 1) & ~1); + } + /* the "data" chunk must contain data in SMF format */ + if (read_id() != MAKE_ID('M', 'T', 'h', 'd')) + goto invalid_format; + return read_smf(); +} + +static void cleanup_file_data(void) +{ + int i; + struct event *event; + + for (i = 0; i < num_tracks; ++i) { + event = tracks[i].first_event; + while (event) { + struct event *next = event->next; + free(event); + event = next; + } + } + num_tracks = 0; + free(tracks); + tracks = NULL; +} + +static void handle_big_sysex(snd_seq_event_t *ev) +{ + unsigned int length; + ssize_t event_size; + int err; + + length = ev->data.ext.len; + if (length > MIDI_BYTES_PER_SEC) + ev->data.ext.len = MIDI_BYTES_PER_SEC; + event_size = snd_seq_event_length(ev); + if (event_size + 1 > snd_seq_get_output_buffer_size(seq)) { + err = snd_seq_drain_output(seq); + check_snd("drain output", err); + err = snd_seq_set_output_buffer_size(seq, event_size + 1); + check_snd("set output buffer size", err); + } + while (length > MIDI_BYTES_PER_SEC) { + err = snd_seq_event_output(seq, ev); + check_snd("output event", err); + err = snd_seq_drain_output(seq); + check_snd("drain output", err); + err = snd_seq_sync_output_queue(seq); + check_snd("sync output", err); + if (sleep(1)) + fatal("aborted"); + ev->data.ext.ptr += MIDI_BYTES_PER_SEC; + length -= MIDI_BYTES_PER_SEC; + } + ev->data.ext.len = length; +} + +static void play_midi(void) +{ + snd_seq_event_t ev; + int i, max_tick, err; + + /* calculate length of the entire file */ + max_tick = -1; + for (i = 0; i < num_tracks; ++i) { + if (tracks[i].end_tick > max_tick) + max_tick = tracks[i].end_tick; + } + + /* initialize current position in each track */ + for (i = 0; i < num_tracks; ++i) + tracks[i].current_event = tracks[i].first_event; + + /* common settings for all our events */ + snd_seq_ev_clear(&ev); + ev.queue = queue; + ev.source.port = 0; + ev.flags = SND_SEQ_TIME_STAMP_TICK; + + err = snd_seq_start_queue(seq, queue, NULL); + check_snd("start queue", err); + /* The queue won't be started until the START_QUEUE event is + * actually drained to the kernel, which is exactly what we want. */ + + for (;;) { + struct event* event = NULL; + struct track* event_track = NULL; + int i, min_tick = max_tick + 1; + + /* search next event */ + for (i = 0; i < num_tracks; ++i) { + struct track *track = &tracks[i]; + struct event *e2 = track->current_event; + if (e2 && e2->tick < min_tick) { + min_tick = e2->tick; + event = e2; + event_track = track; + } + } + if (!event) + break; /* end of song reached */ + + /* advance pointer to next event */ + event_track->current_event = event->next; + + /* output the event */ + ev.type = event->type; + ev.time.tick = event->tick; + ev.dest = ports[event->port]; + switch (ev.type) { + case SND_SEQ_EVENT_NOTEON: + case SND_SEQ_EVENT_NOTEOFF: + case SND_SEQ_EVENT_KEYPRESS: + snd_seq_ev_set_fixed(&ev); + ev.data.note.channel = event->data.d[0]; + ev.data.note.note = event->data.d[1]; + ev.data.note.velocity = event->data.d[2]; + break; + case SND_SEQ_EVENT_CONTROLLER: + snd_seq_ev_set_fixed(&ev); + ev.data.control.channel = event->data.d[0]; + ev.data.control.param = event->data.d[1]; + ev.data.control.value = event->data.d[2]; + break; + case SND_SEQ_EVENT_PGMCHANGE: + case SND_SEQ_EVENT_CHANPRESS: + snd_seq_ev_set_fixed(&ev); + ev.data.control.channel = event->data.d[0]; + ev.data.control.value = event->data.d[1]; + break; + case SND_SEQ_EVENT_PITCHBEND: + snd_seq_ev_set_fixed(&ev); + ev.data.control.channel = event->data.d[0]; + ev.data.control.value = + ((event->data.d[1]) | + ((event->data.d[2]) << 7)) - 0x2000; + break; + case SND_SEQ_EVENT_SYSEX: + snd_seq_ev_set_variable(&ev, event->data.length, + event->sysex); + handle_big_sysex(&ev); + break; + case SND_SEQ_EVENT_TEMPO: + snd_seq_ev_set_fixed(&ev); + ev.dest.client = SND_SEQ_CLIENT_SYSTEM; + ev.dest.port = SND_SEQ_PORT_SYSTEM_TIMER; + ev.data.queue.queue = queue; + ev.data.queue.param.value = event->data.tempo; + break; + default: + fatal("Invalid event type %d!", ev.type); + } + + /* this blocks when the output pool has been filled */ + err = snd_seq_event_output(seq, &ev); + check_snd("output event", err); + } + + /* schedule queue stop at end of song */ + snd_seq_ev_set_fixed(&ev); + ev.type = SND_SEQ_EVENT_STOP; + ev.time.tick = max_tick; + ev.dest.client = SND_SEQ_CLIENT_SYSTEM; + ev.dest.port = SND_SEQ_PORT_SYSTEM_TIMER; + ev.data.queue.queue = queue; + err = snd_seq_event_output(seq, &ev); + check_snd("output event", err); + + /* make sure that the sequencer sees all our events */ + err = snd_seq_drain_output(seq); + check_snd("drain output", err); + + /* + * There are three possibilities how to wait until all events have + * been played: + * 1) send an event back to us (like pmidi does), and wait for it; + * 2) wait for the EVENT_STOP notification for our queue which is sent + * by the system timer port (this would require a subscription); + * 3) wait until the output pool is empty. + * The last is the simplest. + */ + err = snd_seq_sync_output_queue(seq); + check_snd("sync output", err); + + /* give the last notes time to die away */ + if (end_delay > 0) + sleep(end_delay); +} + +static void play_file(void) +{ + int ok; + + if (!strcmp(file_name, "-")) + file = stdin; + else + file = fopen(file_name, "rb"); + if (!file) { + errormsg("Cannot open %s - %s", file_name, strerror(errno)); + return; + } + + file_offset = 0; + ok = 0; + + switch (read_id()) { + case MAKE_ID('M', 'T', 'h', 'd'): + ok = read_smf(); + break; + case MAKE_ID('R', 'I', 'F', 'F'): + ok = read_riff(); + break; + default: + errormsg("%s is not a Standard MIDI File", file_name); + break; + } + + if (file != stdin) + fclose(file); + + if (ok) + play_midi(); + + cleanup_file_data(); +} + +static void list_ports(void) +{ + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + + puts(" Port Client name Port name"); + + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(seq, cinfo) >= 0) { + int client = snd_seq_client_info_get_client(cinfo); + + snd_seq_port_info_set_client(pinfo, client); + snd_seq_port_info_set_port(pinfo, -1); + while (snd_seq_query_next_port(seq, pinfo) >= 0) { + /* port must understand MIDI messages */ + if (!(snd_seq_port_info_get_type(pinfo) + & SND_SEQ_PORT_TYPE_MIDI_GENERIC)) + continue; + /* we need both WRITE and SUBS_WRITE */ + if ((snd_seq_port_info_get_capability(pinfo) + & (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE)) + != (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE)) + continue; + printf("%3d:%-3d %-32.32s %s\n", + snd_seq_port_info_get_client(pinfo), + snd_seq_port_info_get_port(pinfo), + snd_seq_client_info_get_name(cinfo), + snd_seq_port_info_get_name(pinfo)); + } + } +} + +static void usage(const char *argv0) +{ + printf( + "Usage: %s -p client:port[,...] [-d delay] midifile ...\n" + "-h, --help this help\n" + "-V, --version print current version\n" + "-l, --list list all possible output ports\n" + "-p, --port=client:port,... set port(s) to play to\n" + "-d, --delay=seconds delay after song ends\n", + argv0); +} + +static void version(void) +{ + puts("aplaymidi version " SND_UTIL_VERSION_STR); +} + +int main(int argc, char *argv[]) +{ + static const char short_options[] = "hVlp:d:"; + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"list", 0, NULL, 'l'}, + {"port", 1, NULL, 'p'}, + {"delay", 1, NULL, 'd'}, + {} + }; + int c; + int do_list = 0; + + init_seq(); + + while ((c = getopt_long(argc, argv, short_options, + long_options, NULL)) != -1) { + switch (c) { + case 'h': + usage(argv[0]); + return 0; + case 'V': + version(); + return 0; + case 'l': + do_list = 1; + break; + case 'p': + parse_ports(optarg); + break; + case 'd': + end_delay = atoi(optarg); + break; + default: + usage(argv[0]); + return 1; + } + } + + if (do_list) { + list_ports(); + } else { + if (port_count < 1) { + /* use env var for compatibility with pmidi */ + const char *ports_str = getenv("ALSA_OUTPUT_PORTS"); + if (ports_str) + parse_ports(ports_str); + if (port_count < 1) { + errormsg("Please specify at least one port with --port."); + return 1; + } + } + if (optind >= argc) { + errormsg("Please specify a file to play."); + return 1; + } + + create_source_port(); + create_queue(); + connect_ports(); + + for (; optind < argc; ++optind) { + file_name = argv[optind]; + play_file(); + } + } + snd_seq_close(seq); + return 0; +} diff --git a/seq/aplaymidi/arecordmidi.1 b/seq/aplaymidi/arecordmidi.1 new file mode 100644 index 0000000..78b3a3a --- /dev/null +++ b/seq/aplaymidi/arecordmidi.1 @@ -0,0 +1,82 @@ +.TH ARECORDMIDI 1 "17 Sep 2007" + +.SH NAME +arecordmidi \- record Standard MIDI Files + +.SH SYNOPSIS +.B arecordmidi +\-p client:port[,...] [options] midifile + +.SH DESCRIPTION +.B arecordmidi +is a command-line utility that records a Standard MIDI File from one or +more ALSA sequencer ports. + +To stop recording, press Ctrl+C. + +.SH OPTIONS + +.TP +.I \-h,\-\-help +Prints a list of options. + +.TP +.I \-V,\-\-version +Prints the current version. + +.TP +.I \-l,\-\-list +Prints a list of possible input ports. + +.TP +.I \-p,\-\-port=client:port,... +Sets the sequencer port(s) from which events are recorded. + +A client can be specified by its number, its name, or a prefix of its +name. A port is specified by its number; for port 0 of a client, the +":0" part of the port specification can be omitted. + +.TP +.I \-b,\-\-bpm=beats +Sets the musical tempo of the MIDI file, in beats per minute. +The default value is 120 BPM. + +.TP +.I \-f,\-\-fps=frames +Sets the SMPTE resolution, in frames per second. +Possible values are 24, 25, 29.97 (for 30 drop-frame), and 30. + +.TP +.I \-t,\-\-ticks=ticks +Sets the resolution of timestamps (ticks) in the MIDI file, +in ticks per beat (when using musical tempo) or ticks per frame +(when using SMPTE timing). +The default value is 384 ticks/beat or 40 ticks/frame, respectively. + +.TP +.I \-s,\-\-split\-channels +Specifies that the data for each MIDI channel should be written to a +separate track in the MIDI file. +This will result in a "format 1" file. +Otherwise, when there is only one track, +.B arecordmidi +will generate a "format 0" file. + +.TP +.I \-m,\-\-metronome=client:port +Plays a metronome signal on the specified sequencer port. + +Metronome sounds are played on channel 10, MIDI notes 33 & 34 (GM2/GS/XG +metronome standard notes), with velocity 100 and duration 1. + +.TP +.I \-i,\-\-timesig=numerator:denominator +Sets the time signature for the MIDI file and metronome. + +The time signature is specified as usual with two numbers, representing +the numerator and denominator of the time signature as it would be +notated. The denominator must be a power of two. Both numbers should be +separated by a colon. The time signature is 4:4 by default. + +.SH AUTHOR +Clemens Ladisch diff --git a/seq/aplaymidi/arecordmidi.c b/seq/aplaymidi/arecordmidi.c new file mode 100644 index 0000000..9628086 --- /dev/null +++ b/seq/aplaymidi/arecordmidi.c @@ -0,0 +1,880 @@ +/* + * arecordmidi.c - record standard MIDI files from sequencer ports + * + * Copyright (c) 2004-2005 Clemens Ladisch + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* TODO: sequencer queue timer selection */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "version.h" + +#define BUFFER_SIZE 4088 + +/* linked list of buffers, stores data as in the .mid file */ +struct buffer { + struct buffer *next; + unsigned char buf[BUFFER_SIZE]; +}; + +struct smf_track { + int size; /* size of entire data */ + int cur_buf_size; /* size of cur_buf */ + struct buffer *cur_buf; + snd_seq_tick_time_t last_tick; /* end of track */ + unsigned char last_command; /* used for running status */ + int used; /* anything record on this track */ + struct buffer first_buf; /* list head */ +}; + +/* timing/sysex + 16 channels */ +#define TRACKS_PER_PORT 17 + +/* metronome settings */ +/* TODO: create options for this */ +#define METRONOME_CHANNEL 9 +#define METRONOME_STRONG_NOTE 34 +#define METRONOME_WEAK_NOTE 33 +#define METRONOME_VELOCITY 100 +#define METRONOME_PROGRAM 0 + +static snd_seq_t *seq; +static int client; +static int port_count; +static snd_seq_addr_t *ports; +static int queue; +static int smpte_timing = 0; +static int beats = 120; +static int frames; +static int ticks = 0; +static FILE *file; +static int channel_split; +static int num_tracks; +static struct smf_track *tracks; +static volatile sig_atomic_t stop = 0; +static int use_metronome = 0; +static snd_seq_addr_t metronome_port; +static int metronome_weak_note = METRONOME_WEAK_NOTE; +static int metronome_strong_note = METRONOME_STRONG_NOTE; +static int metronome_velocity = METRONOME_VELOCITY; +static int metronome_program = METRONOME_PROGRAM; +static int metronome_channel = METRONOME_CHANNEL; +static int ts_num = 4; /* time signature: numerator */ +static int ts_div = 4; /* time signature: denominator */ +static int ts_dd = 2; /* time signature: denominator as a power of two */ + + +/* prints an error message to stderr, and dies */ +static void fatal(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +/* memory allocation error handling */ +static void check_mem(void *p) +{ + if (!p) + fatal("Out of memory"); +} + +/* error handling for ALSA functions */ +static void check_snd(const char *operation, int err) +{ + if (err < 0) + fatal("Cannot %s - %s", operation, snd_strerror(err)); +} + +static void init_seq(void) +{ + int err; + + /* open sequencer */ + err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0); + check_snd("open sequencer", err); + + /* find out our client's id */ + client = snd_seq_client_id(seq); + check_snd("get client id", client); + + /* set our client's name */ + err = snd_seq_set_client_name(seq, "arecordmidi"); + check_snd("set client name", err); +} + +/* parses one or more port addresses from the string */ +static void parse_ports(const char *arg) +{ + char *buf, *s, *port_name; + int err; + + /* make a copy of the string because we're going to modify it */ + buf = strdup(arg); + check_mem(buf); + + for (port_name = s = buf; s; port_name = s + 1) { + /* Assume that ports are separated by commas. We don't use + * spaces because those are valid in client names. */ + s = strchr(port_name, ','); + if (s) + *s = '\0'; + + ++port_count; + ports = realloc(ports, port_count * sizeof(snd_seq_addr_t)); + check_mem(ports); + + err = snd_seq_parse_address(seq, &ports[port_count - 1], port_name); + if (err < 0) + fatal("Invalid port %s - %s", port_name, snd_strerror(err)); + } + + free(buf); +} + +/* parses the metronome port address */ +static void init_metronome(const char *arg) +{ + int err; + + err = snd_seq_parse_address(seq, &metronome_port, arg); + if (err < 0) + fatal("Invalid port %s - %s", arg, snd_strerror(err)); + use_metronome = 1; +} + +/* parses time signature specification */ +static void time_signature(const char *arg) +{ + long x = 0; + char *sep; + + x = strtol(arg, &sep, 10); + if (x < 1 || x > 64 || *sep != ':') + fatal("Invalid time signature (%s)", arg); + ts_num = x; + x = strtol(++sep, NULL, 10); + if (x < 1 || x > 64) + fatal("Invalid time signature (%s)", arg); + ts_div = x; + for (ts_dd = 0; x > 1; x /= 2) + ++ts_dd; +} + +/* + * Metronome implementation + */ +static void metronome_note(unsigned char note, unsigned int tick) +{ + snd_seq_event_t ev; + snd_seq_ev_clear(&ev); + snd_seq_ev_set_note(&ev, metronome_channel, note, metronome_velocity, 1); + snd_seq_ev_schedule_tick(&ev, queue, 0, tick); + snd_seq_ev_set_source(&ev, port_count); + snd_seq_ev_set_subs(&ev); + snd_seq_event_output(seq, &ev); +} + +static void metronome_echo(unsigned int tick) +{ + snd_seq_event_t ev; + snd_seq_ev_clear(&ev); + ev.type = SND_SEQ_EVENT_USR0; + snd_seq_ev_schedule_tick(&ev, queue, 0, tick); + snd_seq_ev_set_source(&ev, port_count); + snd_seq_ev_set_dest(&ev, client, port_count); + snd_seq_event_output(seq, &ev); +} + +static void metronome_pattern(unsigned int tick) +{ + int j, t, duration; + + t = tick; + duration = ticks * 4 / ts_div; + for (j = 0; j < ts_num; j++) { + metronome_note(j ? metronome_weak_note : metronome_strong_note, t); + t += duration; + } + metronome_echo(t); + snd_seq_drain_output(seq); +} + +static void metronome_set_program(void) +{ + snd_seq_event_t ev; + + snd_seq_ev_clear(&ev); + snd_seq_ev_set_pgmchange(&ev, metronome_channel, metronome_program); + snd_seq_ev_set_source(&ev, port_count); + snd_seq_ev_set_subs(&ev); + snd_seq_event_output(seq, &ev); +} + +static void init_tracks(void) +{ + int i; + + /* MIDI RP-019 says we need at least one track per port */ + num_tracks = port_count; + /* Allocate one track for each possible channel. + * Empty tracks won't be written to the file. */ + if (channel_split) + num_tracks *= TRACKS_PER_PORT; + + tracks = calloc(num_tracks, sizeof(struct smf_track)); + check_mem(tracks); + for (i = 0; i < num_tracks; ++i) + tracks[i].cur_buf = &tracks[i].first_buf; +} + +static void create_queue(void) +{ + snd_seq_queue_tempo_t *tempo; + int err; + + queue = snd_seq_alloc_named_queue(seq, "arecordmidi"); + check_snd("create queue", queue); + + snd_seq_queue_tempo_alloca(&tempo); + if (!smpte_timing) { + snd_seq_queue_tempo_set_tempo(tempo, 60000000 / beats); + snd_seq_queue_tempo_set_ppq(tempo, ticks); + } else { + /* + * ALSA doesn't know about the SMPTE time divisions, so + * we pretend to have a musical tempo with the equivalent + * number of ticks/s. + */ + switch (frames) { + case 24: + snd_seq_queue_tempo_set_tempo(tempo, 500000); + snd_seq_queue_tempo_set_ppq(tempo, 12 * ticks); + break; + case 25: + snd_seq_queue_tempo_set_tempo(tempo, 400000); + snd_seq_queue_tempo_set_ppq(tempo, 10 * ticks); + break; + case 29: + snd_seq_queue_tempo_set_tempo(tempo, 100000000); + snd_seq_queue_tempo_set_ppq(tempo, 2997 * ticks); + break; + case 30: + snd_seq_queue_tempo_set_tempo(tempo, 500000); + snd_seq_queue_tempo_set_ppq(tempo, 15 * ticks); + break; + default: + fatal("Invalid SMPTE frames %d", frames); + } + } + err = snd_seq_set_queue_tempo(seq, queue, tempo); + if (err < 0) + fatal("Cannot set queue tempo (%u/%i)", + snd_seq_queue_tempo_get_tempo(tempo), + snd_seq_queue_tempo_get_ppq(tempo)); +} + +static void create_ports(void) +{ + snd_seq_port_info_t *pinfo; + int i, err; + char name[32]; + + snd_seq_port_info_alloca(&pinfo); + + /* common information for all our ports */ + snd_seq_port_info_set_capability(pinfo, + SND_SEQ_PORT_CAP_WRITE | + SND_SEQ_PORT_CAP_SUBS_WRITE); + snd_seq_port_info_set_type(pinfo, + SND_SEQ_PORT_TYPE_MIDI_GENERIC | + SND_SEQ_PORT_TYPE_APPLICATION); + snd_seq_port_info_set_midi_channels(pinfo, 16); + + /* we want to know when the events got delivered to us */ + snd_seq_port_info_set_timestamping(pinfo, 1); + snd_seq_port_info_set_timestamp_queue(pinfo, queue); + + /* our port number is the same as our port index */ + snd_seq_port_info_set_port_specified(pinfo, 1); + for (i = 0; i < port_count; ++i) { + snd_seq_port_info_set_port(pinfo, i); + + sprintf(name, "arecordmidi port %i", i); + snd_seq_port_info_set_name(pinfo, name); + + err = snd_seq_create_port(seq, pinfo); + check_snd("create port", err); + } + + /* create an optional metronome port */ + if (use_metronome) { + snd_seq_port_info_set_port(pinfo, port_count); + snd_seq_port_info_set_name(pinfo, "arecordmidi metronome"); + snd_seq_port_info_set_capability(pinfo, + SND_SEQ_PORT_CAP_READ | + SND_SEQ_PORT_CAP_WRITE); + snd_seq_port_info_set_type(pinfo, SND_SEQ_PORT_TYPE_APPLICATION); + snd_seq_port_info_set_midi_channels(pinfo, 0); + snd_seq_port_info_set_timestamping(pinfo, 0); + err = snd_seq_create_port(seq, pinfo); + check_snd("create metronome port", err); + } +} + +static void connect_ports(void) +{ + int i, err; + + for (i = 0; i < port_count; ++i) { + err = snd_seq_connect_from(seq, i, ports[i].client, ports[i].port); + if (err < 0) + fatal("Cannot connect from port %d:%d - %s", + ports[i].client, ports[i].port, snd_strerror(err)); + } + + /* subscribe the metronome port */ + if (use_metronome) { + err = snd_seq_connect_to(seq, port_count, metronome_port.client, metronome_port.port); + if (err < 0) + fatal("Cannot connect to port %d:%d - %s", + metronome_port.client, metronome_port.port, snd_strerror(err)); + } +} + +/* records a byte to be written to the .mid file */ +static void add_byte(struct smf_track *track, unsigned char byte) +{ + /* make sure we have enough room in the current buffer */ + if (track->cur_buf_size >= BUFFER_SIZE) { + track->cur_buf->next = calloc(1, sizeof(struct buffer)); + if (!track->cur_buf->next) + fatal("out of memory"); + track->cur_buf = track->cur_buf->next; + track->cur_buf_size = 0; + } + + track->cur_buf->buf[track->cur_buf_size++] = byte; + track->size++; +} + +/* record a variable-length quantity */ +static void var_value(struct smf_track *track, int v) +{ + if (v >= (1 << 28)) + add_byte(track, 0x80 | ((v >> 28) & 0x03)); + if (v >= (1 << 21)) + add_byte(track, 0x80 | ((v >> 21) & 0x7f)); + if (v >= (1 << 14)) + add_byte(track, 0x80 | ((v >> 14) & 0x7f)); + if (v >= (1 << 7)) + add_byte(track, 0x80 | ((v >> 7) & 0x7f)); + add_byte(track, v & 0x7f); +} + +/* record the delta time from the last event */ +static void delta_time(struct smf_track *track, const snd_seq_event_t *ev) +{ + int diff = ev->time.tick - track->last_tick; + if (diff < 0) + diff = 0; + var_value(track, diff); + track->last_tick = ev->time.tick; +} + +/* record a status byte (or not if we can use running status) */ +static void command(struct smf_track *track, unsigned char cmd) +{ + if (cmd != track->last_command) + add_byte(track, cmd); + track->last_command = cmd < 0xf0 ? cmd : 0; +} + +/* put port numbers into all tracks */ +static void record_port_numbers(void) +{ + int i; + + for (i = 0; i < num_tracks; ++i) { + var_value(&tracks[i], 0); + add_byte(&tracks[i], 0xff); + add_byte(&tracks[i], 0x21); + var_value(&tracks[i], 1); + if (channel_split) + add_byte(&tracks[i], i / TRACKS_PER_PORT); + else + add_byte(&tracks[i], i); + } +} + +static void record_event(const snd_seq_event_t *ev) +{ + unsigned int i; + struct smf_track *track; + + /* ignore events without proper timestamps */ + if (ev->queue != queue || !snd_seq_ev_is_tick(ev)) + return; + + /* determine which track to record to */ + i = ev->dest.port; + if (i == port_count) { + if (ev->type == SND_SEQ_EVENT_USR0) + metronome_pattern(ev->time.tick); + return; + } + if (channel_split) { + i *= TRACKS_PER_PORT; + if (snd_seq_ev_is_channel_type(ev)) + i += 1 + (ev->data.note.channel & 0xf); + } + if (i >= num_tracks) + return; + track = &tracks[i]; + + switch (ev->type) { + case SND_SEQ_EVENT_NOTEON: + delta_time(track, ev); + command(track, MIDI_CMD_NOTE_ON | (ev->data.note.channel & 0xf)); + add_byte(track, ev->data.note.note & 0x7f); + add_byte(track, ev->data.note.velocity & 0x7f); + break; + case SND_SEQ_EVENT_NOTEOFF: + delta_time(track, ev); + command(track, MIDI_CMD_NOTE_OFF | (ev->data.note.channel & 0xf)); + add_byte(track, ev->data.note.note & 0x7f); + add_byte(track, ev->data.note.velocity & 0x7f); + break; + case SND_SEQ_EVENT_KEYPRESS: + delta_time(track, ev); + command(track, MIDI_CMD_NOTE_PRESSURE | (ev->data.note.channel & 0xf)); + add_byte(track, ev->data.note.note & 0x7f); + add_byte(track, ev->data.note.velocity & 0x7f); + break; + case SND_SEQ_EVENT_CONTROLLER: + delta_time(track, ev); + command(track, MIDI_CMD_CONTROL | (ev->data.control.channel & 0xf)); + add_byte(track, ev->data.control.param & 0x7f); + add_byte(track, ev->data.control.value & 0x7f); + break; + case SND_SEQ_EVENT_PGMCHANGE: + delta_time(track, ev); + command(track, MIDI_CMD_PGM_CHANGE | (ev->data.control.channel & 0xf)); + add_byte(track, ev->data.control.value & 0x7f); + break; + case SND_SEQ_EVENT_CHANPRESS: + delta_time(track, ev); + command(track, MIDI_CMD_CHANNEL_PRESSURE | (ev->data.control.channel & 0xf)); + add_byte(track, ev->data.control.value & 0x7f); + break; + case SND_SEQ_EVENT_PITCHBEND: + delta_time(track, ev); + command(track, MIDI_CMD_BENDER | (ev->data.control.channel & 0xf)); + add_byte(track, (ev->data.control.value + 8192) & 0x7f); + add_byte(track, ((ev->data.control.value + 8192) >> 7) & 0x7f); + break; + case SND_SEQ_EVENT_CONTROL14: + /* create two commands for MSB and LSB */ + delta_time(track, ev); + command(track, MIDI_CMD_CONTROL | (ev->data.control.channel & 0xf)); + add_byte(track, ev->data.control.param & 0x7f); + add_byte(track, (ev->data.control.value >> 7) & 0x7f); + if ((ev->data.control.param & 0x7f) < 0x20) { + delta_time(track, ev); + /* running status */ + add_byte(track, (ev->data.control.param & 0x7f) + 0x20); + add_byte(track, ev->data.control.value & 0x7f); + } + break; + case SND_SEQ_EVENT_NONREGPARAM: + delta_time(track, ev); + command(track, MIDI_CMD_CONTROL | (ev->data.control.channel & 0xf)); + add_byte(track, MIDI_CTL_NONREG_PARM_NUM_LSB); + add_byte(track, ev->data.control.param & 0x7f); + delta_time(track, ev); + add_byte(track, MIDI_CTL_NONREG_PARM_NUM_MSB); + add_byte(track, (ev->data.control.param >> 7) & 0x7f); + delta_time(track, ev); + add_byte(track, MIDI_CTL_MSB_DATA_ENTRY); + add_byte(track, (ev->data.control.value >> 7) & 0x7f); + delta_time(track, ev); + add_byte(track, MIDI_CTL_LSB_DATA_ENTRY); + add_byte(track, ev->data.control.value & 0x7f); + break; + case SND_SEQ_EVENT_REGPARAM: + delta_time(track, ev); + command(track, MIDI_CMD_CONTROL | (ev->data.control.channel & 0xf)); + add_byte(track, MIDI_CTL_REGIST_PARM_NUM_LSB); + add_byte(track, ev->data.control.param & 0x7f); + delta_time(track, ev); + add_byte(track, MIDI_CTL_REGIST_PARM_NUM_MSB); + add_byte(track, (ev->data.control.param >> 7) & 0x7f); + delta_time(track, ev); + add_byte(track, MIDI_CTL_MSB_DATA_ENTRY); + add_byte(track, (ev->data.control.value >> 7) & 0x7f); + delta_time(track, ev); + add_byte(track, MIDI_CTL_LSB_DATA_ENTRY); + add_byte(track, ev->data.control.value & 0x7f); + break; +#if 0 /* ignore */ + case SND_SEQ_EVENT_SONGPOS: + case SND_SEQ_EVENT_SONGSEL: + case SND_SEQ_EVENT_QFRAME: + case SND_SEQ_EVENT_START: + case SND_SEQ_EVENT_CONTINUE: + case SND_SEQ_EVENT_STOP: + case SND_SEQ_EVENT_TUNE_REQUEST: + case SND_SEQ_EVENT_RESET: + case SND_SEQ_EVENT_SENSING: + break; +#endif + case SND_SEQ_EVENT_SYSEX: + if (ev->data.ext.len == 0) + break; + delta_time(track, ev); + if (*(unsigned char*)ev->data.ext.ptr == 0xf0) + command(track, 0xf0), i = 1; + else + command(track, 0xf7), i = 0; + var_value(track, ev->data.ext.len - i); + for (; i < ev->data.ext.len; ++i) + add_byte(track, ((unsigned char*)ev->data.ext.ptr)[i]); + break; + default: + return; + } + track->used = 1; +} + +static void finish_tracks(void) +{ + snd_seq_queue_status_t *queue_status; + int tick, i, err; + + snd_seq_queue_status_alloca(&queue_status); + + err = snd_seq_get_queue_status(seq, queue, queue_status); + check_snd("get queue status", err); + tick = snd_seq_queue_status_get_tick_time(queue_status); + + /* make length of first track the recording length */ + var_value(&tracks[0], tick - tracks[0].last_tick); + add_byte(&tracks[0], 0xff); + add_byte(&tracks[0], 0x2f); + var_value(&tracks[0], 0); + + /* finish other tracks */ + for (i = 1; i < num_tracks; ++i) { + var_value(&tracks[i], 0); + add_byte(&tracks[i], 0xff); + add_byte(&tracks[i], 0x2f); + var_value(&tracks[i], 0); + } +} + +static void write_file(void) +{ + int used_tracks, time_division, i; + struct buffer *buf; + + used_tracks = 0; + for (i = 0; i < num_tracks; ++i) + used_tracks += !!tracks[i].used; + + /* header id and length */ + fwrite("MThd\0\0\0\6", 1, 8, file); + /* type 0 or 1 */ + fputc(0, file); + fputc(used_tracks > 1, file); + /* number of tracks */ + fputc((used_tracks >> 8) & 0xff, file); + fputc(used_tracks & 0xff, file); + /* time division */ + time_division = ticks; + if (smpte_timing) + time_division |= (0x100 - frames) << 8; + fputc(time_division >> 8, file); + fputc(time_division & 0xff, file); + + for (i = 0; i < num_tracks; ++i) { + if (!tracks[i].used) + continue; + /* track id */ + fwrite("MTrk", 1, 4, file); + /* data length */ + fputc((tracks[i].size >> 24) & 0xff, file); + fputc((tracks[i].size >> 16) & 0xff, file); + fputc((tracks[i].size >> 8) & 0xff, file); + fputc(tracks[i].size & 0xff, file); + /* track contents */ + for (buf = &tracks[i].first_buf; buf; buf = buf->next) + fwrite(buf->buf, 1, buf == tracks[i].cur_buf + ? tracks[i].cur_buf_size : BUFFER_SIZE, file); + } +} + +static void list_ports(void) +{ + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + + puts(" Port Client name Port name"); + + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(seq, cinfo) >= 0) { + int client = snd_seq_client_info_get_client(cinfo); + + if (client == SND_SEQ_CLIENT_SYSTEM) + continue; /* don't show system timer and announce ports */ + snd_seq_port_info_set_client(pinfo, client); + snd_seq_port_info_set_port(pinfo, -1); + while (snd_seq_query_next_port(seq, pinfo) >= 0) { + /* port must understand MIDI messages */ + if (!(snd_seq_port_info_get_type(pinfo) + & SND_SEQ_PORT_TYPE_MIDI_GENERIC)) + continue; + /* we need both READ and SUBS_READ */ + if ((snd_seq_port_info_get_capability(pinfo) + & (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) + != (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) + continue; + printf("%3d:%-3d %-32.32s %s\n", + snd_seq_port_info_get_client(pinfo), + snd_seq_port_info_get_port(pinfo), + snd_seq_client_info_get_name(cinfo), + snd_seq_port_info_get_name(pinfo)); + } + } +} + +static void help(const char *argv0) +{ + fprintf(stderr, "Usage: %s [options] outputfile\n" + "\nAvailable options:\n" + " -h,--help this help\n" + " -V,--version show version\n" + " -l,--list list input ports\n" + " -p,--port=client:port,... source port(s)\n" + " -b,--bpm=beats tempo in beats per minute\n" + " -f,--fps=frames resolution in frames per second (SMPTE)\n" + " -t,--ticks=ticks resolution in ticks per beat or frame\n" + " -s,--split-channels create a track for each channel\n" + " -m,--metronome=client:port play a metronome signal\n" + " -i,--timesig=nn:dd time signature\n", + argv0); +} + +static void version(void) +{ + fputs("arecordmidi version " SND_UTIL_VERSION_STR "\n", stderr); +} + +static void sighandler(int sig) +{ + stop = 1; +} + +int main(int argc, char *argv[]) +{ + static const char short_options[] = "hVlp:b:f:t:sdm:i:"; + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"list", 0, NULL, 'l'}, + {"port", 1, NULL, 'p'}, + {"bpm", 1, NULL, 'b'}, + {"fps", 1, NULL, 'f'}, + {"ticks", 1, NULL, 't'}, + {"split-channels", 0, NULL, 's'}, + {"dump", 0, NULL, 'd'}, + {"metronome", 1, NULL, 'm'}, + {"timesig", 1, NULL, 'i'}, + { } + }; + + char *filename = NULL; + int do_list = 0; + struct pollfd *pfds; + int npfds; + int c, err; + + init_seq(); + + while ((c = getopt_long(argc, argv, short_options, + long_options, NULL)) != -1) { + switch (c) { + case 'h': + help(argv[0]); + return 0; + case 'V': + version(); + return 0; + case 'l': + do_list = 1; + break; + case 'p': + parse_ports(optarg); + break; + case 'b': + beats = atoi(optarg); + if (beats < 4 || beats > 6000) + fatal("Invalid tempo"); + smpte_timing = 0; + break; + case 'f': + frames = atoi(optarg); + if (frames != 24 && frames != 25 && + frames != 29 && frames != 30) + fatal("Invalid number of frames/s"); + smpte_timing = 1; + break; + case 't': + ticks = atoi(optarg); + if (ticks < 1 || ticks > 0x7fff) + fatal("Invalid number of ticks"); + break; + case 's': + channel_split = 1; + break; + case 'd': + fputs("The --dump option isn't supported anymore, use aseqdump instead.\n", stderr); + break; + case 'm': + init_metronome(optarg); + break; + case 'i': + time_signature(optarg); + break; + default: + help(argv[0]); + return 1; + } + } + + if (do_list) { + list_ports(); + return 0; + } + + if (port_count < 1) { + fputs("Pleast specify a source port with --port.\n", stderr); + return 1; + } + + if (!ticks) + ticks = smpte_timing ? 40 : 384; + if (smpte_timing && ticks > 0xff) + ticks = 0xff; + + if (optind >= argc) { + fputs("Please specify a file to record to.\n", stderr); + return 1; + } + filename = argv[optind]; + + init_tracks(); + create_queue(); + create_ports(); + connect_ports(); + if (port_count > 1) + record_port_numbers(); + + /* record tempo */ + if (!smpte_timing) { + int usecs_per_quarter = 60000000 / beats; + var_value(&tracks[0], 0); /* delta time */ + add_byte(&tracks[0], 0xff); + add_byte(&tracks[0], 0x51); + var_value(&tracks[0], 3); + add_byte(&tracks[0], usecs_per_quarter >> 16); + add_byte(&tracks[0], usecs_per_quarter >> 8); + add_byte(&tracks[0], usecs_per_quarter); + + /* time signature */ + var_value(&tracks[0], 0); /* delta time */ + add_byte(&tracks[0], 0xff); + add_byte(&tracks[0], 0x58); + var_value(&tracks[0], 4); + add_byte(&tracks[0], ts_num); + add_byte(&tracks[0], ts_dd); + add_byte(&tracks[0], 24); /* MIDI clocks per metronome click */ + add_byte(&tracks[0], 8); /* notated 32nd-notes per MIDI quarter note */ + } + + /* always write at least one track */ + tracks[0].used = 1; + + file = fopen(filename, "wb"); + if (!file) + fatal("Cannot open %s - %s", filename, strerror(errno)); + + err = snd_seq_start_queue(seq, queue, NULL); + check_snd("start queue", err); + snd_seq_drain_output(seq); + + err = snd_seq_nonblock(seq, 1); + check_snd("set nonblock mode", err); + + if (use_metronome) { + metronome_set_program(); + metronome_pattern(0); + } + + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); + + npfds = snd_seq_poll_descriptors_count(seq, POLLIN); + pfds = alloca(sizeof(*pfds) * npfds); + for (;;) { + snd_seq_poll_descriptors(seq, pfds, npfds, POLLIN); + if (poll(pfds, npfds, -1) < 0) + break; + do { + snd_seq_event_t *event; + err = snd_seq_event_input(seq, &event); + if (err < 0) + break; + if (event) + record_event(event); + } while (err > 0); + if (stop) + break; + } + + finish_tracks(); + write_file(); + + fclose(file); + snd_seq_close(seq); + return 0; +} diff --git a/seq/aseqdump/Makefile.am b/seq/aseqdump/Makefile.am new file mode 100644 index 0000000..d918d9f --- /dev/null +++ b/seq/aseqdump/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = aseqdump.1 + +bin_PROGRAMS = aseqdump +man_MANS = aseqdump.1 diff --git a/seq/aseqdump/Makefile.in b/seq/aseqdump/Makefile.in new file mode 100644 index 0000000..722ed52 --- /dev/null +++ b/seq/aseqdump/Makefile.in @@ -0,0 +1,578 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = aseqdump$(EXEEXT) +subdir = seq/aseqdump +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +aseqdump_SOURCES = aseqdump.c +aseqdump_OBJECTS = aseqdump.$(OBJEXT) +aseqdump_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = aseqdump.c +DIST_SOURCES = aseqdump.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = aseqdump.1 +man_MANS = aseqdump.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign seq/aseqdump/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign seq/aseqdump/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +aseqdump$(EXEEXT): $(aseqdump_OBJECTS) $(aseqdump_DEPENDENCIES) + @rm -f aseqdump$(EXEEXT) + $(LINK) $(aseqdump_OBJECTS) $(aseqdump_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aseqdump.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/seq/aseqdump/aseqdump.1 b/seq/aseqdump/aseqdump.1 new file mode 100644 index 0000000..f6f2aa9 --- /dev/null +++ b/seq/aseqdump/aseqdump.1 @@ -0,0 +1,39 @@ +.TH ASEQDUMP 1 "19 Feb 2005" + +.SH NAME +aseqdump \- show the events received at an ALSA sequencer port + +.SH SYNOPSIS +.B aseqdump +[\fI\-p client:port,...\fP] + +.SH DESCRIPTION +.B aseqdump +is a command-line utility that prints the sequencer events it receives as text. + +To stop receiving, press Ctrl+C. + +.SH OPTIONS + +.TP +.I \-h,\-\-help +Prints a list of options. + +.TP +.I \-V,\-\-version +Prints the current version. + +.TP +.I \-l,\-\-list +Prints a list of possible input ports. + +.TP +.I \-p,\-\-port=client:port,... +Sets the sequencer port(s) from which events are received. + +A client can be specified by its number, its name, or a prefix of its +name. A port is specified by its number; for port 0 of a client, the +":0" part of the port specification can be omitted. + +.SH AUTHOR +Clemens Ladisch diff --git a/seq/aseqdump/aseqdump.c b/seq/aseqdump/aseqdump.c new file mode 100644 index 0000000..24c5d21 --- /dev/null +++ b/seq/aseqdump/aseqdump.c @@ -0,0 +1,438 @@ +/* + * aseqdump.c - show the events received at an ALSA sequencer port + * + * Copyright (c) 2005 Clemens Ladisch + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "version.h" + +static snd_seq_t *seq; +static int port_count; +static snd_seq_addr_t *ports; +static volatile sig_atomic_t stop = 0; + + +/* prints an error message to stderr, and dies */ +static void fatal(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +/* memory allocation error handling */ +static void check_mem(void *p) +{ + if (!p) + fatal("Out of memory"); +} + +/* error handling for ALSA functions */ +static void check_snd(const char *operation, int err) +{ + if (err < 0) + fatal("Cannot %s - %s", operation, snd_strerror(err)); +} + +static void init_seq(void) +{ + int err; + + /* open sequencer */ + err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0); + check_snd("open sequencer", err); + + /* set our client's name */ + err = snd_seq_set_client_name(seq, "aseqdump"); + check_snd("set client name", err); +} + +/* parses one or more port addresses from the string */ +static void parse_ports(const char *arg) +{ + char *buf, *s, *port_name; + int err; + + /* make a copy of the string because we're going to modify it */ + buf = strdup(arg); + check_mem(buf); + + for (port_name = s = buf; s; port_name = s + 1) { + /* Assume that ports are separated by commas. We don't use + * spaces because those are valid in client names. */ + s = strchr(port_name, ','); + if (s) + *s = '\0'; + + ++port_count; + ports = realloc(ports, port_count * sizeof(snd_seq_addr_t)); + check_mem(ports); + + err = snd_seq_parse_address(seq, &ports[port_count - 1], port_name); + if (err < 0) + fatal("Invalid port %s - %s", port_name, snd_strerror(err)); + } + + free(buf); +} + +static void create_port(void) +{ + int err; + + err = snd_seq_create_simple_port(seq, "aseqdump", + SND_SEQ_PORT_CAP_WRITE | + SND_SEQ_PORT_CAP_SUBS_WRITE, + SND_SEQ_PORT_TYPE_MIDI_GENERIC | + SND_SEQ_PORT_TYPE_APPLICATION); + check_snd("create port", err); +} + +static void connect_ports(void) +{ + int i, err; + + for (i = 0; i < port_count; ++i) { + err = snd_seq_connect_from(seq, 0, ports[i].client, ports[i].port); + if (err < 0) + fatal("Cannot connect from port %d:%d - %s", + ports[i].client, ports[i].port, snd_strerror(err)); + } +} + +static void dump_event(const snd_seq_event_t *ev) +{ + printf("%3d:%-3d ", ev->source.client, ev->source.port); + switch (ev->type) { + case SND_SEQ_EVENT_NOTEON: + if (ev->data.note.velocity) + printf("Note on %2d, note %d, velocity %d\n", + ev->data.note.channel, ev->data.note.note, ev->data.note.velocity); + else + printf("Note off %2d, note %d\n", + ev->data.note.channel, ev->data.note.note); + break; + case SND_SEQ_EVENT_NOTEOFF: + printf("Note off %2d, note %d, velocity %d\n", + ev->data.note.channel, ev->data.note.note, ev->data.note.velocity); + break; + case SND_SEQ_EVENT_KEYPRESS: + printf("Polyphonic aftertouch %2d, note %d, value %d\n", + ev->data.note.channel, ev->data.note.note, ev->data.note.velocity); + break; + case SND_SEQ_EVENT_CONTROLLER: + printf("Control change %2d, controller %d, value %d\n", + ev->data.control.channel, ev->data.control.param, ev->data.control.value); + break; + case SND_SEQ_EVENT_PGMCHANGE: + printf("Program change %2d, program %d\n", + ev->data.control.channel, ev->data.control.value); + break; + case SND_SEQ_EVENT_CHANPRESS: + printf("Channel aftertouch %2d, value %d\n", + ev->data.control.channel, ev->data.control.value); + break; + case SND_SEQ_EVENT_PITCHBEND: + printf("Pitch bend %2d, value %d\n", + ev->data.control.channel, ev->data.control.value); + break; + case SND_SEQ_EVENT_CONTROL14: + printf("Control change %2d, controller %d, value %5d\n", + ev->data.control.channel, ev->data.control.param, ev->data.control.value); + break; + case SND_SEQ_EVENT_NONREGPARAM: + printf("Non-reg. parameter %2d, parameter %d, value %d\n", + ev->data.control.channel, ev->data.control.param, ev->data.control.value); + break; + case SND_SEQ_EVENT_REGPARAM: + printf("Reg. parameter %2d, parameter %d, value %d\n", + ev->data.control.channel, ev->data.control.param, ev->data.control.value); + break; + case SND_SEQ_EVENT_SONGPOS: + printf("Song position pointer value %d\n", + ev->data.control.value); + break; + case SND_SEQ_EVENT_SONGSEL: + printf("Song select value %d\n", + ev->data.control.value); + break; + case SND_SEQ_EVENT_QFRAME: + printf("MTC quarter frame %02xh\n", + ev->data.control.value); + break; + case SND_SEQ_EVENT_TIMESIGN: + // XXX how is this encoded? + printf("SMF time signature (%#010x)\n", + ev->data.control.value); + break; + case SND_SEQ_EVENT_KEYSIGN: + // XXX how is this encoded? + printf("SMF key signature (%#010x)\n", + ev->data.control.value); + break; + case SND_SEQ_EVENT_START: + if (ev->source.client == SND_SEQ_CLIENT_SYSTEM && + ev->source.port == SND_SEQ_PORT_SYSTEM_TIMER) + printf("Queue start queue %d\n", + ev->data.queue.queue); + else + printf("Start\n"); + break; + case SND_SEQ_EVENT_CONTINUE: + if (ev->source.client == SND_SEQ_CLIENT_SYSTEM && + ev->source.port == SND_SEQ_PORT_SYSTEM_TIMER) + printf("Queue continue queue %d\n", + ev->data.queue.queue); + else + printf("Continue\n"); + break; + case SND_SEQ_EVENT_STOP: + if (ev->source.client == SND_SEQ_CLIENT_SYSTEM && + ev->source.port == SND_SEQ_PORT_SYSTEM_TIMER) + printf("Queue stop queue %d\n", + ev->data.queue.queue); + else + printf("Stop\n"); + break; + case SND_SEQ_EVENT_SETPOS_TICK: + printf("Set tick queue pos. queue %d\n", ev->data.queue.queue); + break; + case SND_SEQ_EVENT_SETPOS_TIME: + printf("Set rt queue pos. queue %d\n", ev->data.queue.queue); + break; + case SND_SEQ_EVENT_TEMPO: + printf("Set queue tempo queue %d\n", ev->data.queue.queue); + break; + case SND_SEQ_EVENT_CLOCK: + printf("Clock\n"); + break; + case SND_SEQ_EVENT_TICK: + printf("Tick\n"); + break; + case SND_SEQ_EVENT_QUEUE_SKEW: + printf("Queue timer skew queue %d\n", ev->data.queue.queue); + break; + case SND_SEQ_EVENT_TUNE_REQUEST: + printf("Tune request\n"); + break; + case SND_SEQ_EVENT_RESET: + printf("Reset\n"); + break; + case SND_SEQ_EVENT_SENSING: + printf("Active Sensing\n"); + break; + case SND_SEQ_EVENT_CLIENT_START: + printf("Client start client %d\n", + ev->data.addr.client); + break; + case SND_SEQ_EVENT_CLIENT_EXIT: + printf("Client exit client %d\n", + ev->data.addr.client); + break; + case SND_SEQ_EVENT_CLIENT_CHANGE: + printf("Client changed client %d\n", + ev->data.addr.client); + break; + case SND_SEQ_EVENT_PORT_START: + printf("Port start %d:%d\n", + ev->data.addr.client, ev->data.addr.port); + break; + case SND_SEQ_EVENT_PORT_EXIT: + printf("Port exit %d:%d\n", + ev->data.addr.client, ev->data.addr.port); + break; + case SND_SEQ_EVENT_PORT_CHANGE: + printf("Port changed %d:%d\n", + ev->data.addr.client, ev->data.addr.port); + break; + case SND_SEQ_EVENT_PORT_SUBSCRIBED: + printf("Port subscribed %d:%d -> %d:%d\n", + ev->data.connect.sender.client, ev->data.connect.sender.port, + ev->data.connect.dest.client, ev->data.connect.dest.port); + break; + case SND_SEQ_EVENT_PORT_UNSUBSCRIBED: + printf("Port unsubscribed %d:%d -> %d:%d\n", + ev->data.connect.sender.client, ev->data.connect.sender.port, + ev->data.connect.dest.client, ev->data.connect.dest.port); + break; + case SND_SEQ_EVENT_SYSEX: + { + unsigned int i; + printf("System exclusive "); + for (i = 0; i < ev->data.ext.len; ++i) + printf(" %02X", ((unsigned char*)ev->data.ext.ptr)[i]); + printf("\n"); + } + break; + default: + printf("Event type %d\n", ev->type); + } +} + +static void list_ports(void) +{ + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + + puts(" Port Client name Port name"); + + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(seq, cinfo) >= 0) { + int client = snd_seq_client_info_get_client(cinfo); + + snd_seq_port_info_set_client(pinfo, client); + snd_seq_port_info_set_port(pinfo, -1); + while (snd_seq_query_next_port(seq, pinfo) >= 0) { + /* we need both READ and SUBS_READ */ + if ((snd_seq_port_info_get_capability(pinfo) + & (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) + != (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ)) + continue; + printf("%3d:%-3d %-32.32s %s\n", + snd_seq_port_info_get_client(pinfo), + snd_seq_port_info_get_port(pinfo), + snd_seq_client_info_get_name(cinfo), + snd_seq_port_info_get_name(pinfo)); + } + } +} + +static void help(const char *argv0) +{ + printf("Usage: %s [options]\n" + "\nAvailable options:\n" + " -h,--help this help\n" + " -V,--version show version\n" + " -l,--list list input ports\n" + " -p,--port=client:port,... source port(s)\n", + argv0); +} + +static void version(void) +{ + puts("aseqdump version " SND_UTIL_VERSION_STR); +} + +static void sighandler(int sig) +{ + stop = 1; +} + +int main(int argc, char *argv[]) +{ + static const char short_options[] = "hVlp:"; + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"list", 0, NULL, 'l'}, + {"port", 1, NULL, 'p'}, + { } + }; + + int do_list = 0; + struct pollfd *pfds; + int npfds; + int c, err; + + init_seq(); + + while ((c = getopt_long(argc, argv, short_options, + long_options, NULL)) != -1) { + switch (c) { + case 'h': + help(argv[0]); + return 0; + case 'V': + version(); + return 0; + case 'l': + do_list = 1; + break; + case 'p': + parse_ports(optarg); + break; + default: + help(argv[0]); + return 1; + } + } + if (optind < argc) { + help(argv[0]); + return 1; + } + + if (do_list) { + list_ports(); + return 0; + } + + create_port(); + connect_ports(); + + err = snd_seq_nonblock(seq, 1); + check_snd("set nonblock mode", err); + + if (port_count > 0) + printf("Waiting for data."); + else + printf("Waiting for data at port %d:0.", + snd_seq_client_id(seq)); + printf(" Press Ctrl+C to end.\n"); + printf("Source Event Ch Data\n"); + + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); + + npfds = snd_seq_poll_descriptors_count(seq, POLLIN); + pfds = alloca(sizeof(*pfds) * npfds); + for (;;) { + snd_seq_poll_descriptors(seq, pfds, npfds, POLLIN); + if (poll(pfds, npfds, -1) < 0) + break; + do { + snd_seq_event_t *event; + err = snd_seq_event_input(seq, &event); + if (err < 0) + break; + if (event) + dump_event(event); + } while (err > 0); + fflush(stdout); + if (stop) + break; + } + + snd_seq_close(seq); + return 0; +} diff --git a/seq/aseqnet/Makefile.am b/seq/aseqnet/Makefile.am new file mode 100644 index 0000000..2ebc4a5 --- /dev/null +++ b/seq/aseqnet/Makefile.am @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = README.aseqnet aseqnet.1 + +bin_PROGRAMS = aseqnet +aseqnet_SOURCES = aseqnet.c +aseqnet_LDADD = $(INTLLIBS) +man_MANS = aseqnet.1 diff --git a/seq/aseqnet/Makefile.in b/seq/aseqnet/Makefile.in new file mode 100644 index 0000000..71a5245 --- /dev/null +++ b/seq/aseqnet/Makefile.in @@ -0,0 +1,581 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = aseqnet$(EXEEXT) +subdir = seq/aseqnet +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_aseqnet_OBJECTS = aseqnet.$(OBJEXT) +aseqnet_OBJECTS = $(am_aseqnet_OBJECTS) +am__DEPENDENCIES_1 = +aseqnet_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(aseqnet_SOURCES) +DIST_SOURCES = $(aseqnet_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +EXTRA_DIST = README.aseqnet aseqnet.1 +aseqnet_SOURCES = aseqnet.c +aseqnet_LDADD = $(INTLLIBS) +man_MANS = aseqnet.1 +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign seq/aseqnet/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign seq/aseqnet/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +aseqnet$(EXEEXT): $(aseqnet_OBJECTS) $(aseqnet_DEPENDENCIES) + @rm -f aseqnet$(EXEEXT) + $(LINK) $(aseqnet_OBJECTS) $(aseqnet_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aseqnet.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/seq/aseqnet/README.aseqnet b/seq/aseqnet/README.aseqnet new file mode 100644 index 0000000..bd0b68e --- /dev/null +++ b/seq/aseqnet/README.aseqnet @@ -0,0 +1,53 @@ +================================================================ + ALSA sequencer connectors over network + ver.0.1 + Copyright (C) 1999-2000 Takashi Iwai +================================================================ + +* ASEQNET + +aseqnet is a sequencer client which sends/receives events over +network. Suppose two hosts (hostA and hostB) connected by network. +You need to run ALSA system on both hosts. Then, start aseqnet as a +server on hostA: + + hostA% aseqnet + sequencer opened: 128:0 + +A user client 128 with port 0 was opened. (The client number may +vary.) At next, start client on hostB. The argument is the hostname +where server is running. + + hostB% aseqnet hostA + sequencer opened: 132:0 + +Now events sent to hostA:128:0 is transferred to hostB:132:0, and vice +versa. + +You can connect these ports arbitrary to other sequencer ports. +For example, connect hostB:132:0 to a MIDI output device 65:0. The +aconnect utility can be used for this: + + hostB% aconnect 132:0 65:0 + +Events to hostA:128:0 will be delivered indirectly to hostB:65:0. +You'll hear MIDI sounds as following: + + hostA% pmidi -p 128:0 foo.mid + +The multiple clients may exist simultaneously. If hostC is connected +as a client to hostA, events from from hostA are sent to all connected +network clients, hostB and hostC. However, only one connection is +allowed from a client to a server. + +To disconnect network, stop all clients before server by ctrl-C or +sending signal to them. The server will automatically quit. + +The available options are: + + -p port : specify the TCP port number or TCP service name. + Default value is 40002. + -s addr : explicit read-subscription to the given address + (client:addr). + -d addr : explicit write-subscription to the given address. + -v : verbose mode. diff --git a/seq/aseqnet/aseqnet.1 b/seq/aseqnet/aseqnet.1 new file mode 100644 index 0000000..a1dc1d3 --- /dev/null +++ b/seq/aseqnet/aseqnet.1 @@ -0,0 +1,81 @@ +.TH aseqnet 1 "January 1, 2000" +.LO 1 +.SH NAME +aseqnet \- ALSA sequencer connectors over network + +.SH SYNOPSIS +.B aseqnet +[remotehost] + +.SH DESCRIPTION +.B aseqnet +is an ALSA sequencer client which sends and receives event packets +over network. +Suppose two hosts connected by network, +.I hostA +as a server +and +.I hostB +as a client. +The ALSA sequencer system must be running on both hosts. +For creating the server port, run the following on hostA: +.IP "" 4 +hostA% aseqnet +.br +sequencer opened: 128:0 +.PP +Then a user client 128 with port 0 was opened on hostA. +(The client number may vary.) +For creating the (network-)client port, run +.B aseqnet +with the hostname of the server: +.IP "" 4 +hostB% aseqnet hostA +.br +sequencer opened: 132:0 +.PP +Now all events sent to hostA:128:0 are transferred to hostB:132:0, and vice +versa. +.PP +The ports created by +.B aseqnet +can be connected arbitrary to other sequencer ports via +.B aconnect(1). +For example, to connect hostB:132:0 to a MIDI output device 65:0: +.IP "" 4 +hostB% aconnect 132:0 65:0 +.PP +Then events to hostA:128:0 will be delivered to hostB:65:0. +The following command plays MIDI on +.I hostB. +.IP "" 4 +hostA% pmidi \-p 128:0 foo.mid +.PP +The multiple clients may exist simultaneously. If +.I hostC +is connected as a client to hostA, events from from hostA are sent +to all connected network clients, i.e. hostB and hostC. +However, only one connection is allowed from a client to a server. +.PP +To disconnect network, stop all clients before server by ctrl-C or +sending signal to them. The server will automatically quit. + +.SH OPTIONS +.TP +.B \-p port +Specify the TCP port number or TCP service name. +.TP +.B \-s addr +Subscribe to the given address for read automatically. +.TP +.B \-d addr +Subscribe to the given address for write automatically. +.TP +.B \-v +Verbose mode. + +.SH "SEE ALSO" +aconnect(1), pmidi(1) + +.SH AUTHOR +Takashi Iwai . diff --git a/seq/aseqnet/aseqnet.c b/seq/aseqnet/aseqnet.c new file mode 100644 index 0000000..e071ad9 --- /dev/null +++ b/seq/aseqnet/aseqnet.c @@ -0,0 +1,609 @@ +/* + * network server/client for ALSA sequencer + * ver.0.1 + * + * Copyright (C) 1999-2000 Takashi Iwai + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "gettext.h" + +/* + * prototypes + */ +static void usage(void); +static void init_buf(void); +static void init_pollfds(void); +static void close_files(void); +static void init_seq(char *source, char *dest); +static int get_port(char *service); +static void sigterm_exit(int sig); +static void init_server(int port); +static void init_client(char *server, int port); +static void do_loop(void); +static int copy_local_to_remote(void); +static int copy_remote_to_local(int fd); + +/* + * default TCP port number + */ +#define DEFAULT_PORT 40002 + +/* + * local input buffer + */ +static char *readbuf; +static int max_rdlen; +static char *writebuf; +static int cur_wrlen, max_wrlen; + +#define MAX_BUF_EVENTS 200 +#define MAX_CONNECTION 10 + +static snd_seq_t *handle; +static struct pollfd *seqifds = NULL; +static struct pollfd *seqofds = NULL; +static struct pollfd *pollfds = NULL; +static int seqifds_count = 0; +static int seqofds_count = 0; +static int pollfds_count = 0; +static int sockfd, netfd[MAX_CONNECTION] = {[0 ... MAX_CONNECTION-1] = -1}; +static int max_connection; +static int cur_connected; +static int seq_port; + +static int server_mode; +static int verbose = 0; +static int info = 0; + + +/* + * main routine + */ + +static const struct option long_option[] = { + {"port", 1, NULL, 'p'}, + {"source", 1, NULL, 's'}, + {"dest", 1, NULL, 'd'}, + {"help", 0, NULL, 'h'}, + {"verbose", 0, NULL, 'v'}, + {"info", 0, NULL, 'i'}, + {NULL, 0, NULL, 0}, +}; + +int main(int argc, char **argv) +{ + int c; + int port = DEFAULT_PORT; + char *source = NULL, *dest = NULL; + +#ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + textdomain(PACKAGE); +#endif + + while ((c = getopt_long(argc, argv, "p:s:d:vi", long_option, NULL)) != -1) { + switch (c) { + case 'p': + if (isdigit(*optarg)) + port = atoi(optarg); + else + port = get_port(optarg); + break; + case 's': + source = optarg; + break; + case 'd': + dest = optarg; + break; + case 'v': + verbose++; + break; + case 'i': + info++; + break; + default: + usage(); + exit(1); + } + } + + signal(SIGINT, sigterm_exit); + signal(SIGTERM, sigterm_exit); + + init_buf(); + init_seq(source, dest); + + if (optind >= argc) { + server_mode = 1; + max_connection = MAX_CONNECTION; + init_pollfds(); + init_server(port); + } else { + server_mode = 0; + max_connection = 1; + init_pollfds(); + init_client(argv[optind], port); + } + + do_loop(); + + close_files(); + + return 0; +} + + +/* + * print usage + */ +static void usage(void) +{ + printf(_("aseqnet - network client/server on ALSA sequencer\n")); + printf(_(" Copyright (C) 1999 Takashi Iwai\n")); + printf(_("usage:\n")); + printf(_(" server mode: aseqnet [-options]\n")); + printf(_(" client mode: aseqnet [-options] server_host\n")); + printf(_("options:\n")); + printf(_(" -p,--port # : sepcify TCP port (digit or service name)\n")); + printf(_(" -s,--source addr : read from given addr (client:port)\n")); + printf(_(" -d,--dest addr : write to given addr (client:port)\n")); + printf(_(" -v, --verbose : print verbose messages\n")); + printf(_(" -i, --info : print certain received events\n")); +} + + +/* + * allocate and initialize buffers + */ +static void init_buf(void) +{ + max_wrlen = MAX_BUF_EVENTS * sizeof(snd_seq_event_t); + max_rdlen = MAX_BUF_EVENTS * sizeof(snd_seq_event_t); + writebuf = malloc(max_wrlen); + readbuf = malloc(max_rdlen); + if (writebuf == NULL || readbuf == NULL) { + fprintf(stderr, _("can't malloc\n")); + exit(1); + } + memset(writebuf, 0, max_wrlen); + memset(readbuf, 0, max_rdlen); + cur_wrlen = 0; +} + +/* + * allocate and initialize poll array + */ +static void init_pollfds(void) +{ + pollfds_count = seqifds_count + seqofds_count + 1 + max_connection; + pollfds = (struct pollfd *)calloc(pollfds_count, sizeof(struct pollfd)); + assert(pollfds); +} + +/* + * close all files + */ +static void close_files(void) +{ + int i; + if (verbose) + fprintf(stderr, _("closing files..\n")); + for (i = 0; i < max_connection; i++) { + if (netfd[i] >= 0) + close(netfd[i]); + } + if (sockfd >= 0) + close(sockfd); +} + + +/* + * initialize sequencer + */ +static void init_seq(char *source, char *dest) +{ + snd_seq_addr_t addr; + int err, counti, counto; + + if (snd_seq_open(&handle, "default", SND_SEQ_OPEN_DUPLEX, 0) < 0) { + perror("snd_seq_open"); + exit(1); + } + if (seqifds) + free(seqifds); + if (seqofds) + free(seqofds); + counti = seqifds_count = snd_seq_poll_descriptors_count(handle, POLLIN); + assert(counti > 0); + counto = seqofds_count = snd_seq_poll_descriptors_count(handle, POLLOUT); + assert(counto > 0); + seqifds = (struct pollfd *)calloc(counti, sizeof(struct pollfd)); + assert(seqifds); + seqofds = (struct pollfd *)calloc(counto, sizeof(struct pollfd)); + assert(seqofds); + err = snd_seq_poll_descriptors(handle, seqifds, counti, POLLIN); + assert(err == counti); + err = snd_seq_poll_descriptors(handle, seqofds, counto, POLLOUT); + assert(err == counto); + + snd_seq_nonblock(handle, 1); + + /* set client info */ + if (server_mode) + snd_seq_set_client_name(handle, "Net Server"); + else + snd_seq_set_client_name(handle, "Net Client"); + + /* create a port */ + seq_port = snd_seq_create_simple_port(handle, "Network", + SND_SEQ_PORT_CAP_READ | + SND_SEQ_PORT_CAP_WRITE | + SND_SEQ_PORT_CAP_SUBS_READ | + SND_SEQ_PORT_CAP_SUBS_WRITE, + SND_SEQ_PORT_TYPE_MIDI_GENERIC); + if (seq_port < 0) { + perror("create seq port"); + exit(1); + } + if (verbose) + fprintf(stderr, _("sequencer opened: %d:%d\n"), + snd_seq_client_id(handle), seq_port); + + /* explicit subscriptions */ + if (source) { + /* read subscription */ + if (snd_seq_parse_address(handle, &addr, source) < 0) { + fprintf(stderr, _("invalid source address %s\n"), source); + exit(1); + } + if (snd_seq_connect_from(handle, seq_port, addr.client, addr.port)) { + perror("read subscription"); + exit(1); + } + } + if (dest) { + /* write subscription */ + if (snd_seq_parse_address(handle, &addr, dest) < 0) { + fprintf(stderr, _("invalid destination address %s\n"), dest); + exit(1); + } + if (snd_seq_connect_to(handle, seq_port, addr.client, addr.port)) { + perror("write subscription"); + exit(1); + } + } +} + + +/* + * convert from string to TCP port number + */ +static int get_port(char *service) +{ + struct servent *sp; + + if ((sp = getservbyname(service, "tcp")) == NULL){ + fprintf(stderr, _("service '%s' is not found in /etc/services\n"), service); + return -1; + } + return sp->s_port; +} + +/* + * signal handler + */ +static void sigterm_exit(int sig) +{ + close_files(); + exit(1); +} + + +/* + * initialize network server + */ +static void init_server(int port) +{ + int i; + int curstate = 1; + struct sockaddr_in addr; + + memset(&addr, 0, sizeof(addr)); + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons(port); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) { + perror("create socket"); + exit(1); + } + setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)); + /* the return value is ignored.. */ + + if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + perror("can't bind"); + exit(1); + } + + if (listen(sockfd, 5) < 0) { + perror("can't listen"); + exit(1); + } + + cur_connected = 0; + for (i = 0; i < max_connection; i++) + netfd[i] = -1; +} + +/* + * start connection on server + */ +static void start_connection(void) +{ + struct sockaddr_in addr; + int i; + socklen_t addr_len; + + for (i = 0; i < max_connection; i++) { + if (netfd[i] < 0) + break; + } + if (i >= max_connection) { + fprintf(stderr, _("too many connections!\n")); + exit(1); + } + memset(&addr, 0, sizeof(addr)); + addr_len = sizeof(addr); + netfd[i] = accept(sockfd, (struct sockaddr *)&addr, &addr_len); + if (netfd[i] < 0) { + perror("accept"); + exit(1); + } + if (verbose) + fprintf(stderr, _("accepted[%d]\n"), netfd[i]); + cur_connected++; +} + +/* + * initialize network client + */ +static void init_client(char *server, int port) +{ + struct sockaddr_in addr; + struct hostent *host; + int curstate = 1; + int fd; + + if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ + perror("create socket"); + exit(1); + } + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0) { + perror("setsockopt"); + exit(1); + } + if ((host = gethostbyname(server)) == NULL){ + fprintf(stderr, _("can't get address %s\n"), server); + exit(1); + } + addr.sin_port = htons(port); + addr.sin_family = AF_INET; + memcpy(&addr.sin_addr, host->h_addr, host->h_length); + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + perror("connect"); + exit(1); + } + if (verbose) + fprintf(stderr, _("ok.. connected\n")); + netfd[0] = fd; + cur_connected = 1; +} + +/* + * event loop + */ +static void do_loop(void) +{ + int i, rc, width; + int seqifd_ptr, sockfd_ptr = -1, netfd_ptr; + + for (;;) { + memset(pollfds, 0, pollfds_count * sizeof(struct pollfd)); + seqifd_ptr = 0; + memcpy(pollfds, seqifds, sizeof(*seqifds)*(width = seqifds_count)); + if (server_mode) { + sockfd_ptr = width; + pollfds[width].fd = sockfd; + pollfds[width].events = POLLIN; + width++; + } + netfd_ptr = width; + for (i = 0; i < max_connection; i++) { + if (netfd[i] >= 0) { + pollfds[width].fd = netfd[i]; + pollfds[width].events = POLLIN; + width++; + } + } + do { + rc = poll(pollfds, width, -1); + } while (rc <= 0 && errno == EINTR); + if (rc <= 0) { + perror("poll"); + exit(1); + } + if (server_mode) { + if (pollfds[sockfd_ptr].revents & (POLLIN|POLLOUT)) + start_connection(); + } + for (i = 0; i < seqifds_count; i++) + if (pollfds[seqifd_ptr + i].revents & (POLLIN|POLLOUT)) { + if (copy_local_to_remote()) + return; + break; + } + for (i = 0; i < max_connection; i++) { + if (netfd[i] < 0) + continue; + if (pollfds[netfd_ptr + i].revents & (POLLIN|POLLOUT)) { + if (copy_remote_to_local(netfd[i])) { + netfd[i] = -1; + cur_connected--; + if (cur_connected <= 0) + return; + } + } + } + } +} + + +/* + * flush write buffer - send data to the socket + */ +static void flush_writebuf(void) +{ + if (cur_wrlen) { + int i; + for (i = 0; i < max_connection; i++) { + if (netfd[i] >= 0) + write(netfd[i], writebuf, cur_wrlen); + } + cur_wrlen = 0; + } +} + +/* + * get space from write buffer + */ +static char *get_writebuf(int len) +{ + char *buf; + if (cur_wrlen + len >= max_wrlen) + flush_writebuf(); + buf = writebuf + cur_wrlen; + cur_wrlen += len; + return buf; +} + +static void print_event(snd_seq_event_t *ev) +{ + switch (ev->type) { + case SND_SEQ_EVENT_CONTROLLER: + printf(_("Channel %2d: Control event : %5d\n"), + ev->data.control.channel, ev->data.control.value); + break; + case SND_SEQ_EVENT_PITCHBEND: + printf(_("Channel %2d: Pitchbender : %5d\n"), + ev->data.control.channel, ev->data.control.value); + break; + case SND_SEQ_EVENT_NOTEON: + printf(_("Channel %2d: Note On event : %5d\n"), + ev->data.control.channel, ev->data.note.note); + break; + case SND_SEQ_EVENT_NOTEOFF: + printf(_("Channel %2d: Note Off event: %5d\n"), + ev->data.control.channel, ev->data.note.note); + break; + } +} + +#define EVENT_PACKET_SIZE 32 + +/* + * copy events from sequencer to port(s) + */ +static int copy_local_to_remote(void) +{ + int rc; + snd_seq_event_t *ev; + char *buf; + + while ((rc = snd_seq_event_input(handle, &ev)) >= 0 && ev) { + if (ev->type >= SND_SEQ_EVENT_CLIENT_START && + ! snd_seq_ev_is_variable_type(ev)) { + snd_seq_free_event(ev); + continue; + } + if (snd_seq_ev_is_variable(ev)) { + int len; + len = EVENT_PACKET_SIZE + ev->data.ext.len; + buf = get_writebuf(len); + memcpy(buf, ev, sizeof(snd_seq_event_t)); + memcpy(buf + EVENT_PACKET_SIZE, ev->data.ext.ptr, ev->data.ext.len); + } else { + buf = get_writebuf(EVENT_PACKET_SIZE); + memcpy(buf, ev, EVENT_PACKET_SIZE); + } + if (info) + print_event(ev); + snd_seq_free_event(ev); + } + flush_writebuf(); + return 0; +} + +/* + * copy events from a port to sequencer + */ +static int copy_remote_to_local(int fd) +{ + int count; + char *buf; + snd_seq_event_t *ev; + + count = read(fd, readbuf, MAX_BUF_EVENTS * sizeof(snd_seq_event_t)); + buf = readbuf; + + if (count == 0) { + if (verbose) + fprintf(stderr, _("disconnected\n")); + return 1; + } + + while (count > 0) { + ev = (snd_seq_event_t*)buf; + buf += EVENT_PACKET_SIZE; + count -= EVENT_PACKET_SIZE; + if (snd_seq_ev_is_variable(ev) && ev->data.ext.len > 0) { + ev->data.ext.ptr = buf; + buf += ev->data.ext.len; + count -= ev->data.ext.len; + } + snd_seq_ev_set_direct(ev); + snd_seq_ev_set_source(ev, seq_port); + snd_seq_ev_set_subs(ev); + if (info) + print_event(ev); + snd_seq_event_output(handle, ev); + } + + snd_seq_drain_output(handle); + return 0; +} + diff --git a/speaker-test/Makefile.am b/speaker-test/Makefile.am new file mode 100644 index 0000000..e3551bc --- /dev/null +++ b/speaker-test/Makefile.am @@ -0,0 +1,9 @@ +INCLUDES = -I$(top_srcdir)/include +SUBDIRS= samples +LDADD = $(LIBINTL) -lm + +bin_PROGRAMS = speaker-test +speaker_test_SOURCES = speaker-test.c pink.c +man_MANS = speaker-test.1 +EXTRA_DIST = readme.txt speaker-test.1 pink.h + diff --git a/speaker-test/Makefile.in b/speaker-test/Makefile.in new file mode 100644 index 0000000..89c3a54 --- /dev/null +++ b/speaker-test/Makefile.in @@ -0,0 +1,737 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = speaker-test$(EXEEXT) +subdir = speaker-test +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_speaker_test_OBJECTS = speaker-test.$(OBJEXT) pink.$(OBJEXT) +speaker_test_OBJECTS = $(am_speaker_test_OBJECTS) +speaker_test_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +speaker_test_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(speaker_test_SOURCES) +DIST_SOURCES = $(speaker_test_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +INCLUDES = -I$(top_srcdir)/include +SUBDIRS = samples +LDADD = $(LIBINTL) -lm +speaker_test_SOURCES = speaker-test.c pink.c +man_MANS = speaker-test.1 +EXTRA_DIST = readme.txt speaker-test.1 pink.h +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign speaker-test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign speaker-test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +speaker-test$(EXEEXT): $(speaker_test_OBJECTS) $(speaker_test_DEPENDENCIES) + @rm -f speaker-test$(EXEEXT) + $(LINK) $(speaker_test_OBJECTS) $(speaker_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pink.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speaker-test.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/speaker-test/pink.c b/speaker-test/pink.c new file mode 100644 index 0000000..ef30755 --- /dev/null +++ b/speaker-test/pink.c @@ -0,0 +1,96 @@ +/* + patest_pink.c + + generate Pink Noise using Gardner method. + Optimization suggested by James McCartney uses a tree + to select which random value to replace. + + x x x x x x x x x x x x x x x x + x x x x x x x x + x x x x + x x + x + + Tree is generated by counting trailing zeros in an increasing index. + When the index is zero, no random number is selected. + + This program uses the Portable Audio library which is under development. + For more information see: http://www.audiomulch.com/portaudio/ + + Author: Phil Burk, http://www.softsynth.com + + Revision History: + + Copyleft 1999 Phil Burk - No rights reserved. +*/ + +#include +#include +#include "pink.h" + +/************************************************************/ +/* Calculate pseudo-random 32 bit number based on linear congruential method. */ +static unsigned long generate_random_number( void ) +{ + static unsigned long rand_seed = 22222; /* Change this for different random sequences. */ + rand_seed = (rand_seed * 196314165) + 907633515; + return rand_seed; +} + +/* Setup PinkNoise structure for N rows of generators. */ +void initialize_pink_noise( pink_noise_t *pink, int num_rows ) +{ + int i; + long pmax; + pink->pink_index = 0; + pink->pink_index_mask = (1<pink_scalar = 1.0f / pmax; +/* Initialize rows. */ + for( i=0; ipink_rows[i] = 0; + pink->pink_running_sum = 0; +} + +/* generate Pink noise values between -1.0 and +1.0 */ +float generate_pink_noise_sample( pink_noise_t *pink ) +{ + long new_random; + long sum; + float output; + +/* Increment and mask index. */ + pink->pink_index = (pink->pink_index + 1) & pink->pink_index_mask; + +/* If index is zero, don't update any random values. */ + if( pink->pink_index != 0 ) + { + /* Determine how many trailing zeros in PinkIndex. */ + /* This algorithm will hang if n==0 so test first. */ + int num_zeros = 0; + int n = pink->pink_index; + while( (n & 1) == 0 ) + { + n = n >> 1; + num_zeros++; + } + + /* Replace the indexed ROWS random value. + * Subtract and add back to Running_sum instead of adding all the random + * values together. Only one changes each time. + */ + pink->pink_running_sum -= pink->pink_rows[num_zeros]; + new_random = ((long)generate_random_number()) >> PINK_RANDOM_SHIFT; + pink->pink_running_sum += new_random; + pink->pink_rows[num_zeros] = new_random; + } + +/* Add extra white noise value. */ + new_random = ((long)generate_random_number()) >> PINK_RANDOM_SHIFT; + sum = pink->pink_running_sum + new_random; + +/* Scale to range of -1.0 to 0.9999. */ + output = pink->pink_scalar * sum; + + return output; +} diff --git a/speaker-test/pink.h b/speaker-test/pink.h new file mode 100644 index 0000000..0d17f7a --- /dev/null +++ b/speaker-test/pink.h @@ -0,0 +1,15 @@ +#define PINK_MAX_RANDOM_ROWS (30) +#define PINK_RANDOM_BITS (24) +#define PINK_RANDOM_SHIFT ((sizeof(long)*8)-PINK_RANDOM_BITS) + +typedef struct +{ + long pink_rows[PINK_MAX_RANDOM_ROWS]; + long pink_running_sum; /* Used to optimize summing of generators. */ + int pink_index; /* Incremented each sample. */ + int pink_index_mask; /* Index wrapped by ANDing with this mask. */ + float pink_scalar; /* Used to scale within range of -1.0 to +1.0 */ +} pink_noise_t; + +void initialize_pink_noise( pink_noise_t *pink, int num_rows ); +float generate_pink_noise_sample( pink_noise_t *pink ); diff --git a/speaker-test/readme.txt b/speaker-test/readme.txt new file mode 100644 index 0000000..6774fe0 --- /dev/null +++ b/speaker-test/readme.txt @@ -0,0 +1,12 @@ +To make or build just type + +make + +To test: - +1) Just stereo sound from one stereo jack: - +./speaker-test -Dplug:front -c2 +2) A 4 speaker setup from two stereo jacks: - +./speaker-test -Dplug:surround40 -c4 +3) A 5.1 speaker setup from three stereo jacks: - +./speaker-test -Dplug:surround51 -c6 + diff --git a/speaker-test/samples/Front_Center.wav b/speaker-test/samples/Front_Center.wav new file mode 100644 index 0000000000000000000000000000000000000000..4f121805621c1e274af95e1a9307dc5dff411e7b GIT binary patch literal 137134 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%0A{U;GXU3=BnpP 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 literal 0 HcmV?d00001 diff --git a/speaker-test/samples/Front_Left.wav b/speaker-test/samples/Front_Left.wav new file mode 100644 index 0000000000000000000000000000000000000000..9d6ebdd85f235e12934ee9a0069258601da78ffc GIT binary patch literal 142128 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 literal 0 HcmV?d00001 diff --git a/speaker-test/samples/Front_Right.wav b/speaker-test/samples/Front_Right.wav new file mode 100644 index 0000000000000000000000000000000000000000..441565c8ee7efb552e7bb9e01afd2e5443c23f3f GIT binary patch literal 146990 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

aLniek$aEQqU83-U;T*&7ixy*53w3=?7F$ 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

PV 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

S=u7^=ANY{oyKSA(_9Odu$lh5jKY~(~>3(kO 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 literal 0 HcmV?d00001 diff --git a/speaker-test/samples/Rear_Center.wav b/speaker-test/samples/Rear_Center.wav new file mode 100644 index 0000000000000000000000000000000000000000..ee2c6da904594e9af29a0ab7825a5d1475ef62c7 GIT binary patch literal 130096 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 z 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 E2R9U-SO5S3 literal 0 HcmV?d00001 diff --git a/speaker-test/samples/Rear_Left.wav b/speaker-test/samples/Rear_Left.wav new file mode 100644 index 0000000000000000000000000000000000000000..57d031158c00175ce535b310554f9eee95c9b48a GIT binary patch literal 126064 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�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 Sk*t4sej$Ez>BrdGHtT-_SNr7v literal 0 HcmV?d00001 diff --git a/speaker-test/samples/Rear_Right.wav b/speaker-test/samples/Rear_Right.wav new file mode 100644 index 0000000000000000000000000000000000000000..692e646bed38b0de657c20a95786f73b5e9bb07b GIT binary patch literal 146480 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 literal 0 HcmV?d00001 diff --git a/speaker-test/samples/Side_Right.wav b/speaker-test/samples/Side_Right.wav new file mode 100644 index 0000000000000000000000000000000000000000..b0e5b3a88bd44938c81238dcb4243e89c2f52c7d GIT binary patch literal 129966 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 z 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

;3L6RI1iuRg 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 B1dRXy literal 0 HcmV?d00001 diff --git a/speaker-test/samples/sample_map.csv b/speaker-test/samples/sample_map.csv new file mode 100644 index 0000000..20d8ed2 --- /dev/null +++ b/speaker-test/samples/sample_map.csv @@ -0,0 +1,2 @@ +0, "Front Left", "/usr/share/alsa/samples/Front_Left.wav" +1, "Front Right", "/usr/share/alsa/samples/Front_Right.wav" diff --git a/speaker-test/speaker-test.1 b/speaker-test/speaker-test.1 new file mode 100644 index 0000000..f0948a6 --- /dev/null +++ b/speaker-test/speaker-test.1 @@ -0,0 +1,125 @@ +.\" -*- nroff -*- +.\" macros +.de EX \" Begin Example +. IP +. ft CW +. nf +. ne \\$1 +.. +.de EE \" End Example +. ft P +. fi +. PP +.. +.TH SPEAKER\-TEST 1 "20 September 2004" speaker-test +.SH NAME +speaker\-test \- command-line speaker test tone generator for ALSA +.SH SYNOPSIS +.B speaker\-test [\-options] + +.SH DESCRIPTION +\fBspeaker\-test\fP generates a tone that can be used to test the speakers of a computer. + +.SH OPTIONS + +.TP +\fB\-c\fP | \fB\-\-channels\fP \fINUM\fP +\fINUM\fP channels in stream + +.TP +\fB\-D\fP | \fB\-\-device\fP \fINAME\fP +PCM device name \fINAME\fP + +.TP +\fB\-f\fP | \fB\-\-frequency\fP \fIFREQ\fP +sine wave of \fIFREQ\fP Hz + +.TP +\fB\-\-help\fP +Print usage help + +.TP +\fB\-b\fP | \fB\-\-buffer\fP \fITIME\fP +Use buffer size of \fITIME\fP microseconds. +When 0 is given, use the maximal buffer size. +The default value is 0. + +.TP +\fB\-p\fP | \fB\-\-period\fP \fITIME\fP +Use period size of \fITIME\fP microseconds. +When 0 is given, the periods given by \fB\-P\fP option is used. +The default value is 0. + +.TP +\fB\-P\fP | \fB\-\-nperiods\fP \fPERIODS\fP +Use number of periods. The default value is 4. + +.TP +\fB\-r\fP | \fB\-\-rate\fP \fIRATE\fP +stream of \fIRATE\fP Hz + +.TP +\fB\-t\fP | \fB\-\-test\fP \fBpink\fP|\fBsine\fP|\fBwav\fP +\fB\-t pink\fP means use pink noise (default). + +Pink noise is perceptually uniform noise -- that is, it sounds like every frequency at once. If you can hear any tone it may indicate resonances in your speaker system or room. + +\fB\-t sine\fP means to use sine wave. + +\fB\-t wav\fP means to play WAV files, either pre-defined files or given via \fB\-w\fP option. + +You can pass the number from 1 to 3 as a backward compatibility. + +.TP +\fB\-l\fP | \fB\-\-nloops\fP \fBCOUNT\fP + +Specifies the number of loops. Zero means to run infinitely. + +When \fB\-s\fP option below with a valid channel is given, \fBspeaker\-test\fP will perform +always a single-shot without looping. + +.TP +\fB\-s\fP | \fB\-\-speaker\fP \fBCHANNEL\fP +Do a single-shot speaker test for the given channel. The channel number starts from 1. +The channel number corresponds to left, right, rear-left, rear-right, center, LFE, +side-left, side-right, and so on. + +For example, when 1 is passed, it tests the left channel only once rather than both channels +with looping. + +.TP +\fB\-w\fP | \fB\-\-wavfile\fP +Use the given WAV file for the playback instead of pre-defined WAV files. + +.TP +\fB\-W\fP | \fB\-\-wavdir\fP +Specify the directory containing WAV files for playback. +The default path is \fI/usr/share/sounds/alsa\fP. + + +.SH USAGE EXAMPLES + +Produce stereo sound from one stereo jack: +.EX + speaker-test -Dplug:front -c2 +.EE + +Produce 4 speaker sound from two stereo jacks: +.EX + speaker-test -Dplug:surround40 -c4 +.EE + +Produce 5.1 speaker sound from three stereo jacks: +.EX + speaker-test -Dplug:surround51 -c6 +.EE + +To send a nice low 75Hz tone to the Woofer and then exit without touching any other speakers: +.EX + speaker-test -Dplug:surround51 -c6 -s1 -f75 +.EE + +.SH AUTHOR +The speaker-test program was written by James Courtier-Dutton. +Pink noise support was added by Nathan Hurst. +Further extensions by Takashi Iwai. diff --git a/speaker-test/speaker-test.c b/speaker-test/speaker-test.c new file mode 100644 index 0000000..3029110 --- /dev/null +++ b/speaker-test/speaker-test.c @@ -0,0 +1,1087 @@ +/* + * Copyright (C) 2000-2004 James Courtier-Dutton + * Copyright (C) 2005 Nathan Hurst + * + * This file is part of the speaker-test tool. + * + * This small program sends a simple sinusoidal wave to your speakers. + * + * speaker-test is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * speaker-test is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * + * Main program by James Courtier-Dutton (including some source code fragments from the alsa project.) + * Some cleanup from Daniel Caujolle-Bert + * Pink noise option added Nathan Hurst, + * based on generator by Phil Burk (pink.c) + * + * Changelog: + * 0.0.8 Added support for pink noise output. + * Changelog: + * 0.0.7 Added support for more than 6 channels. + * Changelog: + * 0.0.6 Added support for different sample formats. + * + * $Id: speaker_test.c,v 1.00 2003/11/26 19:43:38 jcdutton Exp $ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ALSA_PCM_NEW_HW_PARAMS_API +#define ALSA_PCM_NEW_SW_PARAMS_API +#include +#include +#include +#include "pink.h" +#include "aconfig.h" +#include "gettext.h" +#include "version.h" + +#ifdef ENABLE_NLS +#include +#endif + +enum { + TEST_PINK_NOISE = 1, + TEST_SINE, + TEST_WAV, + TEST_PATTERN, +}; + +#define MAX_CHANNELS 16 + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define COMPOSE_ID(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24)) +#define LE_SHORT(v) (v) +#define LE_INT(v) (v) +#define BE_SHORT(v) bswap_16(v) +#define BE_INT(v) bswap_32(v) +#else /* __BIG_ENDIAN */ +#define COMPOSE_ID(a,b,c,d) ((d) | ((c)<<8) | ((b)<<16) | ((a)<<24)) +#define LE_SHORT(v) bswap_16(v) +#define LE_INT(v) bswap_32(v) +#define BE_SHORT(v) (v) +#define BE_INT(v) (v) +#endif + +static char *device = "default"; /* playback device */ +static snd_pcm_format_t format = SND_PCM_FORMAT_S16; /* sample format */ +static unsigned int rate = 48000; /* stream rate */ +static unsigned int channels = 1; /* count of channels */ +static unsigned int speaker = 0; /* count of channels */ +static unsigned int buffer_time = 0; /* ring buffer length in us */ +static unsigned int period_time = 0; /* period time in us */ +static unsigned int nperiods = 4; /* number of periods */ +static double freq = 440.0; /* sinusoidal wave frequency in Hz */ +static int test_type = TEST_PINK_NOISE; /* Test type. 1 = noise, 2 = sine wave */ +static pink_noise_t pink; +static snd_pcm_uframes_t buffer_size; +static snd_pcm_uframes_t period_size; +static const char *given_test_wav_file = NULL; +static char *wav_file_dir = SOUNDSDIR; +static int debug = 0; + +static const char *const channel_name[MAX_CHANNELS] = { + /* 0 */ N_("Front Left"), + /* 1 */ N_("Front Right"), + /* 2 */ N_("Rear Left"), + /* 3 */ N_("Rear Right"), + /* 4 */ N_("Center"), + /* 5 */ N_("LFE"), + /* 6 */ N_("Side Left"), + /* 7 */ N_("Side Right"), + /* 8 */ N_("Channel 9"), + /* 9 */ N_("Channel 10"), + /* 10 */ N_("Channel 11"), + /* 11 */ N_("Channel 12"), + /* 12 */ N_("Channel 13"), + /* 13 */ N_("Channel 14"), + /* 14 */ N_("Channel 15"), + /* 15 */ N_("Channel 16") +}; + +static const int channels4[] = { + 0, /* Front Left */ + 1, /* Front Right */ + 3, /* Rear Right */ + 2, /* Rear Left */ +}; +static const int channels6[] = { + 0, /* Front Left */ + 4, /* Center */ + 1, /* Front Right */ + 3, /* Rear Right */ + 2, /* Rear Left */ + 5, /* LFE */ +}; +static const int channels8[] = { + 0, /* Front Left */ + 4, /* Center */ + 1, /* Front Right */ + 7, /* Side Right */ + 3, /* Rear Right */ + 2, /* Rear Left */ + 6, /* Side Left */ + 5, /* LFE */ +}; +static const int supported_formats[] = { + SND_PCM_FORMAT_S8, + SND_PCM_FORMAT_S16_LE, + SND_PCM_FORMAT_S16_BE, + SND_PCM_FORMAT_FLOAT_LE, + SND_PCM_FORMAT_S32_LE, + SND_PCM_FORMAT_S32_BE, + -1 +}; + +static void generate_sine(uint8_t *frames, int channel, int count, double *_phase) { + double phase = *_phase; + double max_phase = 1.0 / freq; + double step = 1.0 / (double)rate; + double res; + float fres; + int chn; + int32_t ires; + int8_t *samp8 = (int8_t*) frames; + int16_t *samp16 = (int16_t*) frames; + int32_t *samp32 = (int32_t*) frames; + float *samp_f = (float*) frames; + + while (count-- > 0) { + for(chn=0;chn> 24; + } else { + *samp8++ = 0; + } + break; + case SND_PCM_FORMAT_S16_LE: + if (chn==channel) { + res = (sin((phase * 2 * M_PI) / max_phase - M_PI)) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp16++ = LE_SHORT(ires >> 16); + } else { + *samp16++ = 0; + } + break; + case SND_PCM_FORMAT_S16_BE: + if (chn==channel) { + res = (sin((phase * 2 * M_PI) / max_phase - M_PI)) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp16++ = BE_SHORT(ires >> 16); + } else { + *samp16++ = 0; + } + break; + case SND_PCM_FORMAT_FLOAT_LE: + if (chn==channel) { + res = (sin((phase * 2 * M_PI) / max_phase - M_PI)) * 0.75 ; /* Don't use MAX volume */ + fres = res; + *samp_f++ = fres; + } else { + *samp_f++ = 0.0; + } + break; + case SND_PCM_FORMAT_S32_LE: + if (chn==channel) { + res = (sin((phase * 2 * M_PI) / max_phase - M_PI)) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp32++ = LE_INT(ires); + } else { + *samp32++ = 0; + } + break; + case SND_PCM_FORMAT_S32_BE: + if (chn==channel) { + res = (sin((phase * 2 * M_PI) / max_phase - M_PI)) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp32++ = BE_INT(ires); + } else { + *samp32++ = 0; + } + break; + default: + ; + } + } + + phase += step; + if (phase >= max_phase) + phase -= max_phase; + } + + *_phase = phase; +} + +/* Pink noise is a better test than sine wave because we can tell + * where pink noise is coming from more easily that a sine wave. + */ + + +static void generate_pink_noise( uint8_t *frames, int channel, int count) { + double res; + int chn; + int32_t ires; + int8_t *samp8 = (int8_t*) frames; + int16_t *samp16 = (int16_t*) frames; + int32_t *samp32 = (int32_t*) frames; + + while (count-- > 0) { + for(chn=0;chn> 24; + } else { + *samp8++ = 0; + } + break; + case SND_PCM_FORMAT_S16_LE: + if (chn==channel) { + res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp16++ = LE_SHORT(ires >> 16); + } else { + *samp16++ = 0; + } + break; + case SND_PCM_FORMAT_S16_BE: + if (chn==channel) { + res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp16++ = BE_SHORT(ires >> 16); + } else { + *samp16++ = 0; + } + break; + case SND_PCM_FORMAT_S32_LE: + if (chn==channel) { + res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp32++ = LE_INT(ires); + } else { + *samp32++ = 0; + } + break; + case SND_PCM_FORMAT_S32_BE: + if (chn==channel) { + res = generate_pink_noise_sample(&pink) * 0x03fffffff; /* Don't use MAX volume */ + ires = res; + *samp32++ = BE_INT(ires); + } else { + *samp32++ = 0; + } + break; + default: + ; + } + } + } +} + +/* + * useful for tests + */ +static void generate_pattern(uint8_t *frames, int channel, int count, int *_pattern) { + int pattern = *_pattern; + int chn; + int8_t *samp8 = (int8_t*) frames; + int16_t *samp16 = (int16_t*) frames; + int32_t *samp32 = (int32_t*) frames; + float *samp_f = (float*) frames; + + while (count-- > 0) { + for(chn=0;chn 0) { + printf(_("Requested period time %u us\n"), period_time); + err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, NULL); + if (err < 0) { + fprintf(stderr, _("Unable to set period time %u us for playback: %s\n"), + period_time, snd_strerror(err)); + return err; + } + } + if (buffer_time > 0) { + printf(_("Requested buffer time %u us\n"), buffer_time); + err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, NULL); + if (err < 0) { + fprintf(stderr, _("Unable to set buffer time %u us for playback: %s\n"), + buffer_time, snd_strerror(err)); + return err; + } + } + if (! buffer_time && ! period_time) { + buffer_size = buffer_size_max; + if (! period_time) + buffer_size = (buffer_size / nperiods) * nperiods; + printf(_("Using max buffer size %lu\n"), buffer_size); + err = snd_pcm_hw_params_set_buffer_size_near(handle, params, &buffer_size); + if (err < 0) { + fprintf(stderr, _("Unable to set buffer size %lu for playback: %s\n"), + buffer_size, snd_strerror(err)); + return err; + } + } + if (! buffer_time || ! period_time) { + printf(_("Periods = %u\n"), nperiods); + err = snd_pcm_hw_params_set_periods_near(handle, params, &nperiods, NULL); + if (err < 0) { + fprintf(stderr, _("Unable to set nperiods %u for playback: %s\n"), + nperiods, snd_strerror(err)); + return err; + } + } + + /* write the parameters to device */ + err = snd_pcm_hw_params(handle, params); + if (err < 0) { + fprintf(stderr, _("Unable to set hw params for playback: %s\n"), snd_strerror(err)); + return err; + } + + snd_pcm_hw_params_get_buffer_size(params, &buffer_size); + snd_pcm_hw_params_get_period_size(params, &period_size, NULL); + printf(_("was set period_size = %lu\n"),period_size); + printf(_("was set buffer_size = %lu\n"),buffer_size); + if (2*period_size > buffer_size) { + fprintf(stderr, _("buffer to small, could not use\n")); + return -EINVAL; + } + + return 0; +} + +static int set_swparams(snd_pcm_t *handle, snd_pcm_sw_params_t *swparams) { + int err; + + /* get the current swparams */ + err = snd_pcm_sw_params_current(handle, swparams); + if (err < 0) { + fprintf(stderr, _("Unable to determine current swparams for playback: %s\n"), snd_strerror(err)); + return err; + } + + /* start the transfer when a buffer is full */ + err = snd_pcm_sw_params_set_start_threshold(handle, swparams, buffer_size); + if (err < 0) { + fprintf(stderr, _("Unable to set start threshold mode for playback: %s\n"), snd_strerror(err)); + return err; + } + + /* allow the transfer when at least period_size frames can be processed */ + err = snd_pcm_sw_params_set_avail_min(handle, swparams, period_size); + if (err < 0) { + fprintf(stderr, _("Unable to set avail min for playback: %s\n"), snd_strerror(err)); + return err; + } + + /* write the parameters to the playback device */ + err = snd_pcm_sw_params(handle, swparams); + if (err < 0) { + fprintf(stderr, _("Unable to set sw params for playback: %s\n"), snd_strerror(err)); + return err; + } + + return 0; +} + +/* + * Underrun and suspend recovery + */ + +static int xrun_recovery(snd_pcm_t *handle, int err) { + if (err == -EPIPE) { /* under-run */ + err = snd_pcm_prepare(handle); + if (err < 0) + fprintf(stderr, _("Can't recovery from underrun, prepare failed: %s\n"), snd_strerror(err)); + return 0; + } + else if (err == -ESTRPIPE) { + + while ((err = snd_pcm_resume(handle)) == -EAGAIN) + sleep(1); /* wait until the suspend flag is released */ + + if (err < 0) { + err = snd_pcm_prepare(handle); + if (err < 0) + fprintf(stderr, _("Can't recovery from suspend, prepare failed: %s\n"), snd_strerror(err)); + } + + return 0; + } + + return err; +} + +/* + * Handle WAV files + */ + +static const char *wav_file[MAX_CHANNELS]; +static int wav_file_size[MAX_CHANNELS]; + +struct wave_header { + struct { + uint32_t magic; + uint32_t length; + uint32_t type; + } hdr; + struct { + uint32_t type; + uint32_t length; + } chunk1; + struct { + uint16_t format; + uint16_t channels; + uint32_t rate; + uint32_t bytes_per_sec; + uint16_t sample_size; + uint16_t sample_bits; + } body; + struct { + uint32_t type; + uint32_t length; + } chunk; +}; + +#define WAV_RIFF COMPOSE_ID('R','I','F','F') +#define WAV_WAVE COMPOSE_ID('W','A','V','E') +#define WAV_FMT COMPOSE_ID('f','m','t',' ') +#define WAV_DATA COMPOSE_ID('d','a','t','a') +#define WAV_PCM_CODE 1 + +static const char *search_for_file(const char *name) +{ + char *file; + if (*name == '/') + return strdup(name); + file = malloc(strlen(wav_file_dir) + strlen(name) + 2); + if (file) + sprintf(file, "%s/%s", wav_file_dir, name); + return file; +} + +static int check_wav_file(int channel, const char *name) +{ + struct wave_header header; + int fd; + + wav_file[channel] = search_for_file(name); + if (! wav_file[channel]) { + fprintf(stderr, _("No enough memory\n")); + return -ENOMEM; + } + + if ((fd = open(wav_file[channel], O_RDONLY)) < 0) { + fprintf(stderr, _("Cannot open WAV file %s\n"), wav_file[channel]); + return -EINVAL; + } + if (read(fd, &header, sizeof(header)) < (int)sizeof(header)) { + fprintf(stderr, _("Invalid WAV file %s\n"), wav_file[channel]); + goto error; + } + + if (header.hdr.magic != WAV_RIFF || header.hdr.type != WAV_WAVE) { + fprintf(stderr, _("Not a WAV file: %s\n"), wav_file[channel]); + goto error; + } + if (header.body.format != LE_SHORT(WAV_PCM_CODE)) { + fprintf(stderr, _("Unsupported WAV format %d for %s\n"), + LE_SHORT(header.body.format), wav_file[channel]); + goto error; + } + if (header.body.channels != LE_SHORT(1)) { + fprintf(stderr, _("%s is not a mono stream (%d channels)\n"), + wav_file[channel], LE_SHORT(header.body.channels)); + goto error; + } + if (header.body.rate != LE_INT(rate)) { + fprintf(stderr, _("Sample rate doesn't match (%d) for %s\n"), + LE_INT(header.body.rate), wav_file[channel]); + goto error; + } + if (header.body.sample_bits != LE_SHORT(16)) { + fprintf(stderr, _("Unsupported sample format bits %d for %s\n"), + LE_SHORT(header.body.sample_bits), wav_file[channel]); + goto error; + } + if (header.chunk.type != WAV_DATA) { + fprintf(stderr, _("Invalid WAV file %s\n"), wav_file[channel]); + goto error; + } + wav_file_size[channel] = LE_INT(header.chunk.length); + close(fd); + return 0; + + error: + close(fd); + return -EINVAL; +} + +static int setup_wav_file(int chn) +{ + static const char *const wavs[MAX_CHANNELS] = { + "Front_Left.wav", + "Front_Right.wav", + "Rear_Left.wav", + "Rear_Right.wav", + "Front_Center.wav", + "Rear_Center.wav", /* FIXME: should be "Bass" or so */ + "Side_Left.wav", + "Side_Right.wav", + "Channel_9.wav", + "Channel_10.wav", + "Channel_11.wav", + "Channel_12.wav", + "Channel_13.wav", + "Channel_14.wav", + "Channel_15.wav", + "Channel_16.wav" + }; + + if (given_test_wav_file) + return check_wav_file(chn, given_test_wav_file); + else + return check_wav_file(chn, wavs[chn]); +} + +static int read_wav(uint16_t *buf, int channel, int offset, int bufsize) +{ + static FILE *wavfp = NULL; + int size; + + if (! wav_file[channel]) { + fprintf(stderr, _("Undefined channel %d\n"), channel); + return -EINVAL; + } + + if (offset >= wav_file_size[channel]) + return 0; /* finished */ + + if (! offset) { + if (wavfp) + fclose(wavfp); + wavfp = fopen(wav_file[channel], "r"); + if (! wavfp) + return -errno; + if (fseek(wavfp, sizeof(struct wave_header), SEEK_SET) < 0) + return -errno; + } + if (offset + bufsize > wav_file_size[channel]) + bufsize = wav_file_size[channel] - offset; + bufsize /= channels; + for (size = 0; size < bufsize; size += 2) { + int chn; + for (chn = 0; chn < channels; chn++) { + if (chn == channel) { + if (fread(buf, 2, 1, wavfp) != 1) + return size; + } + else + *buf = 0; + buf++; + } + } + return size; +} + + +/* + * Transfer method - write only + */ + +static int write_buffer(snd_pcm_t *handle, uint8_t *ptr, int cptr) +{ + int err; + + while (cptr > 0) { + + err = snd_pcm_writei(handle, ptr, cptr); + + if (err == -EAGAIN) + continue; + + if (err < 0) { + fprintf(stderr, _("Write error: %d,%s\n"), err, snd_strerror(err)); + if (xrun_recovery(handle, err) < 0) { + fprintf(stderr, _("xrun_recovery failed: %d,%s\n"), err, snd_strerror(err)); + return -1; + } + break; /* skip one period */ + } + + ptr += snd_pcm_frames_to_bytes(handle, err); + cptr -= err; + } + return 0; +} + +static int write_loop(snd_pcm_t *handle, int channel, int periods, uint8_t *frames) +{ + double phase = 0; + int pattern = 0; + int err, n; + + fflush(stdout); + if (test_type == TEST_WAV) { + int bufsize = snd_pcm_frames_to_bytes(handle, period_size); + n = 0; + while ((err = read_wav((uint16_t *)frames, channel, n, bufsize)) > 0) { + n += err; + if ((err = write_buffer(handle, frames, + snd_pcm_bytes_to_frames(handle, err * channels))) < 0) + break; + } + if (buffer_size > n) { + snd_pcm_drain(handle); + snd_pcm_prepare(handle); + } + return err; + } + + + if (periods <= 0) + periods = 1; + + for(n = 0; n < periods; n++) { + if (test_type == TEST_PINK_NOISE) + generate_pink_noise(frames, channel, period_size); + else if (test_type == TEST_PATTERN) + generate_pattern(frames, channel, period_size, &pattern); + else + generate_sine(frames, channel, period_size, &phase); + + if ((err = write_buffer(handle, frames, period_size)) < 0) + return err; + } + if (buffer_size > n * period_size) { + snd_pcm_drain(handle); + snd_pcm_prepare(handle); + } + return 0; +} + +static void help(void) +{ + const int *fmt; + + printf( + _("Usage: speaker-test [OPTION]... \n" + "-h,--help help\n" + "-D,--device playback device\n" + "-r,--rate stream rate in Hz\n" + "-c,--channels count of channels in stream\n" + "-f,--frequency sine wave frequency in Hz\n" + "-F,--format sample format\n" + "-b,--buffer ring buffer size in us\n" + "-p,--period period size in us\n" + "-P,--nperiods number of periods\n" + "-t,--test pink=use pink noise, sine=use sine wave, wav=WAV file\n" + "-l,--nloops specify number of loops to test, 0 = infinite\n" + "-s,--speaker single speaker test. Values 1=Left, 2=right, etc\n" + "-w,--wavfile Use the given WAV file as a test sound\n" + "-W,--wavdir Specify the directory containing WAV files\n" + "\n")); + printf(_("Recognized sample formats are:")); + for (fmt = supported_formats; *fmt >= 0; fmt++) { + const char *s = snd_pcm_format_name(*fmt); + if (s) + printf(" %s", s); + } + + printf("\n\n"); +} + +int main(int argc, char *argv[]) { + snd_pcm_t *handle; + int err, morehelp; + snd_pcm_hw_params_t *hwparams; + snd_pcm_sw_params_t *swparams; + uint8_t *frames; + int chn; + const int *fmt; + double time1,time2,time3; + unsigned int n, nloops; + struct timeval tv1,tv2; + + static const struct option long_option[] = { + {"help", 0, NULL, 'h'}, + {"device", 1, NULL, 'D'}, + {"rate", 1, NULL, 'r'}, + {"channels", 1, NULL, 'c'}, + {"frequency", 1, NULL, 'f'}, + {"format", 1, NULL, 'F'}, + {"buffer", 1, NULL, 'b'}, + {"period", 1, NULL, 'p'}, + {"nperiods", 1, NULL, 'P'}, + {"test", 1, NULL, 't'}, + {"nloops", 1, NULL, 'l'}, + {"speaker", 1, NULL, 's'}, + {"wavfile", 1, NULL, 'w'}, + {"wavdir", 1, NULL, 'W'}, + {"debug", 0, NULL, 'd'}, + {NULL, 0, NULL, 0 }, + }; + +#ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + textdomain(PACKAGE); +#endif + + snd_pcm_hw_params_alloca(&hwparams); + snd_pcm_sw_params_alloca(&swparams); + + nloops = 0; + morehelp = 0; + + printf("\nspeaker-test %s\n\n", SND_UTIL_VERSION_STR); + while (1) { + int c; + + if ((c = getopt_long(argc, argv, "hD:r:c:f:F:b:p:P:t:l:s:w:W:d", long_option, NULL)) < 0) + break; + + switch (c) { + case 'h': + morehelp++; + break; + case 'D': + device = strdup(optarg); + break; + case 'F': + format = snd_pcm_format_value(optarg); + for (fmt = supported_formats; *fmt >= 0; fmt++) + if (*fmt == format) + break; + if (*fmt < 0) { + fprintf(stderr, "Format %s is not supported...\n", snd_pcm_format_name(format)); + exit(EXIT_FAILURE); + } + break; + case 'r': + rate = atoi(optarg); + rate = rate < 4000 ? 4000 : rate; + rate = rate > 196000 ? 196000 : rate; + break; + case 'c': + channels = atoi(optarg); + channels = channels < 1 ? 1 : channels; + channels = channels > 1024 ? 1024 : channels; + break; + case 'f': + freq = atof(optarg); + freq = freq < 30.0 ? 30.0 : freq; + freq = freq > 5000.0 ? 5000.0 : freq; + break; + case 'b': + buffer_time = atoi(optarg); + buffer_time = buffer_time > 1000000 ? 1000000 : buffer_time; + break; + case 'p': + period_time = atoi(optarg); + period_time = period_time > 1000000 ? 1000000 : period_time; + break; + case 'P': + nperiods = atoi(optarg); + if (nperiods < 2 || nperiods > 1024) { + fprintf(stderr, _("Invalid number of periods %d\n"), nperiods); + exit(1); + } + break; + case 't': + if (*optarg == 'p') + test_type = TEST_PINK_NOISE; + else if (*optarg == 's') + test_type = TEST_SINE; + else if (*optarg == 'w') + test_type = TEST_WAV; + else if (*optarg == 't') + test_type = TEST_PATTERN; + else if (isdigit(*optarg)) { + test_type = atoi(optarg); + if (test_type < TEST_PINK_NOISE || test_type > TEST_PATTERN) { + fprintf(stderr, _("Invalid test type %s\n"), optarg); + exit(1); + } + } else { + fprintf(stderr, _("Invalid test type %s\n"), optarg); + exit(1); + } + break; + case 'l': + nloops = atoi(optarg); + break; + case 's': + speaker = atoi(optarg); + speaker = speaker < 1 ? 0 : speaker; + speaker = speaker > channels ? 0 : speaker; + if (speaker==0) { + fprintf(stderr, _("Invalid parameter for -s option.\n")); + exit(EXIT_FAILURE); + } + break; + case 'w': + given_test_wav_file = optarg; + break; + case 'W': + wav_file_dir = optarg; + break; + case 'd': + debug = 1; + break; + default: + fprintf(stderr, _("Unknown option '%c'\n"), c); + exit(EXIT_FAILURE); + break; + } + } + + if (morehelp) { + help(); + exit(EXIT_SUCCESS); + } + + if (test_type == TEST_WAV) + format = SND_PCM_FORMAT_S16_LE; /* fixed format */ + + printf(_("Playback device is %s\n"), device); + printf(_("Stream parameters are %iHz, %s, %i channels\n"), rate, snd_pcm_format_name(format), channels); + switch (test_type) { + case TEST_PINK_NOISE: + printf(_("Using 16 octaves of pink noise\n")); + break; + case TEST_SINE: + printf(_("Sine wave rate is %.4fHz\n"), freq); + break; + case TEST_WAV: + printf(_("WAV file(s)\n")); + break; + + } + + if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + printf(_("Playback open error: %d,%s\n"), err,snd_strerror(err)); + exit(EXIT_FAILURE); + } + + if ((err = set_hwparams(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + printf(_("Setting of hwparams failed: %s\n"), snd_strerror(err)); + snd_pcm_close(handle); + exit(EXIT_FAILURE); + } + if ((err = set_swparams(handle, swparams)) < 0) { + printf(_("Setting of swparams failed: %s\n"), snd_strerror(err)); + snd_pcm_close(handle); + exit(EXIT_FAILURE); + } + if (debug) { + snd_output_t *log; + err = snd_output_stdio_attach(&log, stderr, 0); + if (err >= 0) { + snd_pcm_dump(handle, log); + snd_output_close(log); + } + } + + frames = malloc(snd_pcm_frames_to_bytes(handle, period_size)); + if (test_type == TEST_PINK_NOISE) + initialize_pink_noise(&pink, 16); + + if (frames == NULL) { + fprintf(stderr, _("No enough memory\n")); + exit(EXIT_FAILURE); + } + if (speaker==0) { + + if (test_type == TEST_WAV) { + for (chn = 0; chn < channels; chn++) { + if (setup_wav_file(chn) < 0) + exit(EXIT_FAILURE); + } + } + + for (n = 0; ! nloops || n < nloops; n++) { + + gettimeofday(&tv1, NULL); + for(chn = 0; chn < channels; chn++) { + int channel=chn; + if (channels == 4) { + channel=channels4[chn]; + } + if (channels == 6) { + channel=channels6[chn]; + } + if (channels == 8) { + channel=channels8[chn]; + } + printf(" %d - %s\n", channel, gettext(channel_name[channel])); + + err = write_loop(handle, channel, ((rate*3)/period_size), frames); + + if (err < 0) { + fprintf(stderr, _("Transfer failed: %s\n"), snd_strerror(err)); + free(frames); + snd_pcm_close(handle); + exit(EXIT_SUCCESS); + } + } + gettimeofday(&tv2, NULL); + time1 = (double)tv1.tv_sec + ((double)tv1.tv_usec / 1000000.0); + time2 = (double)tv2.tv_sec + ((double)tv2.tv_usec / 1000000.0); + time3 = time2 - time1; + printf(_("Time per period = %lf\n"), time3 ); + } + } else { + if (test_type == TEST_WAV) { + if (setup_wav_file(speaker - 1) < 0) + exit(EXIT_FAILURE); + } + + printf(" - %s\n", gettext(channel_name[speaker-1])); + err = write_loop(handle, speaker-1, ((rate*5)/period_size), frames); + + if (err < 0) { + fprintf(stderr, _("Transfer failed: %s\n"), snd_strerror(err)); + } + } + + + free(frames); + snd_pcm_close(handle); + + exit(EXIT_SUCCESS); +} diff --git a/utils/Makefile.am b/utils/Makefile.am new file mode 100644 index 0000000..083e5b4 --- /dev/null +++ b/utils/Makefile.am @@ -0,0 +1,4 @@ +EXTRA_DIST = buildrpm + +rpm: buildrpm alsa-lib.spec + VERSION=$(VERSION) $(srcdir)/buildrpm diff --git a/utils/Makefile.in b/utils/Makefile.in new file mode 100644 index 0000000..11bd769 --- /dev/null +++ b/utils/Makefile.in @@ -0,0 +1,369 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = utils +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/alsa-utils.spec.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/aconfig.h +CONFIG_CLEAN_FILES = alsa-utils.spec +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +ASOUND_STATE_DIR = @ASOUND_STATE_DIR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSESINC = @CURSESINC@ +CURSESLIB = @CURSESLIB@ +CURSES_CFLAGS = @CURSES_CFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POSUB = @POSUB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SND_UTIL_MAJOR = @SND_UTIL_MAJOR@ +SND_UTIL_MINOR = @SND_UTIL_MINOR@ +SND_UTIL_SUBMINOR = @SND_UTIL_SUBMINOR@ +SND_UTIL_VERSION = @SND_UTIL_VERSION@ +STRIP = @STRIP@ +TESTSOUND = @TESTSOUND@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ncurses5_config = @ncurses5_config@ +ncursesw5_config = @ncursesw5_config@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemdsystemunitdir = @systemdsystemunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +xmlto = @xmlto@ +EXTRA_DIST = buildrpm +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +alsa-utils.spec: $(top_builddir)/config.status $(srcdir)/alsa-utils.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am + + +rpm: buildrpm alsa-lib.spec + VERSION=$(VERSION) $(srcdir)/buildrpm + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/utils/alsa-utils.spec.in b/utils/alsa-utils.spec.in new file mode 100644 index 0000000..8daf3ba --- /dev/null +++ b/utils/alsa-utils.spec.in @@ -0,0 +1,76 @@ +%define ver @VERSION@ +%define rel 1 + +Summary: Advanced Linux Sound Architecture (ALSA) - Utils +Name: alsa-utils +Version: %ver +Release: %rel +Copyright: GPL +Group: System/Libraries +Source: ftp://ftp.alsa-project.org/pub/utils/alsa-utils-%{ver}.tar.bz2 +BuildRoot: %{_tmppath}/%{name}-%{version}-root +URL: http://www.alsa-project.org +Requires: alsa-lib ncurses +BuildRequires: alsa-lib-devel ncurses-devel gettext + +%description + +Advanced Linux Sound Architecture (ALSA) - Utils + +%changelog +* Sun Oct 1 2006 Jaroslav Kysela +- add gettext to BuildRequires +- add more files (see alsa bug#2139) + +* Tue Nov 25 2003 Ronny V. Vindenes +- include all manpages + +* Thu Mar 6 2003 Ronny V. Vindenes + +- removed wrongly included doc file +- changed BuildRoot from /var/tmp to _tmppath +- use standard rpm macros for build & install section +- updated dependencies + +* Tue Nov 20 2001 Jaroslav Kysela + +- changed BuildRoot from /tmp to /var/tmp +- _prefix and _mandir macros are used for configure and mkdir +- DESTDIR is used for make install + +* Sun Nov 11 2001 Miroslav Benes + +- dangerous command "rpm -rf $RPM_BUILD_ROOT" checks $RPM_BUILD_ROOT variable +- unset key "Docdir" - on some new systems are documentation in /usr/share/doc + +* Mon May 28 1998 Helge Jensen + +- Made SPEC file + +%prep +%setup +%build +%configure +make + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT +%makeinstall + +%clean +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc ChangeLog COPYING README + +%{_prefix}/sbin/* +%{_prefix}/bin/* +%{_mandir}/man?/* +%{_mandir}/fr/man?/* +%{_prefix}/share/alsa/speaker-test/* +%{_prefix}/share/locale/ja/LC_MESSAGES/* +%{_prefix}/share/locale/ru/LC_MESSAGES/* +%{_prefix}/share/man/fr/man8/alsaconf.8.gz +%{_prefix}/share/sounds/alsa/* diff --git a/utils/buildrpm b/utils/buildrpm new file mode 100644 index 0000000..3a9ab86 --- /dev/null +++ b/utils/buildrpm @@ -0,0 +1,44 @@ +#!/bin/bash + +source=. +version=`cat $source/../version` +package=$source/../alsa-utils-$version.tar.bz2 +packagedir=/usr/src/redhat +xrpmbuild=rpm +rpmbuild --usage 2> /dev/null > /dev/null && xrpmbuild=rpmbuild + +# SuSE path +if [ -d /usr/src/packages ]; then + packagedir=/usr/src/packages +fi + +make -C .. clean +make -C .. dist + +if [ ! -r $package ]; then + echo "Error: wrong package: $package" + exit 1 +fi + +cp -fv $package ${packagedir}/SOURCES + +if [ ! -r $source/buildrpm ]; then + echo "Error: invalid directory: $source" + exit 1 +fi + +if [ ! -d ${packagedir} ]; then + echo "Error: ${packagedir} directory not found" + exit 1 +fi + +if [ ! -r $source/alsadriver.spec ]; then + cd $source/.. + ./configure + cd utils +fi + +cp -fv $source/alsa-utils.spec ${packagedir}/SPECS +cd ${packagedir}/SPECS +$xrpmbuild -ba alsa-utils.spec +cd ${packagedir} -- 2.7.4

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