--- /dev/null
+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 <timj@gtk.org>
+* enhanced Mixer from Andy Lo A Foe <arloafoe@cs.vu.nl> 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)
--- /dev/null
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, 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.
+\f
+ 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.)
+\f
+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.
+\f
+ 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.
+\f
+ 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
+\f
+ Appendix: 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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.
+
+ <signature of Ty Coon>, 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.
--- /dev/null
+#
+# Makefile for ALSA Utilities
+# Copyright (c) 1994-98 by Jaroslav Kysela <perex@jcu.cz>
+#
+
+ifeq (Makefile.conf,$(wildcard Makefile.conf))
+include Makefile.conf
+else
+dummy:
+ @echo
+ @echo "Please, run configure script as first..."
+ @echo
+endif
+
+
+all:
+ $(MAKE) -C aplay
+ $(MAKE) -C amixer
+ $(MAKE) -C alsamixer
+ @echo
+ @echo "ALSA Utilities were sucessfully compiled."
+ @echo
+
+install: all
+ $(INSTALL) -s -m 755 -o root -g root aplay/aplay ${bindir}
+ ln -sf aplay ${bindir}/arecord
+ $(INSTALL) -s -m 755 -o root -g root amixer/amixer ${bindir}
+ $(INSTALL) -s -m 755 -o root -g root alsamixer/alsamixer ${bindir}
+
+clean:
+ $(MAKE) -C include clean
+ $(MAKE) -C aplay clean
+ $(MAKE) -C amixer clean
+ $(MAKE) -C alsamixer clean
+ $(MAKE) -C utils clean
+ rm -f core .depend *.o *.orig *~
+ rm -f `find . -name "out.txt"`
+
+pack: clean
+ rm -f config.cache config.log config.status Makefile.conf
+ chown -R root.root ../alsa-utils
+ tar cvz -C .. -f ../alsa-utils-$(SND_UTIL_VERSION).tar.gz alsa-utils
+
+publish: pack
+ cat ../alsa-utils-$(SND_UTIL_VERSION).tar.gz | \
+ ssh -l root zarquon.jcu.cz /home/alsa/publishutils alsa-utils-$(SND_UTIL_VERSION).tar.gz
--- /dev/null
+# Generated automatically from Makefile.conf.in by configure.
+#
+# Configuration Makefile for ALSA Utilities
+# Copyright (c) 1994-98 by Jaroslav Kysela <perex@jcu.cz>
+#
+
+srcdir=.
+prefix=/usr
+exec_prefix=${prefix}
+includedir=${prefix}/include
+bindir=${exec_prefix}/bin
+libdir=${exec_prefix}/lib
+c_opts=-I/usr/include
+INSTALL=/usr/bin/install -c
+SND_UTIL_VERSION=0.0.4
+SND_UTIL_MAJOR=0
+SND_UTIL_MINOR=0
+SND_UTIL_SUBMINOR=4
+
+CC=gcc
+CPP=gcc
+INCLUDE=-I/usr/local/include -I$(TOPDIR)/include
+COPTS = $(c_opts)
+COPTS += -Wall -Wstrict-prototypes -fomit-frame-pointer -pipe
+LINKER=ld
+SNDLIB=-lsound
+NCURSESINC="<ncurses.h>"
+NCURSESLIB=-lncurses
+LN_S=@LN_S@
--- /dev/null
+#
+# Configuration Makefile for ALSA Utilities
+# Copyright (c) 1994-98 by Jaroslav Kysela <perex@jcu.cz>
+#
+
+srcdir=@srcdir@
+VPATH=@srcdir@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+includedir=@includedir@
+bindir=@bindir@
+libdir=@libdir@
+c_opts=@CFLAGS@
+INSTALL=@INSTALL@
+SND_UTIL_VERSION=@SND_UTIL_VERSION@
+SND_UTIL_MAJOR=@SND_UTIL_MAJOR@
+SND_UTIL_MINOR=@SND_UTIL_MINOR@
+SND_UTIL_SUBMINOR=@SND_UTIL_SUBMINOR@
+
+CC=gcc
+CPP=gcc
+INCLUDE=-I/usr/local/include -I$(TOPDIR)/include
+COPTS = $(c_opts)
+COPTS += -Wall -Wstrict-prototypes -fomit-frame-pointer -pipe
+LINKER=ld
+SNDLIB=-lsound
+NCURSESINC="<ncurses.h>"
+NCURSESLIB=-lncurses
+LN_S=@LN_S@
--- /dev/null
+
+ Advanced Linux Sound Architecture - Utilities
+ =============================================
+
+This packages contains command line utilities for the ALSA project.
+Package should be compiled only with installed ALSA driver and
+ALSA C library.
+
+aplay/arecord - utility for playback / record of .wav,.voc,.au files
+amixer - a command line mixer
+alsamixer - ncurses mixer
+
+You should look for more info about ALSA project to http://alsa.jcu.cz.
+
+ Jaroslav Kysela <perex@jcu.cz>
--- /dev/null
+#
+# Makefile for Alsa Mixer
+#
+
+TOPDIR = ..
+
+include $(TOPDIR)/Makefile.conf
+
+OBJECTS = alsamixer.o
+
+.SUFFIXES:
+.SUFFIXES: .o .cpp .c .s .S
+
+.c.o:
+ $(CC) $(COPTS) $(INCLUDE) -DNCURSESINC=$(NCURSESINC) -c -o $*.o $<
+
+all: alsamixer
+
+alsamixer: $(OBJECTS)
+ $(CPP) -o alsamixer $(OBJECTS) $(SNDLIB) $(NCURSESLIB)
+
+clean:
+ rm -f *.o alsamixer *~
--- /dev/null
+/* AlsaMixer - Commandline mixer for the ALSA project
+ * Copyright (C) 1998 Jaroslav Kysela <perex@jcu.cz> & Tim Janik <timj@gtk.org>
+ *
+ * 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 Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/sound.h>
+
+#include <errno.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/signal.h>
+
+#ifndef NCURSESINC
+#include <ncurses.h>
+#else
+#include NCURSESINC
+#endif
+#include <time.h>
+
+#include <sys/soundlib.h>
+
+/* example compilation commandline:
+ * clear; gcc -Wall -pipe -O2 alsamixer.c -o alsamixer -lncurses
+ */
+
+/* --- defines --- */
+#define PRGNAME "alsamixer"
+#define PRGNAME_UPPER "AlsaMixer"
+#define VERSION "v0.9"
+
+#undef MAX
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#undef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#undef ABS
+#define ABS(a) (((a) < 0) ? -(a) : (a))
+#undef CLAMP
+#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
+
+#define MIXER_MIN_X (23) /* minimum: 23 */
+#define MIXER_MIN_Y (19) /* minimum: 19 */
+
+#define MIXER_BLACK (COLOR_BLACK)
+#define MIXER_DARK_RED (COLOR_RED)
+#define MIXER_RED (COLOR_RED | A_BOLD)
+#define MIXER_GREEN (COLOR_GREEN | A_BOLD)
+#define MIXER_ORANGE (COLOR_YELLOW)
+#define MIXER_YELLOW (COLOR_YELLOW | A_BOLD)
+#define MIXER_MARIN (COLOR_BLUE)
+#define MIXER_BLUE (COLOR_BLUE | A_BOLD)
+#define MIXER_MAGENTA (COLOR_MAGENTA)
+#define MIXER_DARK_CYAN (COLOR_CYAN)
+#define MIXER_CYAN (COLOR_CYAN | A_BOLD)
+#define MIXER_GREY (COLOR_WHITE)
+#define MIXER_GRAY (MIXER_GREY)
+#define MIXER_WHITE (COLOR_WHITE | A_BOLD)
+
+
+/* --- variables --- */
+static WINDOW *mixer_window = NULL;
+static int mixer_max_x = 0;
+static int mixer_max_y = 0;
+static int mixer_ofs_x = 0;
+static float mixer_extra_space = 0;
+static int mixer_ofs_y = 0;
+static int mixer_cbar_height = 0;
+
+static int card_id = 0;
+static int mixer_id = 0;
+static void *mixer_handle;
+static char *mixer_card_name = NULL;
+static char *mixer_device_name = NULL;
+
+static int mixer_n_channels = 0;
+static int mixer_n_vis_channels = 0;
+static int mixer_first_vis_channel = 0;
+static int mixer_focus_channel = 0;
+static int mixer_exact = 0;
+
+static int mixer_lvolume_delta = 0;
+static int mixer_rvolume_delta = 0;
+static int mixer_balance_volumes = 0;
+static int mixer_toggle_mute_left = 0;
+static int mixer_toggle_mute_right = 0;
+static int mixer_toggle_record = 0;
+
+
+/* --- draw contexts --- */
+enum
+{
+ DC_DEFAULT,
+ DC_BACK,
+ DC_TEXT,
+ DC_PROMPT,
+ DC_CBAR_MUTE,
+ DC_CBAR_NOMUTE,
+ DC_CBAR_RECORD,
+ DC_CBAR_NORECORD,
+ DC_CBAR_EMPTY,
+ DC_CBAR_FULL_1,
+ DC_CBAR_FULL_2,
+ DC_CBAR_FULL_3,
+ DC_CBAR_LABEL,
+ DC_CBAR_FOCUS_LABEL,
+ DC_FOCUS,
+ DC_LAST
+};
+
+static int dc_fg[DC_LAST] = { 0 };
+static int dc_attrib[DC_LAST] = { 0 };
+static int dc_char[DC_LAST] = { 0 };
+static int mixer_do_color = 1;
+
+static void
+mixer_init_dc (int c,
+ int n,
+ int f,
+ int b,
+ int a)
+{
+ dc_fg[n] = f;
+ dc_attrib[n] = a;
+ dc_char[n] = c;
+ if (n > 0)
+ init_pair (n, dc_fg[n] & 0xf, b & 0x0f);
+}
+
+static int
+mixer_dc (int n)
+{
+ if (mixer_do_color)
+ attrset (COLOR_PAIR (n) | (dc_fg[n] & 0xfffffff0));
+ else
+ attrset (dc_attrib[n]);
+
+ return dc_char[n];
+}
+
+static void
+mixer_init_draw_contexts (void)
+{
+ start_color ();
+
+ mixer_init_dc ('.', DC_BACK, MIXER_WHITE, MIXER_BLACK, A_NORMAL);
+ mixer_init_dc ('.', DC_TEXT, MIXER_YELLOW, MIXER_BLACK, A_BOLD);
+ mixer_init_dc ('.', DC_PROMPT, MIXER_DARK_CYAN, MIXER_BLACK, A_NORMAL);
+ mixer_init_dc ('M', DC_CBAR_MUTE, MIXER_CYAN, MIXER_BLACK, A_BOLD);
+ mixer_init_dc ('-', DC_CBAR_NOMUTE, MIXER_CYAN, MIXER_BLACK, A_NORMAL);
+ mixer_init_dc ('x', DC_CBAR_RECORD, MIXER_DARK_RED, MIXER_BLACK, A_BOLD);
+ mixer_init_dc ('-', DC_CBAR_NORECORD, MIXER_GRAY, MIXER_BLACK, A_NORMAL);
+ mixer_init_dc (' ', DC_CBAR_EMPTY, MIXER_GRAY, MIXER_BLACK, A_DIM);
+ mixer_init_dc ('#', DC_CBAR_FULL_1, MIXER_WHITE, MIXER_BLACK, A_BOLD);
+ mixer_init_dc ('#', DC_CBAR_FULL_2, MIXER_GREEN, MIXER_BLACK, A_BOLD);
+ mixer_init_dc ('#', DC_CBAR_FULL_3, MIXER_RED, MIXER_BLACK, A_BOLD);
+ mixer_init_dc ('.', DC_CBAR_LABEL, MIXER_WHITE, MIXER_BLUE, A_REVERSE | A_BOLD);
+ mixer_init_dc ('.', DC_CBAR_FOCUS_LABEL, MIXER_RED, MIXER_BLUE, A_REVERSE | A_BOLD);
+ mixer_init_dc ('.', DC_FOCUS, MIXER_RED, MIXER_BLACK, A_BOLD);
+}
+#define DC_CBAR_FRAME (DC_CBAR_MUTE)
+#define DC_FRAME (DC_PROMPT)
+
+
+/* --- error types --- */
+typedef enum
+{
+ ERR_NONE,
+ ERR_OPEN,
+ ERR_FCN,
+ ERR_SIGNAL,
+ ERR_WINSIZE,
+} ErrType;
+
+
+/* --- prototypes --- */
+static void mixer_abort (ErrType error,
+ const char *err_string)
+ __attribute__
+((noreturn));
+
+
+/* --- functions --- */
+static void
+mixer_clear (void)
+{
+ int x, y;
+
+ mixer_dc (DC_BACK);
+ clear ();
+
+ /* buggy ncurses doesn't really write spaces with the specified
+ * color into the screen on clear ();
+ */
+ for (x = 0; x < mixer_max_x; x++)
+ for (y = 0; y < mixer_max_y; y++)
+ mvaddch (y, x, ' ');
+ refresh ();
+}
+
+static void
+mixer_abort (ErrType error,
+ const char *err_string)
+{
+ if (mixer_window)
+ {
+ mixer_clear ();
+ endwin ();
+ mixer_window = NULL;
+ }
+ printf ("\n");
+
+ switch (error)
+ {
+ case ERR_OPEN:
+ fprintf (stderr,
+ PRGNAME ": failed to open mixer #%i/#%i: %s\n",
+ card_id,
+ mixer_id,
+ snd_strerror(errno));
+ break;
+ case ERR_FCN:
+ fprintf (stderr,
+ PRGNAME ": function %s failed: %s\n",
+ err_string,
+ snd_strerror(errno));
+ break;
+ case ERR_SIGNAL:
+ fprintf (stderr,
+ PRGNAME ": aborting due to signal `%s'\n",
+ err_string);
+ break;
+ case ERR_WINSIZE:
+ fprintf (stderr,
+ PRGNAME ": screen size too small (%dx%d)\n",
+ mixer_max_x,
+ mixer_max_y);
+ break;
+ default:
+ break;
+ }
+
+ exit (error);
+}
+
+static int
+mixer_cbar_get_pos (int channel_index,
+ int *x_p,
+ int *y_p)
+{
+ int x;
+ int y;
+
+ if (channel_index < mixer_first_vis_channel ||
+ channel_index - mixer_first_vis_channel >= mixer_n_vis_channels)
+ return FALSE;
+
+ channel_index -= mixer_first_vis_channel;
+
+ x = mixer_ofs_x + 1;
+ y = mixer_ofs_y;
+ x += channel_index * (3 + 2 + 3 + 1 + mixer_extra_space);
+ y += mixer_max_y / 2;
+ y += mixer_cbar_height / 2 + 1;
+
+ if (x_p)
+ *x_p = x;
+ if (y_p)
+ *y_p = y;
+
+ return TRUE;
+}
+
+static void
+mixer_update_cbar (int channel_index)
+{
+ char string[64];
+ char c;
+ snd_mixer_channel_info_t cinfo = { 0 };
+ snd_mixer_channel_t cdata = { 0 };
+ int vleft, vright;
+ int x, y, i;
+
+
+ /* set specified EXACT mode
+ */
+ if (snd_mixer_exact_mode(mixer_handle, mixer_exact)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_exact");
+
+ /* set new channel indices and read info
+ */
+ if (snd_mixer_channel_info(mixer_handle, channel_index, &cinfo)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_channel_info");
+
+ /* set new channel values
+ */
+ if (channel_index == mixer_focus_channel &&
+ (mixer_lvolume_delta || mixer_rvolume_delta ||
+ mixer_toggle_mute_left || mixer_toggle_mute_right ||
+ mixer_balance_volumes ||
+ mixer_toggle_record))
+ {
+ if (snd_mixer_channel_read(mixer_handle, channel_index, &cdata)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_channel_read");
+
+ cdata.flags &= ~SND_MIXER_FLG_DECIBEL;
+ cdata.left = CLAMP (cdata.left + mixer_lvolume_delta, cinfo.min, cinfo.max);
+ cdata.right = CLAMP (cdata.right + mixer_rvolume_delta, cinfo.min, cinfo.max);
+ mixer_lvolume_delta = mixer_rvolume_delta = 0;
+ if (mixer_balance_volumes)
+ {
+ cdata.left = (cdata.left + cdata.right) / 2;
+ cdata.right = cdata.left;
+ mixer_balance_volumes = 0;
+ }
+ if (mixer_toggle_mute_left)
+ {
+ if (cdata.flags & SND_MIXER_FLG_MUTE_LEFT)
+ cdata.flags &= ~SND_MIXER_FLG_MUTE_LEFT;
+ else
+ cdata.flags |= SND_MIXER_FLG_MUTE_LEFT;
+ }
+ if (mixer_toggle_mute_right)
+ {
+ if (cdata.flags & SND_MIXER_FLG_MUTE_RIGHT)
+ cdata.flags &= ~SND_MIXER_FLG_MUTE_RIGHT;
+ else
+ cdata.flags |= SND_MIXER_FLG_MUTE_RIGHT;
+ }
+ mixer_toggle_mute_left = mixer_toggle_mute_right = 0;
+ if (mixer_toggle_record)
+ {
+ if (cdata.flags & SND_MIXER_FLG_RECORD)
+ cdata.flags &= ~SND_MIXER_FLG_RECORD;
+ else
+ cdata.flags |= SND_MIXER_FLG_RECORD;
+ }
+ mixer_toggle_record = 0;
+
+ if (snd_mixer_channel_write(mixer_handle, channel_index, &cdata)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_channel_write");
+ }
+
+ /* first, read values for the numbers to be displayed in
+ * specified EXACT mode
+ */
+ if (snd_mixer_channel_read(mixer_handle, channel_index, &cdata)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_ioctl_channel_read");
+ vleft = cdata.left;
+ vright = cdata.right;
+
+ /* then, always use percentage values for the bars. if we don't do
+ * this, we will see aliasing effects on specific circumstances.
+ * (actually they don't really dissapear, but they are transfered
+ * to bar<->smaller-scale ambiguities).
+ */
+ if (mixer_exact)
+ {
+ i = 0;
+ if (snd_mixer_exact_mode(mixer_handle, 0)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_exact");
+ if (snd_mixer_channel_read(mixer_handle, channel_index, &cdata)<0)
+ mixer_abort (ERR_FCN, "snd_mixer_channel_read");
+ }
+
+ /* get channel bar position
+ */
+ if (!mixer_cbar_get_pos (channel_index, &x, &y))
+ return;
+
+ /* channel bar name
+ */
+ mixer_dc (channel_index == mixer_focus_channel ? DC_CBAR_FOCUS_LABEL : DC_CBAR_LABEL);
+ cinfo.name[8] = 0;
+ for (i = 0; i < 8; i++)
+ {
+ string[i] = ' ';
+ }
+ sprintf(string + (8 - strlen (cinfo.name)) / 2, "%s ", cinfo.name);
+ string[8] = 0;
+ mvaddstr (y, x, string);
+ y--;
+
+ /* current channel values
+ */
+ mixer_dc (DC_BACK);
+ mvaddstr (y, x, " ");
+ mixer_dc (DC_TEXT);
+ sprintf (string, "%d", vleft);
+ mvaddstr (y, x + 3 - strlen (string), string);
+ mixer_dc (DC_CBAR_FRAME);
+ mvaddch (y, x + 3, '<');
+ mvaddch (y, x + 4, '>');
+ mixer_dc (DC_TEXT);
+ sprintf (string, "%d", vright);
+ mvaddstr (y, x + 5, string);
+ y--;
+
+ /* left/right bar
+ */
+ mixer_dc (DC_CBAR_FRAME);
+ mvaddstr (y, x, " ");
+ mvaddch (y, x + 2, ACS_LLCORNER);
+ mvaddch (y, x + 3, ACS_HLINE);
+ mvaddch (y, x + 4, ACS_HLINE);
+ mvaddch (y, x + 5, ACS_LRCORNER);
+ y--;
+ for (i = 0; i < mixer_cbar_height; i++)
+ {
+ mvaddstr (y - i, x, " ");
+ mvaddch (y - i, x + 2, ACS_VLINE);
+ mvaddch (y - i, x + 5, ACS_VLINE);
+ }
+ string[2] = 0;
+ for (i = 0; i < mixer_cbar_height; i++)
+ {
+ int dc;
+
+ if (i + 1 >= 0.8 * mixer_cbar_height)
+ dc = DC_CBAR_FULL_3;
+ else if (i + 1 >= 0.4 * mixer_cbar_height)
+ dc = DC_CBAR_FULL_2;
+ else
+ dc = DC_CBAR_FULL_1;
+ mvaddch (y, x + 3, mixer_dc (cdata.left > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY));
+ mvaddch (y, x + 4, mixer_dc (cdata.right > i * 100 / mixer_cbar_height ? dc : DC_CBAR_EMPTY));
+ y--;
+ }
+
+ /* muted?
+ */
+ mixer_dc (DC_BACK);
+ mvaddstr (y, x, " ");
+ c = cinfo.caps & SND_MIXER_CINFO_CAP_MUTE ? '-' : ' ';
+ mixer_dc (DC_CBAR_FRAME);
+ mvaddch (y, x + 2, ACS_ULCORNER);
+ mvaddch (y, x + 3, mixer_dc (cdata.flags & SND_MIXER_FLG_MUTE_LEFT ?
+ DC_CBAR_MUTE : DC_CBAR_NOMUTE));
+ mvaddch (y, x + 4, mixer_dc (cdata.flags & SND_MIXER_FLG_MUTE_RIGHT ?
+ DC_CBAR_MUTE : DC_CBAR_NOMUTE));
+ mixer_dc (DC_CBAR_FRAME);
+ mvaddch (y, x + 5, ACS_URCORNER);
+ y--;
+
+ /* record input?
+ */
+ if (cdata.flags & SND_MIXER_FLG_RECORD)
+ {
+ mixer_dc (DC_CBAR_RECORD);
+ mvaddstr (y, x + 1, "RECORD");
+ }
+ else if (cinfo.caps & SND_MIXER_CINFO_CAP_RECORD)
+ for (i = 0; i < 6; i++)
+ mvaddch (y, x + 1 + i, mixer_dc (DC_CBAR_NORECORD));
+ else
+ {
+ mixer_dc (DC_BACK);
+ mvaddstr (y, x, " ");
+ }
+ y--;
+}
+
+static void
+mixer_update_cbars (void)
+{
+ static int o_x = 0;
+ static int o_y = 0;
+ int i, x, y;
+
+ if (!mixer_cbar_get_pos (mixer_focus_channel, &x, &y))
+ {
+ if (mixer_focus_channel < mixer_first_vis_channel)
+ mixer_first_vis_channel = mixer_focus_channel;
+ else if (mixer_focus_channel >= mixer_first_vis_channel + mixer_n_vis_channels)
+ mixer_first_vis_channel = mixer_focus_channel - mixer_n_vis_channels + 1;
+ mixer_cbar_get_pos (mixer_focus_channel, &x, &y);
+ }
+ for (i = 0; i < mixer_n_vis_channels; i++)
+ mixer_update_cbar (i + mixer_first_vis_channel);
+
+ /* draw focused cbar
+ */
+ mixer_dc (DC_BACK);
+ mvaddstr (o_y, o_x, " ");
+ mvaddstr (o_y, o_x + 9, " ");
+ o_x = x - 1;
+ o_y = y;
+ mixer_dc (DC_FOCUS);
+ mvaddstr (o_y, o_x, "<");
+ mvaddstr (o_y, o_x + 9, ">");
+}
+
+static void
+mixer_draw_frame (void)
+{
+ char string[128];
+ int i;
+ int max_len;
+
+ mixer_dc (DC_FRAME);
+
+ /* corners
+ */
+ mvaddch (0, 0, ACS_ULCORNER);
+ mvaddch (mixer_max_y - 1, 0, ACS_LLCORNER);
+ mvaddch (mixer_max_y - 1, mixer_max_x - 1, ACS_LRCORNER);
+ mvaddch (0, mixer_max_x - 1, ACS_URCORNER);
+
+ /* lines
+ */
+ for (i = 1; i < mixer_max_y - 1; i++)
+ {
+ mvaddch (i, 0, ACS_VLINE);
+ mvaddch (i, mixer_max_x - 1, ACS_VLINE);
+ }
+ for (i = 1; i < mixer_max_x - 1; i++)
+ {
+ mvaddch (0, i, ACS_HLINE);
+ mvaddch (mixer_max_y - 1, i, ACS_HLINE);
+ }
+
+ /* program title
+ */
+ sprintf (string, "%s %s", PRGNAME_UPPER, VERSION);
+ max_len = strlen (string);
+ mvaddch (0, mixer_max_x / 2 - max_len / 2 - 1, '[');
+ mvaddch (0, mixer_max_x / 2 - max_len / 2 + max_len, ']');
+ mixer_dc (DC_TEXT);
+ mvaddstr (0, mixer_max_x / 2 - max_len / 2, string);
+
+ /* card name
+ */
+ mixer_dc (DC_PROMPT);
+ mvaddstr (1, 2, "Card:");
+ mixer_dc (DC_TEXT);
+ sprintf (string, "%s", mixer_card_name);
+ max_len = mixer_max_x - 2 - 6 - 2;
+ if (strlen (string) > max_len)
+ string[max_len] = 0;
+ mvaddstr (1, 2 + 6, string);
+
+ /* device name
+ */
+ mixer_dc (DC_PROMPT);
+ mvaddstr (2, 2, "Chip: ");
+ mixer_dc (DC_TEXT);
+ sprintf (string, "%s", mixer_device_name);
+ max_len = mixer_max_x - 2 - 6 - 2;
+ if (strlen (string) > max_len)
+ string[max_len] = 0;
+ mvaddstr (2, 2 + 6, string);
+}
+
+static void
+mixer_init (void)
+{
+ static snd_mixer_info_t mixer_info = { 0 };
+ static struct snd_ctl_hw_info hw_info;
+ void *ctl_handle;
+
+ if (snd_ctl_open( &ctl_handle, card_id ) < 0 )
+ mixer_abort (ERR_OPEN, "snd_ctl_open" );
+ if (snd_ctl_hw_info( ctl_handle, &hw_info ) < 0 )
+ mixer_abort (ERR_FCN, "snd_ctl_hw_info" );
+ snd_ctl_close( ctl_handle );
+ /* open mixer device
+ */
+ if (snd_mixer_open( &mixer_handle, card_id, mixer_id ) < 0)
+ mixer_abort (ERR_OPEN, "snd_mixer_open" );
+
+ /* setup global variables
+ */
+ if (snd_mixer_info( mixer_handle, &mixer_info) < 0)
+ mixer_abort (ERR_FCN, "snd_mixer_info" );
+ mixer_n_channels = mixer_info.channels;
+ mixer_card_name = hw_info.name;
+ mixer_device_name = mixer_info.name;
+}
+
+static void
+mixer_iteration_update(void *dummy, int channel)
+{
+ mixer_update_cbar(channel);
+ refresh ();
+}
+
+static int
+mixer_iteration (void)
+{
+ static snd_mixer_callbacks_t callbacks = {
+ NULL,
+ mixer_iteration_update,
+ };
+ int key;
+ int finished = 0;
+ int mixer_fd;
+ fd_set in;
+
+ mixer_fd = snd_mixer_file_descriptor( mixer_handle );
+ while ( 1 ) {
+ FD_ZERO(&in);
+ FD_SET(fileno(stdin), &in);
+ FD_SET(mixer_fd, &in);
+ if (select(mixer_fd+1, &in, NULL, NULL, NULL)<=0)
+ return 1;
+ if (FD_ISSET(mixer_fd, &in))
+ snd_mixer_read(mixer_handle, &callbacks);
+ if (FD_ISSET(fileno(stdin), &in)) break;
+ }
+ key = getch ();
+ switch (key)
+ {
+ case 27: /* Escape */
+ finished = 1;
+ break;
+ case 9: /* Tab */
+ mixer_exact = !mixer_exact;
+ break;
+ case KEY_RIGHT:
+ case 'n':
+ mixer_focus_channel += 1;
+ break;
+ case KEY_LEFT:
+ case 'p':
+ mixer_focus_channel -= 1;
+ break;
+ case KEY_PPAGE:
+ if (mixer_exact)
+ {
+ mixer_lvolume_delta = 8;
+ mixer_rvolume_delta = 8;
+ }
+ else
+ {
+ mixer_lvolume_delta = 10;
+ mixer_rvolume_delta = 10;
+ }
+ break;
+ case KEY_NPAGE:
+ if (mixer_exact)
+ {
+ mixer_lvolume_delta = -8;
+ mixer_rvolume_delta = -8;
+ }
+ else
+ {
+ mixer_lvolume_delta = -10;
+ mixer_rvolume_delta = -10;
+ }
+ break;
+ case KEY_BEG:
+ case KEY_HOME:
+ mixer_lvolume_delta = 512;
+ mixer_rvolume_delta = 512;
+ break;
+ case KEY_LL:
+ case KEY_END:
+ mixer_lvolume_delta = -512;
+ mixer_rvolume_delta = -512;
+ break;
+ case '+':
+ mixer_lvolume_delta = 1;
+ mixer_rvolume_delta = 1;
+ break;
+ case '-':
+ mixer_lvolume_delta = -1;
+ mixer_rvolume_delta = -1;
+ break;
+ case 'w':
+ case KEY_UP:
+ mixer_lvolume_delta = 1;
+ mixer_rvolume_delta = 1;
+ case 'W':
+ mixer_lvolume_delta += 1;
+ mixer_rvolume_delta += 1;
+ break;
+ case 'x':
+ case KEY_DOWN:
+ mixer_lvolume_delta = -1;
+ mixer_rvolume_delta = -1;
+ case 'X':
+ mixer_lvolume_delta += -1;
+ mixer_rvolume_delta += -1;
+ break;
+ case 'q':
+ mixer_lvolume_delta = 1;
+ case 'Q':
+ mixer_lvolume_delta += 1;
+ break;
+ case 'y':
+ case 'z':
+ mixer_lvolume_delta = -1;
+ case 'Y':
+ case 'Z':
+ mixer_lvolume_delta += -1;
+ break;
+ case 'e':
+ mixer_rvolume_delta = 1;
+ case 'E':
+ mixer_rvolume_delta += 1;
+ break;
+ case 'c':
+ mixer_rvolume_delta = -1;
+ case 'C':
+ mixer_rvolume_delta += -1;
+ break;
+ case 'm':
+ case 'M':
+ mixer_toggle_mute_left = 1;
+ mixer_toggle_mute_right = 1;
+ break;
+ case 'b':
+ case 'B':
+ case '=':
+ mixer_balance_volumes = 1;
+ break;
+ case '<':
+ case ',':
+ mixer_toggle_mute_left = 1;
+ break;
+ case '>':
+ case '.':
+ mixer_toggle_mute_right = 1;
+ break;
+ case 'R':
+ case 'r':
+ case 'L':
+ case 'l':
+ mixer_clear ();
+ break;
+ case ' ':
+ mixer_toggle_record = 1;
+ break;
+ }
+ mixer_focus_channel = CLAMP (mixer_focus_channel, 0, mixer_n_channels - 1);
+
+ return finished;
+}
+
+static void
+mixer_init_screen (void)
+{
+ signal (SIGWINCH, (void *)mixer_init_screen);
+
+ getmaxyx (mixer_window, mixer_max_y, mixer_max_x);
+ mixer_clear ();
+ mixer_max_x = MAX (MIXER_MIN_X, mixer_max_x);
+ mixer_max_y = MAX (MIXER_MIN_Y, mixer_max_y);
+ mixer_clear ();
+ mixer_ofs_x = 2;
+ mixer_ofs_y = 2;
+ mixer_extra_space = 0;
+ mixer_n_vis_channels = MIN ((mixer_max_x - 2 * mixer_ofs_x + 1) / (9 + mixer_extra_space),
+ mixer_n_channels);
+ mixer_extra_space = ((mixer_max_x - 2 * mixer_ofs_x - 1 - mixer_n_vis_channels * 9.0) /
+ (mixer_n_vis_channels - 1));
+ if (mixer_n_vis_channels < mixer_n_channels)
+ {
+ /* recalc
+ */
+ mixer_extra_space = MAX (mixer_extra_space, 1);
+ mixer_n_vis_channels = MIN ((mixer_max_x - 2 * mixer_ofs_x + 1) / (9 + mixer_extra_space),
+ mixer_n_channels);
+ mixer_extra_space = ((mixer_max_x - 2 * mixer_ofs_x - 1 - mixer_n_vis_channels * 9.0) /
+ (mixer_n_vis_channels - 1));
+ }
+ mixer_first_vis_channel = 0;
+ mixer_cbar_height = 10 + MAX (0, (mixer_max_y - MIXER_MIN_Y - 1)) / 2;
+}
+
+static void
+mixer_signal_handler (int signal)
+{
+ mixer_abort (ERR_SIGNAL, sys_siglist[signal]);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ int opt;
+
+ /* parse args
+ */
+ do
+ {
+ opt = getopt (argc, argv, "c:m:ehg" );
+ switch (opt)
+ {
+ case '?':
+ case 'h':
+ fprintf (stderr, "%s %s\n", PRGNAME_UPPER, VERSION);
+ fprintf (stderr, "Usage: %s [-e] [-c <card: 1..%i>] [-m <mixer: 0..1>]\n", PRGNAME, snd_cards() );
+ mixer_abort (ERR_NONE, "");
+ case 'c':
+ card_id = snd_card_name( optarg );
+ break;
+ case 'e':
+ mixer_exact = !mixer_exact;
+ break;
+ case 'g':
+ mixer_do_color = !mixer_do_color;
+ break;
+ case 'm':
+ mixer_id = CLAMP (optarg[0], '0', '1');
+ break;
+ }
+ }
+ while (opt > 0);
+
+ /* initialize mixer
+ */
+ mixer_init ();
+
+ /* setup signal handlers
+ */
+ signal (SIGINT, mixer_signal_handler);
+ signal (SIGTRAP, mixer_signal_handler);
+ signal (SIGABRT, mixer_signal_handler);
+ signal (SIGQUIT, mixer_signal_handler);
+ signal (SIGBUS, mixer_signal_handler);
+ signal (SIGSEGV, mixer_signal_handler);
+ signal (SIGPIPE, mixer_signal_handler);
+ signal (SIGTERM, mixer_signal_handler);
+
+ /* initialize ncurses
+ */
+ mixer_window = initscr ();
+ if (mixer_do_color)
+ mixer_do_color = has_colors ();
+ mixer_init_draw_contexts ();
+ mixer_init_screen ();
+ if (mixer_max_x < MIXER_MIN_X ||
+ mixer_max_y < MIXER_MIN_Y)
+ mixer_abort (ERR_WINSIZE, "");
+
+ /* react on key presses
+ * and draw window
+ */
+ keypad (mixer_window, TRUE);
+ leaveok (mixer_window, TRUE);
+ cbreak ();
+ noecho ();
+ do
+ {
+ mixer_update_cbars ();
+ mixer_draw_frame ();
+ refresh ();
+ }
+ while (!mixer_iteration ());
+
+ mixer_abort (ERR_NONE, "");
+};
--- /dev/null
+#
+# Makefile for Mixer
+#
+
+TOPDIR = ..
+
+include $(TOPDIR)/Makefile.conf
+
+OBJECTS = amixer.o amain.o
+
+.SUFFIXES:
+.SUFFIXES: .o .cpp .c .s .S
+
+.cpp.o:
+ $(CXX) $(COPTS) $(INCLUDE) -c -o $*.o $<
+
+all: amixer
+
+amixer.o: amixer.cpp
+ $(CXX) $(COPTS) $(INCLUDE) -c -o amixer.o amixer.cpp
+amain.o: amain.cpp
+ $(CXX) $(COPTS) $(INCLUDE) -c -o amain.o amain.cpp
+
+amixer: $(OBJECTS)
+ $(CXX) -o amixer $(SNDLIB) $(OBJECTS)
+
+clean:
+ rm -f *.o amixer *~
+
--- /dev/null
+Intro
+-----
+
+This is a quick mixer program for the ALSA project. It will grow out
+to include a GTK interface eventually, if noone beats me to it :)
+
+
+Building
+--------
+
+Edit the Makefile where the -I (include option) is. This should
+point to the directory where the alsadriver is located. Then
+type "make" and it should build without complaining. If you have
+trouble with it please mail me at <arloafoe@cs.vu.nl>
+
+
+Running
+-------
+
+amixer -h should display the syntax
+
+
+Bugs & Todo
+-----------
+
+A lot, let me know..
+
+
+Changes
+-------
+
+v0.001 March 20 1998 - Initial code
+v0.1 Apr 21 1997 - Actually useful now
+
+
+Contact
+-------
+Andy Lo A Foe
+arloafoe@cs.vu.nl
--- /dev/null
+/*
+ * Copyright 1998, Andy Lo A Foe <arloafoe@cs.vu.nl>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/soundlib.h>
+#include "amixer.h"
+
+#define MIXER_RC ".amixerrc"
+
+char *rc_file(void)
+{
+ static char rc_path[1024];
+ char *p;
+
+ p = getenv("HOME");
+ if (p) {
+ sprintf(rc_path, "%s/%s", p, MIXER_RC);
+ } else {
+ printf("Error reading HOME env. variable\n");
+ return NULL;
+ }
+ return rc_path;
+}
+
+void copyright()
+{
+ printf("CLI ALSA Mixer v0.11 (c) 1998 Adnans\n\n");
+}
+
+void usage()
+{
+ printf("\n"
+ "Usage: amixer [-c card] [-d dev] device [vol|L:R] [mute|unmute] [rec|norec]\n\n"
+ " amixer [-p path] -r\tRead %s or <path> settings\n"
+ " amixer -w\t\tWrite %s settings\n"
+ " amixer -q ...\t\tQuiet mode\n"
+ " amixer -h\t\tHelp\n\n"
+ "Example: amixer line-out 80:50 unmute rec\n\n", rc_file(), rc_file());
+}
+
+
+void read_config(Mixer *mix, const char *path)
+{
+ FILE *rc;
+ char buf[1024];
+ int opt1;
+ int opt2;
+ int left, right;
+ int dev;
+ int count = 0;
+ int flags;
+
+ if ((rc = fopen(path ? path : rc_file(), "r")) == NULL) {
+ printf("Mixer values not read\n");
+ return;
+ }
+ while (!feof(rc) && fgets(buf, 1024, rc)) {
+ count++;
+ if (buf[0] == '\n')
+ continue;
+ if (buf[0] == '#' || strlen(buf) == 0)
+ continue;
+
+ if (sscanf(buf, "%d %d:%d %d %d\n", &dev, &left, &right, &opt1, &opt2) != 5) {
+ printf("WARNING: unable to make out line %d of .rc file -> \"%s\"\n", count, buf);
+ continue;
+ }
+ flags = 0;
+ if (opt1) flags |= E_MIXER_MUTE;
+ if (opt2) flags |= E_MIXER_RECORD;
+ // Set mixer settings
+ mix->DeviceSet(dev);
+ mix->Write(left, right, flags);
+ }
+
+ fclose(rc);
+ return;
+}
+
+void write_config(Mixer *mix)
+{
+ FILE *rc;
+ int32 left, right, flags;
+
+ if ((rc = fopen(rc_file(), "w+")) == NULL) {
+ printf("Mixer values not written\n");
+ return;
+ }
+ fprintf(rc, "# CLI ALSA mixer settings file. Autogenerated\n"
+ "# Modify at your own risk :)\n\n");
+ for (int i=0; i < mix->NumDevices(); i++) {
+ mix->DeviceSet(i);
+ mix->Read(&left, &right, &flags);
+ fprintf(rc, "%d %d:%d %d %d\n", i, mix->Left(), mix->Right(), flags & E_MIXER_MUTE ? 1 : 0, flags & E_MIXER_RECORD ? 1 : 0);
+ }
+ fclose(rc);
+ return;
+}
+
+int main(int argc, char **argv)
+{
+ int card = 0, device = 0;
+ char device_name[64] = "";
+ int32 exact, mute, unmute, norec, rec, left, right, flags, device_index;
+ int32 left_dB, right_dB;
+ int32 cur_left, cur_right, cur_flags;
+ int count, quiet = 0;
+ int i,add;
+ int pathind = 0;
+ Mixer *the_mixer;
+
+ exact = mute = rec = norec = unmute = device_index = left = right = -1;
+ left_dB = right_dB = -1;
+
+ for (add = 0; add + 1 < argc; i++) {
+ if (!strcmp(argv[add+1],"--help")) {
+ usage();
+ return 0;
+ }
+ if (argv[add+1][0] == '-') {
+ add++;
+ if (argv[add][1] == 'c') {
+ card = snd_card_name(argv[++add]);
+ if (card < 0) {
+ fprintf(stderr, "Invalid card: %s\n",argv[2]);
+ exit(1);
+ }
+ } else if (argv[add][1] == 'd') {
+ device = atoi(argv[++add]);
+ if (device < 0 || device > 128) {
+ fprintf(stderr, "Invalid device: %s\n",argv[2]);
+ exit(1);
+ }
+ } else if (argv[add][1] == 'h') {
+ usage();
+ return 0;
+ } else if (argv[add][1] == 'p') {
+ pathind = ++add;
+ } else if (argv[add][1] == 'r') {
+ the_mixer = new Mixer(card,device);
+ if (the_mixer && the_mixer->Init()) read_config(the_mixer, pathind ? argv[pathind] : (const char *)NULL);
+ delete the_mixer;
+ return 0;
+ } else if (argv[add][1] == 'w') {
+ the_mixer = new Mixer(card,device);
+ if (the_mixer && the_mixer->Init()) write_config(the_mixer);
+ delete the_mixer;
+ return 0;
+ } else if (argv[add][1] == 'q') {
+ quiet = 1;
+ } else {
+ fprintf(stderr, "Invalid option: %s\n", argv[add]+1);
+ return 1;
+ }
+ } else {
+ break;
+ }
+ }
+ for (i=1+add; i < argc; i++) {
+ if (strcmp(argv[i],"exact")==0) {
+ exact = 1;
+ } else if (strcmp(argv[i],"mute")==0) {
+ mute = 1;
+ } else if (strcmp(argv[i],"unmute")==0) {
+ unmute = 1;
+ } else if (strcmp(argv[i],"rec")==0) {
+ rec = 1;
+ } else if (strcmp(argv[i],"norec")==0) {
+ norec = 1;
+ } else if (sscanf(argv[i], "%d:%d", &left, &right)==2) {
+ } else if (sscanf(argv[i], "%d", &left)==1) {
+ right = left;
+ } else if (sscanf(argv[i], "%s", device_name)==1) {
+ } else {
+ fprintf(stderr, "Wrong keyword: %s\n", argv[i]);
+ exit(1);
+ }
+
+ }
+ Mixer mixer(card,device);
+
+ if (mixer.Init() == false) {
+ fprintf(stderr, "Failed to open mixer device\n");
+ return 1;
+ }
+ count = mixer.NumDevices();
+
+ for (i=0; i < count; i++) {
+ mixer.DeviceSet(i);
+ if (strcasecmp(device_name, mixer.Name())==0)
+ device_index = i;
+ }
+ if ( !quiet )
+ copyright();
+ if (device_index >= 0) {
+ mixer.DeviceSet(device_index);
+ mixer.Read(&cur_left, &cur_right, &cur_flags);
+ if (left >= 0) cur_left = left;
+ if (right >= 0) cur_right = right;
+ if (rec == 1) cur_flags |= E_MIXER_RECORD;
+ else if (norec == 1) cur_flags &= ~E_MIXER_RECORD;
+ if (mute == 1) cur_flags |= E_MIXER_MUTE;
+ else if (unmute == 1) cur_flags &= ~E_MIXER_MUTE;
+ if (left != -1 || rec != -1 || norec != -1 || mute != -1 || unmute != -1) {
+ mixer.Write(cur_left, cur_right, cur_flags);
+ }
+ if ( !quiet ) {
+ printf("%-16s", mixer.Name());
+ mixer.Read(&left, &right, &flags);
+ mixer.Read_dB(&left_dB, &right_dB);
+ printf("%-3d%% (%6.2fdB) : %-3d%% (%6.2fdB) %s %s\n\n",
+ left, ((float)left_dB) / 100.0,
+ right, ((float)right_dB) / 100.0,
+ (flags & E_MIXER_MUTE) ? "Mute" : " ",
+ (flags & E_MIXER_RECORD) ? "Rec" : " " );
+ }
+ } else {
+ if (quiet) {
+ usage();
+ return 1;
+ }
+ if (strlen(device_name))
+ printf("Device not found: %s\n\n", device_name);
+ for (i=0; i < count; i++) {
+ mixer.DeviceSet(i);
+ printf("%-16s", mixer.Name());
+ mixer.Read(&left, &right, &flags);
+ mixer.Read_dB(&left_dB, &right_dB);
+ printf("%-3d%% (%6.2fdB) : %-3d%% (%6.2fdB) %s %s\n",
+ left, ((float)left_dB)/100.0, right, ((float)right_dB)/100.0,
+ (flags & E_MIXER_MUTE) ? "Mute" : " ",
+ (flags & E_MIXER_RECORD) ? "Rec" : " ");
+ }
+ return 0;
+ }
+
+ return 0;
+}
--- /dev/null
+/*
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/soundlib.h>
+#include "amixer.h"
+
+
+Mixer::Mixer(int card, int device)
+{
+ mixer_handle = NULL;
+
+ if (snd_mixer_open(&mixer_handle, card, device) < 0) {
+ fprintf(stderr, "Can't access mixer %i/%i\n", card+1, device);
+ mixer_status = ~E_MIXER_SUCCESS;
+ return;
+ }
+ mixer_status = E_MIXER_SUCCESS;
+ mixer_status |= E_MIXER_NEED_CLOSE;
+}
+
+
+bool Mixer::Open(int card, int device)
+{
+ Close();
+ if (snd_mixer_open(&mixer_handle, card, device) < 0) {
+ fprintf(stderr, "Can't access mixer %i/%i\n", card + 1, device);
+ mixer_status = ~E_MIXER_SUCCESS;
+ } else{
+ mixer_status = E_MIXER_SUCCESS;
+ mixer_status |= E_MIXER_NEED_CLOSE;
+ }
+ return Init();
+}
+
+
+void Mixer::Close()
+{
+ if (mixer_handle != NULL && mixer_status & E_MIXER_NEED_CLOSE) {
+ snd_mixer_close(mixer_handle);
+ }
+ mixer_handle = NULL;
+ mixer_status = ~E_MIXER_SUCCESS;
+}
+
+
+Mixer::~Mixer()
+{
+ Close();
+}
+
+
+bool Mixer::Init()
+{
+ if (!(mixer_status & E_MIXER_SUCCESS))
+ return false;
+ if ((nr_devices = snd_mixer_channels(mixer_handle)) < 0)
+ return false;
+
+ return true;
+}
+
+
+
+char* Mixer::Name()
+{
+ return Name(current_device);
+}
+
+char* Mixer::Name(int32 device)
+{
+ if (snd_mixer_channel_info(mixer_handle,device,&ch_info) < 0)
+ return "Unknown";
+ return (char *)ch_info.name;
+}
+
+void Mixer::Update()
+{
+ if(snd_mixer_channel_read(mixer_handle, current_device, &ch_data) < 0) {
+ fprintf(stderr, "Can't read data from channel %i\n", current_device);
+ return; /* No fail code? */
+ }
+}
+
+void Mixer::DeviceRead(int32 device, int32 *left, int32 *right, int32 *flags)
+{
+ current_device = device;
+ Update();
+ *left = ch_data.left;
+ *right = ch_data.right;
+ *flags = ch_data.flags;
+}
+
+
+void Mixer::DeviceWrite(int32 device, int32 left, int32 right, int32 flags)
+{
+ current_device = device;
+ ch_data.channel = device;
+ ch_data.left = left;
+ ch_data.right = right;
+ ch_data.flags = flags;
+ if(snd_mixer_channel_write(mixer_handle, device, &ch_data) < 0) {
+ fprintf(stderr, "Can't write data to channel %i\n", device);
+ return; /* No fail code? */
+ }
+}
+
--- /dev/null
+/*
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include "atypes.h"
+
+#define E_MIXER_SUCCESS 1
+#define E_MIXER_NEED_CLOSE 2
+
+#define E_MIXER_RECORD SND_MIXER_FLG_RECORD
+#define E_MIXER_MUTE_LEFT SND_MIXER_FLG_MUTE_LEFT
+#define E_MIXER_MUTE_RIGHT SND_MIXER_FLG_MUTE_RIGHT
+#define E_MIXER_MUTE SND_MIXER_FLG_MUTE
+
+
+class Mixer
+{
+public:
+ Mixer(int card = 0, int device = 0);
+ ~Mixer();
+ bool Init();
+ bool Open(int card, int device);
+ void Close();
+ void DeviceSet(int32 device) {
+ current_device = device;
+ Update();
+ }
+ char* Name(int32 device);
+ char* Name();
+ int32 NumDevices() { return nr_devices; }
+ void Update();
+ void DeviceRead(int32 device, int32 *left, int32 *right, int32 *flag);
+ void DeviceWrite(int32 device, int32 left, int32 right, int32 flag);
+ void Read(int32 *left, int32 *right, int32 *flags) {
+ DeviceRead(current_device, left, right, flags);
+ }
+ void Read_dB(int32 *left_dB, int32 *right_dB) {
+ *left_dB = ch_data.left_dB;
+ *right_dB = ch_data.right_dB;
+ }
+ void Write(int32 left, int32 right, int32 flags) {
+ DeviceWrite(current_device, left, right, flags);
+ }
+ int Left() { return ch_data.left; }
+ int Right() { return ch_data.right; }
+ Mixer& operator[](int32 device) {
+ DeviceSet(device);
+ return (*this);
+ }
+private:
+ snd_mixer_info_t info;
+ snd_mixer_channel_t ch_data;
+ snd_mixer_channel_info_t ch_info;
+
+ void * mixer_handle;
+ int32 mixer_status;
+ int32 current_device;
+ int32 nr_devices;
+};
--- /dev/null
+typedef int int32;
--- /dev/null
+#
+# Makefile for aplay program
+# Copyright (c) 1994-98 by Jaroslav Kysela <perex@jcu.cz>
+#
+
+TOPDIR=..
+
+include $(TOPDIR)/Makefile.conf
+
+TARGET=aplay
+TARGET1=arecord
+OBJECTS=aplay.o
+
+.c.o:
+ $(CC) $(COPTS) $(INCLUDE) -c -o $*.o $<
+
+all: $(TARGET)
+
+$(TARGET): .depend $(OBJECTS)
+ $(CC) $(SNDLIB) $(OBJECTS) -o $(TARGET)
+ ln -sf $(TARGET) $(TARGET1)
+
+clean:
+ rm -f core .depend *.o *.orig *~
+
+.depend:
+ $(CPP) $(COPTS) $(INCLUDE) -M *.c > .depend
+
+#
+# include a dependency file if one exists
+#
+ifeq (.depend,$(wildcard .depend))
+include .depend
+endif
--- /dev/null
+/*
+ * aplay.c - plays and records
+ *
+ * CREATIVE LABS VOICE-files
+ * Microsoft WAVE-files
+ * SPARC AUDIO .AU-files
+ * Raw Data
+ *
+ * Copyright (c) by Jaroslav Kysela <perex@jcu.cz>
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <malloc.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <sys/soundlib.h>
+#include "config.h"
+#include "formats.h"
+
+#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 */
+
+char *command;
+void *pcm_handle;
+struct snd_pcm_playback_info pinfo;
+struct snd_pcm_record_info rinfo;
+snd_pcm_format_t rformat, format;
+int timelimit = 0;
+int quiet_mode = 0;
+int verbose_mode = 0;
+int active_format = FORMAT_DEFAULT;
+int direction = SND_PCM_OPEN_PLAYBACK;
+char *audiobuf = NULL;
+int buffer_size = -1;
+
+int count;
+int vocmajor, vocminor;
+
+/* needed prototypes */
+
+static void playback( char *filename );
+static void record( char *filename );
+
+static void begin_voc( int fd, u_long count );
+static void end_voc( int fd );
+static void begin_wave( int fd, u_long count );
+static void end_wave( int fd );
+static void begin_au( int fd, u_long count );
+
+struct fmt_record {
+ void (*start)(int fd, u_long count);
+ void (*end) (int fd);
+ char *what;
+} fmt_rec_table[] = {
+ { NULL, end_wave, "raw data" },
+ { begin_voc, end_voc, "VOC" },
+ { begin_wave, end_wave, "WAVE" },
+ { begin_au, end_wave, "Sparc Audio" }
+};
+
+static char *get_format( int format )
+{
+ static char *formats[] = {
+ "Mu-Law",
+ "A-Law",
+ "Ima-ADPCM",
+ "Unsigned 8-bit",
+ "Signed 16-bit Little Endian",
+ "Signed 16-bit Big Endian",
+ "Signed 8-bit",
+ "Unsigned 16-bit Little Endian",
+ "Unsigned 16-bit Big Endian",
+ "MPEG",
+ "GSM"
+ };
+ if ( format < 0 || format > SND_PCM_SFMT_GSM )
+ return "Unknown";
+ return formats[ format ];
+}
+
+static void check_new_format( snd_pcm_format_t *format )
+{
+ if ( direction == SND_PCM_OPEN_PLAYBACK ) {
+ if ( pinfo.min_rate > format -> rate || pinfo.max_rate < format -> rate ) {
+ fprintf( stderr, "%s: unsupported rate %iHz for playback (valid range is %iHz-%iHz)\n", command, format -> rate, pinfo.min_rate, pinfo.max_rate );
+ exit( 1 );
+ }
+ if ( format -> format != SND_PCM_SFMT_MU_LAW )
+ if ( !(pinfo.formats & (1 << format -> format)) ) {
+ fprintf( stderr, "%s: requested format %s isn't supported with hardware\n", command, get_format( format -> format ) );
+ exit( 1 );
+ }
+ } else {
+ if ( rinfo.min_rate > format -> rate || rinfo.max_rate < format -> rate ) {
+ fprintf( stderr, "%s: unsupported rate %iHz for record (valid range is %iHz-%iHz)\n", command, format -> rate, rinfo.min_rate, rinfo.max_rate );
+ exit( 1 );
+ }
+ if ( format -> format != SND_PCM_SFMT_MU_LAW )
+ if ( !(rinfo.formats & (1 << format -> format)) ) {
+ fprintf( stderr, "%s: requested format %s isn't supported with hardware\n", command, get_format( rformat.format ) );
+ exit( 1 );
+ }
+ }
+}
+
+static void usage( char *command )
+{
+ fprintf (stderr,
+"Usage: %s [switches] [filename] <filename> ...\n"
+"Available switches:\n"
+"\n"
+" -h,--help help\n"
+" -V,--version print current version\n"
+" -l list all soundcards and digital audio devices\n"
+" -c <card> select card # or card id (1-%i), defaults to 1\n"
+" -d <device> select device #, defaults to 0\n"
+" -q quiet mode\n"
+" -v file format Voc\n"
+" -u file format Sparc Audio (.au)\n"
+" -w file format Wave\n"
+" -r file format Raw\n"
+" -S stereo\n"
+" -t <secs> timelimit (seconds)\n"
+" -s <Hz> speed (Hz)\n"
+" -b <bits> sample size (8,16 bits)\n"
+" -m set CD-ROM quality (44100Hz,stereo,16-bit linear)\n"
+" -M set DAT quality (48000Hz,stereo,16-bit linear)\n"
+" -p <type> compression type (alaw, ulaw, adpcm)\n"
+, command, snd_cards() );
+}
+
+static void device_list( void )
+{
+ void *handle;
+ int card, err, dev, idx;
+ unsigned int mask;
+ struct snd_ctl_hw_info info;
+ snd_pcm_info_t pcminfo;
+ snd_pcm_playback_info_t playinfo;
+ snd_pcm_record_info_t recinfo;
+
+ mask = snd_cards_mask();
+ if ( !mask ) {
+ printf( "%s: no soundcards found...\n", command );
+ return;
+ }
+ for ( card = 0; card < SND_CARDS; card++ ) {
+ if ( !(mask & (1 << card)) ) continue;
+ if ( (err = snd_ctl_open( &handle, card )) < 0 ) {
+ printf( "Error: control open (%i): %s\n", card, snd_strerror( err ) );
+ continue;
+ }
+ if ( (err = snd_ctl_hw_info( handle, &info )) < 0 ) {
+ printf( "Error: control hardware info (%i): %s\n", card, snd_strerror( err ) );
+ snd_ctl_close( handle );
+ continue;
+ }
+ for ( dev = 0; dev < info.pcmdevs; dev++ ) {
+ if ( (err = snd_ctl_pcm_info( handle, dev, &pcminfo )) < 0 ) {
+ printf( "Error: control digital audio info (%i): %s\n", card, snd_strerror( err ) );
+ continue;
+ }
+ printf( "%s: %i [%s] / #%i: %s\n",
+ info.name,
+ card + 1,
+ info.id,
+ dev,
+ pcminfo.name );
+ printf( " Directions: %s%s%s\n",
+ pcminfo.flags & SND_PCM_INFO_PLAYBACK ? "playback " : "",
+ pcminfo.flags & SND_PCM_INFO_RECORD ? "record " : "",
+ pcminfo.flags & SND_PCM_INFO_DUPLEX ? "duplex " : "" );
+ if ( (err = snd_ctl_pcm_playback_info( handle, dev, &playinfo )) < 0 ) {
+ printf( "Error: control digital audio playback info (%i): %s\n", card, snd_strerror( err ) );
+ continue;
+ }
+ if ( pcminfo.flags & SND_PCM_INFO_PLAYBACK ) {
+ printf( " Playback:\n" );
+ printf( " Speed range: %iHz-%iHz\n", playinfo.min_rate, playinfo.max_rate );
+ printf( " Voices range: %i-%i\n", playinfo.min_channels, playinfo.max_channels );
+ printf( " Formats:\n" );
+ for ( idx = 0; idx < SND_PCM_SFMT_GSM; idx++ ) {
+ if ( playinfo.formats & (1 << idx) )
+ printf( " %s\n", get_format( idx ) );
+ }
+ if ( (err = snd_ctl_pcm_record_info( handle, dev, &recinfo )) < 0 ) {
+ printf( "Error: control digital audio record info (%i): %s\n", card, snd_strerror( err ) );
+ continue;
+ }
+ }
+ if ( pcminfo.flags & SND_PCM_INFO_RECORD ) {
+ printf( " Record:\n" );
+ printf( " Speed range: %iHz-%iHz\n", recinfo.min_rate, recinfo.max_rate );
+ printf( " Voices range: %i-%i\n", recinfo.min_channels, recinfo.max_channels );
+ printf( " Formats:\n" );
+ for ( idx = 0; idx < SND_PCM_SFMT_GSM; idx++ ) {
+ if ( recinfo.formats & (1 << idx) )
+ printf( " %s\n", get_format( idx ) );
+ }
+ }
+ }
+ snd_ctl_close( handle );
+ }
+}
+
+static void version( void )
+{
+ printf( "%s: version " SND_UTIL_VERSION " by Jaroslav Kysela <perex@jcu.cz>\n", command );
+}
+
+int main( int argc, char *argv[] )
+{
+ int card, dev, tmp, err, c;
+
+ card = 0;
+ dev = 0;
+ command = argv[0];
+ active_format = FORMAT_DEFAULT;
+ if ( strstr( argv[0], "arecord" ) ) {
+ direction = SND_PCM_OPEN_RECORD;
+ active_format = FORMAT_WAVE;
+ command = "Arecord";
+ } else if ( strstr( argv[0], "aplay" ) ) {
+ direction = SND_PCM_OPEN_PLAYBACK;
+ command = "Aplay";
+ } else {
+ fprintf( stderr, "Error: command should be named either arecord or aplay\n");
+ return 1;
+ }
+
+ buffer_size = -1;
+ memset( &rformat, 0, sizeof( rformat ) );
+ rformat.format = SND_PCM_SFMT_U8;
+ rformat.rate = DEFAULT_SPEED;
+ rformat.channels = 1;
+
+ if ( argc > 1 && !strcmp( argv[1], "--help" ) ) {
+ usage( command );
+ return 0;
+ }
+ if ( argc > 1 && !strcmp( argv[1], "--version" ) ) {
+ version();
+ return 0;
+ }
+ while ( (c = getopt( argc, argv, "hlc:d:qs:So:t:b:vrwuxB:c:p:mM" )) != EOF )
+ switch ( c ) {
+ case 'h':
+ usage( command );
+ return 0;
+ case 'l':
+ device_list();
+ return 0;
+ case 'c':
+ card = snd_card_name( optarg );
+ if ( card < 0 ) {
+ fprintf( stderr, "Error: soundcard '%s' not found\n", optarg );
+ return 1;
+ }
+ break;
+ case 'd':
+ dev = atoi( optarg );
+ if ( dev < 0 || dev > 32 ) {
+ fprintf( stderr, "Error: device %i is invalid\n", dev );
+ return 1;
+ }
+ break;
+ case 'S':
+ rformat.channels = 2;
+ break;
+ case 'o':
+ tmp = atoi( optarg );
+ if ( tmp < 1 || tmp > 32 ) {
+ fprintf( stderr, "Error: value %i for channels is invalid\n", tmp );
+ return 1;
+ }
+ break;
+ case 'q':
+ quiet_mode = 1;
+ break;
+ case 'r':
+ active_format = FORMAT_RAW;
+ break;
+ case 'v':
+ active_format = FORMAT_VOC;
+ break;
+ case 'w':
+ active_format = FORMAT_WAVE;
+ break;
+ case 'u':
+ active_format = FORMAT_AU;
+ rformat.format = SND_PCM_SFMT_MU_LAW;
+ break;
+ case 's':
+ tmp = atoi( optarg );
+ if ( tmp < 300 )
+ tmp *= 1000;
+ rformat.rate = tmp;
+ if ( tmp < 2000 || tmp > 128000 ) {
+ fprintf( stderr, "Error: bad speed value %i\n", tmp );
+ return 1;
+ }
+ break;
+ case 't':
+ timelimit = atoi( optarg );
+ break;
+ case 'b':
+ tmp = atoi( optarg );
+ switch( tmp ) {
+ case 8:
+ rformat.format = SND_PCM_SFMT_U8;
+ break;
+ case 16:
+ rformat.format = SND_PCM_SFMT_S16_LE;
+ break;
+ }
+ break;
+ case 'x':
+ verbose_mode = 1; quiet_mode = 0;
+ break;
+ case 'p':
+ if ( !strcmp( optarg, "alaw" ) ) {
+ rformat.format = SND_PCM_SFMT_A_LAW;
+ active_format = FORMAT_RAW;
+ break;
+ } else if ( !strcmp( optarg, "ulaw" ) || !strcmp( optarg, "mulaw" ) ) {
+ rformat.format = SND_PCM_SFMT_MU_LAW;
+ active_format = FORMAT_RAW;
+ break;
+ } if ( !strcmp( optarg, "adpcm" ) ) {
+ rformat.format = SND_PCM_SFMT_IMA_ADPCM;
+ active_format = FORMAT_RAW;
+ break;
+ }
+ fprintf( stderr, "Error: wrong extended format '%s'\n", optarg );
+ return 1;
+ case 'm':
+ case 'M':
+ rformat.format = SND_PCM_SFMT_S16_LE;
+ rformat.rate = c == 'M' ? 48000 : 44100;
+ rformat.channels = 2;
+ break;
+ case 'V':
+ version();
+ return 0;
+ default:
+ usage( command );
+ return 1;
+ }
+
+ if ( !quiet_mode )
+ version();
+
+ if ( (err = snd_pcm_open( &pcm_handle, card, dev, direction )) < 0 ) {
+ fprintf( stderr, "Error: audio open error: %s\n", snd_strerror( err ) );
+ return 1;
+ }
+
+ if ( direction == SND_PCM_OPEN_PLAYBACK ) {
+ if ( (err = snd_pcm_playback_info( pcm_handle, &pinfo )) < 0 ) {
+ fprintf( stderr, "Error: playback info error: %s\n", snd_strerror( err ) );
+ return 1;
+ }
+ tmp = pinfo.buffer_size;
+ tmp /= 4; /* 4 fragments are best */
+ } else {
+ if ( (err = snd_pcm_record_info( pcm_handle, &rinfo )) < 0 ) {
+ fprintf( stderr, "Error: record info error: %s\n", snd_strerror( err ) );
+ return 1;
+ }
+ tmp = rinfo.buffer_size;
+ tmp /= 8; /* 8 fragments are best */
+ }
+
+ buffer_size = tmp;
+ if (buffer_size < 512 || buffer_size > 16L * 1024L * 1024L ) {
+ fprintf( stderr, "Error: Invalid audio buffer size %d\n", buffer_size );
+ return 1;
+ }
+
+ check_new_format( &rformat );
+ format = rformat;
+
+ if ( (audiobuf = malloc( buffer_size )) == NULL ) {
+ fprintf( stderr, "%s: unable to allocate input/output buffer\n", command );
+ return 1;
+ }
+
+ if ( optind > argc - 1 ) {
+ if ( direction == SND_PCM_OPEN_PLAYBACK )
+ playback( NULL );
+ else
+ record( NULL );
+ } else {
+ while ( optind <= argc - 1 ) {
+ if ( direction == SND_PCM_OPEN_PLAYBACK )
+ playback( argv[optind++] );
+ else
+ record( argv[optind++] );
+ }
+ }
+ snd_pcm_close( pcm_handle );
+ return 0;
+}
+
+/*
+ * 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 (strstr(vp->magic, VOC_MAGIC_STRING) ) {
+ vocminor = vp->version & 0xFF;
+ vocmajor = vp->version / 256;
+ if (vp->version != (0x1233 - vp->coded_ver) )
+ return -2; /* coded version mismatch */
+ return vp->headerlen - sizeof(VocHeader); /* 0 mostly */
+ }
+ return -1; /* magic string fail */
+}
+
+/*
+ * test, if it's a .WAV file, 0 if ok (and set the speed, stereo etc.)
+ * < 0 if not
+ */
+static int test_wavefile( void *buffer )
+{
+ WaveHeader *wp = buffer;
+
+ if (wp->main_chunk == WAV_RIFF && wp->chunk_type == WAV_WAVE &&
+ wp->sub_chunk == WAV_FMT && wp->data_chunk == WAV_DATA) {
+ if (wp->format != WAV_PCM_CODE) {
+ fprintf( stderr, "%s: can't play not PCM-coded WAVE-files\n", command);
+ exit( 1 );
+ }
+ if (wp -> modus < 1 || wp->modus > 32) {
+ fprintf(stderr, "%s: can't play WAVE-files with %d tracks\n",
+ command, wp->modus);
+ exit( 1 );
+ }
+ format.channels = wp->modus;
+ switch ( wp->bit_p_spl ) {
+ case 8:
+ format.format = SND_PCM_SFMT_U8;
+ break;
+ case 16:
+ format.format = SND_PCM_SFMT_S16_LE;
+ break;
+ default:
+ fprintf(stderr, "%s: can't play WAVE-files with sample %d bits wide\n",
+ command, wp->bit_p_spl);
+ }
+ format.rate = wp -> sample_fq;
+ count = wp -> data_length;
+ check_new_format( &format );
+ return 0;
+ }
+ return -1;
+}
+
+/*
+ *
+ */
+
+static int test_au( int fd, void *buffer )
+{
+ AuHeader *ap = buffer;
+
+ if ( ntohl( ap -> magic ) != AU_MAGIC )
+ return -1;
+ if ( ntohl( ap -> hdr_size ) > 128 || ntohl( ap -> hdr_size ) < 24 )
+ return -1;
+ count = ntohl( ap -> data_size );
+ switch ( ntohl( ap -> encoding ) ) {
+ case AU_FMT_ULAW:
+ format.format = SND_PCM_SFMT_MU_LAW;
+ break;
+ case AU_FMT_LIN8:
+ format.format = SND_PCM_SFMT_U8;
+ break;
+ case AU_FMT_LIN16:
+ format.format = SND_PCM_SFMT_U16_LE;
+ break;
+ default:
+ return -1;
+ }
+ format.rate = ntohl( ap -> sample_rate );
+ if ( format.rate < 2000 || format.rate > 256000 ) return -1;
+ format.channels = ntohl( ap -> channels );
+ if ( format.channels < 1 || format.channels > 128 ) return -1;
+ if ( read( fd, buffer + sizeof( AuHeader ), ntohl( ap -> hdr_size ) - sizeof( AuHeader ) ) < 0 ) {
+ fprintf( stderr, "%s: read error\n", command );
+ exit( 1 );
+ }
+ check_new_format( &format );
+ return 0;
+}
+
+/*
+ * writing zeros from the zerobuf to simulate silence,
+ * perhaps it's enough to use a long var instead of zerobuf ?
+ */
+static void write_zeros( unsigned x )
+{
+ unsigned l;
+ char *buf;
+
+ buf = (char *)malloc( buffer_size );
+ if ( !buf ) {
+ fprintf( stderr, "%s: can allocate buffer for zeros\n", command );
+ return; /* not fatal error */
+ }
+ memset( buf, 128, buffer_size );
+ while ( x > 0 ) {
+ l = x;
+ if ( l > buffer_size ) l = buffer_size;
+ if ( snd_pcm_write( pcm_handle, buf, l ) != l ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit( 1 );
+ }
+ x -= l;
+ }
+}
+
+static void set_format(void)
+{
+ unsigned int bps; /* bytes per second */
+ unsigned int size; /* fragment size */
+ struct snd_pcm_playback_params pparams;
+ struct snd_pcm_record_params rparams;
+
+ bps = format.rate * format.channels;
+ switch ( format.format ) {
+ case SND_PCM_SFMT_U16_LE:
+ case SND_PCM_SFMT_U16_BE:
+ bps <<= 1;
+ break;
+ case SND_PCM_SFMT_IMA_ADPCM:
+ bps >>= 2;
+ break;
+ }
+ bps >>= 2; /* ok.. this buffer should be 0.25 sec */
+ if ( bps < 16 ) bps = 16;
+ size = buffer_size;
+ while ( size > bps ) size >>= 1;
+ if ( size < 16 ) size = 16;
+
+ if ( direction == SND_PCM_OPEN_PLAYBACK ) {
+ if ( snd_pcm_playback_format( pcm_handle, &format ) < 0 ) {
+ fprintf( stderr, "%s: unable to set playback format %s, %iHz, %i voices\n", command, get_format( format.format ), format.rate, format.channels );
+ exit( 1 );
+ }
+ memset( &pparams, 0, sizeof( pparams ) );
+ pparams.fragment_size = size;
+ pparams.fragments_max = -1; /* little trick */
+ pparams.fragments_room = 1;
+ if ( snd_pcm_playback_params( pcm_handle, &pparams ) < 0 ) {
+ fprintf( stderr, "%s: unable to set playback params\n", command );
+ exit( 1 );
+ }
+ } else {
+ if ( snd_pcm_record_format( pcm_handle, &format ) < 0 ) {
+ fprintf( stderr, "%s: unable to set record format %s, %iHz, %i voices\n", command, get_format( format.format ), format.rate, format.channels );
+ exit( 1 );
+ }
+ memset( &rparams, 0, sizeof( rparams ) );
+ rparams.fragment_size = size;
+ rparams.fragments_min = 1;
+ if ( snd_pcm_record_params( pcm_handle, &rparams ) < 0 ) {
+ fprintf( stderr, "%s: unable to set record params\n", command );
+ exit( 1 );
+ }
+ }
+}
+
+/*
+ * ok, let's play a .voc file
+ */
+
+static void voc_play( int fd, int ofs, char *name )
+{
+ int l;
+ VocBlockType *bp;
+ VocVoiceData *vd;
+ VocExtBlock *eb;
+ u_long nextblock, in_buffer;
+ u_char *data = audiobuf;
+ char was_extended = 0, output = 0;
+ u_short *sp, repeat = 0;
+ u_long silence;
+ int filepos = 0;
+
+#define COUNT(x) nextblock -= x; in_buffer -=x ;data += x
+#define COUNT1(x) in_buffer -=x ;data += x
+
+ if ( !quiet_mode ) {
+ fprintf( stderr, "Playing Creative Labs Voice file '%s'...\n", name );
+ }
+
+ /* first we waste the rest of header, ugly but we don't need seek */
+ while ( ofs > buffer_size ) {
+ if ( read( fd, audiobuf, buffer_size ) != buffer_size ) {
+ fprintf( stderr, "%s: read error\n", command );
+ exit( 1 );
+ }
+ ofs -= buffer_size;
+ }
+ if (ofs)
+ if ( read( fd, audiobuf, ofs ) != ofs ) {
+ fprintf( stderr, "%s: read error\n", command );
+ exit( 1 );
+ }
+
+ format.format = SND_PCM_SFMT_U8;
+ format.channels = 1;
+ format.rate = DEFAULT_SPEED;
+ set_format();
+
+ 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 audiobuf up */
+ if (in_buffer)
+ memcpy (audiobuf, data, in_buffer);
+ data = audiobuf;
+ if ((l = read (fd, audiobuf + in_buffer, buffer_size - in_buffer) ) > 0)
+ in_buffer += l;
+ else if (! in_buffer) {
+ /* the file is truncated, so simulate 'Terminator'
+ and reduce the datablock for save landing */
+ nextblock = audiobuf[0] = 0;
+ if (l == -1) {
+ perror (name);
+ exit (-1);
+ }
+ }
+ }
+ while (! nextblock) { /* this is a new block */
+ if (in_buffer<sizeof(VocBlockType)) return;
+ 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) {
+ format.rate = (int)(vd->tc);
+ format.rate = 1000000 / (256 - format.rate);
+#if 0
+ d_printf ("Voice data %d Hz\n", dsp_speed);
+#endif
+ if (vd->pack) { /* /dev/dsp can't it */
+ fprintf (stderr, "%s: can't play packed .voc files\n", command);
+ return;
+ }
+ if (format.channels == 2) { /* if we are in Stereo-Mode, switch back */
+ format.channels = 1;
+ set_format();
+ }
+ }
+ else { /* there was extended block */
+ format.channels = 2;
+ was_extended = 0;
+ }
+ set_format();
+ break;
+ case 2: /* nothing to do, pure data */
+#if 0
+ d_printf ("Voice continuation\n");
+#endif
+ break;
+ case 3: /* a silence block, no data, only a count */
+ sp = (u_short *)data; COUNT1(sizeof(u_short));
+ format.rate = (int)(*data); COUNT1(1);
+ format.rate = 1000000 / (256 - format.rate);
+ set_format();
+ silence = ( ((u_long)*sp) * 1000) / format.rate;
+#if 0
+ d_printf ("Silence for %d ms\n", (int)silence);
+#endif
+ write_zeros (*sp);
+ snd_pcm_flush_playback( pcm_handle );
+ 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 = lseek (fd, 0, 1)) < 0 ) {
+ fprintf(stderr, "%s: can't play loops; %s isn't seekable\n",
+ command, 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
+ lseek (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));
+ format.rate = (int)(eb->tc);
+ format.rate = 256000000L / (65536 - format.rate);
+ format.channels = eb->mode == VOC_MODE_STEREO ? 2 : 1;
+ if (format.channels == 2)
+ format.rate = format.rate >> 1;
+ if (eb->pack) { /* /dev/dsp can't it */
+ fprintf (stderr, "%s: can't play packed .voc files\n", command);
+ return;
+ }
+#if 0
+ d_printf ("Extended block %s %d Hz\n",
+ (eb->mode ? "Stereo" : "Mono"), dsp_speed);
+#endif
+ break;
+ default:
+ fprintf (stderr, "%s: unknown blocktype %d. terminate.\n",
+ command, bp->type);
+ return;
+ } /* switch (bp->type) */
+ } /* while (! nextblock) */
+ /* put nextblock data bytes to dsp */
+ l = in_buffer;
+ if ( nextblock < l ) l = nextblock;
+ if (l) {
+ if (output && !quiet_mode) {
+ if ( write( 2, data, l) != l ) { /* to stderr */
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+ } else {
+ if (snd_pcm_write(pcm_handle, data, l) != l) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+ }
+ COUNT(l);
+ }
+ } /* while(1) */
+}
+/* that was a big one, perhaps somebody split it :-) */
+
+/* setting the globals for playing raw data */
+static void init_raw_data(void)
+{
+ format = rformat;
+}
+
+/* calculate the data count to read from/to dsp */
+static u_long calc_count(void)
+{
+ u_long count;
+
+ if (!timelimit)
+ count = 0x7fffffff;
+ else {
+ count = timelimit * format.rate * format.channels;
+ switch ( format.format ) {
+ case SND_PCM_SFMT_S16_LE:
+ case SND_PCM_SFMT_S16_BE:
+ case SND_PCM_SFMT_U16_LE:
+ case SND_PCM_SFMT_U16_BE:
+ count *= 2;
+ break;
+ case SND_PCM_SFMT_IMA_ADPCM:
+ count /= 4;
+ break;
+ }
+ }
+ return count;
+}
+
+/* write a .VOC-header */
+static void begin_voc( int fd, u_long cnt )
+{
+ VocHeader vh;
+ VocBlockType bt;
+ VocVoiceData vd;
+ VocExtBlock eb;
+
+ strncpy( vh.magic, VOC_MAGIC_STRING, 20 );
+ vh.magic[19] = 0x1A;
+ vh.headerlen = sizeof( VocHeader );
+ vh.version = VOC_ACTUAL_VERSION;
+ vh.coded_ver = 0x1233 - VOC_ACTUAL_VERSION;
+
+ if ( write( fd, &vh, sizeof(VocHeader) ) != sizeof(VocHeader) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+
+ if (format.channels > 1) {
+ /* write a extended block */
+ bt.type = 8;
+ bt.datalen = 4;
+ bt.datalen_m = bt.datalen_h = 0;
+ if ( write (fd, &bt, sizeof(VocBlockType)) != sizeof( VocBlockType ) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+ eb.tc = (u_short)(65536 - 256000000L / (format.rate << 1));
+ eb.pack = 0;
+ eb.mode = 1;
+ if ( write(fd, &eb, sizeof(VocExtBlock)) != sizeof(VocExtBlock) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+ }
+ bt.type = 1;
+ cnt += sizeof(VocVoiceData); /* Voice_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 ) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+ vd.tc = (u_char)(256 - (1000000 / format.rate) );
+ vd.pack = 0;
+ if ( write (fd, &vd, sizeof(VocVoiceData) ) != sizeof( VocVoiceData ) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+}
+
+/* write a WAVE-header */
+static void begin_wave(int fd, u_long cnt)
+{
+ WaveHeader wh;
+ int bits;
+
+ switch ( format.format ) {
+ case SND_PCM_SFMT_U8:
+ bits = 8;
+ break;
+ case SND_PCM_SFMT_S16_LE:
+ bits = 16;
+ break;
+ default:
+ fprintf( stderr, "%s: Wave doesn't support %s format...\n", command, get_format( format.format ) );
+ exit( 1 );
+ }
+ wh.main_chunk = WAV_RIFF;
+ wh.length = cnt + sizeof(WaveHeader) - 8;
+ wh.chunk_type = WAV_WAVE;
+ wh.sub_chunk = WAV_FMT;
+ wh.sc_len = 16;
+ wh.format = WAV_PCM_CODE;
+ wh.modus = format.channels;
+ wh.sample_fq = format.rate;
+#if 0
+ wh.byte_p_spl = (samplesize == 8) ? 1 : 2;
+ wh.byte_p_sec = dsp_speed * wh.modus * wh.byte_p_spl;
+#else
+ wh.byte_p_spl = wh.modus * ((bits + 7) / 8);
+ wh.byte_p_sec = wh.byte_p_spl * format.rate;
+#endif
+ wh.bit_p_spl = bits;
+ wh.data_chunk = WAV_DATA;
+ wh.data_length= cnt;
+ if ( write (fd, &wh, sizeof(WaveHeader)) != sizeof( WaveHeader ) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+}
+
+/* write a Au-header */
+static void begin_au(int fd, u_long cnt)
+{
+ AuHeader ah;
+
+ ah.magic = htonl( AU_MAGIC );
+ ah.hdr_size = htonl( 24 );
+ ah.data_size = htonl( cnt );
+ switch ( format.format ) {
+ case SND_PCM_SFMT_MU_LAW:
+ ah.encoding = htonl( AU_FMT_ULAW );
+ break;
+ case SND_PCM_SFMT_U8:
+ ah.encoding = htonl( AU_FMT_LIN8 );
+ break;
+ case SND_PCM_SFMT_U16_LE:
+ ah.encoding = htonl( AU_FMT_LIN16 );
+ break;
+ default:
+ fprintf( stderr, "%s: Sparc Audio doesn't support %s format...\n", command, get_format( format.format ) );
+ exit( 1 );
+ }
+ ah.sample_rate = htonl( format.rate );
+ ah.channels = htonl( format.channels );
+ if ( write (fd, &ah, sizeof(AuHeader)) != sizeof( AuHeader ) ) {
+ fprintf( stderr, "%s: write error\n", command );
+ exit(1);
+ }
+}
+
+/* closing .VOC */
+static void end_voc(int fd)
+{
+ char dummy = 0; /* Write a Terminator */
+ if ( write (fd, &dummy, 1) != 1 ) {
+ fprintf( stderr, "%s: write error", command );
+ exit( 1 );
+ }
+ if (fd != 1)
+ close (fd);
+}
+
+static void end_wave(int fd)
+{ /* only close output */
+ if (fd != 1)
+ close (fd);
+}
+
+static void header( int rtype, char *name )
+{
+ if (!quiet_mode) {
+ fprintf (stderr, "%s %s '%s' : ",
+ (direction == SND_PCM_OPEN_PLAYBACK) ? "Playing" : "Recording",
+ fmt_rec_table[rtype].what,
+ name );
+ fprintf (stderr, "%s, ", get_format( format.format ) );
+ fprintf (stderr, "Speed %d Hz, ", format.rate);
+ if ( format.channels == 1 )
+ fprintf (stderr, "Mono" );
+ else if ( format.channels == 2 )
+ fprintf (stderr, "Stereo" );
+ else fprintf (stderr, "Voices %i", format.channels);
+ fprintf (stderr, "\n" );
+ }
+}
+
+/* playing raw data */
+
+void playback_go (int fd, int loaded, u_long count, int rtype, char *name)
+{
+ int l;
+ u_long c;
+
+ header( rtype, name );
+ set_format();
+
+ while (count) {
+ c = count;
+
+ if (c > buffer_size)
+ c = buffer_size;
+
+ if ((l = read (fd, audiobuf + loaded, c - loaded)) > 0) {
+ l += loaded; loaded = 0; /* correct the count; ugly but ... */
+#if 0
+ sleep( 1 );
+#endif
+ if (snd_pcm_write(pcm_handle, audiobuf, l) != l) {
+ fprintf( stderr, "write error\n" );
+ exit (1);
+ }
+ count -= l;
+ } else {
+ if (l == -1) {
+ perror (name);
+ exit (-1);
+ }
+ count = 0; /* Stop */
+ }
+ } /* while (count) */
+}
+
+/* recording raw data, this proc handels WAVE files and .VOCs (as one block) */
+
+void record_go(int fd, int loaded, u_long count, int rtype, char *name)
+{
+ int l;
+ u_long c;
+
+ header( rtype, name );
+ set_format();
+
+ while (count) {
+ c = count;
+ if (c > buffer_size)
+ c = buffer_size;
+
+ if ((l = snd_pcm_read(pcm_handle, audiobuf, c)) > 0) {
+ if (write (fd, audiobuf, l) != l) {
+ perror (name);
+ exit (-1);
+ }
+ count -= l;
+ }
+
+ if (l == -1) {
+ fprintf( stderr, "read error\n" );
+ exit (-1);
+ }
+ }
+}
+
+/*
+ * let's play or record it (record_type says VOC/WAVE/raw)
+ */
+
+static void playback(char *name)
+{
+ int fd, ofs;
+
+ snd_pcm_flush_playback( pcm_handle );
+ if (!name) {
+ fd = 0;
+ name = "stdin";
+ } else {
+ if ((fd = open (name, O_RDONLY, 0)) == -1) {
+ perror (name);
+ exit(1);
+ }
+ }
+ /* read the file header */
+ if ( read( fd, audiobuf, sizeof(AuHeader) ) != sizeof( AuHeader ) ) {
+ fprintf( stderr, "%s: read error", command );
+ exit( 1 );
+ }
+ if ( test_au( fd, audiobuf ) >= 0 ) {
+ playback_go( fd, 0, count, FORMAT_AU, name );
+ goto __end;
+ }
+ if ( read( fd, audiobuf + sizeof(AuHeader),
+ sizeof(VocHeader)-sizeof(AuHeader) ) !=
+ sizeof(VocHeader)-sizeof(AuHeader) ) {
+ fprintf( stderr, "%s: read error", command );
+ exit( 1 );
+ }
+ if ( (ofs = test_vocfile (audiobuf) ) >= 0) {
+ voc_play (fd, ofs, name);
+ goto __end;
+ }
+ /* read bytes for WAVE-header */
+ if ( read (fd, audiobuf + sizeof(VocHeader),
+ sizeof(WaveHeader) - sizeof(VocHeader) ) !=
+ sizeof(WaveHeader) - sizeof(VocHeader) ) {
+ fprintf( stderr, "%s: read error", command );
+ exit( 1 );
+ }
+ if (test_wavefile (audiobuf) >= 0) {
+ playback_go(fd, 0, count, FORMAT_WAVE, name);
+ } else {
+ /* should be raw data */
+ init_raw_data();
+ count = calc_count();
+ playback_go(fd, sizeof(WaveHeader), count, FORMAT_RAW, name);
+ }
+ __end:
+ if (fd != 0)
+ close(fd);
+}
+
+static void record(char *name)
+{
+ int fd;
+
+ snd_pcm_flush_record( pcm_handle );
+ if (!name) {
+ fd = 1;
+ name = "stdout";
+ } else {
+ remove( name );
+ if ((fd = open (name, O_WRONLY | O_CREAT, 0644)) == -1) {
+ perror (name);
+ exit(1);
+ }
+ }
+ count = calc_count() & 0xFFFFFFFE;
+ /* 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 (fmt_rec_table[active_format].start)
+ fmt_rec_table[active_format].start(fd, count);
+ record_go( fd, 0, count, active_format, name);
+ fmt_rec_table[active_format].end(fd);
+}
--- /dev/null
+#ifndef FORMATS_H
+#define FORMATS_H 1
+
+#include <sys/types.h>
+
+/* Definitions for .VOC files */
+
+#define VOC_MAGIC_STRING "Creative Voice File\0x1A"
+#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 */
+
+#define WAV_RIFF 0x46464952
+#define WAV_WAVE 0x45564157
+#define WAV_FMT 0x20746D66
+#define WAV_DATA 0x61746164
+#define WAV_PCM_CODE 1
+
+/* 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 wav_header {
+ u_int main_chunk; /* 'RIFF' */
+ u_int length; /* filelen */
+ u_int chunk_type; /* 'WAVE' */
+
+ u_int sub_chunk; /* 'fmt ' */
+ u_int sc_len; /* length of sub_chunk, =16 */
+ u_short format; /* should be 1 for PCM-code */
+ u_short modus; /* 1 Mono, 2 Stereo */
+ 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 */
+
+ u_int data_chunk; /* 'data' */
+ u_int data_length; /* samplecount */
+} WaveHeader;
+
+/* Definitions for Sparc .au header */
+
+#define AU_MAGIC 0x2e736e64
+
+#define AU_FMT_ULAW 1
+#define AU_FMT_LIN8 2
+#define AU_FMT_LIN16 3
+
+typedef struct au_header {
+ u_int magic; /* 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 */
--- /dev/null
+# 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. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+ac_cv_c_const=${ac_cv_c_const='yes'}
+ac_cv_c_inline=${ac_cv_c_inline='inline'}
+ac_cv_header_linux_sound_h=${ac_cv_header_linux_sound_h='yes'}
+ac_cv_header_stdc=${ac_cv_header_stdc='yes'}
+ac_cv_header_sys_soundlib_h=${ac_cv_header_sys_soundlib_h='yes'}
+ac_cv_header_time=${ac_cv_header_time='yes'}
+ac_cv_path_install=${ac_cv_path_install='/usr/bin/install -c'}
+ac_cv_prog_CC=${ac_cv_prog_CC='gcc'}
+ac_cv_prog_CPP=${ac_cv_prog_CPP='gcc -E'}
+ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB='ranlib'}
+ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross='no'}
+ac_cv_prog_cc_g=${ac_cv_prog_cc_g='yes'}
+ac_cv_prog_cc_works=${ac_cv_prog_cc_works='yes'}
+ac_cv_prog_gcc=${ac_cv_prog_gcc='yes'}
+ac_cv_prog_gcc_traditional=${ac_cv_prog_gcc_traditional='no'}
--- /dev/null
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+configure:528: checking for gcc
+configure:605: checking whether the C compiler (gcc ) works
+configure:619: gcc -o conftest conftest.c 1>&5
+configure:639: checking whether the C compiler (gcc ) is a cross-compiler
+configure:644: checking whether we are using GNU C
+configure:653: gcc -E conftest.c
+configure:668: checking whether gcc accepts -g
+configure:698: checking for ranlib
+configure:754: checking for a BSD compatible install
+configure:805: checking how to run the C preprocessor
+configure:826: gcc -E conftest.c >/dev/null 2>conftest.out
+configure:866: checking for ANSI C header files
+configure:879: gcc -E conftest.c >/dev/null 2>conftest.out
+configure:946: gcc -o conftest -g -O2 conftest.c 1>&5
+configure:974: checking for linux/sound.h
+configure:984: gcc -E conftest.c >/dev/null 2>conftest.out
+configure:974: checking for sys/soundlib.h
+configure:984: gcc -E conftest.c >/dev/null 2>conftest.out
+configure:1012: checking for working const
+configure:1066: gcc -c -g -O2 conftest.c 1>&5
+configure:1087: checking for inline
+configure:1101: gcc -c -g -O2 conftest.c 1>&5
+configure:1127: checking whether time.h and sys/time.h may both be included
+configure:1141: gcc -c -g -O2 conftest.c 1>&5
+configure:1164: checking whether gcc needs -traditional
+configure:1171: sgtty.h: No such file or directory
+configure:1219: checking for alsa-lib package
+configure:1236: gcc -o conftest -I/usr/include conftest.c -L/usr/lib -lsound 1>&5
+configure:1250: checking for alsa-utils version
--- /dev/null
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host entry.jcu.cz:
+#
+# ./configure
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion"
+ exec ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "./config.status generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "$ac_cs_usage"; exit 0 ;;
+ *) echo "$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=.
+ac_given_INSTALL="/usr/bin/install -c"
+
+trap 'rm -fr Makefile.conf utils/alsa-utils.spec include/config.h conftest*; exit 1' 1 2 15
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
+/^[ ]*VPATH[ ]*=[^:]*$/d
+
+s%@CFLAGS@%-I/usr/include%g
+s%@CPPFLAGS@%%g
+s%@CXXFLAGS@%%g
+s%@DEFS@%-DHAVE_CONFIG_H%g
+s%@LDFLAGS@%%g
+s%@LIBS@%-L/usr/lib -lsound%g
+s%@exec_prefix@%${prefix}%g
+s%@prefix@%/usr%g
+s%@program_transform_name@%s,x,x,%g
+s%@bindir@%${exec_prefix}/bin%g
+s%@sbindir@%${exec_prefix}/sbin%g
+s%@libexecdir@%${exec_prefix}/libexec%g
+s%@datadir@%${prefix}/share%g
+s%@sysconfdir@%${prefix}/etc%g
+s%@sharedstatedir@%${prefix}/com%g
+s%@localstatedir@%${prefix}/var%g
+s%@libdir@%${exec_prefix}/lib%g
+s%@includedir@%${prefix}/include%g
+s%@oldincludedir@%/usr/include%g
+s%@infodir@%${prefix}/info%g
+s%@mandir@%${prefix}/man%g
+s%@CC@%gcc%g
+s%@RANLIB@%ranlib%g
+s%@INSTALL_PROGRAM@%${INSTALL}%g
+s%@INSTALL_DATA@%${INSTALL} -m 644%g
+s%@CPP@%gcc -E%g
+s%@SND_UTIL_VERSION@%0.0.4%g
+s%@SND_UTIL_MAJOR@%0%g
+s%@SND_UTIL_MINOR@%0%g
+s%@SND_UTIL_SUBMINOR@%4%g
+
+CEOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+
+CONFIG_FILES=${CONFIG_FILES-"Makefile.conf utils/alsa-utils.spec"}
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+ CONFIG_HEADERS="include/config.h"
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+ cat > conftest.frag <<CEOF
+${ac_dA}STDC_HEADERS${ac_dB}STDC_HEADERS${ac_dC}1${ac_dD}
+${ac_uA}STDC_HEADERS${ac_uB}STDC_HEADERS${ac_uC}1${ac_uD}
+${ac_eA}STDC_HEADERS${ac_eB}STDC_HEADERS${ac_eC}1${ac_eD}
+${ac_dA}HAVE_LINUX_SOUND_H${ac_dB}HAVE_LINUX_SOUND_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_LINUX_SOUND_H${ac_uB}HAVE_LINUX_SOUND_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_LINUX_SOUND_H${ac_eB}HAVE_LINUX_SOUND_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SYS_SOUNDLIB_H${ac_dB}HAVE_SYS_SOUNDLIB_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_SOUNDLIB_H${ac_uB}HAVE_SYS_SOUNDLIB_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_SOUNDLIB_H${ac_eB}HAVE_SYS_SOUNDLIB_H${ac_eC}1${ac_eD}
+${ac_dA}TIME_WITH_SYS_TIME${ac_dB}TIME_WITH_SYS_TIME${ac_dC}1${ac_dD}
+${ac_uA}TIME_WITH_SYS_TIME${ac_uB}TIME_WITH_SYS_TIME${ac_uC}1${ac_uD}
+${ac_eA}TIME_WITH_SYS_TIME${ac_eB}TIME_WITH_SYS_TIME${ac_eC}1${ac_eD}
+CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+
+ cat > conftest.frag <<CEOF
+${ac_dA}SND_UTIL_VERSION${ac_dB}SND_UTIL_VERSION${ac_dC}"0.0.4"${ac_dD}
+${ac_uA}SND_UTIL_VERSION${ac_uB}SND_UTIL_VERSION${ac_uC}"0.0.4"${ac_uD}
+${ac_eA}SND_UTIL_VERSION${ac_eB}SND_UTIL_VERSION${ac_eC}"0.0.4"${ac_eD}
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+
+
+exit 0
--- /dev/null
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_default_prefix=/usr
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+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=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -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 ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$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" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$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)
+ # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --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
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$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" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ 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)
+ 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" ;;
+
+ -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 ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.12"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=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" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=Makefile.conf.in
+
+# 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 its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ 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
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:528: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+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
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:557: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ ac_prog_rejected=no
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_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 $# -gt 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
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:605: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 615 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:619: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:639: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:644: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:653: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:668: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:698: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+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
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# 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
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:754: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ for ac_prog in ginstall installbsd scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ # OSF/1 installbsd also uses dspmsg, but is usable.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+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. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&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_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:805: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 820 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:826: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 837 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:866: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 871 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:879: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 896 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ 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 > conftest.$ac_ext <<EOF
+#line 914 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ 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 > conftest.$ac_ext <<EOF
+#line 935 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#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)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:946: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+
+for ac_hdr in linux/sound.h sys/soundlib.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:974: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 979 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:984: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1012: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1017 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* 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";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 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;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1066: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1087: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+#line 1094 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1101: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+ inline | yes) ;;
+ no) cat >> confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:1127: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1132 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
+EOF
+if { (eval echo configure:1141: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_header_time=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_time=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+ cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+
+if test $ac_cv_prog_gcc = yes; then
+ echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:1164: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat > conftest.$ac_ext <<EOF
+#line 1170 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+else
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat > conftest.$ac_ext <<EOF
+#line 1188 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+
+myprefix=$prefix
+if test "$myprefix" = "NONE"; then
+ myprefix=$ac_default_prefix
+fi
+CFLAGS="-I$myprefix/include"
+LIBS="-L$myprefix/lib -lsound"
+#echo "CFLAGS=$CFLAGS"
+#echo "LIBS=$LIBS"
+echo $ac_n "checking for alsa-lib package""... $ac_c" 1>&6
+echo "configure:1219: checking for alsa-lib package" >&5
+if test "$cross_compiling" = yes; then
+ echo "$ac_t"""not supported"" 1>&6; echo "Fatal error: Cross-compiling isn't supported..."; exit 1;
+
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1225 "configure"
+#include "confdefs.h"
+
+#include <sys/soundlib.h>
+void main(void)
+{
+ snd_cards();
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:1236: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ echo "$ac_t"""present"" 1>&6
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ echo "$ac_t"""not found"" 1>&6; echo "Fatal error: Install alsa-lib package at first..."; exit 1;
+fi
+rm -fr conftest*
+fi
+
+
+echo $ac_n "checking for alsa-utils version""... $ac_c" 1>&6
+echo "configure:1250: checking for alsa-utils version" >&5
+SND_UTIL_VERSION=`cat $srcdir/version`
+cat >> confdefs.h <<EOF
+#define SND_UTIL_VERSION "$SND_UTIL_VERSION"
+EOF
+
+
+SND_UTIL_MAJOR=`echo $SND_UTIL_VERSION | cut -d . -f 1`
+
+SND_UTIL_MINOR=`echo $SND_UTIL_VERSION | cut -d . -f 2`
+
+SND_UTIL_SUBMINOR=`echo $SND_UTIL_VERSION | cut -d . -f 3`
+
+echo "$ac_t""$SND_UTIL_VERSION" 1>&6
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# 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. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# 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.
+(set) 2>&1 |
+ case `(ac_space=' '; set) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile.conf utils/alsa-utils.spec include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@RANLIB@%$RANLIB%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@CPP@%$CPP%g
+s%@SND_UTIL_VERSION@%$SND_UTIL_VERSION%g
+s%@SND_UTIL_MAJOR@%$SND_UTIL_MAJOR%g
+s%@SND_UTIL_MINOR@%$SND_UTIL_MINOR%g
+s%@SND_UTIL_SUBMINOR@%$SND_UTIL_SUBMINOR%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile.conf utils/alsa-utils.spec"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="include/config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #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.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
--- /dev/null
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(Makefile.conf.in)
+AC_PREFIX_DEFAULT(/usr)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_RANLIB
+AC_PROG_INSTALL
+AC_PROG_LN_S
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CONFIG_HEADER(include/config.h)
+AC_CHECK_HEADERS(linux/sound.h sys/soundlib.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 Check for ALSA library package.
+myprefix=$prefix
+if test "$myprefix" = "NONE"; then
+ myprefix=$ac_default_prefix
+fi
+CFLAGS="-I$myprefix/include"
+LIBS="-L$myprefix/lib -lsound"
+#echo "CFLAGS=$CFLAGS"
+#echo "LIBS=$LIBS"
+AC_MSG_CHECKING(for alsa-lib package)
+AC_TRY_RUN([
+#include <sys/soundlib.h>
+void main(void)
+{
+ snd_cards();
+ exit(0);
+}
+],
+ AC_MSG_RESULT("present"),
+ AC_MSG_RESULT("not found"); echo "Fatal error: Install alsa-lib package at first..."; exit 1;,
+ AC_MSG_RESULT("not supported"); echo "Fatal error: Cross-compiling isn't supported..."; exit 1;
+)
+
+dnl Check for version...
+AC_MSG_CHECKING(for alsa-utils version)
+SND_UTIL_VERSION=`cat $srcdir/version`
+AC_DEFINE_UNQUOTED(SND_UTIL_VERSION, "$SND_UTIL_VERSION")
+AC_SUBST(SND_UTIL_VERSION)
+SND_UTIL_MAJOR=`echo $SND_UTIL_VERSION | cut -d . -f 1`
+AC_SUBST(SND_UTIL_MAJOR)
+SND_UTIL_MINOR=`echo $SND_UTIL_VERSION | cut -d . -f 2`
+AC_SUBST(SND_UTIL_MINOR)
+SND_UTIL_SUBMINOR=`echo $SND_UTIL_VERSION | cut -d . -f 3`
+AC_SUBST(SND_UTIL_SUBMINOR)
+AC_MSG_RESULT($SND_UTIL_VERSION)
+
+AC_OUTPUT(Makefile.conf utils/alsa-utils.spec)
--- /dev/null
+#
+# Makefile for ALSA utils package
+# Copyright (c) 1994-98 by Jaroslav Kysela <perex@jcu.cz>
+#
+
+include ../Makefile.conf
+
+clean:
+ rm -f core .depend *.o *.orig *~
+
--- /dev/null
+/* include/config.h. Generated automatically by configure. */
+/*
+ * Configuration header file for compilation of the ALSA utilities
+ */
+
+#define SND_UTIL_VERSION "0.0.4"
--- /dev/null
+/*
+ * Configuration header file for compilation of the ALSA utilities
+ */
+
+#undef SND_UTIL_VERSION
--- /dev/null
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# 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. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# 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 $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
--- /dev/null
+#
+# Makefile for ALSA utils package
+# Copyright (c) 1994-98 by Jaroslav Kysela <perex@jcu.cz>
+#
+
+include ../Makefile.conf
+
+clean:
+ rm -f core .depend *.o *.orig *~
+
--- /dev/null
+%define ver 0.0.4
+%define rel 1
+%define prefix /
+
+Summary: Advanced Linux Sound Architecture (ALSA) - Utils
+Name: alsa-utils
+Version: %ver
+Release: %rel
+Copyright: GPL
+Group: System/Libraries
+Source: ftp://alsa.jcu.cz/pub/utils/alsa-utils-%{ver}.tar.gz
+BuildRoot: /tmp/alsa-utils-%{ver}
+Packager: Helge Jensen <slog@slog.dk>
+URL: http://alsa.jcu.cz
+Docdir: %{prefix}/usr/doc
+Requires: alsa-lib alsa-driver
+%description
+
+Advanced Linux Sound Architecture (ALSA) - Utils
+
+Features
+========
+
+* general
+ - modularized architecture with support for 2.0 and latest 2.1 kernels
+ - support for versioned and exported symbols
+ - full proc filesystem support - /proc/sound
+* ISA soundcards
+ - support for 128k ISA DMA buffer
+* mixer
+ - new enhanced API for applications
+ - support for unlimited number of channels
+ - volume can be set in three ways (percentual (0-100), exact and decibel)
+ - support for mute (and hardware mute if hardware supports it)
+ - support for mixer events
+ - this allows two or more applications to be synchronized
+* digital audio (PCM)
+ - new enhanced API for applications
+ - full real duplex support
+ - full duplex support for SoundBlaster 16/AWE soundcards
+ - digital audio data for playback and record should be read back using
+ proc filesystem
+* OSS/Lite compatibility
+ - full mixer compatibity
+ - full PCM (/dev/dsp) compatibility
+
+%changelog
+
+* Mon May 28 1998 Helge Jensen <slog@slog.dk>
+
+- Made SPEC file
+
+%prep
+%setup -n alsa-utils
+%build
+
+./configure --prefix=/usr
+make
+
+%install
+mkdir -p $RPM_BUILD_ROOT/usr/bin
+
+make prefix="$RPM_BUILD_ROOT/usr" install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+
+%doc CHANGELOG COPYING README config.status
+
+%{prefix}/usr/bin/*
--- /dev/null
+%define ver @SND_UTIL_VERSION@
+%define rel 1
+%define prefix /
+
+Summary: Advanced Linux Sound Architecture (ALSA) - Utils
+Name: alsa-utils
+Version: %ver
+Release: %rel
+Copyright: GPL
+Group: System/Libraries
+Source: ftp://alsa.jcu.cz/pub/utils/alsa-utils-%{ver}.tar.gz
+BuildRoot: /tmp/alsa-utils-%{ver}
+Packager: Helge Jensen <slog@slog.dk>
+URL: http://alsa.jcu.cz
+Docdir: %{prefix}/usr/doc
+Requires: alsa-lib alsa-driver
+%description
+
+Advanced Linux Sound Architecture (ALSA) - Utils
+
+Features
+========
+
+* general
+ - modularized architecture with support for 2.0 and latest 2.1 kernels
+ - support for versioned and exported symbols
+ - full proc filesystem support - /proc/sound
+* ISA soundcards
+ - support for 128k ISA DMA buffer
+* mixer
+ - new enhanced API for applications
+ - support for unlimited number of channels
+ - volume can be set in three ways (percentual (0-100), exact and decibel)
+ - support for mute (and hardware mute if hardware supports it)
+ - support for mixer events
+ - this allows two or more applications to be synchronized
+* digital audio (PCM)
+ - new enhanced API for applications
+ - full real duplex support
+ - full duplex support for SoundBlaster 16/AWE soundcards
+ - digital audio data for playback and record should be read back using
+ proc filesystem
+* OSS/Lite compatibility
+ - full mixer compatibity
+ - full PCM (/dev/dsp) compatibility
+
+%changelog
+
+* Mon May 28 1998 Helge Jensen <slog@slog.dk>
+
+- Made SPEC file
+
+%prep
+%setup -n alsa-utils
+%build
+
+./configure --prefix=/usr
+make
+
+%install
+mkdir -p $RPM_BUILD_ROOT/usr/bin
+
+make prefix="$RPM_BUILD_ROOT/usr" install
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+
+%doc CHANGELOG COPYING README config.status
+
+%{prefix}/usr/bin/*
--- /dev/null
+#!/bin/bash
+
+source=.
+version=`cat $source/../version`
+package=$source/../../alsa-utils-$version.tar.gz
+
+if [ ! -r $package ]; then
+ echo "Error: wrong package: $package"
+ exit 1
+fi
+
+make -C .. pack
+
+cp -fv $package /usr/src/redhat/SOURCES
+
+if [ ! -r $source/buildrpm ]; then
+ echo "Error: invalid directory: $source"
+ exit 1
+fi
+
+if [ ! -d /usr/src/redhat ]; then
+ echo "Error: /usr/src/redhat directory not found"
+ exit 1
+fi
+
+if [ ! -r $source/alsadriver.spec ]; then
+ cd $source/..
+ ./configure
+ cd utils
+fi
+
+cp -fv $source/alsa-utils.spec /usr/src/redhat/SPECS
+cd /usr/src/redhat/SPECS
+rpm -ba alsa-utils.spec
+cd /usr/src/redhat