shithub: aacdec

Download patch

ref: c7dc7254c1ecfeb2227275f56bddac4f4e822760
author: menno <menno>
date: Mon Jan 14 14:15:57 EST 2002

no message

--- /dev/null
+++ b/AUTHORS
@@ -1,0 +1,4 @@
+
+menno (menno@audiocoding.com)
+ - complete library
+
--- /dev/null
+++ b/COPYING
@@ -1,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 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
+++ b/ChangeLog
@@ -1,0 +1,2 @@
+
+Initial revision
\ No newline at end of file
--- /dev/null
+++ b/NEWS
@@ -1,0 +1,3 @@
+
+14 Januari 2002
+ - Initial revision of completely rewritten FAAD 2 library
\ No newline at end of file
--- /dev/null
+++ b/README
@@ -1,0 +1,44 @@
+Freeware Advanced Audio Decoder version 2
+http://www.audiocoding.com/
+
+FAAD 2 is a LC, MAIN and LTP profile, MPEG2 and MPEG-4 AAC decoder, completely
+written from scratch. FAAD 2 is licensed under the GPL.
+
+
+__________
+COPYRIGHTS
+
+For FAAD the following license applies:
+
+******************************************************************************
+FAAD - Freeware Advanced Audio Decoder
+Copyright (C) 2002 M. Bakker
+ 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software 
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+******************************************************************************
+
+
+Please note that the use of this software may require the payment of
+patent royalties. You need to consider this issue before you start
+building derivative works. We are not warranting or indemnifying you in
+any way for patent royalities! YOU ARE SOLELY RESPONSIBLE FOR YOUR OWN
+ACTIONS!
+
+
+______
+PEOPLE
+
+FAAD2 is completely written by:
+ - menno (menno@audiocoding.com).
--- /dev/null
+++ b/TODO
@@ -1,0 +1,15 @@
+
+- Small fixes to PNS (see pns.c)
+- Channel coupling
+- Better buffering in frontend (more intelligently handle nr. of channels)
+- Lot's of testing
+- SSR (???)
+- CELP decoder -> AAC scalable profile
+
+- Reintroduce:
+ - Winamp plugin
+ - Winamp3 plugin
+ - Sonique plugin
+ - XMMS plugin
+ - CoolEdit lugin
+
--- /dev/null
+++ b/common/faad/aacinfo.c
@@ -1,0 +1,367 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: aacinfo.c,v 1.1 2002/01/14 19:15:49 menno Exp $
+**/
+
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+#include <malloc.h>
+#include "filestream.h"
+#include "aacinfo.h"
+
+#define ADIF_MAX_SIZE 30 /* Should be enough */
+#define ADTS_MAX_SIZE 10 /* Should be enough */
+
+static int sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000};
+
+static int read_ADIF_header(FILE_STREAM *file, faadAACInfo *info)
+{
+    int bitstream;
+    unsigned char buffer[ADIF_MAX_SIZE];
+    int skip_size = 0;
+    int sf_idx;
+
+    /* Get ADIF header data */
+    info->headertype = 1;
+
+    if(read_buffer_filestream(file, buffer, ADIF_MAX_SIZE) < 0)
+		return -1;
+
+    /* copyright string */
+    if(buffer[0] & 0x80)
+        skip_size += 9; /* skip 9 bytes */
+
+    bitstream = buffer[0 + skip_size] & 0x10;
+    info->bitrate = ((unsigned int)(buffer[0 + skip_size] & 0x0F)<<19)|
+        ((unsigned int)buffer[1 + skip_size]<<11)|
+        ((unsigned int)buffer[2 + skip_size]<<3)|
+        ((unsigned int)buffer[3 + skip_size] & 0xE0);
+
+    if (bitstream == 0)
+    {
+        info->object_type =  ((buffer[6 + skip_size]&0x01)<<1)|((buffer[7 + skip_size]&0x80)>>7);
+        sf_idx = (buffer[7 + skip_size]&0x78)>>3;
+    } else {
+        info->object_type = (buffer[4 + skip_size] & 0x18)>>3;
+        sf_idx = ((buffer[4 + skip_size] & 0x07)<<1)|((buffer[5 + skip_size] & 0x80)>>7);
+    }
+    info->sampling_rate = sample_rates[sf_idx];
+
+    return 0;
+}
+
+static int read_ADTS_header(FILE_STREAM *file, faadAACInfo *info,
+                            unsigned long **seek_table, int *seek_table_len,
+                            int tagsize, int no_seek_table)
+{
+    /* Get ADTS header data */
+    unsigned char buffer[ADTS_MAX_SIZE];
+    int frames, framesinsec=0, t_framelength = 0, frame_length, sr_idx, ID;
+    int second = 0, pos;
+	int i;
+    float frames_per_sec = 0;
+    unsigned long bytes;
+	unsigned long *tmp_seek_table = NULL;
+
+    info->headertype = 2;
+
+    /* Read all frames to ensure correct time and bitrate */
+    for(frames=0; /* */; frames++, framesinsec++)
+    {
+		/* If streaming, only go until we hit 5 seconds worth */
+		 if(file->http || no_seek_table)
+		 {
+			 if(frames >= 43 * 5)
+			 {
+				break;
+			 }
+		 }
+
+        pos = tell_filestream(file);
+
+        /* 12 bit SYNCWORD */
+        bytes = read_buffer_filestream(file, buffer, ADTS_MAX_SIZE);
+
+        if(bytes != ADTS_MAX_SIZE)
+        {
+            /* Bail out if no syncword found */
+            break;
+        }
+
+		/* check syncword */
+        if (!((buffer[0] == 0xFF)&&((buffer[1] & 0xF6) == 0xF0)))
+            break;
+
+        if(!frames)
+        {
+            /* fixed ADTS header is the same for every frame, so we read it only once */
+            /* Syncword found, proceed to read in the fixed ADTS header */
+            ID = buffer[1] & 0x08;
+            info->object_type = (buffer[2]&0xC0)>>6;
+            sr_idx = (buffer[2]&0x3C)>>2;
+            info->channels = ((buffer[2]&0x01)<<2)|((buffer[3]&0xC0)>>6);
+
+            frames_per_sec = sample_rates[sr_idx] / 1024.f;
+        }
+
+        /* ...and the variable ADTS header */
+        if (ID == 0) {
+            info->version = 4;
+            frame_length = (((unsigned int)buffer[4]) << 5) |
+                ((unsigned int)buffer[5] >> 3);
+        } else { /* MPEG-2 */
+            info->version = 2;
+            frame_length = ((((unsigned int)buffer[3] & 0x3)) << 11)
+            | (((unsigned int)buffer[4]) << 3) | (buffer[5] >> 5);
+        }
+
+        t_framelength += frame_length;
+
+		if(!file->http)
+		{
+			if(framesinsec == 43)
+				framesinsec = 0;
+
+			if(framesinsec == 0 && seek_table_len)
+			{
+				tmp_seek_table = (unsigned long *) realloc(tmp_seek_table, (second + 1) * sizeof(unsigned long));
+				tmp_seek_table[second] = pos;
+				second++;
+			}
+		}
+
+		/* NOTE: While simply skipping ahead by reading may seem to be more work than seeking,
+			it is actually much faster, and keeps compatibility with streaming */
+		for(i=0; i < frame_length - ADTS_MAX_SIZE; i++)
+        {
+			if(read_byte_filestream(file) < 0)
+				break;
+        }
+    }
+
+	if(seek_table_len)
+	{
+		*seek_table_len = second;
+		*seek_table = tmp_seek_table;
+	}
+
+    info->sampling_rate = sample_rates[sr_idx];
+    info->bitrate = (int)(((t_framelength / frames) * (info->sampling_rate/1024.0)) +0.5)*8;
+
+	if(file->http)
+	{
+		/* Since we only use 5 seconds of aac data to get a rough bitrate, we must use a different
+		   method of calculating the overall length */
+		if(filelength_filestream(file))
+		{
+			info->length = (int)((filelength_filestream(file)/(((info->bitrate*8)/1024)*16))*1000);
+		}
+		else
+		{
+			/* Since the server didnt tell us how long the file is, 
+			   we have no way of determining length */
+			info->length = 0;
+		}
+	}
+	else
+	{
+		info->length = (int)((float)(frames/frames_per_sec))*1000;
+	}
+
+    return 0;
+}
+
+int get_AAC_format(char *filename, faadAACInfo *info,
+                   unsigned long **seek_table, int *seek_table_len,
+                   int no_seek_table)
+{
+    unsigned long tagsize;
+    FILE_STREAM *file;
+	char buffer[10];
+    unsigned long file_len;
+    unsigned char adxx_id[5];
+    unsigned long tmp;
+
+    memset(info, 0, sizeof(faadAACInfo));
+
+    file = open_filestream(filename);
+
+    if(file == NULL)
+        return -1;
+
+    file_len = filelength_filestream(file);
+
+    /* Skip the tag, if it's there */
+    tmp = read_buffer_filestream(file, buffer, 10);
+
+    if (StringComp(buffer, "ID3", 3) == 0)
+	{
+		unsigned int i;
+
+        /* high bit is not used */
+        tagsize = (buffer[6] << 21) | (buffer[7] << 14) |
+            (buffer[8] <<  7) | (buffer[9] <<  0);
+
+        for(i=0; i < tagsize; i++)
+			if(read_byte_filestream(file) < 0)
+				return -1;
+
+        tagsize += 10;
+    }
+	else
+	{
+        tagsize = 0;
+
+		/* Simple hack to reset to the beginning */
+		file->buffer_offset = 0;
+		file->file_offset = 0;
+    }
+
+	if(file_len)
+	    file_len -= tagsize;
+
+    tmp = read_buffer_filestream(file, adxx_id, 2);
+    //seek_filestream(file, tagsize, FILE_BEGIN);
+
+    adxx_id[5-1] = 0;
+    info->length = 0;
+
+	/* Determine the header type of the file, check the first two bytes */
+    if(StringComp(adxx_id, "AD", 2) == 0)
+    {
+		/* We think its an ADIF header, but check the rest just to make sure */
+		tmp = read_buffer_filestream(file, adxx_id + 2, 2);
+		
+		if(StringComp(adxx_id, "ADIF", 4) == 0)
+		{
+			read_ADIF_header(file, info);
+		}
+    }
+    else
+    {
+		/* No ADIF, check for ADTS header */
+        if ((adxx_id[0] == 0xFF)&&((adxx_id[1] & 0xF6) == 0xF0))
+        {
+			/* ADTS  header located */
+			/* Since this routine must work for streams, we can't use the seek function to go backwards, thus 
+			   we have to use a quick hack as seen below to go back where we need to. */
+			
+			if(file->buffer_offset >= 2)
+			{
+				// simple seeking hack, though not really safe, the probability of it causing a problem is low.
+				file->buffer_offset -= 2;
+				file->file_offset -= 2;
+			}
+
+            read_ADTS_header(file, info, seek_table, seek_table_len, tagsize,
+                no_seek_table);
+        }
+        else
+        {
+            /* Unknown/headerless AAC file, assume format: */
+            info->version = 2;
+            info->bitrate = 128000;
+            info->sampling_rate = 44100;
+            info->channels = 2;
+            info->headertype = 0;
+            info->object_type = 1;
+        }
+    }
+
+    close_filestream(file);
+
+    return 0;
+}
+
+int StringComp(char const *str1, char const *str2, unsigned long len)
+{
+    signed int c1 = 0, c2 = 0;
+
+    while (len--) {
+        c1 = *str1++;
+        c2 = *str2++;
+
+        if (c1 == 0 || c1 != c2)
+            break;
+    }
+
+    return c1 - c2;
+}
+
+#ifdef TEST
+/* Program to test aacinfo functionality */
+
+#include <stdio.h>
+
+void main(int argc, char *argv[])
+{
+    faadAACInfo info;
+    unsigned long *seek_table = NULL;
+    int seek_table_len = 0;
+    char *header, *object;
+
+    if (argc < 2)
+    {
+        fprintf(stderr, "USAGE: aacinfo aacfile.aac\n");
+        return;
+    }
+
+    get_AAC_format(argv[1], &info, &seek_table, &seek_table_len, 0);
+
+    fprintf(stdout, "MPEG version: %d\n", info.version);
+    fprintf(stdout, "channels: %d\n", info.channels);
+    fprintf(stdout, "sampling_rate: %d\n", info.sampling_rate);
+    fprintf(stdout, "bitrate: %d\n", info.bitrate);
+    fprintf(stdout, "length: %.3f\n", (float)info.length/1000.0);
+
+    switch (info.object_type)
+    {
+    case 0:
+        object = "MAIN";
+        break;
+    case 1:
+        object = "LC";
+        break;
+    case 2:
+        object = "SSR";
+        break;
+    case 3:
+        object = "LTP";
+        break;
+    }
+    fprintf(stdout, "object_type: %s\n", object);
+
+    switch (info.headertype)
+    {
+    case 0:
+        header = "RAW";
+        break;
+    case 1:
+        header = "ADIF";
+        break;
+    case 2:
+        header = "ADTS";
+        break;
+    }
+    fprintf(stdout, "headertype: %s\n", header);
+}
+
+#endif
\ No newline at end of file
--- /dev/null
+++ b/common/faad/aacinfo.dsp
@@ -1,0 +1,110 @@
+# Microsoft Developer Studio Project File - Name="aacinfo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=aacinfo - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "aacinfo.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "aacinfo.mak" CFG="aacinfo - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "aacinfo - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "aacinfo - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=xicl6.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "aacinfo - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "TEST" /YX /FD /c
+# ADD BASE RSC /l 0x413 /d "NDEBUG"
+# ADD RSC /l 0x413 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=xilink6.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF  "$(CFG)" == "aacinfo - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "TEST" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x413 /d "_DEBUG"
+# ADD RSC /l 0x413 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=xilink6.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "aacinfo - Win32 Release"
+# Name "aacinfo - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\aacinfo.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filestream.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\aacinfo.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\filestream.h
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null
+++ b/common/faad/aacinfo.dsw
@@ -1,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "aacinfo"=.\aacinfo.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+++ b/common/faad/aacinfo.h
@@ -1,0 +1,42 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: aacinfo.h,v 1.1 2002/01/14 19:15:49 menno Exp $
+**/
+
+#include "filestream.h"
+
+typedef struct {
+    int version;
+    int channels;
+    int sampling_rate;
+    int bitrate;
+    int length;
+    int object_type;
+    int headertype;
+} faadAACInfo;
+
+int get_AAC_format(char *filename, faadAACInfo *info,
+                   unsigned long **seek_table, int *seek_table_len,
+                   int no_seek_table);
+
+static int read_ADIF_header(FILE_STREAM *file, faadAACInfo *info);
+static int read_ADTS_header(FILE_STREAM *file, faadAACInfo *info,
+                            unsigned long **seek_table, int *seek_table_len,
+                            int tagsize, int no_seek_table);
+int StringComp(char const *str1, char const *str2, unsigned long len);
\ No newline at end of file
--- /dev/null
+++ b/common/faad/filestream.c
@@ -1,0 +1,464 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: filestream.c,v 1.1 2002/01/14 19:15:49 menno Exp $
+**/
+
+/* Not very portable yet */
+
+#include <winsock2.h> // Note: Must be *before* windows.h
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+#include "filestream.h"
+#include "aacinfo.h"
+
+/* TEMPROARY HACK */
+#define CommonExit(A) MessageBox(NULL, A, "FAAD Plugin", MB_OK)
+
+int winsock_init=0; // 0=winsock not initialized, 1=success
+long local_buffer_size = 64;
+long stream_buffer_size = 128;
+
+FILE_STREAM *open_filestream(char *filename)
+{
+    FILE_STREAM *fs;
+
+    if(StringComp(filename,"http://", 7) == 0)
+    {
+        fs = (FILE_STREAM *)LocalAlloc(LPTR, sizeof(FILE_STREAM) + stream_buffer_size * 1024);
+
+        if(fs == NULL)
+            return NULL;
+
+        fs->data = (unsigned char *)&fs[1];
+
+        if(http_file_open(filename, fs) < 0)
+        {
+            LocalFree(fs);
+            return NULL;
+        }
+
+        fs->http = 1;
+    }
+    else
+    {
+        fs = (FILE_STREAM*)LocalAlloc(LPTR, sizeof(FILE_STREAM) + local_buffer_size * 1024);
+
+        if(fs == NULL)
+            return NULL;
+
+        fs->data = (unsigned char *)&fs[1];
+
+        fs->stream = CreateFile(filename, GENERIC_READ,
+            FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
+            OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
+        if (fs->stream == INVALID_HANDLE_VALUE)
+        {
+            LocalFree(fs);
+            return NULL;
+        }
+
+        fs->http = 0;
+    }
+
+    fs->buffer_length = 0;
+    fs->buffer_offset = 0;
+    fs->file_offset = 0;
+
+    return fs;
+}
+
+int read_byte_filestream(FILE_STREAM *fs)
+{
+    if(fs->buffer_offset == fs->buffer_length)
+    {
+        fs->buffer_offset = 0;
+
+        if(fs->http)
+            fs->buffer_length = recv(fs->inetStream, fs->data, stream_buffer_size * 1024, 0);
+        else
+            ReadFile(fs->stream, fs->data, local_buffer_size * 1024, &fs->buffer_length, 0);
+
+        if(fs->buffer_length <= 0)
+        {
+            if(fs->http)
+            {
+                int x;
+                x = WSAGetLastError();
+
+                if(x == 0)
+                {
+                    /* Equivalent of a successful EOF for HTTP */
+                }
+            }
+
+            fs->buffer_length = 0;
+            return -1;
+        }
+    }
+
+    fs->file_offset++;
+
+    return fs->data[fs->buffer_offset++];
+}
+
+int read_buffer_filestream(FILE_STREAM *fs, void *data, int length)
+{
+    int i, tmp;
+    unsigned char *data2 = (unsigned char *)data;
+
+    for(i=0; i < length; i++)
+    {
+        if((tmp = read_byte_filestream(fs)) < 0)
+        {
+            if(i)
+			{
+                break;
+            }
+			else
+			{
+                return -1;
+            }
+        }
+        data2[i] = tmp;
+    }
+
+    return i;
+}
+
+unsigned long filelength_filestream(FILE_STREAM *fs)
+{
+    unsigned long fsize;
+
+    if (fs->http)
+    {
+        fsize = fs->http_file_length;
+    }
+	else
+	{
+        fsize = GetFileSize(fs->stream, NULL);
+    }
+
+    return fsize;
+}
+
+void seek_filestream(FILE_STREAM *fs, unsigned long offset, int mode)
+{
+    if(fs->http)
+    {
+        return;
+    }
+
+	SetFilePointer(fs->stream, offset, NULL, mode);
+
+	if(mode == FILE_CURRENT)
+		fs->file_offset += offset;
+	else if(mode == FILE_END)
+		fs->file_offset = filelength_filestream(fs) + offset;
+	else
+		fs->file_offset = offset;
+
+    fs->buffer_length = 0;
+    fs->buffer_offset = 0;
+}
+
+unsigned long tell_filestream(FILE_STREAM *fs)
+{
+    return fs->file_offset;
+}
+
+void close_filestream(FILE_STREAM *fs)
+{
+    if(fs)
+    {
+        if (fs->http)
+        {
+            if (fs->inetStream)
+            {
+                /* The 'proper' way to close a TCP connection */
+                if(fs->inetStream)
+                {
+                    CloseTCP(fs->inetStream);
+                }
+            }
+        }
+        else
+        {
+            if(fs->stream)
+                CloseHandle(fs->stream);
+        }
+
+        LocalFree(fs);
+        fs = NULL;
+    }
+}
+
+int WinsockInit()
+{
+    /* Before using winsock, you must load the DLL... */
+    WSADATA wsaData;
+
+    /* Load version 2.0 */
+    if (WSAStartup( MAKEWORD( 2, 0 ), &wsaData ))
+    {
+        /* Disable streaming */
+        return -1;
+    }
+
+    winsock_init = 1;
+
+    return 0;
+}
+
+void WinsockDeInit()
+{
+    /* Unload the DLL */
+
+    if(winsock_init)
+        WSACleanup();
+}
+
+int FindCRLF(char *str)
+{
+    int i;
+
+    for(i=0; i != lstrlen(str) && str[i] != '\r'; i++);
+
+    return i;
+}
+
+void CloseTCP(int s)
+{
+    char tempbuf[1024];
+
+    /* Set the socket to ignore any new incoming data */
+    shutdown(s, 1);
+
+    /* Get any old remaining data */
+    while(recv(s, tempbuf, 1024, 0) > 0);
+
+    /* Deallocate the socket */
+    closesocket(s);
+}
+
+int resolve_host(char *host, SOCKADDR_IN *sck_addr, unsigned short remote_port)
+{
+    HOSTENT *hp;
+
+    if (isalpha(host[0]))
+    {
+        /* server address is a name */
+        hp = gethostbyname(host);
+    }
+    else
+    {
+        unsigned long addr;
+        /* Convert nnn.nnn address to a usable one */
+        addr = inet_addr(host);
+        hp = gethostbyaddr((char *)&addr, 4, AF_INET);
+    }
+
+    if (hp == NULL)
+    {
+        char tmp[128];
+        wsprintf(tmp, "Error resolving host address [%s]!\n", host);
+        CommonExit(tmp);
+        return -1;
+    }
+
+    ZeroMemory(sck_addr, sizeof(SOCKADDR_IN));
+    sck_addr->sin_family = AF_INET;
+    sck_addr->sin_port = htons(remote_port);
+    CopyMemory(&sck_addr->sin_addr, hp->h_addr, hp->h_length);
+
+    return 0;
+}
+
+int http_file_open(char *url, FILE_STREAM *fs)
+{
+    SOCKET sck;
+    SOCKADDR_IN host;
+    char server[1024], file[1024], request[1024], *temp = NULL, *tmpfile = NULL;
+    int i, j, port = 80, bytes_recv, http_code;
+
+    /* No winsock, no streaming */
+    if(!winsock_init)
+    {
+        return -1;
+    }
+
+    url += 7; // Skip over http://
+
+    /* Extract data from the URL */
+    for(i=0; url[i] != '/' && url[i] != ':' && url[i] != 0; i++);
+
+    ZeroMemory(server, 1024);
+    CopyMemory(server, url, i);
+
+    if(url[i] == ':')
+    {
+        /* A certain port was specified */
+        port = atol(url + (i + 1));
+    }
+
+    for(; url[i] != '/' && url[i] != 0; i++);
+
+    ZeroMemory(file, 1024);
+
+    CopyMemory(file, url + i, lstrlen(url));
+
+    /* END OF URL PARSING */
+
+    /* Create a TCP/IP socket */
+    sck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+    if(sck == INVALID_SOCKET)
+    {
+        CommonExit("Error creating TCP/IP new socket");
+        return -1;
+    }
+
+    /* Resolve the host address (turn www.blah.com into an IP) */
+    if(resolve_host(server, &host, (unsigned short)port))
+    {
+        CommonExit("Error resolving host address");
+        CloseTCP(sck);
+        return -1;
+    }
+
+    /* Connect to the server */
+    if(connect(sck, (SOCKADDR *)&host, sizeof(SOCKADDR)) == SOCKET_ERROR)
+    {
+        CommonExit("Error connecting to remote server");
+        CloseTCP(sck);
+        return -1;
+    }
+
+	tmpfile = calloc(1, (strlen(file) * 3) + 1);
+
+	/* Encode URL */
+	for(i=0, j=0; i < (int)strlen(file); i++)
+	{
+		if((unsigned char)file[i] <= 31 || (unsigned char)file[i] >= 127)
+		{
+			/* encode ASCII-control characters */
+			wsprintf(tmpfile + j, "%%%X", (unsigned char)file[i]);
+			j += 3;
+			continue;
+		}
+		else
+		{
+			switch(file[i])
+			{
+				/* encode characters that could confuse some servers */
+				case ' ':
+				case '"':
+				case '>':
+				case '<':
+				case '#':
+				case '%':
+				case '{':
+				case '}':
+				case '|':
+				case '\\':
+				case '^':
+				case '~':
+				case '[':
+				case ']':
+				case '`':
+
+				wsprintf(tmpfile + j, "%%%X", (unsigned char)file[i]);
+				j += 3;
+				continue;
+			}
+		}
+		
+		tmpfile[j] = file[i];
+		j++;
+	}
+
+    wsprintf(request, "GET %s\r\n\r\n", tmpfile);
+
+	free(tmpfile);
+
+    /* Send the request */
+    if(send(sck, request, lstrlen(request), 0) <= 0)
+    {
+        /* Error sending data */
+        CloseTCP(sck);
+        return -1;
+    }
+
+    ZeroMemory(request, 1024);
+
+    /* Send the request */
+    if((bytes_recv = recv(sck, request, 1024, 0)) <= 0)
+    {
+        /* Error sending data */
+        CloseTCP(sck);
+        return -1;
+    }
+
+    if(StringComp(request,"HTTP/1.", 7) != 0)
+    {
+        /* Invalid header */
+        CloseTCP(sck);
+        return -1;
+    }
+
+    http_code = atol(request + 9);
+
+    if(http_code < 200 || http_code > 299)
+    {
+        /* HTTP error */
+        CloseTCP(sck);
+        return -1;
+    }
+
+	// Search for a length field
+	fs->http_file_length = 0;
+
+    /* Limit search to only 20 loops */
+    if((temp = strstr(request, "Content-Length: ")) != NULL)
+    {
+		/* Has a content-length field, copy into structure */
+		fs->http_file_length = atol(temp + 16);
+	}
+
+    /* Copy the handle data into the structure */
+    fs->inetStream = sck;
+
+    /* Copy any excess data beyond the header into the filestream buffers */
+	temp = strstr(request, "\r\n\r\n");
+
+	if(temp)
+	{
+		temp += 4;
+	}
+
+    if(temp - request < bytes_recv)
+    {
+        memcpy(fs->data, temp, (temp - request) - bytes_recv);
+        fs->buffer_length = (temp - request) - bytes_recv;
+        fs->buffer_offset = 0;
+    }
+
+    return 0;
+}
--- /dev/null
+++ b/common/faad/filestream.h
@@ -1,0 +1,51 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: filestream.h,v 1.1 2002/01/14 19:15:49 menno Exp $
+**/
+
+#ifndef FILESTREAM_H
+#define FILESTREAM_H
+
+typedef struct {
+    HANDLE stream;
+    unsigned short inetStream;
+    unsigned char *data;
+    int http;
+    int buffer_offset;
+    int buffer_length;
+    int file_offset;
+    int http_file_length;
+} FILE_STREAM;
+
+extern long local_buffer_size;
+extern long stream_buffer_size;
+
+FILE_STREAM *open_filestream(char *filename);
+int read_byte_filestream(FILE_STREAM *fs);
+int read_buffer_filestream(FILE_STREAM *fs, void *data, int length);
+unsigned long filelength_filestream(FILE_STREAM *fs);
+void close_filestream(FILE_STREAM *fs);
+void seek_filestream(FILE_STREAM *fs, unsigned long offset, int mode);
+unsigned long tell_filestream(FILE_STREAM *fs);
+int http_file_open(char *url, FILE_STREAM *fs);
+
+int WinsockInit();
+void WinsockDeInit();
+void CloseTCP(int s);
+#endif
\ No newline at end of file
--- /dev/null
+++ b/common/faad/getopt.c
@@ -1,0 +1,755 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+    Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 2, or (at your option) any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef __STDC__
+#  ifndef const
+#    define const
+#  endif
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.  */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__) || !__MacOSX__
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef  __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#endif  /* GNU C library.  */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+   long-named option.  Because this is not POSIX.2 compliant, it is
+   being phased out.  */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* XXX 1003.2 says this must be 1 before any call.  */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+#define BAD_OPTION '\0'
+int optopt = BAD_OPTION;
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return EOF with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+#ifdef  __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+#include <string.h>
+#define my_index    strchr
+#define my_strlen   strlen
+#else
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#if __STDC__ || defined(PROTO)
+extern char *getenv(const char *name);
+extern int  strcmp (const char *s1, const char *s2);
+extern int  strncmp(const char *s1, const char *s2, unsigned int n);
+
+static int my_strlen(const char *s);
+static char *my_index (const char *str, int chr);
+#else
+extern char *getenv ();
+#endif
+
+static int
+my_strlen (str)
+     const char *str;
+{
+  int n = 0;
+  while (*str++)
+    n++;
+  return n;
+}
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+    return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+#endif              /* GNU C library.  */
+
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.
+
+   To perform the swap, we first reverse the order of all elements. So
+   all options now come before all non options, but they are in the
+   wrong order. So we put back the options and non options in original
+   order by reversing them again. For example:
+       original input:      a b c -x -y
+       reverse all:         -y -x c b a
+       reverse options:     -x -y c b a
+       reverse non options: -x -y a b c
+*/
+
+#if __STDC__ || defined(PROTO)
+static void exchange (char **argv);
+#endif
+
+static void
+exchange (argv)
+     char **argv;
+{
+  char *temp, **first, **last;
+
+  /* Reverse all the elements [first_nonopt, optind) */
+  first = &argv[first_nonopt];
+  last  = &argv[optind-1];
+  while (first < last) {
+    temp = *first; *first = *last; *last = temp; first++; last--;
+  }
+  /* Put back the options in order */
+  first = &argv[first_nonopt];
+  first_nonopt += (optind - last_nonopt);
+  last  = &argv[first_nonopt - 1];
+  while (first < last) {
+    temp = *first; *first = *last; *last = temp; first++; last--;
+  }
+
+  /* Put back the non options in order */
+  first = &argv[first_nonopt];
+  last_nonopt = optind;
+  last  = &argv[last_nonopt-1];
+  while (first < last) {
+    temp = *first; *first = *last; *last = temp; first++; last--;
+  }
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns `EOF'.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return BAD_OPTION after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return BAD_OPTION.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  int option_index;
+
+  optarg = 0;
+
+  /* Initialize the internal data when the first call is made.
+     Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  if (optind == 0)
+    {
+      first_nonopt = last_nonopt = optind = 1;
+
+      nextchar = NULL;
+
+      /* Determine how to handle the ordering of options and nonoptions.  */
+
+      if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+      else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+      else if (getenv ("POSIXLY_CORRECT") != NULL)
+    ordering = REQUIRE_ORDER;
+      else
+    ordering = PERMUTE;
+    }
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      if (ordering == PERMUTE)
+    {
+      /* If we have just processed some options following some non-options,
+         exchange them so that the options come first.  */
+
+      if (first_nonopt != last_nonopt && last_nonopt != optind)
+        exchange ((char **) argv);
+      else if (last_nonopt != optind)
+        first_nonopt = optind;
+
+      /* Now skip any additional non-options
+         and extend the range of non-options previously skipped.  */
+
+      while (optind < argc
+         && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+         && (longopts == NULL
+             || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif              /* GETOPT_COMPAT */
+         )
+        optind++;
+      last_nonopt = optind;
+    }
+
+      /* Special ARGV-element `--' means premature end of options.
+     Skip it like a null option,
+     then exchange with previous non-options as if it were an option,
+     then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+    {
+      optind++;
+
+      if (first_nonopt != last_nonopt && last_nonopt != optind)
+        exchange ((char **) argv);
+      else if (first_nonopt == last_nonopt)
+        first_nonopt = optind;
+      last_nonopt = argc;
+
+      optind = argc;
+    }
+
+      /* If we have done all the ARGV-elements, stop the scan
+     and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+    {
+      /* Set the next-arg-index to point at the non-options
+         that we previously skipped, so the caller will digest them.  */
+      if (first_nonopt != last_nonopt)
+        optind = first_nonopt;
+      return EOF;
+    }
+
+      /* If we have come to a non-option and did not permute it,
+     either stop the scan or describe it to the caller and pass it by.  */
+
+      if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+      && (longopts == NULL
+          || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif              /* GETOPT_COMPAT */
+      )
+    {
+      if (ordering == REQUIRE_ORDER)
+        return EOF;
+      optarg = argv[optind++];
+      return 1;
+    }
+
+      /* We have found another option-ARGV-element.
+     Start decoding its characters.  */
+
+      nextchar = (argv[optind] + 1
+          + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  if (longopts != NULL
+      && ((argv[optind][0] == '-'
+       && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+      || argv[optind][0] == '+'
+#endif              /* GETOPT_COMPAT */
+      ))
+    {
+      const struct option *p;
+      char *s = nextchar;
+      int exact = 0;
+      int ambig = 0;
+      const struct option *pfound = NULL;
+      int indfound = 0;
+
+      while (*s && *s != '=')
+    s++;
+
+      /* Test all options for either exact match or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name;
+       p++, option_index++)
+    if (!strncmp (p->name, nextchar, s - nextchar))
+      {
+        if (s - nextchar == my_strlen (p->name))
+          {
+        /* Exact match found.  */
+        pfound = p;
+        indfound = option_index;
+        exact = 1;
+        break;
+          }
+        else if (pfound == NULL)
+          {
+        /* First nonexact match found.  */
+        pfound = p;
+        indfound = option_index;
+          }
+        else
+          /* Second nonexact match found.  */
+          ambig = 1;
+      }
+
+      if (ambig && !exact)
+    {
+      if (opterr)
+        fprintf (stderr, "%s: option `%s' is ambiguous\n",
+             argv[0], argv[optind]);
+      nextchar += my_strlen (nextchar);
+      optind++;
+      return BAD_OPTION;
+    }
+
+      if (pfound != NULL)
+    {
+      option_index = indfound;
+      optind++;
+      if (*s)
+        {
+          /* Don't test has_arg with >, because some C compilers don't
+         allow it to be used on enums.  */
+          if (pfound->has_arg)
+        optarg = s + 1;
+          else
+        {
+          if (opterr)
+            {
+              if (argv[optind - 1][1] == '-')
+            /* --option */
+            fprintf (stderr,
+                 "%s: option `--%s' doesn't allow an argument\n",
+                 argv[0], pfound->name);
+              else
+            /* +option or -option */
+            fprintf (stderr,
+                 "%s: option `%c%s' doesn't allow an argument\n",
+                 argv[0], argv[optind - 1][0], pfound->name);
+            }
+          nextchar += my_strlen (nextchar);
+          return BAD_OPTION;
+        }
+        }
+      else if (pfound->has_arg == 1)
+        {
+          if (optind < argc)
+        optarg = argv[optind++];
+          else
+        {
+          if (opterr)
+            fprintf (stderr, "%s: option `%s' requires an argument\n",
+                 argv[0], argv[optind - 1]);
+          nextchar += my_strlen (nextchar);
+          return optstring[0] == ':' ? ':' : BAD_OPTION;
+        }
+        }
+      nextchar += my_strlen (nextchar);
+      if (longind != NULL)
+        *longind = option_index;
+      if (pfound->flag)
+        {
+          *(pfound->flag) = pfound->val;
+          return 0;
+        }
+      return pfound->val;
+    }
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+     or the option starts with '--' or is not a valid short
+     option, then it's an error.
+     Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+      || argv[optind][0] == '+'
+#endif              /* GETOPT_COMPAT */
+      || my_index (optstring, *nextchar) == NULL)
+    {
+      if (opterr)
+        {
+          if (argv[optind][1] == '-')
+        /* --option */
+        fprintf (stderr, "%s: unrecognized option `--%s'\n",
+             argv[0], nextchar);
+          else
+        /* +option or -option */
+        fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+             argv[0], argv[optind][0], nextchar);
+        }
+      nextchar = (char *) "";
+      optind++;
+      return BAD_OPTION;
+    }
+    }
+
+  /* Look at and handle the next option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+    if (opterr)
+      {
+#if 0
+        if (c < 040 || c >= 0177)
+          fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+               argv[0], c);
+        else
+          fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+        /* 1003.2 specifies the format of this message.  */
+        fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+      }
+    optopt = c;
+    return BAD_OPTION;
+      }
+    if (temp[1] == ':')
+      {
+    if (temp[2] == ':')
+      {
+        /* This is an option that accepts an argument optionally.  */
+        if (*nextchar != '\0')
+          {
+        optarg = nextchar;
+        optind++;
+          }
+        else
+          optarg = 0;
+        nextchar = NULL;
+      }
+    else
+      {
+        /* This is an option that requires an argument.  */
+        if (*nextchar != '\0')
+          {
+        optarg = nextchar;
+        /* If we end this ARGV-element by taking the rest as an arg,
+           we must advance to the next element now.  */
+        optind++;
+          }
+        else if (optind == argc)
+          {
+        if (opterr)
+          {
+#if 0
+            fprintf (stderr, "%s: option `-%c' requires an argument\n",
+                 argv[0], c);
+#else
+            /* 1003.2 specifies the format of this message.  */
+            fprintf (stderr, "%s: option requires an argument -- %c\n",
+                 argv[0], c);
+#endif
+          }
+        optopt = c;
+        if (optstring[0] == ':')
+          c = ':';
+        else
+          c = BAD_OPTION;
+          }
+        else
+          /* We already incremented `optind' once;
+         increment it again when taking next ARGV-elt as argument.  */
+          optarg = argv[optind++];
+        nextchar = NULL;
+      }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+               (const struct option *) 0,
+               (int *) 0,
+               0);
+}
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+#endif  /* _LIBC or not __GNU_LIBRARY__.  */
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == EOF)
+    break;
+
+      switch (c)
+    {
+    case '0':
+    case '1':
+    case '2':
+    case '3':
+    case '4':
+    case '5':
+    case '6':
+    case '7':
+    case '8':
+    case '9':
+      if (digit_optind != 0 && digit_optind != this_option_optind)
+        printf ("digits occur in two different argv-elements.\n");
+      digit_optind = this_option_optind;
+      printf ("option %c\n", c);
+      break;
+
+    case 'a':
+      printf ("option a\n");
+      break;
+
+    case 'b':
+      printf ("option b\n");
+      break;
+
+    case 'c':
+      printf ("option c with value `%s'\n", optarg);
+      break;
+
+    case BAD_OPTION:
+      break;
+
+    default:
+      printf ("?? getopt returned character code 0%o ??\n", c);
+    }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+    printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
--- /dev/null
+++ b/common/faad/getopt.h
@@ -1,0 +1,130 @@
+/* Declarations for getopt.
+   Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 2, or (at your option) any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#ifndef __MacOSX__
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+#endif
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument      (or 0) if the option does not take an argument,
+   required_argument    (or 1) if the option requires an argument,
+   optional_argument    (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define no_argument     0
+#define required_argument   1
+#define optional_argument   2
+
+//#if __STDC__ || defined(PROTO)
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                 const char *shortopts,
+                     const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                 const char *shortopts,
+                     const struct option *longopts, int *longind,
+                 int long_only);
+//#else /* not __STDC__ */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+//extern int getopt_long ();
+//extern int getopt_long_only ();
+
+//extern int _getopt_internal ();
+//#endif /* not __STDC__ */
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
--- /dev/null
+++ b/common/faad/id3v2tag.c
@@ -1,0 +1,1117 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser 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
+ *
+ * $Id: id3v2tag.c,v 1.1 2002/01/14 19:15:49 menno Exp $
+ */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <commctrl.h>
+#include <resource.h>
+
+#include <id3.h>
+
+#include <id3v2tag.h>
+
+HWND m_hwndList;
+
+LPSTR ID3Frames[] =
+{
+    "No known frame",
+    "Audio encryption",
+    "Attached picture",
+    "Comments",
+    "Commercial frame",
+    "Encryption method registration",
+    "Equalization",
+    "Event timing codes",
+    "General encapsulated object",
+    "Group identification registration",
+    "Involved people list",
+    "Linked information",
+    "Music CD identifier",
+    "MPEG location lookup table",
+    "Ownership frame",
+    "Private frame",
+    "Play counter",
+    "Popularimeter",
+    "Position synchronisation frame",
+    "Recommended buffer size",
+    "Relative volume adjustment",
+    "Reverb",
+    "Synchronized lyric",
+    "Synchronized tempo codes",
+    "Album title",
+    "BPM (beats per minute)",
+    "Composer",
+    "Genre", //"Content type",
+    "Copyright message",
+    "Date",
+    "Playlist delay",
+    "Encoded by",
+    "Lyricist",
+    "File type",
+    "Time",
+    "Content group description",
+    "Title",
+    "Subtitle",
+    "Initial key",
+    "Language(s)",
+    "Length",
+    "Media type",
+    "Original album title",
+    "Original filename",
+    "Original lyricist(s)",
+    "Original artist(s)",
+    "Original release year",
+    "File owner",
+    "Lead performer(s)",
+    "Band/orchestra/accompaniment",
+    "Conductor/performer refinement",
+    "Interpreted, remixed, or otherwise modified by",
+    "Part of a set",
+    "Publisher",
+    "Track number",
+    "Recording dates",
+    "Internet radio station name",
+    "Internet radio station owner",
+    "Size",
+    "ISRC (international standard recording code)",
+    "Software/Hardware and settings used for encoding",
+    "User defined text information",
+    "Year",
+    "Unique file identifier",
+    "Terms of use",
+    "Unsynchronized lyric",
+    "Commercial information",
+    "Copyright/Legal information",
+    "Official audio file webpage",
+    "Official artist webpage",
+    "Official audio source webpage",
+    "Official internet radio station homepage",
+    "Payment",
+    "Official publisher webpage",
+    "User defined URL link",
+    "Encrypted meta frame (id3v2.2.x)",
+    "Compressed meta frame (id3v2.2.1)"
+};
+
+ID3GENRES ID3Genres[]=
+{
+    123,    "Acapella",
+    34,     "Acid",
+    74,     "Acid Jazz",
+    73,     "Acid Punk",
+    99,     "Acoustic",
+    20,     "Alternative",
+    40,     "AlternRock",
+    26,     "Ambient",
+    90,     "Avantgarde",
+    116,    "Ballad",
+    41,     "Bass",
+    85,     "Bebob",
+    96,     "Big Band",
+    89,     "Bluegrass",
+    0,      "Blues",
+    107,    "Booty Bass",
+    65,     "Cabaret",
+    88,     "Celtic",
+    104,    "Chamber Music",
+    102,    "Chanson",
+    97,     "Chorus",
+    61,     "Christian Rap",
+    1,      "Classic Rock",
+    32,     "Classical",
+    112,    "Club",
+    57,     "Comedy",
+    2,      "Country",
+    58,     "Cult",
+    3,      "Dance",
+    125,    "Dance Hall",
+    50,     "Darkwave",
+    254,    "Data",
+    22,     "Death Metal",
+    4,      "Disco",
+    55,     "Dream",
+    122,    "Drum Solo",
+    120,    "Duet",
+    98,     "Easy Listening",
+    52,     "Electronic",
+    48,     "Ethnic",
+    124,    "Euro-House",
+    25,     "Euro-Techno",
+    54,     "Eurodance",
+    84,     "Fast Fusion",
+    80,     "Folk",
+    81,     "Folk-Rock",
+    115,    "Folklore",
+    119,    "Freestyle",
+    5,      "Funk",
+    30,     "Fusion",
+    36,     "Game",
+    59,     "Gangsta",
+    38,     "Gospel",
+    49,     "Gothic",
+    91,     "Gothic Rock",
+    6,      "Grunge",
+    79,     "Hard Rock",
+    7,      "Hip-Hop",
+    35,     "House",
+    100,    "Humour",
+    19,     "Industrial",
+    33,     "Instrumental",
+    46,     "Instrumental Pop",
+    47,     "Instrumental Rock",
+    8,      "Jazz",
+    29,     "Jazz+Funk",
+    63,     "Jungle",
+    86,     "Latin",
+    71,     "Lo-Fi",
+    45,     "Meditative",
+    9,      "Metal",
+    77,     "Musical",
+    82,     "National Folk",
+    64,     "Native American",
+    10,     "New Age",
+    66,     "New Wave",
+    39,     "Noise",
+    255,    "Not Set",
+    11,     "Oldies",
+    103,    "Opera",
+    12,     "Other",
+    75,     "Polka",
+    13,     "Pop",
+    62,     "Pop/Funk",
+    53,     "Pop-Folk",
+    109,    "Porn Groove",
+    117,    "Power Ballad",
+    23,     "Pranks",
+    108,    "Primus",
+    92,     "Progressive Rock",
+    67,     "Psychadelic",
+    93,     "Psychedelic Rock",
+    43,     "Punk",
+    121,    "Punk Rock",
+    14,     "R&B",
+    15,     "Rap",
+    68,     "Rave",
+    16,     "Reggae",
+    76,     "Retro",
+    87,     "Revival",
+    118,    "Rhythmic Soul",
+    17,     "Rock",
+    78,     "Rock & Roll",
+    114,    "Samba",
+    110,    "Satire",
+    69,     "Showtunes",
+    21,     "Ska",
+    111,    "Slow Jam",
+    95,     "Slow Rock",
+    105,    "Sonata",
+    42,     "Soul",
+    37,     "Sound Clip",
+    24,     "Soundtrack",
+    56,     "Southern Rock",
+    44,     "Space",
+    101,    "Speech",
+    83,     "Swing",
+    94,     "Symphonic Rock",
+    106,    "Symphony",
+    113,    "Tango",
+    18,     "Techno",
+    51,     "Techno-Industrial",
+    60,     "Top 40",
+    70,     "Trailer",
+    31,     "Trance",
+    72,     "Tribal",
+    27,     "Trip-Hop",
+    28,     "Vocal"
+};
+
+const int NUMFRAMES = sizeof(ID3Frames)/sizeof(ID3Frames[0]);
+const int NUMGENRES = sizeof(ID3Genres)/sizeof(ID3Genres[0]);
+
+
+LPSTR DupString(LPSTR lpsz)
+{
+    int cb = lstrlen(lpsz) + 1;
+    LPSTR lpszNew = LocalAlloc(LMEM_FIXED, cb);
+    if (lpszNew != NULL)
+        CopyMemory(lpszNew, lpsz, cb);
+    return lpszNew;
+}
+
+LPSTR GetFrameDesc(ID3_FrameID id)
+{
+    return DupString(ID3Frames[id]);
+}
+
+LPSTR GetGenre(LPSTR lpsz)
+{
+    int id = atoi(lpsz + 1);
+    int i;
+
+    if ((*(lpsz + 1) > '0') && (*(lpsz + 1) < '9'))
+    {
+        for (i = 0; i < NUMGENRES; i++)
+        {
+            if (id == ID3Genres[i].id)
+                return DupString(ID3Genres[i].name);
+        }
+    }
+    return DupString(lpsz);
+}
+
+void FillID3List(HWND hwndDlg, HWND hwndList, char *filename)
+{
+    ID3Tag *tag;
+    ID3Frame *frame;
+    ID3Field *field;
+    ID3_FrameID eFrameID;
+    char info[1024];
+    int numFrames;
+    int i;
+    int iItem = 0;
+
+
+    if ((tag = ID3Tag_New()) != NULL)
+    {
+        ID3Tag_Link(tag, filename);
+
+        numFrames = ID3Tag_NumFrames(tag);
+
+        for (i = 0; i < numFrames; i++)
+        {
+            iItem++;
+
+            frame = ID3Tag_GetFrameNum(tag, i);
+            eFrameID = ID3Frame_GetID(frame);
+
+            switch (eFrameID)
+            {
+            case ID3FID_ALBUM:            case ID3FID_BPM:
+            case ID3FID_COMPOSER:         case ID3FID_CONTENTTYPE:
+            case ID3FID_COPYRIGHT:        case ID3FID_DATE:
+            case ID3FID_PLAYLISTDELAY:    case ID3FID_ENCODEDBY:
+            case ID3FID_LYRICIST:         case ID3FID_FILETYPE:
+            case ID3FID_TIME:             case ID3FID_CONTENTGROUP:
+            case ID3FID_TITLE:            case ID3FID_SUBTITLE:
+            case ID3FID_INITIALKEY:       case ID3FID_LANGUAGE:
+            case ID3FID_SONGLEN:          case ID3FID_MEDIATYPE:
+            case ID3FID_ORIGALBUM:        case ID3FID_ORIGFILENAME:
+            case ID3FID_ORIGLYRICIST:     case ID3FID_ORIGARTIST:
+            case ID3FID_ORIGYEAR:         case ID3FID_FILEOWNER:
+            case ID3FID_LEADARTIST:       case ID3FID_BAND:
+            case ID3FID_CONDUCTOR:        case ID3FID_MIXARTIST:
+            case ID3FID_PARTINSET:        case ID3FID_PUBLISHER:
+            case ID3FID_TRACKNUM:         case ID3FID_RECORDINGDATES:
+            case ID3FID_NETRADIOSTATION:  case ID3FID_NETRADIOOWNER:
+            case ID3FID_SIZE:             case ID3FID_ISRC:
+            case ID3FID_ENCODERSETTINGS:  case ID3FID_YEAR:
+            {
+                LV_ITEM lvi;
+                ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+
+                /* Initialize LV_ITEM members that are common to all items. */
+                lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+                lvi.state = 0;
+                lvi.stateMask = 0;
+                lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+                lvi.iImage = 0;
+                lvi.iItem = iItem;
+                lvi.iSubItem = 0;
+
+                pItem->frameId = eFrameID;
+                pItem->aCols[0] = GetFrameDesc(eFrameID);
+
+                field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                ID3Field_GetASCII(field, info, 1024, 1);
+                if (eFrameID == ID3FID_CONTENTTYPE)
+                    pItem->aCols[1] = GetGenre(info);
+                else
+                    pItem->aCols[1] = DupString(info);
+
+                lvi.lParam = (LPARAM)pItem;    /* item data */
+
+                /* Add the item. */
+                ListView_InsertItem(hwndList, &lvi);
+
+                break;
+            }
+            case ID3FID_USERTEXT:
+            case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
+            case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
+            {
+                LV_ITEM lvi;
+                ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+
+                /* Initialize LV_ITEM members that are common to all items. */
+                lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+                lvi.state = 0;
+                lvi.stateMask = 0;
+                lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+                lvi.iImage = 0;
+                lvi.iItem = iItem;
+                lvi.iSubItem = 0;
+
+                pItem->frameId = eFrameID;
+
+                field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
+                ID3Field_GetASCII(field, info, 1024, 1);
+                pItem->aCols[0] = DupString(info);
+
+                field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                ID3Field_GetASCII(field, info, 1024, 1);
+                pItem->aCols[1] = DupString(info);
+
+                lvi.lParam = (LPARAM)pItem;    /* item data */
+
+                /* Add the item. */
+                ListView_InsertItem(hwndList, &lvi);
+
+                break;
+            }
+            case ID3FID_WWWAUDIOFILE:       case ID3FID_WWWARTIST:
+            case ID3FID_WWWAUDIOSOURCE:     case ID3FID_WWWCOMMERCIALINFO:
+            case ID3FID_WWWCOPYRIGHT:       case ID3FID_WWWPUBLISHER:
+            case ID3FID_WWWPAYMENT:         case ID3FID_WWWRADIOPAGE:
+            {
+                LV_ITEM lvi;
+                ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+
+                /* Initialize LV_ITEM members that are common to all items. */
+                lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+                lvi.state = 0;
+                lvi.stateMask = 0;
+                lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+                lvi.iImage = 0;
+                lvi.iItem = iItem;
+                lvi.iSubItem = 0;
+
+                pItem->frameId = eFrameID;
+
+                pItem->aCols[0] = GetFrameDesc(eFrameID);
+
+                field = ID3Frame_GetField(frame, ID3FN_URL);
+                ID3Field_GetASCII(field, info, 1024, 1);
+                pItem->aCols[1] = DupString(info);
+
+                lvi.lParam = (LPARAM)pItem;    /* item data */
+
+                /* Add the item. */
+                ListView_InsertItem(hwndList, &lvi);
+
+                break;
+            }
+            case ID3FID_WWWUSER:
+            {
+                LV_ITEM lvi;
+                ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+
+                /* Initialize LV_ITEM members that are common to all items. */
+                lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+                lvi.state = 0;
+                lvi.stateMask = 0;
+                lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+                lvi.iImage = 0;
+                lvi.iItem = iItem;
+                lvi.iSubItem = 0;
+
+                pItem->frameId = eFrameID;
+
+                field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
+                ID3Field_GetASCII(field, info, 1024, 1);
+                pItem->aCols[0] = DupString(info);
+
+                field = ID3Frame_GetField(frame, ID3FN_URL);
+                ID3Field_GetASCII(field, info, 1024, 1);
+                pItem->aCols[1] = DupString(info);
+
+                lvi.lParam = (LPARAM)pItem;    /* item data */
+
+                /* Add the item. */
+                ListView_InsertItem(hwndList, &lvi);
+
+                break;
+            }
+            default:
+                break;
+            }
+        }
+        ID3Tag_Delete(tag);
+    }
+}
+
+BOOL CALLBACK AddFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    int i, cursel;
+
+    switch (message) {
+    case WM_INITDIALOG:
+        EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
+        EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
+
+        /* Note: FRAMEID is the index in the combo box + 1 */
+        for (i = 1; i < NUMFRAMES; i++)
+        {
+            SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)ID3Frames[i]);
+        }
+        return TRUE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam)) {
+        case IDC_FRAMETYPE:
+            if (HIWORD(wParam) == CBN_SELCHANGE)
+            {
+                cursel = SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_GETCURSEL, 0, 0);
+
+                switch (cursel + 1)
+                {
+                case ID3FID_ALBUM:             case ID3FID_BPM:
+                case ID3FID_COMPOSER:          case ID3FID_COPYRIGHT:
+                case ID3FID_DATE:              case ID3FID_PLAYLISTDELAY:
+                case ID3FID_ENCODEDBY:         case ID3FID_LYRICIST:
+                case ID3FID_FILETYPE:          case ID3FID_TIME:
+                case ID3FID_CONTENTGROUP:      case ID3FID_TITLE:
+                case ID3FID_SUBTITLE:          case ID3FID_INITIALKEY:
+                case ID3FID_LANGUAGE:          case ID3FID_SONGLEN:
+                case ID3FID_MEDIATYPE:         case ID3FID_ORIGALBUM:
+                case ID3FID_ORIGFILENAME:      case ID3FID_ORIGLYRICIST:
+                case ID3FID_ORIGARTIST:        case ID3FID_ORIGYEAR:
+                case ID3FID_FILEOWNER:         case ID3FID_LEADARTIST:
+                case ID3FID_BAND:              case ID3FID_CONDUCTOR:
+                case ID3FID_MIXARTIST:         case ID3FID_PARTINSET:
+                case ID3FID_PUBLISHER:         case ID3FID_TRACKNUM:
+                case ID3FID_RECORDINGDATES:    case ID3FID_NETRADIOSTATION:
+                case ID3FID_NETRADIOOWNER:     case ID3FID_SIZE:
+                case ID3FID_ISRC:              case ID3FID_ENCODERSETTINGS:
+                case ID3FID_YEAR:              case ID3FID_WWWAUDIOFILE:
+                case ID3FID_WWWARTIST:         case ID3FID_WWWAUDIOSOURCE:
+                case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT:
+                case ID3FID_WWWPUBLISHER:      case ID3FID_WWWPAYMENT:
+                case ID3FID_WWWRADIOPAGE:      case ID3FID_CONTENTTYPE:
+                {
+                    SetDlgItemText(hwndDlg, IDC_COL0, ID3Frames[cursel+1]);
+                    EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
+                    EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
+                    break;
+                }
+                case ID3FID_USERTEXT:          case ID3FID_COMMENT:
+                case ID3FID_UNSYNCEDLYRICS:    case ID3FID_WWWUSER:
+                {
+                    SetDlgItemText(hwndDlg, IDC_COL0, ID3Frames[cursel+1]);
+                    EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), TRUE);
+                    EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
+                    break;
+                }
+                default:
+                    MessageBox(hwndDlg, "Sorry, this frame type cannot be added (yet).", "Sorry", MB_OK);
+                    EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
+                    EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
+                    break;
+                }
+            }
+            return TRUE;
+        case IDOK:
+            {
+                LV_ITEM lvi;
+                ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+                char *col0 = LocalAlloc(LPTR, 1024);
+                char *col1 = LocalAlloc(LPTR, 1024);
+
+                /* Initialize LV_ITEM members that are common to all items. */
+                lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+                lvi.state = 0;
+                lvi.stateMask = 0;
+                lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+                lvi.iImage = 0;
+                lvi.iItem = ListView_GetItemCount(m_hwndList) + 1;
+                lvi.iSubItem = 0;
+
+                cursel = SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_GETCURSEL, 0, 0);
+                pItem->frameId = cursel + 1;
+                GetDlgItemText(hwndDlg, IDC_COL0, col0, 1024);
+                GetDlgItemText(hwndDlg, IDC_COL1, col1, 1024);
+                pItem->aCols[0] = col0;
+                pItem->aCols[1] = col1;
+
+                lvi.lParam = (LPARAM)pItem;    /* item data */
+
+                /* Add the item. */
+                ListView_InsertItem(m_hwndList, &lvi);
+                ListView_Update(m_hwndList, lvi.iItem);
+            }
+        case IDCANCEL:
+            EndDialog(hwndDlg, wParam);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+BOOL List_AddFrame(HWND hwndApp, HWND hwndList)
+{
+    int result;
+
+    m_hwndList = hwndList;
+
+    result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_ADDFRAME),
+        hwndApp, AddFrameProc);
+
+    if (LOWORD(result) == IDOK)
+        return TRUE;
+    return FALSE;
+}
+
+
+void InsertTextFrame(HWND dlg, HWND list, int control, int item, int frame_id)
+{
+    LV_ITEM lvi;
+    ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+
+    /* Initialize LV_ITEM members that are common to all items. */
+    lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+    lvi.state = 0;
+    lvi.stateMask = 0;
+    lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+    lvi.iImage = 0;
+    lvi.iItem = item;
+    lvi.iSubItem = 0;
+
+    pItem->frameId = frame_id;
+    pItem->aCols[0] = GetFrameDesc(frame_id);
+
+    pItem->aCols[1] = LocalAlloc(LPTR, 1024);
+    GetDlgItemText(dlg, control, pItem->aCols[1], 1024);
+
+    lvi.lParam = (LPARAM)pItem;    /* item data */
+
+    /* Add the item. */
+    ListView_InsertItem(list, &lvi);
+}
+
+void AddFrameFromRAWData(HWND hwndList, int frameId, LPSTR data1, LPSTR data2)
+{
+    LV_ITEM lvi;
+    ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
+    int nextItem;
+
+    nextItem = ListView_GetItemCount(hwndList);
+
+    /* Initialize LV_ITEM members that are common to all items. */
+    lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+    lvi.state = 0;
+    lvi.stateMask = 0;
+    lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+    lvi.iImage = 0;
+    lvi.iItem = nextItem;
+    lvi.iSubItem = 0;
+
+    pItem->frameId = frameId;
+
+    pItem->aCols[0] = LocalAlloc(LPTR, 1024);
+    pItem->aCols[1] = LocalAlloc(LPTR, 1024);
+
+    lstrcpy(pItem->aCols[0], data1);
+    lstrcpy(pItem->aCols[1], data2);
+
+    lvi.lParam = (LPARAM)pItem;    /* item data */
+
+    /* Add the item. */
+    ListView_InsertItem(hwndList, &lvi);
+}
+
+HWND m_hwndDlg;
+int changed;
+
+BOOL CALLBACK AddStandardProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    int added = 0;
+
+    switch (message) {
+    case WM_INITDIALOG:
+        changed = 0;
+        return TRUE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam)) {
+        case IDOK:
+        {
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_TRACK)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_TRACK, ListView_GetItemCount(m_hwndList)+1, ID3FID_TRACKNUM);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_TITLE)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_TITLE, ListView_GetItemCount(m_hwndList)+1, ID3FID_TITLE);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ARTIST)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_ARTIST, ListView_GetItemCount(m_hwndList)+1, ID3FID_LEADARTIST);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ALBUM)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_ALBUM, ListView_GetItemCount(m_hwndList)+1, ID3FID_ALBUM);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_YEAR)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_YEAR, ListView_GetItemCount(m_hwndList)+1, ID3FID_YEAR);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_GENRE)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_GENRE, ListView_GetItemCount(m_hwndList)+1, ID3FID_CONTENTTYPE);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COMMENT)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_COMMENT, ListView_GetItemCount(m_hwndList)+1, ID3FID_COMMENT);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COMPOSER)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_COMPOSER, ListView_GetItemCount(m_hwndList)+1, ID3FID_COMPOSER);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ORIGARTIST)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_ORIGARTIST, ListView_GetItemCount(m_hwndList)+1, ID3FID_ORIGARTIST);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COPYRIGHT)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_COPYRIGHT, ListView_GetItemCount(m_hwndList)+1, ID3FID_COPYRIGHT);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_URL)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_URL, ListView_GetItemCount(m_hwndList)+1, ID3FID_WWWARTIST);
+                added++;
+            }
+
+            if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ENCBY)) > 0) {
+                InsertTextFrame(hwndDlg, m_hwndList, IDC_ENCBY, ListView_GetItemCount(m_hwndList)+1, ID3FID_ENCODEDBY);
+                added++;
+            }
+
+            if (added > 0)
+                changed = 1;
+        }
+        case IDCANCEL:
+            EndDialog(hwndDlg, changed);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+BOOL List_AddStandardFrames(HWND hwndApp, HWND hwndList)
+{
+    int result;
+
+    m_hwndList = hwndList;
+    m_hwndDlg = hwndApp;
+
+    result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_ADDSTANDARD),
+        hwndApp, AddStandardProc);
+
+    return result?TRUE:FALSE;
+}
+
+
+/* List_OnGetDispInfo - processes the LVN_GETDISPINFO  */
+/*     notification message. */
+/* pnmv - value of lParam (points to an LV_DISPINFO structure) */
+void List_OnGetDispInfo(LV_DISPINFO *pnmv)
+{
+    /* Provide the item or subitem's text, if requested. */
+    if (pnmv->item.mask & LVIF_TEXT) {
+        ID3ITEM *pItem = (ID3ITEM *) (pnmv->item.lParam);
+        lstrcpy(pnmv->item.pszText,
+            pItem->aCols[pnmv->item.iSubItem]);
+    }
+}
+
+ID3ITEM *pItem;
+int editItemIndex;
+
+BOOL CALLBACK EditTextFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    LV_ITEM lvi;
+
+    switch (message) {
+    case WM_INITDIALOG:
+        SetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0]);
+        SetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1]);
+
+        switch (pItem->frameId)
+        {
+        case ID3FID_ALBUM:              case ID3FID_BPM:
+        case ID3FID_COMPOSER:           case ID3FID_COPYRIGHT:
+        case ID3FID_DATE:               case ID3FID_PLAYLISTDELAY:
+        case ID3FID_ENCODEDBY:          case ID3FID_LYRICIST:
+        case ID3FID_FILETYPE:           case ID3FID_TIME:
+        case ID3FID_CONTENTGROUP:       case ID3FID_TITLE:
+        case ID3FID_SUBTITLE:           case ID3FID_INITIALKEY:
+        case ID3FID_LANGUAGE:           case ID3FID_SONGLEN:
+        case ID3FID_MEDIATYPE:          case ID3FID_ORIGALBUM:
+        case ID3FID_ORIGFILENAME:       case ID3FID_ORIGLYRICIST:
+        case ID3FID_ORIGARTIST:         case ID3FID_ORIGYEAR:
+        case ID3FID_FILEOWNER:          case ID3FID_LEADARTIST:
+        case ID3FID_BAND:               case ID3FID_CONDUCTOR:
+        case ID3FID_MIXARTIST:          case ID3FID_PARTINSET:
+        case ID3FID_PUBLISHER:          case ID3FID_TRACKNUM:
+        case ID3FID_RECORDINGDATES:     case ID3FID_NETRADIOSTATION:
+        case ID3FID_NETRADIOOWNER:      case ID3FID_SIZE:
+        case ID3FID_ISRC:               case ID3FID_ENCODERSETTINGS:
+        case ID3FID_YEAR:               case ID3FID_WWWAUDIOFILE:
+        case ID3FID_WWWARTIST:          case ID3FID_WWWAUDIOSOURCE:
+        case ID3FID_WWWCOMMERCIALINFO:  case ID3FID_WWWCOPYRIGHT:
+        case ID3FID_WWWPUBLISHER:       case ID3FID_WWWPAYMENT:
+        case ID3FID_WWWRADIOPAGE:       case ID3FID_CONTENTTYPE:
+        {
+            EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
+            EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
+            break;
+        }
+        case ID3FID_USERTEXT:           case ID3FID_COMMENT:
+        case ID3FID_UNSYNCEDLYRICS:     case ID3FID_WWWUSER:
+        {
+            EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), TRUE);
+            EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
+            break;
+        }
+        default:
+            EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
+            EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
+            EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), FALSE);
+            break;
+        }
+        return TRUE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam)) {
+        case IDOK:
+        {
+            GetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0], 1024);
+            GetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1], 1024);
+            lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
+            lvi.state = 0;
+            lvi.stateMask = 0;
+            lvi.pszText = LPSTR_TEXTCALLBACK;   /* app. maintains text */
+            lvi.iImage = 0;
+            lvi.iItem = editItemIndex;
+            lvi.iSubItem = 0;
+            lvi.lParam = (LPARAM)pItem;    /* item data */
+
+            /* Add the item. */
+            ListView_SetItem(m_hwndList, &lvi);
+            ListView_Update(m_hwndList, editItemIndex);
+        } /* Fall through */
+        case IDCANCEL:
+            EndDialog(hwndDlg, wParam);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+/* Double clicking means editing a frame */
+BOOL List_EditData(HWND hwndApp, HWND hwndList)
+{
+    LV_ITEM lvi;
+    BOOL result;
+
+    /* First get the selected item */
+    int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
+
+    m_hwndList = hwndList;
+
+    if (index != -1)
+    {
+        lvi.mask = LVIF_PARAM;
+        lvi.iItem = index;
+        lvi.iSubItem = 0;
+
+        if (ListView_GetItem(hwndList, &lvi) == TRUE)
+        {
+            pItem = (ID3ITEM*)lvi.lParam;
+            editItemIndex = lvi.iItem;
+
+            result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_EDITTEXTFRAME),
+                hwndApp, EditTextFrameProc);
+            if (LOWORD(result) == IDOK)
+                return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+
+/* Delete the selected frame */
+BOOL List_DeleteSelected(HWND hwndApp, HWND hwndList)
+{
+    int items;
+
+    /* First get the selected item */
+    int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
+
+    if (index != -1)
+        ListView_DeleteItem(hwndList, index);
+
+    items = ListView_GetItemCount(hwndList);
+    if (index != -1) return TRUE;
+    else return FALSE;
+}
+
+
+/* Save the ID3 to the file */
+void List_SaveID3(HWND hwndApp, HWND hwndList, char *filename)
+{
+    LV_ITEM lvi;
+    ID3ITEM *pItem1;
+    int i, items;
+    ID3Tag *tag;
+    ID3Frame *frame;
+    ID3Field *field;
+    
+    /* Strip the tag first, before completely rewriting it */
+    if ((tag = ID3Tag_New()) != NULL)
+    {
+        ID3Tag_Link(tag, filename);
+        ID3Tag_Strip(tag, ID3TT_ALL);
+        ID3Tag_Clear(tag);
+
+        if (SendMessage(GetDlgItem(hwndApp, IDC_ID3V2TAG), BM_GETCHECK, 0, 0) == BST_UNCHECKED)
+        {
+            /* No frames saved */
+            ID3Tag_Delete(tag);
+            EnableWindow(GetDlgItem(hwndApp, IDC_ID3V2TAG), FALSE);
+            ListView_DeleteAllItems(hwndList);
+            return;
+        }
+
+        /* First get the number of items */
+        items = ListView_GetItemCount(hwndList);
+
+        if (items > 0)
+        {
+            for (i = 0; i < items; i++)
+            {
+                lvi.mask = LVIF_PARAM;
+                lvi.iItem = i;
+                lvi.iSubItem = 0;
+
+                if (ListView_GetItem(hwndList, &lvi) == TRUE)
+                {
+                    pItem1 = (ID3ITEM*)lvi.lParam;
+
+                    frame = ID3Frame_NewID(pItem1->frameId);
+
+                    switch (pItem1->frameId)
+                    {
+                    case ID3FID_ALBUM:            case ID3FID_BPM:
+                    case ID3FID_COMPOSER:         case ID3FID_CONTENTTYPE:
+                    case ID3FID_COPYRIGHT:        case ID3FID_DATE:
+                    case ID3FID_PLAYLISTDELAY:    case ID3FID_ENCODEDBY:
+                    case ID3FID_LYRICIST:         case ID3FID_FILETYPE:
+                    case ID3FID_TIME:             case ID3FID_CONTENTGROUP:
+                    case ID3FID_TITLE:            case ID3FID_SUBTITLE:
+                    case ID3FID_INITIALKEY:       case ID3FID_LANGUAGE:
+                    case ID3FID_SONGLEN:          case ID3FID_MEDIATYPE:
+                    case ID3FID_ORIGALBUM:        case ID3FID_ORIGFILENAME:
+                    case ID3FID_ORIGLYRICIST:     case ID3FID_ORIGARTIST:
+                    case ID3FID_ORIGYEAR:         case ID3FID_FILEOWNER:
+                    case ID3FID_LEADARTIST:       case ID3FID_BAND:
+                    case ID3FID_CONDUCTOR:        case ID3FID_MIXARTIST:
+                    case ID3FID_PARTINSET:        case ID3FID_PUBLISHER:
+                    case ID3FID_TRACKNUM:         case ID3FID_RECORDINGDATES:
+                    case ID3FID_NETRADIOSTATION:  case ID3FID_NETRADIOOWNER:
+                    case ID3FID_SIZE:             case ID3FID_ISRC:
+                    case ID3FID_ENCODERSETTINGS:  case ID3FID_YEAR:
+                    {
+                        field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                        ID3Field_SetASCII(field, pItem1->aCols[1]);
+                        ID3Tag_AddFrame(tag, frame);
+                        break;
+                    }
+                    case ID3FID_USERTEXT:
+                    case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
+                    case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
+                    {
+                        field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
+                        ID3Field_SetASCII(field, pItem1->aCols[0]);
+                        field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                        ID3Field_SetASCII(field, pItem1->aCols[1]);
+                        ID3Tag_AddFrame(tag, frame);
+                        break;
+                    }
+                    case ID3FID_WWWAUDIOFILE:     case ID3FID_WWWARTIST:
+                    case ID3FID_WWWAUDIOSOURCE:   case ID3FID_WWWCOMMERCIALINFO:
+                    case ID3FID_WWWCOPYRIGHT:     case ID3FID_WWWPUBLISHER:
+                    case ID3FID_WWWPAYMENT:       case ID3FID_WWWRADIOPAGE:
+                    {
+                        field = ID3Frame_GetField(frame, ID3FN_URL);
+                        ID3Field_SetASCII(field, pItem1->aCols[1]);
+                        ID3Tag_AddFrame(tag, frame);
+                        break;
+                    }
+                    case ID3FID_WWWUSER:
+                    {
+                        field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
+                        ID3Field_SetASCII(field, pItem1->aCols[0]);
+                        field = ID3Frame_GetField(frame, ID3FN_URL);
+                        ID3Field_SetASCII(field, pItem1->aCols[1]);
+                        ID3Tag_AddFrame(tag, frame);
+                        break;
+                    }
+                    default:
+                        break;
+                    }
+                }
+            }
+            ID3Tag_UpdateByTagType(tag, ID3TT_ID3V2);
+        }
+
+        ID3Tag_Delete(tag);
+    }
+}
+
+/* Get the title from the file */
+void GetID3FileTitle(char *filename, char *title, char *format)
+{
+    ID3Tag *tag;
+    ID3Frame *frame;
+    ID3Field *field;
+    char buffer[255];
+    int some_info = 0;
+    char *in = format;
+    char *out = title;
+    char *bound = out + (MAX_PATH - 10 - 1);
+
+
+    if ((tag = ID3Tag_New()) != NULL)
+    {
+        ID3Tag_Link(tag, filename);
+
+        while (*in && out < bound)
+        {
+            switch (*in) {
+            case '%':
+                ++in;
+                break;
+
+            default:
+                *out++ = *in++;
+                continue;
+            }
+
+            /* handle % escape sequence */
+            switch (*in++) {
+            case '0':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TRACKNUM)) != NULL) {
+                    int size;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    lstrcpy(out, buffer); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '1':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) {
+                    int size;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    lstrcpy(out, buffer); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '2':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) {
+                    int size;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    lstrcpy(out, buffer); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '3':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) {
+                    int size;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    lstrcpy(out, buffer); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '4':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_YEAR)) != NULL) {
+                    int size;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    lstrcpy(out, buffer); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '5':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_COMMENT)) != NULL) {
+                    int size;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    lstrcpy(out, buffer); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '6':
+                if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_CONTENTTYPE)) != NULL) {
+                    int size; char *tmp;
+                    field = ID3Frame_GetField(frame, ID3FN_TEXT);
+                    size = ID3Field_GetASCII(field, buffer, 255, 1);
+                    tmp = GetGenre(buffer);
+                    lstrcpy(out, tmp); out += size;
+                    some_info = 1;
+                }
+                break;
+            case '7':
+            {
+                char *p=filename+lstrlen(filename);
+                int len = 0;
+                while (*p != '\\' && p >= filename) { p--; len++; }
+                lstrcpy(out, ++p); out += len;
+                some_info = 1;
+                break;
+            }
+            }
+        }
+
+        ID3Tag_Delete(tag);
+    }
+
+    if (!some_info)
+    {
+        char *p=filename+lstrlen(filename);
+        while (*p != '\\' && p >= filename) p--;
+        lstrcpy(title,++p);
+    }
+}
+
--- /dev/null
+++ b/common/faad/id3v2tag.h
@@ -1,0 +1,48 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 Menno Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser 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
+ *
+ * $Id: id3v2tag.h,v 1.1 2002/01/14 19:15:49 menno Exp $
+ */
+
+#ifndef __ID3V2TAG_H__
+#define __ID3V2TAG_H__
+
+void GetID3FileTitle(char *filename, char *title, char *format);
+void FillID3List(HWND hwndDlg, HWND hwndList, char *filename);
+void List_OnGetDispInfo(LV_DISPINFO *pnmv);
+BOOL List_EditData(HWND hwndApp, HWND hwndList);
+void List_SaveID3(HWND hwndApp, HWND hwndList, char *filename);
+BOOL List_DeleteSelected(HWND hwndApp, HWND hwndList);
+BOOL List_AddFrame(HWND hwndApp, HWND hwndList);
+BOOL List_AddStandardFrames(HWND hwndApp, HWND hwndList);
+void AddFrameFromRAWData(HWND hwndList, int frameId, LPSTR data1, LPSTR data2);
+
+HINSTANCE hInstance_for_id3editor;
+
+typedef struct ID3GENRES_TAG
+{
+    BYTE id;
+    char name[30];
+} ID3GENRES;
+
+typedef struct id3item_tag {
+    int frameId;
+    LPSTR aCols[2];
+} ID3ITEM;
+
+#endif
\ No newline at end of file
--- /dev/null
+++ b/common/libsndfile/AUTHORS
@@ -1,0 +1,17 @@
+The main author of libsndfile is Erik de Castro Lopo <erikd AT zip DOT com DOT au>.
+
+The code in the src/GSM610 directory was written by Jutta Degener 
+<jutta AT cs DOT tu-berlin DOT de> and Carsten Bormann 
+<cabo AT cs DOT tu-berlin DOT de>. They should not be contacted in relation to 
+libsndfile or the GSM 6.10 code that is part of libsndfile. Their original code 
+can be found at:
+
+    http://kbs.cs.tu-berlin.de/~jutta/toast.html
+
+Code in the src/G72x directory was released by Sun Microsystems, Inc. to the 
+public domain. Minor modifications were required to integrate these files 
+into libsndfile. The changes are listed in src/G72x/ChangeLog.
+
+
+
+
--- /dev/null
+++ b/common/libsndfile/COPYING
@@ -1,0 +1,503 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, 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 library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+  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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+  If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be 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.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+  9. 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 Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+  11. 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 Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  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 library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser 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
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
--- /dev/null
+++ b/common/libsndfile/ChangeLog
@@ -1,0 +1,1202 @@
+2001-11-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+	* examples/sfplay_beos.cpp
+	Added BeOS version of sfplay.c. This needs to be compiled using a C++
+	compiler so is therefore not built by default. Thanks to Marcus Overhagen
+	for providing this.
+
+2001-11-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+	* src/*.[ch]
+	Removed all usage of off_t which is not part of the ISO C standard. All places 
+	which were using it are now using type long which is the type of the offset 
+	parameter for the fseek function.
+	This should fix problems on BeOS, MacOS and *BSD like systems which were failing
+	"make check" because sizeof (long) != sizeof (off_t).
+
+2001-11-10  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+	* examples/sfplay.c
+	New example file showing how libsndfile can be used to read and play a sound file.
+	At the moment on Linux is supported. Others will follow in the near future.
+
+2001-11-08  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/au.c src/sndfile.au
+	Added support for 32 bit float data in big and little endian AU files.
+	
+	* tests/write_read_test.c
+	Added tests for 32 bit float data in AU files.
+
+2001-11-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/lossy_comp_test.c
+	Finalised testing of stereo files where possible.
+
+2001-11-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_ms_adpcm.c
+	Fixed bug in writing stereo MS ADPCM WAV files. Thanks to Xu Xin for pointing
+	out this problem.
+
+2001-10-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_ms_adpcm.c
+	Modified function srate2blocksize () to handle 44k1Hz stereo files.
+
+2001-10-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/lossy_comp_test.c
+	Modified this test program so that for stereo capable files, test stereo mode 
+	instead of mono.
+
+2001-10-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.h 
+    Win32 has _snprintf and _vsnprintf but not snprintf and vsnprintf. Added a
+	conditional #define to fix this.
+
+2001-10-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/voc.c
+    Changed the TYPE_xxx enum names to VOC_TYPE_xxx to prevent name clashes
+    on MacOS with CodeWarrior 6.0.
+
+    * MacOS/MacOS-readme.txt 
+    Updated the compile instructions. Probably still need work as I don't have
+    access to a Mac.
+
+2001-10-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c src/aiff.c common.c
+    Changed all references to snprintf to LSF_SNPRINTF and all vsnprintf to 
+    LSF_VSNPRINTF. LSF_VSNPRINTF and LSF_VSNPRINTF are defined in common.h.
+
+    * src/common.h
+    Added checking of HAVE_SNPRINTF and HAVE_VSNPRINTF and defining LSF_VSNPRINTF 
+    and LSF_VSNPRINTF to appropriate values.
+
+    * src/missing.c
+    New file containing a minimal implementation of snprintf and vsnprintf functions 
+    named missing_snprintf and missing_vsnprintf respectively. These are only 
+    compliled into the binary if snprintf and/or vsnprintf are not available.
+
+2001-09-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/ircam.c 
+    New file to handle Berkeley/IRCAM/CARL files.
+
+    * src/sndfile.c src/common.h
+    Modified for IRCAM handling.
+
+    * tests/*.c
+    Added tests for IRCAM files.
+
+2001-09-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Apparently microsoft windows (tm) doesn't like ulaw and Alaw WAV files with 
+    20 byte format chunks (contrary to ms's own documentation). Fixed the WAV 
+    header writing code to generate smaller ms compliant ulaw and Alaw WAV files.
+
+2001-09-17  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/stdio_test.sh tests/stdio_test.c
+    Shell script was rewritten as a C program due to incompatibilities of the sh
+    shell on Linux and Solaris.
+
+2001-09-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/stdio_test.sh tests/stdout_test.c tests/stdin_test.c
+    New test programs to verify the correct operation of reading from stdin and 
+    writing to stdout.
+
+    * src/sndfile.c wav.c au.c nist.c paf.c
+    Fixed a bugs uncovered by the new test programs above.
+
+2001-09-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c wav.c
+    Fixed a bug preventing reading a file from stdin. Found by T. Narita.
+
+2001-09-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.h
+    Fixed a problem on OpenBSD 2.9 which was causing sf_seek() to fail on IMA WAV
+    files. Root cause was the declaration of the func_seek typedef not matching the 
+    functions it was actually being used to point to. In OpenBSD sizeof (off_t) != 
+    sizeof (int). Thanks to Heikki Korpela for allowing me to log into his OpenBSD
+    machine to debug this problem.
+
+2001-09-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c 
+    Implemented sf_command ("norm float").
+
+    * src/*.c
+    Implemented handling of sf_command ("norm float"). Float normalization can now
+    be turned on and off.
+
+    * tests/double_test.c
+    Renamed to floating_point_test.c. Modified to include tests for all scaled reads 
+    and writes of floats and doubles.
+
+    * src/au_g72x.c
+    Fixed bug in normalization code found with improved floating_point_test program.
+
+    * src/wav.c
+    Added code for parsing 'INFO' and 'LIST' chunks. Will be used for extract text 
+    annotations from WAV files.
+
+    * src/aiff.c
+    Added code for parsing '(c) ' and 'ANNO' chunks. Will be used for extract text 
+    annotations from WAV files.
+
+2001-09-02  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * examples/sf_info.c example/Makefile.am
+    Renamed to sndfile_info.c. The program sndfile_info will now be installed when the 
+    library is installed.
+
+    * src/floatcast.h
+    New file defining floating point to short and int casts. These casts will
+    eventually replace all flot and double casts to short and int. See comments at
+    the top of the file for the reasoning.
+    
+    * src/*.c
+    Changed all default float and double casts to short or int with macros defined
+    in floatcast.h. At the moment these casts do nothing. They will be replaced 
+    with faster float to int cast operations in the near future.
+
+2001-08-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    
+    * tests/command_test.c
+    New file for testing sf_command () functionality.
+
+    * src/sndfile.c
+    Revisiting of error return values of some functions.
+    Started implementing sf_command () a new function will allow on-the-fly modification
+    of library behaviour, or instance, sample value scaling.
+
+    * src/common.h
+    Added hook for format specific sf_command () calls to SNDFILE struct.
+    
+    * doc/api.html
+    Updated and errors corrected.
+    
+    * doc/command.html
+    New documentation file explaining new sf_command () function.
+
+2001-08-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    
+    * src/sndfile.c
+    Fixed error return values from sf_read*() and sf_write*(). There were numerous
+    instances of -1 being returned through size_t. These now all set error int the
+    SF_PRIVATE struct and return 0. Thanks to David Viens for spotting this.
+
+2001-08-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    
+    * src/common.c
+    Fixed use of va_arg() calls that were causing warning messages with the latest
+    version of gcc (thanks Maurizio Umberto Puxeddu).
+
+2001-07-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    
+    * src/*.c src/sfendian.h 
+    Moved definition of MAKE_MARKER macro to sfendian.h
+
+2001-07-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+    
+    * src/sndfile.c
+    Modified sf_get_lib_version () so that version string will be visible using the
+    Unix strings command.
+
+    * examples/Makefile.am examples/sfinfo.c
+    Renamed sfinfo program and source code to sf_info. This prevents a name clash
+    with the program included with libaudiofile.
+
+2001-07-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/read_seek_test.c tests/lossy_comp_test.c
+    Added tests for sf_read_float () and sf_readf_float ().
+
+    * src/voc.c
+    New files for handling Creative Voice files (not complete).
+
+    * src/samplitude.c
+    New files for handling Samplitude files (not complete).
+ 
+2001-07-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c src/au.c src/paf.c src/svx.c src/wav.c
+    Converted these files to using psf_binheader_readf() function. Will soon be ready
+    to make reading writing from pipes work reliably.
+
+    * src/*.[ch]
+    Added code for sf_read_float () and sf_readf_float () methods of accessing 
+    file data.
+    
+2001-07-20  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/paf.c src/wav_gsm610.c
+    Removed two printf()s which had escaped notice for some time (thanks Sigbj�rn 
+    Skj�ret).
+
+2001-07-19  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_gsm610.c
+    Fixed a bug which prevented GSM 6.10 encoded WAV files generated by libsndfile from 
+    being played in Windoze (thanks klay).
+
+2001-07-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.[ch]
+    Implemented psf_binheader_readf() which will do for file header reading what
+    psf_binheader_writef() did for writing headers. Will eventually allow
+    libsndfile to read and write from pipes, including named pipes.
+
+2001-07-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * MacOS/config.h Win32/config.h
+    Attempted to bring these two files uptodate with src/config.h. As I don't have
+    access to either of these systems support for them may be completely broken.
+
+2001-06-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/float32.c
+    Fixed bug for big endian processors that can't read 32 bit IEEE floats. Now tested 
+    on Intel x86 and UltraSparc processors.
+
+2001-06-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    Modified to allow REX files (from Propellorhead's Recycle and Reason programs) to 
+    be read.
+    REX files are basically an AIFF file with slightly unusual sequence of chunks
+    (AIFF files are supposed to allow any sequence) and some extra  application 
+    specific information. 
+    Not yet able to write a REX file as the details of the application specific
+    data is unknown.
+
+2001-06-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Fixed endian bug when reading PEAK chunk on big endian machines.
+
+    * src/common.c
+    Fixed endian bug when reading PEAK chunk on big endian machines with 
+    --enable-force-broken-float configure option.
+    Fix psf_binheader_writef for (FORCE_BROKEN_FLOAT ||______)
+
+2001-06-07  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * configure.in src/config.h.in
+    Removed old CAN_READ_WRITE_x86_IEEE configure variable now that float capabilities
+    are detected at run time.
+    Added FORCE_BROKEN_FLOAT to allow testing of broken float code on machines where
+    the processor can in fact handle floats correctly. 
+    
+    * src/float32.c
+    Rejigged code reading and writing of floats on broken processors.
+    
+    * m4/
+    Removed this directory and all its files as they are no longer needed.
+
+2001-06-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/peak_chunk_test.c
+    New test to validate reading and writing of peak chunk.
+    
+    * examples/sfconvert
+    Added -float32 option.
+
+    * src/*.c
+    Changed all error return values to negative values (ie the negative of what they
+    were). 
+    
+    * src/sndfile.c tests/error_test.c
+    Modified to take account of the previous change.
+
+2001-06-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/float32.c
+    File renamed from wav_float.c and renamed function to something more general.
+    Added runtime detection of floating point capabilities. 
+    Added recording of peaks during write for generation of PEAK chunk. 
+    
+    * src/wav.c src/aiff.c
+    Added handing for PEAK chunk for floating point files. PEAK is read when the
+    file headers are read and generated when the file is closed. Logic is in place
+    for adding PEAK chunk to end of file when writing to a pipe (reading and writing 
+    from/to pipe to be implemented soon).
+
+    * src/sndfile.c
+    Modified sf_signal_max () to use PEAK values if present.
+
+2001-06-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/*.c
+    Added pcm_read_init () and pcm_write_init () to src/pcm.c and removed all other calls
+    to functions in this file from the filetype specific files.
+    
+    * src/*.c
+    Added alaw_read_init (), alaw_write_int (), ulaw_read_init () and ulaw_write_init () 
+    and removed all other calls to functions in alaw.c and ulaw.c from the filetype 
+    specific files.
+    
+    * tests/write_read_test.c
+    Added tests to validate sf_seek () on all file types.
+
+    * src/raw.c
+    Implemented raw_seek () function to fix a bug where sf_seek (file, 0, SEEK_SET) on a 
+    RAW file failed.
+
+    * src/paf.c
+    Fixed a bug in paf24_seek () found due to added seeks tests in tests/write_read_test.c
+
+2001-06-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/read_seek_test.c
+    Fixed a couple of broken binary files.
+
+    * src/aiff.c src/wav.c
+    Added handling of PEAK chunks on file read.
+
+2001-05-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * check_libsndfile.py
+    New file for the regression testing of libsndfile. 
+    check_libsndfile.py is a Python script which reads in a file containing 
+    filenames of audio files. Each file is checked by running the examples/sfinfo 
+    program on them and checking for error or warning messages in the libsndfile 
+    log buffer.
+
+    * check_libsndfile.list
+    This is an example list of audio files for use with check_libsndfile.py
+
+    * tests/lossy_comp_test.c
+    Changed the defined value of M_PI for math header files which don't have it.
+    This fixed validation test failures on MetroWerks compilers. Thanks to Lord 
+    Praetor Satanus of Acheron for bringing this to my attention.
+
+2001-05-30  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.[ch]
+    Removed psf_header_setf () which was no longer required after refactoring
+    and simplification of header writing.
+    Added 'z' format specifier to psf_binheader_writef () for zero filling header 
+    with N bytes. Used by paf.c and nist.c
+
+    * tests/check_log_buffer.c
+    New file implementing check_log_buffer () which reads the log buffer of a SNDFILE*
+    object and searches for error and warning messages. Calls exit () if any are found.
+
+    * tests/*.c 
+    Added calls to check_log_buffer () after each call to sf_open_XXX ().
+
+2001-05-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c src/wav_ms_adpcm.c src/wav_gsm610.c
+    Major rehack of header writing using psf_binheader_writef ().
+
+2001-05-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c src/wav_ima_adpcm.c
+    Major rehack of header writing using psf_binheader_writef ().
+
+2001-05-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Changed return type of get_encoding_str () to prevent compiler warnings on
+    Mac OSX.
+
+    * src/aiff.c src/au.c
+    Major rehack of header writing using psf_binheader_writef ().
+
+2001-05-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.h src/common.c
+    Added comments.
+    Name of log buffer changed from strbuffer to logbuffer.
+    Name of log buffer index variable changed from strindex to logindex.
+
+    * src/*.[ch]
+    Changed name of internal logging function from psf_sprintf () to psf_log_printf ().
+    Changed name of internal header generation functions from psf_[ab]h_printf () to 
+    psf_asciiheader_printf () and psf_binheader_writef ().
+    Changed name of internal header manipulation function psf_hsetf () to 
+    psf_header_setf (). 
+
+2001-05-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/nist.c
+    Fixed reading and writing of sample_byte_format header. "01" means little endian 
+    and "10" means big endian regardless of bit width.
+
+    * configure.in
+    Detect Mac OSX and disable -Wall and -pedantic gcc options. Mac OSX is way screwed
+    up and spews out buckets of warning messages from the system headers.
+    Added --disable-gcc-opt configure option (sets gcc optimisation to -O0 ) for 
+    easier debugging.
+    Made decision to harmonise source code version number and .so library version
+    number. Future releases will stick to this rule.
+
+    * doc/new_file_type.HOWTO
+    New file to document the addition of new file types to libsndfile.
+
+2001-05-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/nist.c
+    New file for reading/writing Sphere NIST audio file format.
+    Originally requested by Elis Pomales in 1999. 
+    Retrieved from unstable (and untouched for 18 months) branch of libsndfile.
+    Some vital information gleaned from the source code to Bill Schottstaedt's sndlib 
+    library : ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz
+    Currently reading and writing 16, 24 and 32 bit, big-endian and little endian, 
+    stereo and mono files. 
+
+    * src/common.h src/common.c
+    Added psf_ah_printf () function to help construction of ASCII headers (ie NIST).
+
+    * configure.in
+    Added test for vsnprintf () required by psf_ah_printf ().
+
+    * tests/write_read_test.c
+    Added tests for supported NIST files.
+
+2001-05-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/write_read_test.c
+    Added tests for little endian AIFC files.
+
+    * src/aiff.c
+    Minor re-working of aiff_open_write ().
+    Added write support for little endian PCM encoded AIFC files.
+
+2001-05-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    Minor re-working of aiff_open_read ().
+    Added read support for little endian PCM encoded AIFC files from the Mac OSX CD ripper 
+    program. Guillaume Lessard provided a couple of sample files and a working patch. 
+    The patch was not used as is but gave a good guide as to what to do. 
+
+2001-05-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    Added support for little endian encoded AIFC files. Guillaume Lessard provided a couple
+    of sample files and a working patch. The patch was not used as is but gave a good guide
+    as to what to do. 
+
+2001-05-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.h
+    Fixed comments about endian-ness of WAV and AIFF files. Guillaume Lessard pointed 
+    out the error.
+
+2001-04-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * examples/make_sine.c
+    Re-write of this example using sample rate and required frequency in Hz.
+
+2001-02-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Fixed bug that prevented known file types from being read as RAW PCM data.
+
+2000-12-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    Added handing of COMT chunk.
+
+2000-11-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * examples/sfconvert.c
+    Fixed bug in normalisatio code. Pointed out by Johnny Wu.
+
+2000-11-08  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * Win32/config.h
+    Fixed the incorrect setting of HAVE_ENDIAN_H parameter. Win32 only issue.
+
+2000-10-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/Makefile.am
+    Added -lm for write_read_test_LDADD.
+
+2000-10-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c src/au.c
+    Fixed bug which prevented writing of G723 24kbps AU files.
+
+    * tests/lossy_comp_test.c
+    Corrrection to options for G723 tests.
+
+    * configure.in
+    Added --disable-gcc-pipe option for DJGPP compiler (gcc on MS-DOS) which 
+    doesn't allow gcc -pipe option.
+
+2000-09-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/ulaw.c src/alaw.c src/wav_imaadpcm.c src/msadpcm.c src/wav_gsm610.c
+    Fixed normailsation bugs shown up by new double_test program.
+
+2000-08-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/pcm.c
+    Fixed bug in normalisation code (spotted by Steve Lhomme).
+
+    * tests/double_test.c
+    New file to test scaled and unscaled sf_read_double() and sf_write_double()
+    functions.
+
+2000-08-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * COPYING
+    Changed to the LGPL COPYING file (spotted by H. S. Teoh).
+
+2000-08-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.h
+    Removed prototype of unimplemented function sf_get_info(). Added prototype for
+    sf_error_number() Thanks to Sigbj�rn Skj�ret for spotting these.
+
+2000-08-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/newpcm.h
+    New file to contain a complete rewrite of the PCM data handling.
+
+2000-08-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Fixed a leak of FILE* pointers in sf_open_write(). Thanks to Sigbj�rn Skj�ret
+    for spotting this one.
+
+2000-08-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Fixed a leak of FILE* pointers in sf_open_read(). Thanks to Sigbj�rn Skj�ret
+    for spotting this one.
+
+2000-08-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/au_g72x.c src/G72x/g72x.c
+    Added G723 encoded AU file support.
+
+    * tests/lossy_comp_test.c
+    Added tests for G721 and G723 encoded AU files.
+
+2000-08-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * all files
+    Changed the license to LGPL. Albert Faber who had copyright on Win32/unistd.h
+    gave his permission to change the license on that file. All other files were
+    either copyright erikd AT zip DOT com DOT au or copyright under a GPL/LGPL compatible
+    license.
+
+2000-08-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/lossy_comp_test.c
+    Fixed incorrect error message.
+
+    * src/au_g72x.c src/G72x/*
+    G721 encoded AU files now working.
+
+    * Win32/README-Win32.txt
+    Replaced this file with a new one which gives a full explanation
+    of how to build libsndfile under Win32. Thanks to Mike Ricos.
+
+2000-08-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/*.[ch]
+    Removed double leading underscores from the start of all variable and
+    function names. Identifiers with a leading underscores are reserved
+    for use by the compiler.
+
+    * src/au_g72x.c src/G72x/*
+    Continued work on G721 encoded AU files.
+
+2000-07-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/G72x/*
+    New files for reading/writing G721 and G723 ADPCM audio. These files 
+    are from a Sun Microsystems reference implementation released under a 
+    free software licence.
+    Extensive changes to this code to make it fit in with libsndfile.
+    See the ChangeLog in this directory for details.
+
+    * src/au_g72x.c
+    New file for G721 encoded AU files.
+
+2000-07-08  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * libsndfile.spec.in
+    Added a spec file for making RPMs. Thanks to Josh Green for supplying this.
+
+2000-06-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c src/sndfile.h
+    Add checking for and handling of header-less u-law encoded AU/SND files.
+    Any file with a ".au" or ".snd" file extension and without the normal
+    AU file header is treated as an 8kHz, u-law encoded file.
+
+    * src/au.h
+    New function for opening a headerless u-law encoded file for read.
+
+2000-06-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/paf.c
+    Add checking for files shorter than minimal PAF file header length.
+
+2000-06-02  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/write_read_test.c
+    Added extra sf_perror() calls when sf_write_XXXX fails.
+
+2000-05-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.c
+    Modified usage of va_arg() macro to work correctly on PowerPC 
+    Linux. Thanks to Kyle Wheeler for giving me ssh access to his 
+    machine while I was trying to track this down.
+
+    * configure.in src/*.[ch]
+    Sorted out some endian-ness issues brought up by PowerPC Linux.
+
+    * tests/read_seek_test.c
+    Added extra debugging for when tests fail.
+
+2000-05-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Fixed bug in GSM 6.10 handling for big-endian machines. Thanks
+    to Sigbj�rn Skj�ret for reporting this.
+
+2000-04-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c src/wav.c src/wav_gsm610.c
+    Finallised writing of GSM 6.10 WAV files.
+
+    * tests/lossy_comp_test.c
+    Wrote new test code for GSM 6.10 files. 
+
+    * examples/sfinfo.c
+    Fixed incorrect format in printf() statement.
+
+2000-04-06  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.h.in
+    Fixed comments about sf_perror () and sf_error_str ().
+
+2000-03-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * configure.in
+    Fixed --enable-justsrc option.
+
+2000-03-07  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * wav.c
+    Fixed checking of bytespersec field of header. Still some weirdness
+    with some files.
+
+2000-03-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/lossy_comp_test.c
+    Added option to test PCM WAV files (sanity check).
+    Fixed bug in sf_seek() tests.
+
+2000-02-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c src/wav.c
+    Minor changes to allow writing of GSM 6.10 WAV files.
+
+2000-02-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * configure.in Makefile.am src/Makefile.am
+    Finally got around to figuring out how to build a single library from 
+    multiple source directories.
+    Reading GSM 6.10 files now seems to work.
+
+2000-01-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Added more error reporting in read_fmt_chunk().
+
+1999-12-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * examples/sfinfo.c
+    Modified program to accept multiple filenames from the command line.
+
+1999-11-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_ima_adpcm.c
+    Moved code around in preparation to adding ability to read/write IMA ADPCM
+    encoded AIFF files.
+
+1999-11-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.c
+    Fixed put_int() and put_short() macros used by _psf_hprintf() which were 
+    causing seg. faults on Sparc Solaris.
+
+1999-11-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.c
+    Added string.h to includes. Thanks to Sigbjxrn Skjfret.
+
+    * src/svx.c
+    Fixed __svx_close() function to ensure FORM and BODY chunks are correctly
+    set.
+
+1999-10-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/au.c
+    Fixed handling of incorrect size field in AU header on read. Thanks to 
+    Christoph Lauer for finding this problem.
+
+1999-09-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    Fixed a bug with incorrect SSND chunk length being written. This also lead
+    to finding an minor error in AIFF header parsing. Thanks to Dan Timis for 
+    pointing this out.
+
+1999-09-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/paf.c
+    Fixed a bug with reading and writing 24 bit stereo PAF files. This problem
+    came to light when implementing tests for the new functions which operate
+    in terms of frames rather than items.
+
+1999-09-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Modified file type detection to use first 12 bytes of file rather than 
+    file name extension. Required this because NIST files use the same 
+    filename extension as Microsoft WAV files.
+
+    * src/sndfile.c src/sndfile.h
+    Added short, int and double read/write functions which work in frames rather 
+    than items. This was originally suggested by Maurizio Umberto Puxeddu
+
+1999-09-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/svx.c
+    Finished off implementation of write using __psf_hprintf().
+
+1999-09-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/common.h
+    Added a buffer to SF_PRIVATE for writing the header. This is required
+    to make generating headers for IFF/SVX files easier as well as making
+    it easier to do re-write the headers which will be required when 
+    sf_rewrite_header() is implemented.
+
+    * src/common.c
+    Implemented __psf_hprintf() function. This is an internal function
+    which is documented briefly just above the code.
+
+1999-09-05  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Fixed a bug in sf_write_raw() where it was returning incorrect values
+    (thanks to Richard Dobson for finding this one). Must put in a test 
+    routine for sf_read_raw and sf_write_raw.
+
+    * src/aiff.c
+    Fixed default FORMsize in __aiff_open_write ().
+
+    * src/sndfile.c
+    Added copy of filename to internal data structure. IFF/SVX files 
+    contain a NAME header chunk. Both sf_open_read() and sf_open_write()
+    copy the file name (less the leading path information) to the
+    filename field.
+
+    * src/svx.c
+    Started implementing writing of files.
+
+1999-08-04  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/svx.c
+    New file for reading/writing 8SVX and 16SVX files.
+
+    * src/sndfile.[ch] src/common.h
+    Changes for SVX files.
+
+    * src/aiff.c
+    Fixed header parsing when unknown chunk is found.
+
+1999-08-01  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/paf.c
+    New file for reading/writing Ensoniq PARIS audio file format.
+
+    * src/sndfile.[ch] src/common.h
+    Changes for PAF files.
+
+    * src/sndfile.[ch]
+    Added stuff for sf_get_lib_version() function.
+
+
+1999-07-31  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.h MacOS/config.h
+    Fixed minor MacOS configuration issues.
+
+1999-07-30  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * MacOS/
+    Added a new directory for the MacOS config.h file and the
+    readme file.
+
+    * src/aiff.c
+    Fixed calculation of datalength when reading SSND chunk. Thanks to
+    Sigbj�rn Skj�ret for pointing out this error.
+
+1999-07-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c src/sndfile.h src/raw.c
+    Further fixing of #includes for MacOS.
+
+1999-07-25  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c src/aiff.c
+    Added call to ferror () in main header parsing loop of __XXX_open_read
+    functions. This should fix problems on platforms (MacOS, AmigaOS) where 
+    fseek()ing or fread()ing beyond the end of the file puts the FILE*
+    stream in an error state until clearerr() is called.
+
+    * tests/write_read_test.c
+    Added tests for RAW header-less PCM files.
+
+    * src/common.h
+    Moved definition of struct tribyte to pcm.c which is the only place
+    which needs it.
+
+    * src/pcm.c
+    Modified all code which assumed sizeof (struct tribyte) == 3. This code
+    did not work on MacOS. Thanks to Ben "Jacobs" for pointing this out.
+
+    * src/au.c
+    Removed <sys/stat.h> from list of #includes (not being used).
+
+    * src/sndfile.c
+    Added MacOS specific #ifdef to replace <sys/stat.h>.
+
+    * src/sndfile.h
+    Added MacOS specific #ifdef to replace <sys/stat.h>.
+
+    * src/sndfile.h
+    Added MacOS specific typedef for off_t.
+
+    * MacOS-readme.txt
+    New file with instructions for building libsndfile under MacOS. Thanks
+    to Ben "Jacobs" for supplying these instructions.
+
+1999-07-24  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * configure.in
+    Removed sndfile.h from generated file list as there were no longer
+    any autoconf substitutions being made.
+
+    * src/raw.c
+    New file for handling raw header-less PCM files. In order to open these
+    for read, the user must specify format, pcmbitwidth and channels in the
+    SF_INFO struct when calling sf_open_read ().
+
+    * src/sndfile.c
+    Added support for raw header-less PCM files.    
+
+1999-07-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * examples/sfinfo.c
+    Removed options so the sfinfo program always prints out all the information.
+
+1999-07-19  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/alaw.c
+    New file for A-law encoding (similar to u-law).
+
+    * tests/alaw_test.c
+    New test program to test the A-law encode/decode lookup tables.
+
+    * tests/lossy_comp_test.c
+    Added tests for a-law encoded WAV, AU and AULE files.
+
+1999-07-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c src/au.c
+    Removed second "#include <unistd.h>". Thanks to Ben "Jacobs" for pointing
+    this out.
+
+1999-07-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/ulaw_test.c
+    New test program to test the u-law encode/decode lookup tables.
+
+1999-07-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.h
+    Made corrections to comments on the return values from sf_seek ().
+
+    * src/sndfile.c
+    Fixed boundary condition checking bug and accounting bug in sf_read_raw ().
+
+1999-07-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/au.c src/ulaw.c
+    Finished implementation of u-law encoded AU files.
+
+    * src/wav.c
+    Implemented reading and writing of u-law encoded WAV files.
+
+    * tests/
+    Changed name of adpcm_test.c to lossy_comp_test.c. This test program
+    will now be used to test Ulaw and Alaw encoding as well as APDCM.
+    Added tests for Ulaw encoded WAV files.
+
+1999-07-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/adpcm_test.c
+    Initialised amp variable in gen_signal() to remove compiler warning.
+
+1999-07-12  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    In __aiff_open_read () prevented fseek()ing beyond end of file which 
+    was causing trouble on MacOS with the MetroWerks compiler. Thanks to
+    Ben "Jacobs" for pointing this out.
+
+    *src/wav.c
+    Fixed as above in __wav_open_read ().
+
+1999-07-01    Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_ms_adpcm.c
+    Implemented MS ADPCM encoding. Code cleanup of decoder.
+
+    * tests/adpcm_test.c
+    Added tests for MS ADPCM WAV files.
+
+    * src/wav_ima_adpcm.c
+    Fixed incorrect parameter in call to srate2blocksize () from
+    __ima_writer_init ().
+
+1999-06-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/read_seek_test.c
+    Added test for 8 bit AIFF files.
+
+1999-06-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/write_read_test.c
+    Removed test for IMA ADPCM WAV files which is now done in adpcm_test.c
+
+    * configure.in
+    Added -Wconversion to CFLAGS. 
+
+    * src/*.c tests/*.c examples/*.c
+    Fixed all warnings resulting from use of -Wconversion. 
+
+1999-06-17  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Added fact chunk handling on read and write for all non WAVE_FORMAT_PCM
+    WAV files.
+
+    * src/wav_ima.c
+    Changed block alignment to be dependant on sample rate. This should make
+    WAV files created with libsndfile compatible with the MS Windows media
+    players.
+
+    * tests/adpcm_test.c
+    Reimplemented adpcm_test_short and implemented adpcm_test_int and adpcm_test_double.
+    Now have full testing of IMA ADPCM WAV file read, write and seek.
+
+1999-06-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_float.c
+    Fixed function prototype for x86f2d_array () which was causing ocassional 
+    seg. faults on Sparc Solaris machines.
+
+1999-06-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c
+    Fixed bug in __aiff_close where the length fields in the header were
+    not being correctly calculated before writing.
+
+    * tests/write_read_test.c
+    Modified to detect the above bug in WAV, AIFF and AU files.
+
+1999-06-12    Erik de Castro Lopo     <erikd AT zip DOT com DOT au>
+
+    * Win32/*
+    Added a contribution from Albert Faber to allow libsndfile to compile
+    under Win32 systems. libsndfile will now be used as part of LAME the
+    the MPEG 1 Layer 3 encoder (http://internet.roadrunner.com/~mt/mp3/).
+
+1999-06-11    Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * configure.in
+    Changed to reflect previous changes.
+
+    * src/wav_ima_adpcm.c
+    Fixed incorrect calculation of bytespersec header field (IMA ADPCM only).
+
+    Fixed bug when writing from int or double data to IMA ADPCM file. Will need 
+    to write test code for this.
+
+    Fixed bug in __ima_write () whereby the length of the current block was 
+    calculated incorrectly. Thanks to Jongcheon Park for pointing this out.
+
+1999-03-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/*.c
+    Changed all read/write/lseek function calls to fread/fwrite/
+    fseek/ftell and added error checking of return values from
+    fread and fwrite in critical areas of the code.
+
+    * src/au.c
+    Fixed incorrect datasize element in AU header on write.
+
+    * tests/error_test.c
+    Add new test to check all error values have an associated error
+    string. This will avoid embarrassing real world core dumps.
+
+1999-03-23  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c src/aiff.c
+    Added handling for unknown chunk markers in the file. 
+
+1999-03-22  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Filled in missing error strings in SndfileErrors array. Missing entries 
+    can cause core dumps when calling sf_error-str (). Thanks to Sam 
+    <mrsam at-sign geocities.com> for finding this problem.
+
+1999-03-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav_ima_adpcm.c
+    Work on wav_ms_adpcm.c uncovered a bug in __ima_read () when reading 
+    stereo files. Caused by not adjusting offset into buffer of decoded
+    samples for 2 channels. A similar bug existed in __ima_write ().
+    Need a test for stereo ADPCM files.
+
+    * src/wav_ms_adpcm.c
+    Decoder working correctly.
+
+1999-03-18  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * configure.in Makefile.am
+    Added --enable-justsrc configuration variable sent by Sam
+    <mrsam at-sign geocities.com>.
+
+    * src/wav_ima_adpcm.c
+    Fixed bug when reading beyond end of data section due to not
+    checking pima->blockcount.
+    This uncovered __ima_seek () bug due to pima->blockcount being set 
+    before calling __ima_init_block ().
+
+1999-03-17  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Started implementing MS ADPCM decoder. 
+    If file is WAVE_FORMAT_ADPCM and length of data chunk is odd, this
+    encoder seems to add an extra byte. Why not just give an even data
+    length? 
+
+1999-03-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Split code out of wav.c to create wav_float.c and wav_ima_adpcm.c.
+    This will make it easier to add and debug other kinds of WAV files
+    in future.
+
+1999-03-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/
+    Added adpcm_test.c which implements test functions for
+    IMA ADPCM reading/writing/seeking etc.
+
+    * src/wav.c
+    Fixed many bugs in IMA ADPCM encoder and decoder. 
+
+1999-03-11  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Finished implementing IMA ADPCM encoder and decoder (what a bitch!). 
+
+1999-03-03  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/wav.c
+    Started implementing IMA ADPCM decoder. 
+
+1999-03-02  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/sndfile.c
+    Fixed bug where the sf_read_XXX functions were returning a 
+    incorrect read count when reading past end of file.
+    Fixed bug in sf_seek () when seeking backwards from end of file.
+
+    * tests/read_seek_test.c
+    Added multiple read test to short_test(), int_test () and
+    double_test ().
+    Added extra chunk to all test WAV files to test that reading
+    stops at end of 'data' chunk.
+
+1999-02-21  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/write_read_test.c
+    Added tests for little DEC endian AU files.
+
+    * src/au.c
+    Add handling for DEC format little endian AU files.
+
+1999-02-20  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c src/au.c src/wav.c
+    Add __psf_sprintf calls during header parsing.
+
+    * src/sndfile.c src/common.c
+    Implement sf_header_info (sndfile.c) function and __psf_sprintf (common.c).
+
+    * tests/write_read_test.c
+    Added tests for 8 bit PCM files (WAV, AIFF and AU).
+
+    * src/au.c src/aiff.c
+    Add handling of 8 bit PCM data format.
+
+    * src/aiff.c
+    On write, set blocksize in SSND chunk to zero like everybody else.
+
+1999-02-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/pcm.c:
+    Fixed bug in let2s_array (cptr was not being initialised).
+
+    * src/sndfile.c:
+    Fixed bug in sf_read_raw and sf_write_raw. sf_seek should
+    now work when using these functions.
+
+1999-02-15  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * tests/write_read_test.c:
+    Force test_buffer array to be double aligned. Sparc Solaris
+    requires this.
+
+1999-02-14  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/pcm.c:
+    Fixed a bug which was causing errors in the reading
+    and writing of 24 bit PCM files.
+
+    * doc/api.html
+    Finished of preliminary documentaion.
+
+1999-02-13  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * src/aiff.c:
+    Changed reading of 'COMM' chunk to avoid reading an int
+    which overlaps an int (4 byte) boundary.
+
--- /dev/null
+++ b/common/libsndfile/INSTALL
@@ -1,0 +1,182 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
--- /dev/null
+++ b/common/libsndfile/MacOS/MacOS-readme.txt
@@ -1,0 +1,82 @@
+BUILDING LIBSNDFILE FOR MACINTOSH (Pre Mac OSX)
+-----------------------------------------------
+
+These instructions are current as of libsndfile 0.0.16, and assume the
+following development environment:
+
+- MacOS 8.6
+- Metrowerks CodeWarrior Pro4 (IDE3.3, and all publicly available
+  compiler updates as of June, 1999)
+- Apple Universal Libraries 3.2
+
+The following procedure is recommended for building a libsndfile library
+suitable for inclusion in other MacOS projects:
+
+1. using CodeWarrior, create a new "Empty Project"
+
+2. obtain the libsndfile source distribution (see homepage URL below);
+   add all ".c" files found in the top level of the "src", "src/GSM610" and 
+   "src/G72x" folders to the project
+
+3. starting from the factory defaults, adjust the following project
+   settings:
+   - Target Settings panel:
+        linker = "MacOS PPC Linker"
+   - PPC Target panel:
+        project type = "Library"
+        file name = "libsndfile"
+
+4. grab the "config.h" file from the MacOS directory and replace the default
+   config.h file in the "src" directory
+
+5. Make the project
+
+
+CROSSPLATFORM (x86) BUILDS?
+--------------------------
+
+For situations in which CodeWarrior is being used to develop a project
+for dual-platform operation, it is possible to build an x86 version of
+libsndfile on the mac as well.  Use the procedure above to set up the
+PPC target, then perform the following steps:
+
+6. create a new target, by cloning the existing ppc target (created
+   above)
+
+7. adjust the following project settings:
+   - Target Settings panel:
+        linker = "Win32 x86 Linker"
+   - x86 Settings panel:
+        project type = "Library (LIB)"
+        file name = "libsndfile.x32.lib"
+   - Access Paths panel:
+        add this compiler-relative path at the TOP of "System Paths"
+        (note: this must be at the TOP of the path list):
+          "{Compiler}:Win32-x86 Support:Headers:Win32 SDK:sys:"
+
+8. Make the x86 target
+
+
+SEE ALSO
+--------
+
+The file "README" in the libsndfile distribution, for general
+information about libsndfile.
+
+
+CONTACTS
+--------
+
+libsndfile was written by Erik de Castro Lopo (erikd@zip.com.au).  
+The libsndfile home page is at :
+
+        http://www.zip.com.au/~erikd/libsndfile/
+
+MacOS-specific questions, and issues specific to the instructions
+contained in this document should be directed to Ben "Jacobs" at the
+address below.
+
+
+Good luck,
+
+-Ben "Jacobs" <random@well.com>
--- /dev/null
+++ b/common/libsndfile/MacOS/Makefile.am
@@ -1,0 +1,1 @@
+EXTRA_DIST = 	config.h MacOS-readme.txt
--- /dev/null
+++ b/common/libsndfile/MacOS/Makefile.in
@@ -1,0 +1,182 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+VERSION = @VERSION@
+subdirs = @subdirs@
+
+EXTRA_DIST = config.h MacOS-readme.txt
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../src/config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps MacOS/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = MacOS
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+++ b/common/libsndfile/MacOS/config.h
@@ -1,0 +1,93 @@
+/* src/config.h.  Generated automatically by configure.  */
+/* src/config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+/* #undef off_t */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+/* #undef off_t */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Set to 1 if the processor is big endian, otherwise set to 0.  */
+#ifdef __MWERKS__
+#ifdef _WIN32
+#define GUESS_BIG_ENDIAN 0
+#define GUESS_LITTLE_ENDIAN 1
+#else
+#define GUESS_BIG_ENDIAN 1
+#define GUESS_LITTLE_ENDIAN 0
+#endif
+#endif
+
+/* Set to 1 to force the use of code for processors with broken floats */
+/* Otherwise set it to 0.  */
+#define	FORCE_BROKEN_FLOAT 0
+
+/* The number of bytes in a double.  */
+#define SIZEOF_DOUBLE 8
+
+/* The number of bytes in a float.  */
+#define SIZEOF_FLOAT 4
+
+/* The number of bytes in a int.  */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long.  */
+#define SIZEOF_LONG 4
+
+/* The number of bytes in a short.  */
+#define SIZEOF_SHORT 2
+
+/* The number of bytes in a void*.  */
+#define SIZEOF_VOIDP 4
+
+/* Define if you have the fclose function.  */
+#define HAVE_FCLOSE 1
+
+/* Define if you have the fopen function.  */
+#define HAVE_FOPEN 1
+
+/* Define if you have the fread function.  */
+#define HAVE_FREAD 1
+
+/* Define if you have the free function.  */
+#define HAVE_FREE 1
+
+/* Define if you have the fseek function.  */
+#define HAVE_FSEEK 1
+
+/* Define if you have the ftell function.  */
+#define HAVE_FTELL 1
+
+/* Define if you have the fwrite function.  */
+#define HAVE_FWRITE 1
+
+/* Define if you have the malloc function.  */
+#define HAVE_MALLOC 1
+
+/* Define if you have the snprintf function.  */
+#define HAVE_SNPRINTF 1
+
+/* Define if you have the vsnprintf function.  */
+#define HAVE_VSNPRINTF 1
+
+/* Define if you have the <endian.h> header file.  */
+#define HAVE_ENDIAN_H 1
+
+/* Name of package */
+#define PACKAGE "libsndfile"
+
+/* Version number of package */
+#define VERSION "0.0.26"
+
--- /dev/null
+++ b/common/libsndfile/Makefile.am
@@ -1,0 +1,5 @@
+DIST_SUBDIRS = src examples doc tests Win32 MacOS
+SUBDIRS = @subdirs@
+EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec \
+			 check_libsndfile.py
+
--- /dev/null
+++ b/common/libsndfile/Makefile.in
@@ -1,0 +1,365 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+VERSION = @VERSION@
+subdirs = @subdirs@
+
+DIST_SUBDIRS = src examples doc tests Win32 MacOS
+SUBDIRS = @subdirs@
+EXTRA_DIST = reconf acconfig.h libsndfile.spec.in libsndfile.spec 			 check_libsndfile.py
+
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ./src/config.h
+CONFIG_CLEAN_FILES =  libsndfile.spec
+DIST_COMMON =  README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
+Makefile.in NEWS TODO acconfig.h aclocal.m4 config.guess config.sub \
+configure configure.in install-sh libsndfile.spec.in ltconfig ltmain.sh \
+missing mkinstalldirs src/config.h.in src/stamp-h.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in 
+	cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+	cd $(srcdir) && $(AUTOCONF)
+
+src/config.h: src/stamp-h
+	@if test ! -f $@; then \
+		rm -f src/stamp-h; \
+		$(MAKE) src/stamp-h; \
+	else :; fi
+src/stamp-h: $(srcdir)/src/config.h.in $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
+	     $(SHELL) ./config.status
+	@echo timestamp > src/stamp-h 2> /dev/null
+$(srcdir)/src/config.h.in: $(srcdir)/src/stamp-h.in
+	@if test ! -f $@; then \
+		rm -f $(srcdir)/src/stamp-h.in; \
+		$(MAKE) $(srcdir)/src/stamp-h.in; \
+	else :; fi
+$(srcdir)/src/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+	cd $(top_srcdir) && $(AUTOHEADER)
+	@echo timestamp > $(srcdir)/src/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+	-rm -f src/config.h
+
+maintainer-clean-hdr:
+libsndfile.spec: $(top_builddir)/config.status libsndfile.spec.in
+	cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+	  rev="$$subdir $$rev"; \
+	  test "$$subdir" = "." && dot_seen=yes; \
+	done; \
+	test "$$dot_seen" = "no" && rev=". $$rev"; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+	    test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	-rm -rf $(distdir)
+	GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+	mkdir $(distdir)/=build
+	mkdir $(distdir)/=inst
+	dc_install_base=`cd $(distdir)/=inst && pwd`; \
+	cd $(distdir)/=build \
+	  && ../configure --srcdir=.. --prefix=$$dc_install_base \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist
+	-rm -rf $(distdir)
+	@banner="$(distdir).tar.gz is ready for distribution"; \
+	dashes=`echo "$$banner" | sed s/./=/g`; \
+	echo "$$dashes"; \
+	echo "$$banner"; \
+	echo "$$dashes"
+dist: distdir
+	-chmod -R a+r $(distdir)
+	GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+	-rm -rf $(distdir)
+dist-all: distdir
+	-chmod -R a+r $(distdir)
+	GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+	-rm -rf $(distdir)
+distdir: $(DISTFILES)
+	-rm -rf $(distdir)
+	mkdir $(distdir)
+	-chmod 777 $(distdir)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+	for subdir in $(DIST_SUBDIRS); do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d $(distdir)/$$subdir \
+	    || mkdir $(distdir)/$$subdir \
+	    || exit 1; \
+	    chmod 777 $(distdir)/$$subdir; \
+	    (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-recursive
+	-rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
+		maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+++ b/common/libsndfile/NEWS
@@ -1,0 +1,95 @@
+Version 0.0.26 (2001-09-30)
+  * Offical release.
+  * Changed how A-law and u-law WAV file headers are written to allow files generated
+    by libsndfile to be read by M$ windoze.
+  * Added IRCAM file support.
+  * Minor bug fixes.
+  * This will be the last release in the 0.0.X development stream apart from bug fixes.
+    A new deveopement stream with minor interface changes in already in development.
+
+Version 0.0.25 (2001-09-24)
+  * Offical release.
+  * Added sf_command () interface which allows switching normalisation on and off for
+    sf_read/write_float () methods.  
+  * Minor bug fixes.
+  * This will be the last release in the 0.0.X development stream apart from bug fixes.
+    A new deveopement stream with minor interface changes in already in development.
+
+Version 0.0.24 (2001-08-19)
+  * Offical release.
+  * Massive refactoring of header reading code for all file formats.
+  * Added sf_read_float () and sf_write_float () interfaces.
+  * Minor bug fixes.
+
+Version 0.0.23 (2001-07-06)
+  * Offical release.
+  * Massive refactoring of header writing code for all file formats.
+  * Added support for Sphere NIST.
+  * Added support for 32 bit float AIFF and little endian AIFF files (Mac OSX).
+  * Added read and write support for the PEAK chunk in 32 bit float AIFF and WAV files.
+  * Added support for REX files (Propellorheads Reason).
+  * Minor bug fixes.
+
+Version 0.0.22 (2000-10-17)
+  * Offical release.
+  * Bug fix in G723 AU file handling.
+
+Version 0.0.21 (2000-08-16)
+  * Offical release.
+  * AU files without the normal AU file header are now recognised as headerless
+    8kHz 8 bit ulaw encoded files.
+  * Added handling for G721 4bit APDCM encoded AU files.
+  * Added handling for G723 3bit APDCM encoded AU files.
+  * Improved Win32 compiling and use instructions from Mike Ricos.
+  * License change from GPL to LGPL.
+
+Version 0.0.20 (2000-05-30)
+  * Offical release.
+  * Minor bug fix for LinuxPPC (endian issues).
+
+Version 0.0.19 (2000-05-20)
+  * Offical release.
+  * Minor bug fix for handling GSM 6.10 encoded WAV files on big endian machines.
+
+Version 0.0.18 (2000-04-25)
+  * Offical release.
+  * Added handling for GSM 6.10 encoded WAV files.
+  * Minor bug fixes.
+
+Version 0.0.17 (1999-11-16)
+  * Offical release.
+  * New file formats (SVX and PAF).
+  * Minor bug fixes.
+
+Version 0.0.16 (1999-07-31)
+  * Offical release.
+  * Fixed minor MacOS configuration issues.
+
+Version 0.0.15 (1999-07-30)
+  * Offical release.
+  * Added MS ADPCM WAV file write.
+  * Added WAV and AU file A-law and u-law encoding.
+  * Added RAW header-less PCM file handling.
+  * Added MacOS support (thanks to Ben "Jacobs").
+
+Version 0.0.12 (1999-06-19)
+  * Offical release.
+  * Code cleanup to remove compiler warning messages.
+
+Version 0.0.10 (1999-06-12)
+  * Unoffical release.
+  * Changes to low level code which improve error detection and handling.
+  * Added read-only handling of Microsoft ADPCM WAV files.
+  * Added Win32 support (almost exclusively due to Albert Faber, thanks).
+  * Fixed bug in IMA ADPCM file writing.
+
+Version 0.0.9 (1999-03-14)
+  * Add handling of IMA ADPCM WAV files.
+  * Add new function sf_get_header_info and add example program sfinfo.
+  * Implemented 8 bit PCM data formats for AIFF, AU and WAV.
+  
+Version 0.0.8 (1999-02-16)
+  * First offical release.
+
+Version 0.0.7 (1999-02-13)
+  * First unoffical release.
--- /dev/null
+++ b/common/libsndfile/README
@@ -1,0 +1,62 @@
+This is libsndfile, 0.0.26
+
+libsndfile is a library of C routines for reading and writing 
+files containing sampled audio data. 
+
+The src/ directory contains the source code for library itself.
+
+The doc/ directory contains the libsndfile documentation.
+
+The examples/ directory contains examples of how to write code using
+libsndfile. 'wav32_aiff24' converts a WAV file containing 32 bit floating 
+point data into a 24 bit PCM AIFF file. 'sndfile2oct' dumps the audio
+data of a file in a human readable format. 'sfconvert' is the beginnings
+of a audio file format conversion utility. 'make_sine' generates a WAV
+file containing one cycle of a sine wave with 4096 sample points in
+32 bit floating point format. 'sfinfo' opens a sound file and prints
+out information about that file.
+
+The tests/ directory contains programs which link against libsndfile
+and test its functionality.
+
+The Win32/ directory contains files and documentation to allow libsndfile
+to compile under Win32 with the Microsoft Visual C++ compiler.
+
+The MacOS/ directory contains files and documentation to allow libsndfile
+to compile under MacOS with the Metrowerks compiler.
+
+The src/GSM610 directory contains code written by Jutta Degener and Carsten 
+Bormann. Their original code can be found at :
+    http://kbs.cs.tu-berlin.de/~jutta/toast.html
+
+The src/G72x directory contains code written and released by Sum Microsystems
+under a suitably free license.
+
+OTHER PLATFORMS
+---------------
+
+To compile libsndfile on platforms which have a Bourne Shell compatible
+shell, an ANSI C compiler and a make utility should require no more that
+the following three commands :
+		./configure
+		make
+		make install
+		
+For platforms without the required shell, it is usually sufficient to 
+create an approriate config.h file in the src/ directory with correct
+values for the following #defines  (this would work for AmigaOS) :
+
+#define HAVE_ENDIAN_H 0
+#define GUESS_BIG_ENDIAN 1
+#define GUESS_LITTLE_ENDIAN 0
+#define FORCE_BROKEN_FLOAT 0
+
+
+CONTACTS
+--------
+
+libsndfile was written by Erik de Castro Lopo (erikd AT zip DOT com DOT au).  
+The libsndfile home page is at :
+
+	http://www.zip.com.au/~erikd/libsndfile/
+
--- /dev/null
+++ b/common/libsndfile/TODO
@@ -1,0 +1,46 @@
+Here's a list of what I (erikd AT zip DOT com DOT au) think needs to be 
+done. The list is by no means exhaustive and people are encouraged to 
+email me with suggestions. 
+
+  o Add pipe in/out capabilities. libsndfile should be able to read 
+	its input from a pipe and write its output to a pipe.
+
+  o Add checks of the error state after fseek???? Use ferror ().
+
+  o Modify tests/lossy_comp_test.c to add tests for stereo files.
+
+  o Testing compilation and correctness on more platforms.
+
+  o Improve testing routines. Must test all combinations of inputs
+    and outputs.
+
+  o Test sf_seek function on write???
+
+  o Get hold of a couple of Sun/Next AU files containing 32 and 64 bit 
+    floating point data write code to read and write them (well at least
+    the 32 bit ones).
+
+  o Add more sound file formats. People should contact me with their
+    requirements. 
+
+  o Add support for accessing sound formats with multiple audio
+    data sections (ie samples within tracker files, Soundfont II and 
+    multi-sample sampler formats). 
+
+  o Add an interface to allow reading and writing of sample loop points 
+    and other info within AIFF and other file formats. This must be a 
+    general solution.
+
+  o Improve documentation. Is HTML documentation good enough?
+
+  o Look into the possibility of optional sample rate convert on file 
+    read.
+
+As I am the person who knows libsndfile best, I can probably implement 
+any new features faster than anybody else (and you can spend your time
+writing applications with libsndfile). All I need is some 
+documentation and some sample files. Please contact me before emailing
+me documentation and sample files. I would much rather pull them off
+the web than have them clogging up my email inbox.
+
+
--- /dev/null
+++ b/common/libsndfile/Win32/Makefile.am
@@ -1,0 +1,3 @@
+EXTRA_DIST = 	README-Win32.txt README-Win32.txt.old	\
+				config.h unistd.h
+				
--- /dev/null
+++ b/common/libsndfile/Win32/Makefile.in
@@ -1,0 +1,183 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+VERSION = @VERSION@
+subdirs = @subdirs@
+
+EXTRA_DIST = README-Win32.txt README-Win32.txt.old					config.h unistd.h
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../src/config.h
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Win32/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = Win32
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-generic distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+++ b/common/libsndfile/Win32/README-Win32.txt
@@ -1,0 +1,89 @@
+This is the readme-Win32.txt file associated with the LibSndFile 
+library. It describes how the included workspace and project 
+was created for Microsoft Visual C++ developer's studio (MSVC), 
+version 5.0.  Skip to point 7 if you wish to create a new 
+project for building an executable.
+
+1. Extracted libsndfile.zip to d:\files\msvc\
+
+2. It created (replace X.Y.Z with the libsndfile version number)
+     d:\files\msvc\libsndfile-X.Y.Z\Win32      *
+     d:\files\msvc\libsndfile-X.Y.Z\src        *
+     d:\files\msvc\libsndfile-X.Y.Z\tests      *
+     d:\files\msvc\libsndfile-X.Y.Z\examples   
+     d:\files\msvc\libsndfile-X.Y.Z\doc
+     d:\files\msvc\libsndfile-X.Y.Z\m4
+     d:\files\msvc\libsndfile-X.Y.Z\MacOS
+
+     * are needed for this example
+
+3. From MSVC:New->Workspace, I created LibSndFileWorkspace at:
+    d:\files\msvc\libsndfile-X.Y.Z\Win32\
+    (workspace files have the extension .dsw)
+
+3. In MSVC, rt-click on "Workspace LibSndFileWorkspace" and add project:
+    Project type:      Win32 Static Library  
+    Project Name:      LibSndFile 
+    Project Location:  D:\files\msvc\libsndfile-X.Y.Z\Win32
+    Select button:     'Add to current workspace' 
+    Platforms:         Win32
+
+4.  Rt-click newly formed "LibSndFile files" and add files:
+     d:\files\msvc\libsndfile-X.Y.Z\src\*.*
+     d:\files\msvc\libsndfile-X.Y.Z\src\Gsm610\*.*
+     d:\files\msvc\libsndfile-X.Y.Z\src\G72x\*.*
+
+5.  Rt-click 'LibSndFile files' and  go to Settings
+     a. Select all configurations on the left hand side
+     b. Then select C/C++/Preprocessor and add
+     "..\" (no quotes) to 'Additional include directories'
+     (This allows ..Win32\config.h and unistd.h to be found.)
+
+6.  At this point you should be able to build the library. The output
+    will be found in ..\Win32\LibSndFile\Debug\LibSndFile.lib. You can
+    change the LibSndFile project to Release and a similar release 
+    path will be created.
+
+The following describes how to add an application project to the 
+workspace. You may add as many as you wish. In general, you will
+need one project for each executable you want to create.
+
+7. Rt-click LibSndFileWorkspace and select 'Add project'
+    Project type:      Win32 Console Application   
+    Project Name:      sfversion 
+    Location: d:\files\msvc\libsndfile-X.Y.Z\Win32\sfversion 
+    Select button:     'Add to current workspace' 
+    Platforms:         Win32
+    
+    Notes: 
+     - MSVC will create a directory ..\Win32\sfversion\
+     - MSVC will create the file sfversion.dsp in this directory
+
+8. Rt-click 'sfversion files' and add file:
+     d:\files\msvc\libsndfile-X.Y.Z\tests\sfversion.c
+
+9. Rt-click 'sfversion files' and go to Settings:
+     a. Select 'All configurations' on the left hand side
+     b. Then select C/C++/Preprocessor and add
+     "..\..\src,..\" (no quotes) to 'Additional include directories'
+
+9. Rt-click 'sfversion files' and go to Settings:
+     a. Select 'Debug Configuration' on left hand side
+     b. Then select Link tab and add
+     "..\LibSndFile\Debug\LibSndFile.lib " (no quotes) to 
+     the list of 'Object/library modules'. Leave a space between new
+     addition existing lib files.
+
+10. Repeat above for Release build adding Release path info.
+
+11. Build your application, it should link and create an .exe
+
+Final notes:
+
+Files created during build by msvc but are not needed for archive:
+*ncb *.plg *.opt *.obj *.idb *.pch *.lib *.exe
+
+Files associated with LibSndFile but not used by msvc:
+Makefile.in
+Makefile.am
+                          - End -  
--- /dev/null
+++ b/common/libsndfile/Win32/README-Win32.txt.old
@@ -1,0 +1,32 @@
+The MSCV++ workspace and project files have been broken for some time and I 
+have not found anyone willing to fix them or provide new ones. I hope the
+following instructions will be sufficient for Win32 to users to build, test
+and use this library.
+
+It is assumed that when you unzip the source code package you will keep the
+directory structure of the archive.
+
+The source code for the library it self is in following directories under 
+the main libsndfile directory:
+
+		src/
+		src/GSM610/
+
+To build the library you need to create a project containing all the *.c files 
+in these two directories. In addition, you should copy the two header files
+in the Win32/ directory (config.h and unistd.h) to the src/ directory. In the
+case of config.h you will be overwriting the existing config.h file.
+
+The test programs are all in the directory tests/ which contains one .c file
+for each test program. To create all the test programs you will need to 
+compile each of these test programs and link it to the library.
+
+Finally, there is also a directory examples/, which contains a number of small
+example programs. These can be compiled and linked much like the files in the
+tests/ directory.
+
+Anybody who can add to or clarify these instructions should should send me 
+email at <erikd@zip.com.au>.
+
+Erik de Castro Lopo
+May 30th, 2000
--- /dev/null
+++ b/common/libsndfile/Win32/config.h
@@ -1,0 +1,88 @@
+/* src/config.h.  Generated automatically by configure.  */
+/* src/config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+/* #undef off_t */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+/* #undef off_t */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Set to 1 if the processor is big endian, otherwise set to 0.  */
+#define GUESS_BIG_ENDIAN 0
+
+/* Set to 1 if the processor is little endian, otherwise set to 0.  */
+#define GUESS_LITTLE_ENDIAN 1
+
+/* Set to 1 to force the use of code for processors with broken floats */
+/* Otherwise set it to 0.  */
+#define FORCE_BROKEN_FLOAT 0
+
+/* The number of bytes in a double.  */
+#define SIZEOF_DOUBLE 8
+
+/* The number of bytes in a float.  */
+#define SIZEOF_FLOAT 4
+
+/* The number of bytes in a int.  */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long.  */
+#define SIZEOF_LONG 4
+
+/* The number of bytes in a short.  */
+#define SIZEOF_SHORT 2
+
+/* The number of bytes in a void*.  */
+#define SIZEOF_VOIDP 4
+
+/* Define if you have the fclose function.  */
+#define HAVE_FCLOSE 1
+
+/* Define if you have the fopen function.  */
+#define HAVE_FOPEN 1
+
+/* Define if you have the fread function.  */
+#define HAVE_FREAD 1
+
+/* Define if you have the free function.  */
+#define HAVE_FREE 1
+
+/* Define if you have the fseek function.  */
+#define HAVE_FSEEK 1
+
+/* Define if you have the ftell function.  */
+#define HAVE_FTELL 1
+
+/* Define if you have the fwrite function.  */
+#define HAVE_FWRITE 1
+
+/* Define if you have the malloc function.  */
+#define HAVE_MALLOC 1
+
+/* Define if you have the snprintf function.  */
+#define HAVE_SNPRINTF 0
+
+/* Define if you have the vsnprintf function.  */
+#define HAVE_VSNPRINTF 0
+
+/* Define if you have the <endian.h> header file.  */
+#define HAVE_ENDIAN_H 0
+
+/* Name of package */
+#define PACKAGE "libsndfile"
+
+/* Version number of package */
+#define VERSION "0.0.26"
+
--- /dev/null
+++ b/common/libsndfile/Win32/libsndfile.dsp
@@ -1,0 +1,208 @@
+# Microsoft Developer Studio Project File - Name="libsndfile" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=libsndfile - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "libsndfile.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "libsndfile.mak" CFG="libsndfile - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "libsndfile - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "libsndfile - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=xicl6.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libsndfile - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE RSC /l 0x413 /d "NDEBUG"
+# ADD RSC /l 0x413 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=xilink6.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF  "$(CFG)" == "libsndfile - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x413 /d "_DEBUG"
+# ADD RSC /l 0x413 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=xilink6.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libsndfile - Win32 Release"
+# Name "libsndfile - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\src\aiff.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\au.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\common.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\float32.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\ircam.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\nist.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\paf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\pcm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\raw.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\samplitude.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sndfile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\svx.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\voc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\wav.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\src\au.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\config.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\config.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\floatcast.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\G72x\g72x.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\gsm.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\G72x\private.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\private.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\proto.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sfendian.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\sndfile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\unistd.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\GSM610\unproto.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\wav.h
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null
+++ b/common/libsndfile/Win32/libsndfile.dsw
@@ -1,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "libsndfile"=.\libsndfile.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+++ b/common/libsndfile/Win32/unistd.h
@@ -1,0 +1,44 @@
+/*
+** Copyright (C) 1999 Albert Faber
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* A hack file in order to compile the libsndfile package for win32 systems 
+** Define the things that Bill and his fellows forgot to define
+*/
+
+#ifdef _WIN32
+#include <direct.h>
+
+#define	_IFMT		_S_IFMT
+#define _IFREG		_S_IFREG
+
+#define	S_ISREG(m)	((m) & _S_IFREG)
+
+#define	S_IRWXU 	0000700	/* rwx, owner */
+#define		S_IRUSR	0000400	/* read permission, owner */
+#define		S_IWUSR	0000200	/* write permission, owner */
+#define		S_IXUSR	0000100	/* execute/search permission, owner */
+#define	S_IRWXG		0000070	/* rwx, group */
+#define		S_IRGRP	0000040	/* read permission, group */
+#define		S_IWGRP	0000020	/* write permission, grougroup */
+#define		S_IXGRP	0000010	/* execute/search permission, group */
+#define	S_IRWXO		0000007	/* rwx, other */
+#define		S_IROTH	0000004	/* read permission, other */
+#define		S_IWOTH	0000002	/* write permission, other */
+#define		S_IXOTH	0000001	/* execute/search permission, other */
+
+#endif
\ No newline at end of file
--- /dev/null
+++ b/common/libsndfile/acconfig.h
@@ -1,0 +1,288 @@
+/* acconfig.h
+   This file is in the public domain.
+
+   Descriptive text for the C preprocessor macros that
+   the distributed Autoconf macros can define.
+   No software package will use all of them; autoheader copies the ones
+   your configure.in uses into your configuration header file templates.
+
+   The entries are in sort -df order: alphabetical, case insensitive,
+   ignoring punctuation (such as underscores).  Although this order
+   can split up related entries, it makes it easier to check whether
+   a given entry is in the file.
+
+   Leave the following blank line there!!  Autoheader needs it.  */
+
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+#undef _ALL_SOURCE
+#endif
+
+/* Define if using alloca.c.  */
+#undef C_ALLOCA
+
+/* Define if type char is unsigned and you are not using gcc.  */
+#ifndef __CHAR_UNSIGNED__
+#undef __CHAR_UNSIGNED__
+#endif
+
+/* Define if the closedir function returns void instead of int.  */
+#undef CLOSEDIR_VOID
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+#undef CRAY_STACKSEG_END
+
+/* Define for DGUX with <sys/dg_sys_info.h>.  */
+#undef DGUX
+
+/* Define if you have <dirent.h>.  */
+#undef DIRENT
+
+/* Define to the type of elements in the array set by `getgroups'.
+   Usually this is either `int' or `gid_t'.  */
+#undef GETGROUPS_T
+
+/* Define if the `getloadavg' function needs to be run setuid or setgid.  */
+#undef GETLOADAVG_PRIVILEGED
+
+/* Define if the `getpgrp' function takes no argument.  */
+#undef GETPGRP_VOID
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef gid_t
+
+/* Define if you have alloca, as a function or macro.  */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+#undef HAVE_ALLOCA_H
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if your system has a working fnmatch function.  */
+#undef HAVE_FNMATCH
+
+/* Define if your system has its own `getloadavg' function.  */
+#undef HAVE_GETLOADAVG
+
+/* Define if you have the getmntent function.  */
+#undef HAVE_GETMNTENT
+
+/* Define if the `long double' type works.  */
+#undef HAVE_LONG_DOUBLE
+
+/* Define if you support file names longer than 14 characters.  */
+#undef HAVE_LONG_FILE_NAMES
+
+/* Define if you have a working `mmap' system call.  */
+#undef HAVE_MMAP
+
+/* Define if system calls automatically restart after interruption
+   by a signal.  */
+#undef HAVE_RESTARTABLE_SYSCALLS
+
+/* Define if your struct stat has st_blksize.  */
+#undef HAVE_ST_BLKSIZE
+
+/* Define if your struct stat has st_blocks.  */
+#undef HAVE_ST_BLOCKS
+
+/* Define if you have the strcoll function and it is properly defined.  */
+#undef HAVE_STRCOLL
+
+/* Define if your struct stat has st_rdev.  */
+#undef HAVE_ST_RDEV
+
+/* Define if you have the strftime function.  */
+#undef HAVE_STRFTIME
+
+/* Define if you have the ANSI # stringizing operator in cpp. */
+#undef HAVE_STRINGIZE
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
+#undef HAVE_SYS_WAIT_H
+
+/* Define if your struct tm has tm_zone.  */
+#undef HAVE_TM_ZONE
+
+/* Define if you don't have tm_zone but do have the external array
+   tzname.  */
+#undef HAVE_TZNAME
+
+/* Define if you have <unistd.h>.  */
+#undef HAVE_UNISTD_H
+
+/* Define if utime(file, NULL) sets file's timestamp to the present.  */
+#undef HAVE_UTIME_NULL
+
+/* Define if you have <vfork.h>.  */
+#undef HAVE_VFORK_H
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define if you have the wait3 system call.  */
+#undef HAVE_WAIT3
+
+/* Define as __inline if that's what the C compiler calls it.  */
+#undef inline
+
+/* Define if int is 16 bits instead of 32.  */
+#undef INT_16_BITS
+
+/* Define if long int is 64 bits.  */
+#undef LONG_64_BITS
+
+/* Define if major, minor, and makedev are declared in <mkdev.h>.  */
+#undef MAJOR_IN_MKDEV
+
+/* Define if major, minor, and makedev are declared in <sysmacros.h>.  */
+#undef MAJOR_IN_SYSMACROS
+
+/* Define if on MINIX.  */
+#undef _MINIX
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef mode_t
+
+/* Define if you don't have <dirent.h>, but have <ndir.h>.  */
+#undef NDIR
+
+/* Define if you have <memory.h>, and <string.h> doesn't declare the
+   mem* functions.  */
+#undef NEED_MEMORY_H
+
+/* Define if your struct nlist has an n_un member.  */
+#undef NLIST_NAME_UNION
+
+/* Define if you have <nlist.h>.  */
+#undef NLIST_STRUCT
+
+/* Define if your C compiler doesn't accept -c and -o together.  */
+#undef NO_MINUS_C_MINUS_O
+
+/* Define if your Fortran 77 compiler doesn't accept -c and -o together. */
+#undef F77_NO_MINUS_C_MINUS_O
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef pid_t
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+#undef _POSIX_1_SOURCE
+
+/* Define if you need to in order for stat and other things to work.  */
+#undef _POSIX_SOURCE
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* Define to the type of arg1 for select(). */
+#undef SELECT_TYPE_ARG1
+
+/* Define to the type of args 2, 3 and 4 for select(). */
+#undef SELECT_TYPE_ARG234
+
+/* Define to the type of arg5 for select(). */
+#undef SELECT_TYPE_ARG5
+
+/* Define if the `setpgrp' function takes no argument.  */
+#undef SETPGRP_VOID
+
+/* Define if the setvbuf function takes the buffering type as its second
+   argument and the buffer pointer as the third, as on System V
+   before release 3.  */
+#undef SETVBUF_REVERSED
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+	STACK_DIRECTION > 0 => grows toward higher addresses
+	STACK_DIRECTION < 0 => grows toward lower addresses
+	STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly.  */
+#undef STAT_MACROS_BROKEN
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define on System V Release 4.  */
+#undef SVR4
+
+/* Define if you don't have <dirent.h>, but have <sys/dir.h>.  */
+#undef SYSDIR
+
+/* Define if you don't have <dirent.h>, but have <sys/ndir.h>.  */
+#undef SYSNDIR
+
+/* Define if `sys_siglist' is declared by <signal.h>.  */
+#undef SYS_SIGLIST_DECLARED
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if your <sys/time.h> declares struct tm.  */
+#undef TM_IN_SYS_TIME
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef uid_t
+
+/* Define for Encore UMAX.  */
+#undef UMAX
+
+/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
+   instead of <sys/cpustats.h>.  */
+#undef UMAX4_3
+
+/* Define if you do not have <strings.h>, index, bzero, etc..  */
+#undef USG
+
+/* Define vfork as fork if vfork does not work.  */
+#undef vfork
+
+/* Define if the closedir function returns void instead of int.  */
+#undef VOID_CLOSEDIR
+
+/* Define if your processor stores words with the most significant
+   byte first (like Motorola and SPARC, unlike Intel and VAX).  */
+#undef WORDS_BIGENDIAN
+
+/* Define if the X Window System is missing or not being used.  */
+#undef X_DISPLAY_MISSING
+
+/* Define if lex declares yytext as a char * by default, not a char[].  */
+#undef YYTEXT_POINTER
+
+
+/* Leave that blank line there!!  Autoheader needs it.
+   If you're adding to this file, keep in mind:
+   The entries are in sort -df order: alphabetical, case insensitive,
+   ignoring punctuation (such as underscores).  */
+
+/* Set to 1 if the processor is big endian, otherwise set to 0.  */
+#undef	GUESS_BIG_ENDIAN
+
+/* Set to 1 if the processor is little endian, otherwise set to 0.  */
+#undef	GUESS_LITTLE_ENDIAN
+
+/* Set to 1 to force the use of code for processors with broken floats */
+/* Otherwise set it to 0.  */
+#undef	FORCE_BROKEN_FLOAT
+
--- /dev/null
+++ b/common/libsndfile/aclocal.m4
@@ -1,0 +1,540 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated.  We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+  case " <<$>>CONFIG_HEADERS " in
+  *" <<$>>am_file "*<<)>>
+    echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+
+# serial 40 AC_PROG_LIBTOOL
+AC_DEFUN(AC_PROG_LIBTOOL,
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# Save cache, so that ltconfig can load it
+AC_CACHE_SAVE
+
+# Actually configure libtool.  ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
+LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
+DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
+|| AC_MSG_ERROR([libtool configure failed])
+
+# Reload cache, that may have been modified by ltconfig
+AC_CACHE_LOAD
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+])
+
+AC_DEFUN(AC_LIBTOOL_SETUP,
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+dnl
+
+case "$target" in
+NONE) lt_target="$host" ;;
+*) lt_target="$target" ;;
+esac
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN],
+[libtool_flags="$libtool_flags --enable-dlopen"])
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+[libtool_flags="$libtool_flags --enable-win32-dll"])
+AC_ARG_ENABLE(libtool-lock,
+  [  --disable-libtool-lock  avoid locking (might break parallel builds)])
+test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
+test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$lt_target" in
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case "`/usr/bin/file conftest.o`" in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw*)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+])
+esac
+])
+
+# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
+AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
+
+# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
+AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
+#   `yes'.
+AC_DEFUN(AC_ENABLE_SHARED, [dnl
+define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<<  --enable-shared[=PKGS]  build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+  enable_shared=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_shared=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
+#   `yes'.
+AC_DEFUN(AC_ENABLE_STATIC, [dnl
+define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<<  --enable-static[=PKGS]  build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+  enable_static=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_static=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to
+#   `yes'.
+AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl
+define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<<  --enable-fast-install[=PKGS]  optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+  enable_fast_install=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_fast_install=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)])
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AC_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  ac_prog=`($CC -print-prog-name=ld) 2>&5`
+  case "$ac_prog" in
+    # Accept absolute paths.
+changequote(,)dnl
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+changequote([,])dnl
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      ac_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+	test "$with_gnu_ld" != no && break
+      else
+	test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])
+
+AC_DEFUN(AC_PROG_LD_GNU,
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  ac_cv_prog_gnu_ld=yes
+else
+  ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN(AC_PROG_NM,
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  ac_cv_path_NM="$NM"
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	ac_cv_path_NM="$ac_dir/nm -B"
+	break
+      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	ac_cv_path_NM="$ac_dir/nm -p"
+	break
+      else
+	ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+	continue # so that we can try to find one that supports BSD flags
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN(AC_CHECK_LIBM,
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case "$lt_target" in
+*-*-beos* | *-*-cygwin*)
+  # These system don't have libm
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, main, LIBM="-lm")
+  ;;
+esac
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-convenience to the
+# configure arguments.  Note that LIBLTDL and INCLTDL are not
+# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If DIR is not
+# provided, it is assumed to be `libltdl'.  LIBLTDL will be prefixed
+# with '${top_builddir}/' and INCLTDL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!).  If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  case "$enable_ltdl_convenience" in
+  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+  "") enable_ltdl_convenience=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+  esac
+  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+  INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library and INCLTDL to the include flags for
+# the libltdl header and adds --enable-ltdl-install to the configure
+# arguments.  Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
+# AC_CONFIG_SUBDIRS called.  If DIR is not provided and an installed
+# libltdl is not found, it is assumed to be `libltdl'.  LIBLTDL will
+# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
+# with '${top_srcdir}/' (note the single quotes!).  If your package is
+# not flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+  AC_CHECK_LIB(ltdl, main,
+  [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+  [if test x"$enable_ltdl_install" = xno; then
+     AC_MSG_WARN([libltdl not installed, but installation disabled])
+   else
+     enable_ltdl_install=yes
+   fi
+  ])
+  if test x"$enable_ltdl_install" = x"yes"; then
+    ac_configure_args="$ac_configure_args --enable-ltdl-install"
+    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+    INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  else
+    ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+    LIBLTDL="-lltdl"
+    INCLTDL=
+  fi
+])
+
+dnl old names
+AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
+AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
+AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
+
+dnl This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])dnl
+
--- /dev/null
+++ b/common/libsndfile/check_libsndfile.py
@@ -1,0 +1,67 @@
+#!/usr/bin/env python 
+
+import commands, os, string, sys 
+
+# This program tests libsndfile against a user provided list of audio files. 
+# The list is provided as a text file. 
+# 
+
+_EXE_NAME = 'examples/sndfile_info'
+
+
+def dump_status_output_exit (status, output, msg = None): 
+	if msg: 
+		print msg 
+	print "Status :", status 
+	print output 
+	sys.exit (0) 
+
+def sfinfo_check_ok (filename): 
+	cmd = '%s %s' % (_EXE_NAME, filename) 
+	(status, output) = commands.getstatusoutput (cmd) 
+	if status: 
+		dump_status_output_exit (status, output, "Bad status. Dumping") 
+	if string.find (output, "should") > 0: 
+		dump_status_output_exit (status, output, "Found `should'. Dumping") 
+	if string.find (output, "*") > 0: 
+		dump_status_output_exit (status, output, "Found `*'. Dumping") 
+	return 
+
+def sfinfo_check_not_crash (filename): 
+	print filename 
+	 
+_USAGE = """ 
+This is the usage message. 
+
+""" 
+
+if len (sys.argv) != 2: 
+	print _USAGE 
+	sys.exit (0) 
+
+
+if not os.path.isfile (_EXE_NAME): 
+	print "Could not find required program :", _EXE_NAME 
+	sys.exit (0) 
+
+list_file = open (sys.argv [1]) 
+
+while 1: 
+	line = list_file.readline () 
+	if not line: 
+		break  
+	line = string.strip (line)
+	if len (line) < 1:
+		continue 
+	if line [0] == '#':
+		continue 
+	print line
+	if os.path.isfile (line): 
+		sfinfo_check_ok (line) 
+	else: 
+		print "Bad file name : ", line 
+		sys.exit (0) 
+
+list_file.close () 
+
+print "Finished. No errors found." 
--- /dev/null
+++ b/common/libsndfile/config.guess
@@ -1,0 +1,1183 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+#   Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# Use $HOST_CC if defined. $CC may point to a cross-compiler
+if test x"$CC_FOR_BUILD" = x; then
+  if test x"$HOST_CC" != x; then
+    CC_FOR_BUILD="$HOST_CC"
+  else
+    if test x"$CC" != x; then
+      CC_FOR_BUILD="$CC"
+    else
+      CC_FOR_BUILD=cc
+    fi
+  fi
+fi
+
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-cbm ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format.
+	if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep __ELF__ >/dev/null
+	then
+	    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+	    # Return netbsd for either.  FIX?
+	    os=netbsd
+	else
+	    os=netbsdelf
+	fi
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	cat <<EOF >$dummy.s
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		esac
+	fi
+	rm -f $dummy.s $dummy
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-cbm-sysv4
+	exit 0;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    arc64:OpenBSD:*:*)
+	echo mips64el-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hkmips:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mips-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+		rm -f $dummy.c $dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:4)
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=4.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	rm -f $dummy.c $dummy
+	esac
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i?86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    hppa*:OpenBSD:*:*)
+	echo hppa-unknown-openbsd
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i386-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:Linux:*:*)
+
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	ld_help_string=`cd /; ld --help 2>&1`
+	ld_supported_emulations=`echo $ld_help_string \
+			 | sed -ne '/supported emulations:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported emulations: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_emulations" in
+	  *ia64)
+		echo "${UNAME_MACHINE}-unknown-linux"
+		exit 0
+		;;
+	  i?86linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0
+		;;
+	  elf_i?86)
+		echo "${UNAME_MACHINE}-pc-linux"
+		exit 0
+		;;
+	  i?86coff)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0
+		;;
+	  sparclinux)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+		exit 0
+		;;
+	  armlinux)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+		exit 0
+		;;
+	  elf32arm*)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuoldld"
+		exit 0
+		;;
+	  armelf_linux*)
+		echo "${UNAME_MACHINE}-unknown-linux-gnu"
+		exit 0
+		;;
+	  m68klinux)
+		echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+		exit 0
+		;;
+	  elf32ppc | elf32ppclinux)
+		# Determine Lib Version
+		cat >$dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#if defined(__GLIBC__)
+  printf("%s %s\n", __libc_version, __libc_release);
+#else
+  printf("unkown\n");
+#endif
+  return 0;
+}
+EOF
+		LIBC=""
+		$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
+		if test "$?" = 0 ; then
+			./$dummy | grep 1\.99 > /dev/null
+			if test "$?" = 0 ; then
+				LIBC="libc1"
+			fi
+		fi
+		rm -f $dummy.c $dummy
+		echo powerpc-unknown-linux-gnu${LIBC}
+		exit 0
+		;;
+	esac
+
+	if test "${UNAME_MACHINE}" = "alpha" ; then
+		cat <<EOF >$dummy.s
+			.data
+		\$Lformat:
+			.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+			.text
+			.globl main
+			.align 4
+			.ent main
+		main:
+			.frame \$30,16,\$26,0
+			ldgp \$29,0(\$27)
+			.prologue 1
+			.long 0x47e03d80 # implver \$0
+			lda \$2,-1
+			.long 0x47e20c21 # amask \$2,\$1
+			lda \$16,\$Lformat
+			mov \$0,\$17
+			not \$1,\$18
+			jsr \$26,printf
+			ldgp \$29,0(\$26)
+			mov 0,\$16
+			jsr \$26,exit
+			.end main
+EOF
+		LIBC=""
+		$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+		if test "$?" = 0 ; then
+			case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+			esac
+
+			objdump --private-headers $dummy | \
+			  grep ld.so.1 > /dev/null
+			if test "$?" = 0 ; then
+				LIBC="libc1"
+			fi
+		fi
+		rm -f $dummy.s $dummy
+		echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+	elif test "${UNAME_MACHINE}" = "mips" ; then
+	  cat >$dummy.c <<EOF
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	  $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+	  rm -f $dummy.c $dummy
+	elif test "${UNAME_MACHINE}" = "s390"; then
+	  echo s390-ibm-linux && exit 0
+	else
+	  # Either a pre-BFD a.out linker (linux-gnuoldld)
+	  # or one that does not give us useful --help.
+	  # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+	  # If ld does not provide *any* "supported emulations:"
+	  # that means it is gnuoldld.
+	  echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+	  test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+	  case "${UNAME_MACHINE}" in
+	  i?86)
+	    VENDOR=pc;
+	    ;;
+	  *)
+	    VENDOR=unknown;
+	    ;;
+	  esac
+	  # Determine whether the default compiler is a.out or elf
+	  cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	  $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+	  rm -f $dummy.c $dummy
+	fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i?86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i?86:*:5:7*)
+        # Fixed at (any) Pentium or better
+        UNAME_MACHINE=i586
+        if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
+	    echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
+	else
+	    echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    i?86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    i?86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:*:6*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-W:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
--- /dev/null
+++ b/common/libsndfile/config.sub
@@ -1,0 +1,1268 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+#   Free Software Foundation, Inc.
+#
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+	echo Configuration name missing. 1>&2
+	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+	echo "or     $0 ALIAS" 1>&2
+	echo where ALIAS is a recognized configuration type. 1>&2
+	exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+	*local*)
+		echo $1
+		exit 0
+		;;
+	*)
+	;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+		| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+		| 580 | i960 | h8300 \
+		| x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \
+		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+		| hppa64 \
+		| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
+		| alphaev6[78] \
+		| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+		| 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
+		| mips64orion | mips64orionel | mipstx39 | mipstx39el \
+		| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
+		| mips64vr5000 | miprs64vr5000el | mcore \
+		| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
+		| thumb | d10v | fr30 | avr)
+		basic_machine=$basic_machine-unknown
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i[34567]86)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	# FIXME: clean up the formatting here.
+	vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+	      | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+	      | xmp-* | ymp-* \
+	      | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \
+	      | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
+	      | hppa2.0n-* | hppa64-* \
+	      | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
+	      | alphaev6[78]-* \
+	      | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+	      | clipper-* | orion-* \
+	      | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+	      | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-* \
+	      | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+	      | mipstx39-* | mipstx39el-* | mcore-* \
+	      | f301-* | armv*-* | s390-* | sv1-* | t3e-* \
+	      | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+	      | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \
+	      | bs2000-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-cbm
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-cbm
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-cbm
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	cray2)
+		basic_machine=cray2-cray
+		os=-unicos
+		;;
+	[ctj]90-cray)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i[34567]86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i[34567]86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i[34567]86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i[34567]86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	i386-go32 | go32)
+		basic_machine=i386-unknown
+		os=-go32
+		;;
+	i386-mingw32 | mingw32)
+		basic_machine=i386-unknown
+		os=-mingw32
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mipsel*-linux*)
+		basic_machine=mipsel-unknown
+		os=-linux-gnu
+		;;
+	mips*-linux*)
+		basic_machine=mips-unknown
+		os=-linux-gnu
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	mmix*)
+		basic_machine=mmix-knuth
+		os=-mmixware
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	msdos)
+		basic_machine=i386-unknown
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+        pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexen)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexen-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=rs6000-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+	        ;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+	        ;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sparclite-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=t3e-cray
+		os=-unicos
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xmp)
+		basic_machine=xmp-cray
+		os=-unicos
+		;;
+        xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	mips)
+		if [ x$os = x-linux-gnu ]; then
+			basic_machine=mips-unknown
+		else
+			basic_machine=mips-mips
+		fi
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sparc | sparcv9)
+		basic_machine=sparc-sun
+		;;
+        cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	c4x*)
+		basic_machine=c4x-none
+		os=-coff
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i[34567]86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto*)
+		os=-nto-qnx
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-ns2 )
+	        os=-nextstep2
+		;;
+	-nsk)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+        -*mint | -*MiNT)
+	        os=-mint
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+        *-gould)
+		os=-sysv
+		;;
+        *-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+        *-sgi)
+		os=-irix
+		;;
+        *-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f301-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-vxsim* | -vxworks*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -*MiNT)
+				vendor=atari
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
--- /dev/null
+++ b/common/libsndfile/configure
@@ -1,0 +1,2735 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# 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_help="$ac_help
+  --enable-shared[=PKGS]  build shared libraries [default=yes]"
+ac_help="$ac_help
+  --enable-static[=PKGS]  build static libraries [default=yes]"
+ac_help="$ac_help
+  --enable-fast-install[=PKGS]  optimize for fast installation [default=yes]"
+ac_help="$ac_help
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+  --disable-libtool-lock  avoid locking (might break parallel builds)"
+ac_help="$ac_help
+  --enable-justsrc             only compile library sources "
+ac_help="$ac_help
+  --disable-gcc-pipe           disable gcc -pipe option "
+ac_help="$ac_help
+  --disable-gcc-opt            disable gcc optimisations "
+ac_help="$ac_help
+  --enable-force-broken-float  force use of broken float code "
+
+# 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=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# 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.13"
+    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=src/sndfile.c
+
+# 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${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+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
+
+
+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.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+#    configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+#    same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+#    as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:590: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:611: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+  case $nonopt in
+  NONE) target_alias=$host_alias ;;
+  *) target_alias=$nonopt ;;
+  esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:629: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+  case $nonopt in
+  NONE) build_alias=$host_alias ;;
+  *) build_alias=$nonopt ;;
+  esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+
+# 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
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./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:664: 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=":"
+  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.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall 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.
+	    :
+	  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_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:717: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.  echo might interpret backslashes.
+  cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:774: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=libsndfile
+
+VERSION=0.0.27
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:820: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$ac_t""found" 1>&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:833: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$ac_t""found" 1>&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:846: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$ac_t""found" 1>&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:859: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$ac_t""found" 1>&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:872: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$ac_t""found" 1>&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+SHARED_VERSION_INFO="0:27:0"
+
+
+
+
+
+
+# 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:897: 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=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; 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:927: 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=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; 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
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:978: 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=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      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
+ ;;
+    esac
+  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:1010: 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${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1021 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1026: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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*
+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${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+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:1052: 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:1057: 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:1066: \"$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
+else
+  GCC=
+fi
+
+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:1085: 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
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+# 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
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./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:1128: 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=":"
+  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.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall 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.
+	    :
+	  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_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1182: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+	@echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1209: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+  rm -f conftestdata
+  ac_cv_prog_LN_S="ln -s"
+else
+  ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval="$enable_shared"
+  p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+  enable_shared=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_shared=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+else
+  enable_shared=yes
+fi
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval="$enable_static"
+  p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+  enable_static=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_static=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+else
+  enable_static=yes
+fi
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval="$enable_fast_install"
+  p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+  enable_fast_install=no
+  # Look at the argument we got.  We use all the common list separators.
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+  for pkg in $enableval; do
+    if test "X$pkg" = "X$p"; then
+      enable_fast_install=yes
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+else
+  enable_fast_install=yes
+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:1301: 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=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; 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
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:1340: checking for ld used by GCC" >&5
+  ac_prog=`($CC -print-prog-name=ld) 2>&5`
+  case "$ac_prog" in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:1364: checking for GNU ld" >&5
+else
+  echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:1367: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -z "$LD"; then
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      ac_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+	test "$with_gnu_ld" != no && break
+      else
+	test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+  echo "$ac_t""$LD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:1402: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  ac_cv_prog_gnu_ld=yes
+else
+  ac_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+
+
+echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
+echo "configure:1418: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  ac_cv_path_NM="$NM"
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	ac_cv_path_NM="$ac_dir/nm -B"
+	break
+      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	ac_cv_path_NM="$ac_dir/nm -p"
+	break
+      else
+	ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+	continue # so that we can try to find one that supports BSD flags
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi
+fi
+
+NM="$ac_cv_path_NM"
+echo "$ac_t""$NM" 1>&6
+
+
+case "$target" in
+NONE) lt_target="$host" ;;
+*) lt_target="$target" ;;
+esac
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval="$enable_libtool_lock"
+  :
+fi
+
+test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
+test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$lt_target" in
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 1482 "configure"' > conftest.$ac_ext
+  if { (eval echo configure:1483: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+    case "`/usr/bin/file conftest.o`" in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+echo "configure:1504: checking whether the C compiler needs -belf" >&5
+if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1509 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1516: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  lt_cv_cc_needs_belf=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  lt_cv_cc_needs_belf=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+
+
+esac
+
+
+# Save cache, so that ltconfig can load it
+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 | grep ac_space) 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
+
+
+# Actually configure libtool.  ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
+LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
+DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
+|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+
+# Reload cache, that may have been modified by ltconfig
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1619: 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 1634 "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:1640: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+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 1651 "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:1657: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+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} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1668 "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:1674: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+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*
+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:1699: 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 1704 "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:1712: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+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 1729 "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 1747 "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 1768 "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:1779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./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 endian.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1807: 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 1812 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1817: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+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
+
+
+for ac_func in fopen fread fwrite fclose fseek ftell malloc free snprintf vsnprintf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1847: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1852 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1901: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1906 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1934: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1939 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_off_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+  cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+
+echo $ac_n "checking size of short""... $ac_c" 1>&6
+echo "configure:1968: checking size of short" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_short=2
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1976 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(short));
+  exit(0);
+}
+EOF
+if { (eval echo configure:1988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_short=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_short=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_short" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+EOF
+
+
+echo $ac_n "checking size of int""... $ac_c" 1>&6
+echo "configure:2008: checking size of int" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_int=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2016 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(int));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_int=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_int=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_int" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+
+echo $ac_n "checking size of long""... $ac_c" 1>&6
+echo "configure:2048: checking size of long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_long=8
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2056 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(long));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_long=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+
+echo $ac_n "checking size of float""... $ac_c" 1>&6
+echo "configure:2088: checking size of float" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_float=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2096 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(float));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_float=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_float=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_float" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+EOF
+
+
+echo $ac_n "checking size of double""... $ac_c" 1>&6
+echo "configure:2128: checking size of double" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_double=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2136 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(double));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_double=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_double=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_double" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+EOF
+
+
+echo $ac_n "checking size of void*""... $ac_c" 1>&6
+echo "configure:2168: checking size of void*" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_voidp'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_voidp=8
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2176 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(void*));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2188: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_voidp=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_voidp=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_voidp" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
+EOF
+
+
+
+# Check whether --enable-justsrc or --disable-justsrc was given.
+if test "${enable_justsrc+set}" = set; then
+  enableval="$enable_justsrc"
+  ac_arg_justsrc="Y"
+else
+  ac_arg_justsrc="N"
+fi
+
+
+# Check whether --enable-gcc-pipe or --disable-gcc-pipe was given.
+if test "${enable_gcc_pipe+set}" = set; then
+  enableval="$enable_gcc_pipe"
+  ac_arg_gcc_pipe="N"
+else
+  ac_arg_gcc_pipe="Y"
+fi
+
+
+# Check whether --enable-gcc-opt or --disable-gcc-opt was given.
+if test "${enable_gcc_opt+set}" = set; then
+  enableval="$enable_gcc_opt"
+  ac_arg_gcc_opt="N"
+else
+  ac_arg_gcc_opt="Y"
+fi
+
+
+# Check whether --enable-force-broken-float or --disable-force-broken-float was given.
+if test "${enable_force_broken_float+set}" = set; then
+  enableval="$enable_force_broken_float"
+  ac_arg_broken_float="Y"
+else
+  ac_arg_broken_float="N"
+fi
+
+
+if test $ac_cv_prog_gcc = yes ; then
+	CFLAGS="$CFLAGS -g -O2 -Wstrict-prototypes"
+	if test "$ac_arg_gcc_opt" = "N" ; then
+		CFLAGS="$CFLAGS -g -O0 -Wstrict-prototypes"
+		echo "configure: warning: *** Compiler optimisations switched off. ***" 1>&2
+		fi
+			case "$target_os" in 
+		darwin* | rhapsody*)
+			;;
+		*)
+			CFLAGS="$CFLAGS -Wall -pedantic"
+			;;
+		esac
+	if test $ac_arg_gcc_pipe != "N" ; then
+	 	CFLAGS="$CFLAGS -pipe"
+	 	fi
+	fi
+	
+if test $cross_compiling = yes ; then
+	echo "configure: warning: ******************************************************************" 1>&2
+	echo "configure: warning: *** We are cross-compiling, so have to assume sizeof (short) == 2 " 1>&2
+	echo "configure: warning: *** and sizeof (int) == 4. If this is not the case there is no    " 1>&2
+	echo "configure: warning: *** chance of this working. Please contact the mantainer.         " 1>&2
+	echo "configure: warning: ******************************************************************" 1>&2
+	fi
+	
+if test $ac_cv_sizeof_int != 4 ; then
+	echo "configure: warning: ******************************************************************" 1>&2
+	echo "configure: warning: *** sizeof (int) != 4                                             " 1>&2
+	echo "configure: warning: ******************************************************************" 1>&2
+	fi
+
+if test $ac_cv_sizeof_short != 2 ; then
+	echo "configure: warning: ******************************************************************" 1>&2
+	echo "configure: warning: *** sizeof (short) != 2.                                          " 1>&2
+	echo "configure: warning: ******************************************************************" 1>&2
+	fi
+	
+if test $ac_cv_sizeof_float != 4 ; then
+	echo "configure: warning: ******************************************************************" 1>&2
+	echo "configure: warning: *** sizeof (float) != 4.                                          " 1>&2
+	echo "configure: warning: ******************************************************************" 1>&2
+	fi
+	
+if test $ac_cv_sizeof_double != 8 ; then
+	echo "configure: warning: ******************************************************************" 1>&2
+	echo "configure: warning: *** sizeof (double) != 8.                                         " 1>&2
+	echo "configure: warning: ******************************************************************" 1>&2
+	fi
+
+case "$target_cpu" in
+	alpha* | i?86 )
+		cat >> confdefs.h <<\EOF
+#define GUESS_LITTLE_ENDIAN 1
+EOF
+
+		cat >> confdefs.h <<\EOF
+#define GUESS_BIG_ENDIAN 0
+EOF
+
+		;;
+		
+	hppa* | m68* | mips* | powerpc* | hppa* | sparc*)
+		cat >> confdefs.h <<\EOF
+#define GUESS_LITTLE_ENDIAN 0
+EOF
+
+		cat >> confdefs.h <<\EOF
+#define GUESS_BIG_ENDIAN 1
+EOF
+
+		;;
+
+	*)
+		echo "configure: warning: *****************************************************************" 1>&2
+		echo "configure: warning: *** Not able to determine endian-ness of processor.              " 1>&2
+		echo "configure: warning: *** You will need to edit src/config.h before compiling.         " 1>&2
+		echo "configure: warning: *****************************************************************" 1>&2
+		;;
+esac
+
+subdirs="src/GSM610 src/G72x src"
+if test $ac_arg_justsrc = "N" ; then
+	subdirs="$subdirs examples doc tests"
+	fi
+
+if test $ac_arg_broken_float = "Y" ; then
+	cat >> confdefs.h <<\EOF
+#define FORCE_BROKEN_FLOAT 1
+EOF
+
+	echo "configure: warning: *** Testing code for processors that can't read/write IEEE floats." 1>&2
+else
+	cat >> confdefs.h <<\EOF
+#define FORCE_BROKEN_FLOAT 0
+EOF
+
+	fi
+ 
+
+
+
+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 | grep ac_space) 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.13"
+    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 src/Makefile src/GSM610/Makefile src/G72x/Makefile \
+			examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
+			MacOS/Makefile libsndfile.spec src/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%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%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%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@LN_S@%$LN_S%g
+s%@RANLIB@%$RANLIB%g
+s%@LIBTOOL@%$LIBTOOL%g
+s%@CPP@%$CPP%g
+s%@subdirs@%$subdirs%g
+s%@SHARED_VERSION_INFO@%$SHARED_VERSION_INFO%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 src/Makefile src/GSM610/Makefile src/G72x/Makefile \
+			examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
+			MacOS/Makefile libsndfile.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="src/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
+test -z "$CONFIG_HEADERS" || echo timestamp > src/stamp-h
+
+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
+++ b/common/libsndfile/configure.in
@@ -1,0 +1,145 @@
+# Configure `libsndfile'.
+# Copyright (C) 1999-2001 Erik de Castro Lopo (erikd@zip.com.au).
+
+dnl Require autoconf version >= 2.12
+
+AC_PREREQ(2.12)			
+AC_INIT(src/sndfile.c)
+AC_CANONICAL_SYSTEM
+
+AM_INIT_AUTOMAKE(libsndfile,0.0.27)
+
+dnl This is the version info according to the libtool versioning system.
+dnl It does *not* correspond to the release number.
+
+SHARED_VERSION_INFO="0:27:0"
+
+dnl Process this file with autoconf to produce a configure script.
+
+AM_CONFIG_HEADER(src/config.h)
+
+AC_PROG_CC
+AC_PROG_INSTALL
+
+AC_PROG_MAKE_SET
+AC_PROG_LN_S
+AM_PROG_LIBTOOL
+
+AC_HEADER_STDC
+
+AC_CHECK_HEADERS(endian.h)
+
+AC_CHECK_FUNCS(fopen fread fwrite fclose fseek ftell malloc free snprintf vsnprintf)
+
+AC_TYPE_SIZE_T
+AC_TYPE_OFF_T
+
+AC_CHECK_SIZEOF(short,2)
+AC_CHECK_SIZEOF(int,4)
+AC_CHECK_SIZEOF(long,8)
+AC_CHECK_SIZEOF(float,4)
+AC_CHECK_SIZEOF(double,4)
+AC_CHECK_SIZEOF(void*,8)
+
+AC_ARG_ENABLE(justsrc,  [  --enable-justsrc             only compile library sources ],
+	ac_arg_justsrc="Y", ac_arg_justsrc="N")
+
+AC_ARG_ENABLE(gcc-pipe, [  --disable-gcc-pipe           disable gcc -pipe option ],
+	ac_arg_gcc_pipe="N", ac_arg_gcc_pipe="Y")
+
+AC_ARG_ENABLE(gcc-opt,  [  --disable-gcc-opt            disable gcc optimisations ],
+	ac_arg_gcc_opt="N", ac_arg_gcc_opt="Y")
+
+AC_ARG_ENABLE(force-broken-float,  
+						[  --enable-force-broken-float  force use of broken float code ],
+	ac_arg_broken_float="Y", ac_arg_broken_float="N")
+
+if test $ac_cv_prog_gcc = yes ; then
+	CFLAGS="$CFLAGS -g -O2 -Wstrict-prototypes"
+	if test "$ac_arg_gcc_opt" = "N" ; then
+		CFLAGS="$CFLAGS -g -O0 -Wstrict-prototypes"
+		AC_MSG_WARN([[*** Compiler optimisations switched off. ***]])
+		fi
+	dnl Disable -Wall and -pedantic for Apple Darwin/Rhapsody.
+	dnl System headers on these systems are broken.
+	case "$target_os" in 
+		darwin* | rhapsody*)
+			;;
+		*)
+			CFLAGS="$CFLAGS -Wall -pedantic"
+			;;
+		esac
+	if test $ac_arg_gcc_pipe != "N" ; then
+	 	CFLAGS="$CFLAGS -pipe"
+	 	fi
+	fi
+	
+if test $cross_compiling = yes ; then
+	AC_MSG_WARN([[******************************************************************]])
+	AC_MSG_WARN([[*** We are cross-compiling, so have to assume sizeof (short) == 2 ]])
+	AC_MSG_WARN([[*** and sizeof (int) == 4. If this is not the case there is no    ]])
+	AC_MSG_WARN([[*** chance of this working. Please contact the mantainer.         ]])
+	AC_MSG_WARN([[******************************************************************]])
+	fi
+	
+if test $ac_cv_sizeof_int != 4 ; then
+	AC_MSG_WARN([[******************************************************************]])
+	AC_MSG_WARN([[*** sizeof (int) != 4                                             ]])
+	AC_MSG_WARN([[******************************************************************]])
+	fi
+
+if test $ac_cv_sizeof_short != 2 ; then
+	AC_MSG_WARN([[******************************************************************]])
+	AC_MSG_WARN([[*** sizeof (short) != 2.                                          ]])
+	AC_MSG_WARN([[******************************************************************]])
+	fi
+	
+if test $ac_cv_sizeof_float != 4 ; then
+	AC_MSG_WARN([[******************************************************************]])
+	AC_MSG_WARN([[*** sizeof (float) != 4.                                          ]])
+	AC_MSG_WARN([[******************************************************************]])
+	fi
+	
+if test $ac_cv_sizeof_double != 8 ; then
+	AC_MSG_WARN([[******************************************************************]])
+	AC_MSG_WARN([[*** sizeof (double) != 8.                                         ]])
+	AC_MSG_WARN([[******************************************************************]])
+	fi
+
+case "$target_cpu" in
+	alpha* | i?86 )
+		AC_DEFINE(GUESS_LITTLE_ENDIAN,1)
+		AC_DEFINE(GUESS_BIG_ENDIAN,0)
+		;;
+		
+	hppa* | m68* | mips* | powerpc* | hppa* | sparc*)
+		AC_DEFINE(GUESS_LITTLE_ENDIAN,0)
+		AC_DEFINE(GUESS_BIG_ENDIAN,1)
+		;;
+
+	*)
+		AC_MSG_WARN([[*****************************************************************]])
+		AC_MSG_WARN([[*** Not able to determine endian-ness of processor.              ]])
+		AC_MSG_WARN([[*** You will need to edit src/config.h before compiling.         ]])
+		AC_MSG_WARN([[*****************************************************************]])
+		;;
+esac
+
+subdirs="src/GSM610 src/G72x src"
+if test $ac_arg_justsrc = "N" ; then
+	subdirs="$subdirs examples doc tests"
+	fi
+
+if test $ac_arg_broken_float = "Y" ; then
+	AC_DEFINE(FORCE_BROKEN_FLOAT,1)
+	AC_MSG_WARN([[*** Testing code for processors that can't read/write IEEE floats.]])
+else
+	AC_DEFINE(FORCE_BROKEN_FLOAT,0)
+	fi
+ 
+AC_SUBST(subdirs)
+AC_SUBST(SHARED_VERSION_INFO)
+
+AC_OUTPUT(Makefile src/Makefile src/GSM610/Makefile src/G72x/Makefile \
+			examples/Makefile tests/Makefile doc/Makefile Win32/Makefile \
+			MacOS/Makefile libsndfile.spec)
--- /dev/null
+++ b/common/libsndfile/install-sh
@@ -1,0 +1,119 @@
+#!/bin/sh
+
+#
+# install - install a program, script, or datafile
+# This comes from X11R5; it is not part of GNU.
+#
+# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# 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}"
+
+instcmd="$mvprog"
+chmodcmd=""
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+lib=""
+dst=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    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;;
+
+	*)  if [ x"$lib" = x ]
+	    then
+		lib=$1
+	    else
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$lib" = x ]
+then
+	echo "install:  no input file specified"
+	exit 1
+fi
+
+if [ x"$dst" = x ]
+then
+	echo "install:  no destination specified"
+	exit 1
+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 $lib`
+fi
+
+# Make a temp file name in the proper directory.
+
+dstdir=`dirname $dst`
+dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+$doit $instcmd $lib $dsttmp
+
+# and set any options; do chmod last to preserve setuid bits
+
+if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi
+if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi
+if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi
+if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi
+
+# Now rename the file to the real destination.
+
+$doit $rmcmd $dst
+$doit $mvcmd $dsttmp $dst
+
+
+exit 0
--- /dev/null
+++ b/common/libsndfile/libsndfile.spec
@@ -1,0 +1,60 @@
+
+%define name    libsndfile
+%define version 0.0.27
+%define release 1
+%define prefix  /usr
+
+Summary: A library to handle various audio file formats.
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Prefix: %{prefix}
+Copyright: LGPL
+Group: Libraries/Sound
+Source: http://www.zip.com.au/~erikd/libsndfile/libsndfile-%{version}.tar.gz
+URL: http://www.zip.com.au/~erikd/libsndfile/
+BuildRoot: /var/tmp/%{name}-%{version}
+
+%description
+libsndfile is a C library for reading and writing sound files such as
+AIFF, AU and WAV files through one standard interface. It can currently
+read/write 8, 16, 24 and 32-bit PCM files as well as 32-bit floating
+point WAV files and a number of compressed formats.
+
+%package devel
+Summary: Libraries, includes, etc to develop libsndfile applications
+Group: Libraries
+
+%description devel
+Libraries, include files, etc you can use to develop libsndfile applications.
+
+%prep
+%setup
+
+%build
+./configure --prefix=%{prefix}
+make
+
+%install
+if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
+mkdir -p $RPM_BUILD_ROOT
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+
+%clean
+if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO doc
+%prefix/lib/libsndfile.so.*
+
+%files devel
+%defattr(-,root,root)
+%{prefix}/lib/libsndfile.a
+%{prefix}/lib/libsndfile.la
+%{prefix}/lib/libsndfile.so
+%{prefix}/include/sndfile.h
+
+%changelog
+* Thu Jul 6 2000 Josh Green <jgreen@users.sourceforge.net>
+- Created libsndfile.spec.in
--- /dev/null
+++ b/common/libsndfile/libsndfile.spec.in
@@ -1,0 +1,60 @@
+
+%define name    @PACKAGE@
+%define version @VERSION@
+%define release 1
+%define prefix  /usr
+
+Summary: A library to handle various audio file formats.
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Prefix: %{prefix}
+Copyright: LGPL
+Group: Libraries/Sound
+Source: http://www.zip.com.au/~erikd/libsndfile/libsndfile-%{version}.tar.gz
+URL: http://www.zip.com.au/~erikd/libsndfile/
+BuildRoot: /var/tmp/%{name}-%{version}
+
+%description
+libsndfile is a C library for reading and writing sound files such as
+AIFF, AU and WAV files through one standard interface. It can currently
+read/write 8, 16, 24 and 32-bit PCM files as well as 32-bit floating
+point WAV files and a number of compressed formats.
+
+%package devel
+Summary: Libraries, includes, etc to develop libsndfile applications
+Group: Libraries
+
+%description devel
+Libraries, include files, etc you can use to develop libsndfile applications.
+
+%prep
+%setup
+
+%build
+./configure --prefix=%{prefix}
+make
+
+%install
+if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
+mkdir -p $RPM_BUILD_ROOT
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+
+%clean
+if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
+
+%files
+%defattr(-,root,root)
+%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO doc
+%prefix/lib/libsndfile.so.*
+
+%files devel
+%defattr(-,root,root)
+%{prefix}/lib/libsndfile.a
+%{prefix}/lib/libsndfile.la
+%{prefix}/lib/libsndfile.so
+%{prefix}/include/sndfile.h
+
+%changelog
+* Thu Jul 6 2000 Josh Green <jgreen@users.sourceforge.net>
+- Created libsndfile.spec.in
--- /dev/null
+++ b/common/libsndfile/ltconfig
@@ -1,0 +1,3114 @@
+#! /bin/sh
+
+# ltconfig - Create a system-specific libtool.
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A lot of this script is taken from autoconf-2.10.
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+echo=echo
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec "$SHELL" "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# Find the correct PATH separator.  Usually this is `:', but
+# DJGPP uses `;' like DOS.
+if test "X${PATH_SEPARATOR+set}" != Xset; then
+  UNAME=${UNAME-`uname 2>/dev/null`}
+  case X$UNAME in
+    *-DOS) PATH_SEPARATOR=';' ;;
+    *)     PATH_SEPARATOR=':' ;;
+  esac
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test "X${echo_test_string+set}" != Xset; then
+  # find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+       echo_test_string="`eval $cmd`" &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" != 'X\t' ||
+   test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+  for dir in $PATH /usr/ucb; do
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running ltconfig again with it.
+      ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}"
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf "%s\n"'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
+	   test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+	CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL"
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
+	   test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "$0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# The name of this program.
+progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
+
+# Constants:
+PROGRAM=ltconfig
+PACKAGE=libtool
+VERSION=1.3.5
+TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)"
+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'
+rm="rm -f"
+
+help="Try \`$progname --help' for more information."
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+enable_shared=yes
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+enable_static=yes
+enable_fast_install=yes
+enable_dlopen=unknown
+enable_win32_dll=no
+ltmain=
+silent=
+srcdir=
+ac_config_guess=
+ac_config_sub=
+host=
+nonopt=
+ofile="$default_ofile"
+verify_host=yes
+with_gcc=no
+with_gnu_ld=no
+need_locks=yes
+ac_ext=c
+objext=o
+libext=a
+exeext=
+cache_file=
+
+old_AR="$AR"
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+old_CPPFLAGS="$CPPFLAGS"
+old_LDFLAGS="$LDFLAGS"
+old_LD="$LD"
+old_LN_S="$LN_S"
+old_LIBS="$LIBS"
+old_NM="$NM"
+old_RANLIB="$RANLIB"
+old_DLLTOOL="$DLLTOOL"
+old_OBJDUMP="$OBJDUMP"
+old_AS="$AS"
+
+# Parse the command line options.
+args=
+prev=
+for option
+do
+  case "$option" in
+  -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    eval "$prev=\$option"
+    prev=
+    continue
+  fi
+
+  case "$option" in
+  --help) cat <<EOM
+Usage: $progname [OPTION]... [HOST [LTMAIN]]
+
+Generate a system-specific libtool script.
+
+    --debug                enable verbose shell tracing
+    --disable-shared       do not build shared libraries
+    --disable-static       do not build static libraries
+    --disable-fast-install do not optimize for fast installation
+    --enable-dlopen        enable dlopen support
+    --enable-win32-dll     enable building dlls on win32 hosts
+    --help                 display this help and exit
+    --no-verify            do not verify that HOST is a valid host type
+-o, --output=FILE          specify the output file [default=$default_ofile]
+    --quiet                same as \`--silent'
+    --silent               do not print informational messages
+    --srcdir=DIR           find \`config.guess' in DIR
+    --version              output version information and exit
+    --with-gcc             assume that the GNU C compiler will be used
+    --with-gnu-ld          assume that the C compiler uses the GNU linker
+    --disable-lock         disable file locking
+    --cache-file=FILE      configure cache file
+
+LTMAIN is the \`ltmain.sh' shell script fragment or \`ltmain.c' program
+that provides basic libtool functionality.
+
+HOST is the canonical host system name [default=guessed].
+EOM
+  exit 0
+  ;;
+
+  --debug)
+    echo "$progname: enabling shell trace mode"
+    set -x
+    ;;
+
+  --disable-shared) enable_shared=no ;;
+
+  --disable-static) enable_static=no ;;
+
+  --disable-fast-install) enable_fast_install=no ;;
+
+  --enable-dlopen) enable_dlopen=yes ;;
+
+  --enable-win32-dll) enable_win32_dll=yes ;;
+
+  --quiet | --silent) silent=yes ;;
+
+  --srcdir) prev=srcdir ;;
+  --srcdir=*) srcdir="$optarg" ;;
+
+  --no-verify) verify_host=no ;;
+
+  --output | -o) prev=ofile ;;
+  --output=*) ofile="$optarg" ;;
+
+  --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"; exit 0 ;;
+
+  --with-gcc) with_gcc=yes ;;
+  --with-gnu-ld) with_gnu_ld=yes ;;
+
+  --disable-lock) need_locks=no ;;
+
+  --cache-file=*) cache_file="$optarg" ;;
+
+  -*)
+    echo "$progname: unrecognized option \`$option'" 1>&2
+    echo "$help" 1>&2
+    exit 1
+    ;;
+
+  *)
+    if test -z "$ltmain"; then
+      ltmain="$option"
+    elif test -z "$host"; then
+# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
+#      if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
+#        echo "$progname: warning \`$option' is not a valid host type" 1>&2
+#      fi
+      host="$option"
+    else
+      echo "$progname: too many arguments" 1>&2
+      echo "$help" 1>&2
+      exit 1
+    fi ;;
+  esac
+done
+
+if test -z "$ltmain"; then
+  echo "$progname: you must specify a LTMAIN file" 1>&2
+  echo "$help" 1>&2
+  exit 1
+fi
+
+if test ! -f "$ltmain"; then
+  echo "$progname: \`$ltmain' does not exist" 1>&2
+  echo "$help" 1>&2
+  exit 1
+fi
+
+# Quote any args containing shell metacharacters.
+ltconfig_args=
+for arg
+do
+  case "$arg" in
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ltconfig_args="$ltconfig_args '$arg'" ;;
+  *) ltconfig_args="$ltconfig_args $arg" ;;
+  esac
+done
+
+# A relevant subset of AC_INIT.
+
+# 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
+# 5 compiler messages saved in config.log
+# 6 checking for... messages and results
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>>./config.log
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi
+if test "X${LANG+set}"   = Xset; then LANG=C;   export LANG;   fi
+
+if test -n "$cache_file" && test -r "$cache_file"; then
+  echo "loading cache $cache_file within ltconfig"
+  . $cache_file
+fi
+
+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
+
+if test -z "$srcdir"; then
+  # Assume the source directory is the same one as the path to LTMAIN.
+  srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'`
+  test "$srcdir" = "$ltmain" && srcdir=.
+fi
+
+trap "$rm conftest*; exit 1" 1 2 15
+if test "$verify_host" = yes; then
+  # Check for config.guess and config.sub.
+  ac_aux_dir=
+  for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+    if test -f $ac_dir/config.guess; then
+      ac_aux_dir=$ac_dir
+      break
+    fi
+  done
+  if test -z "$ac_aux_dir"; then
+    echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
+    echo "$help" 1>&2
+    exit 1
+  fi
+  ac_config_guess=$ac_aux_dir/config.guess
+  ac_config_sub=$ac_aux_dir/config.sub
+
+  # Make sure we can run config.sub.
+  if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
+  else
+    echo "$progname: cannot run $ac_config_sub" 1>&2
+    echo "$help" 1>&2
+    exit 1
+  fi
+
+  echo $ac_n "checking host system type""... $ac_c" 1>&6
+
+  host_alias=$host
+  case "$host_alias" in
+  "")
+    if host_alias=`$SHELL $ac_config_guess`; then :
+    else
+      echo "$progname: cannot guess host type; you must specify one" 1>&2
+      echo "$help" 1>&2
+      exit 1
+    fi ;;
+  esac
+  host=`$SHELL $ac_config_sub $host_alias`
+  echo "$ac_t$host" 1>&6
+
+  # Make sure the host verified.
+  test -z "$host" && exit 1
+
+elif test -z "$host"; then
+  echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
+  echo "$help" 1>&2
+  exit 1
+else
+  host_alias=$host
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case "$host_os" in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+case "$host_os" in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR cru $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+# Set a sane default for `AR'.
+test -z "$AR" && AR=ar
+
+# Set a sane default for `OBJDUMP'.
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+# If RANLIB is not set, then run the test.
+if test "${RANLIB+set}" != "set"; then
+  result=no
+
+  echo $ac_n "checking for ranlib... $ac_c" 1>&6
+  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+  for dir in $PATH; do
+    test -z "$dir" && dir=.
+    if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then
+      RANLIB="ranlib"
+      result="ranlib"
+      break
+    fi
+  done
+  IFS="$save_ifs"
+
+  echo "$ac_t$result" 1>&6
+fi
+
+if test -n "$RANLIB"; then
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+  old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+fi
+
+# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin.
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$AS" && AS=as
+
+# Check to see if we are using GCC.
+if test "$with_gcc" != yes || test -z "$CC"; then
+  # If CC is not set, then try to find GCC or a usable CC.
+  if test -z "$CC"; then
+    echo $ac_n "checking for gcc... $ac_c" 1>&6
+    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    for dir in $PATH; do
+      test -z "$dir" && dir=.
+      if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then
+	CC="gcc"
+	break
+      fi
+    done
+    IFS="$save_ifs"
+
+    if test -n "$CC"; then
+      echo "$ac_t$CC" 1>&6
+    else
+      echo "$ac_t"no 1>&6
+    fi
+  fi
+
+  # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
+  if test -z "$CC"; then
+    echo $ac_n "checking for cc... $ac_c" 1>&6
+    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    cc_rejected=no
+    for dir in $PATH; do
+      test -z "$dir" && dir=.
+      if test -f $dir/cc || test -f $dir/cc$ac_exeext; then
+	if test "$dir/cc" = "/usr/ucb/cc"; then
+	  cc_rejected=yes
+	  continue
+	fi
+	CC="cc"
+	break
+      fi
+    done
+    IFS="$save_ifs"
+    if test $cc_rejected = yes; then
+      # We found a bogon in the path, so make sure we never use it.
+      set dummy $CC
+      shift
+      if test $# -gt 0; then
+	# We chose a different compiler from the bogus one.
+	# However, it has the same name, so the bogon will be chosen
+	# first if we set CC to just the name; use the full file name.
+	shift
+	set dummy "$dir/cc" "$@"
+	shift
+	CC="$@"
+      fi
+    fi
+
+    if test -n "$CC"; then
+      echo "$ac_t$CC" 1>&6
+    else
+      echo "$ac_t"no 1>&6
+    fi
+
+    if test -z "$CC"; then
+      echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
+      exit 1
+    fi
+  fi
+
+  # Now see if the compiler is really GCC.
+  with_gcc=no
+  echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
+  echo "$progname:581: checking whether we are using GNU C" >&5
+
+  $rm conftest.c
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+  if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:589: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+    with_gcc=yes
+  fi
+  $rm conftest.c
+  echo "$ac_t$with_gcc" 1>&6
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo $ac_n "checking for object suffix... $ac_c" 1>&6
+$rm conftest*
+echo 'int i = 1;' > conftest.c
+echo "$progname:603: checking for object suffix" >& 5
+if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
+  # Append any warnings to the config.log.
+  cat conftest.err 1>&5
+
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  cat conftest.err 1>&5
+  echo "$progname: failed program was:" >&5
+  cat conftest.c >&5
+fi
+$rm conftest*
+echo "$ac_t$objext" 1>&6
+
+echo $ac_n "checking for executable suffix... $ac_c" 1>&6
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_exeext="no"
+  $rm conftest*
+  echo 'main () { return 0; }' > conftest.c
+  echo "$progname:629: checking for executable suffix" >& 5
+  if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then
+    # Append any warnings to the config.log.
+    cat conftest.err 1>&5
+
+    for ac_file in conftest.*; do
+      case $ac_file in
+      *.c | *.err | *.$objext ) ;;
+      *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;;
+      esac
+    done
+  else
+    cat conftest.err 1>&5
+    echo "$progname: failed program was:" >&5
+    cat conftest.c >&5
+  fi
+  $rm conftest*
+fi
+if test "X$ac_cv_exeext" = Xno; then
+  exeext=""
+else
+  exeext="$ac_cv_exeext"
+fi
+echo "$ac_t$ac_cv_exeext" 1>&6
+
+echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
+pic_flag=
+special_shlib_compile_flags=
+wl=
+link_static_flag=
+no_builtin_flag=
+
+if test "$with_gcc" = yes; then
+  wl='-Wl,'
+  link_static_flag='-static'
+
+  case "$host_os" in
+  beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+    # PIC is the default for these OSes.
+    ;;
+  aix*)
+    # Below there is a dirty hack to force normal static linking with -ldl
+    # The problem is because libdl dynamically linked with both libc and
+    # libC (AIX C++ library), which obviously doesn't included in libraries
+    # list by gcc. This cause undefined symbols with -static flags.
+    # This hack allows C programs to be linked with "-static -ldl", but
+    # we not sure about C++ programs.
+    link_static_flag="$link_static_flag ${wl}-lC"
+    ;;
+  cygwin* | mingw* | os2*)
+    # We can build DLLs from non-PIC.
+    ;;
+  amigaos*)
+    # FIXME: we need at least 68020 code to build shared libraries, but
+    # adding the `-m68020' flag to GCC prevents building anything better,
+    # like `-m68040'.
+    pic_flag='-m68020 -resident32 -malways-restore-a4'
+    ;;
+  sysv4*MP*)
+    if test -d /usr/nec; then
+       pic_flag=-Kconform_pic
+    fi
+    ;;
+  *)
+    pic_flag='-fPIC'
+    ;;
+  esac
+else
+  # PORTME Check for PIC flags for the system compiler.
+  case "$host_os" in
+  aix3* | aix4*)
+    # All AIX code is PIC.
+    link_static_flag='-bnso -bI:/lib/syscalls.exp'
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    # Is there a better link_static_flag that works with the bundled CC?
+    wl='-Wl,'
+    link_static_flag="${wl}-a ${wl}archive"
+    pic_flag='+Z'
+    ;;
+
+  irix5* | irix6*)
+    wl='-Wl,'
+    link_static_flag='-non_shared'
+    # PIC (with -KPIC) is the default.
+    ;;
+
+  cygwin* | mingw* | os2*)
+    # We can build DLLs from non-PIC.
+    ;;
+
+  osf3* | osf4* | osf5*)
+    # All OSF/1 code is PIC.
+    wl='-Wl,'
+    link_static_flag='-non_shared'
+    ;;
+
+  sco3.2v5*)
+    pic_flag='-Kpic'
+    link_static_flag='-dn'
+    special_shlib_compile_flags='-belf'
+    ;;
+
+  solaris*)
+    pic_flag='-KPIC'
+    link_static_flag='-Bstatic'
+    wl='-Wl,'
+    ;;
+
+  sunos4*)
+    pic_flag='-PIC'
+    link_static_flag='-Bstatic'
+    wl='-Qoption ld '
+    ;;
+
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    pic_flag='-KPIC'
+    link_static_flag='-Bstatic'
+    wl='-Wl,'
+    ;;
+
+  uts4*)
+    pic_flag='-pic'
+    link_static_flag='-Bstatic'
+    ;;
+  sysv4*MP*)
+    if test -d /usr/nec ;then
+      pic_flag='-Kconform_pic'
+      link_static_flag='-Bstatic'
+    fi
+    ;;
+  *)
+    can_build_shared=no
+    ;;
+  esac
+fi
+
+if test -n "$pic_flag"; then
+  echo "$ac_t$pic_flag" 1>&6
+
+  # Check to make sure the pic_flag actually works.
+  echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
+  $rm conftest*
+  echo "int some_variable = 0;" > conftest.c
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $pic_flag -DPIC"
+  echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5
+  if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
+    # Append any warnings to the config.log.
+    cat conftest.err 1>&5
+    
+    case "$host_os" in
+    hpux9* | hpux10* | hpux11*)
+      # On HP-UX, both CC and GCC only warn that PIC is supported... then they
+      # create non-PIC objects.  So, if there were any warnings, we assume that
+      # PIC is not supported.
+      if test -s conftest.err; then
+	echo "$ac_t"no 1>&6
+	can_build_shared=no
+	pic_flag=
+      else
+	echo "$ac_t"yes 1>&6
+	pic_flag=" $pic_flag"
+      fi
+      ;;
+    *)
+      echo "$ac_t"yes 1>&6
+      pic_flag=" $pic_flag"
+      ;;
+    esac
+  else
+    # Append any errors to the config.log.
+    cat conftest.err 1>&5
+    can_build_shared=no
+    pic_flag=
+    echo "$ac_t"no 1>&6
+  fi
+  CFLAGS="$save_CFLAGS"
+  $rm conftest*
+else
+  echo "$ac_t"none 1>&6
+fi
+
+# Check to see if options -o and -c are simultaneously supported by compiler
+echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6
+$rm -r conftest 2>/dev/null
+mkdir conftest
+cd conftest
+$rm conftest*
+echo "int some_variable = 0;" > conftest.c
+mkdir out
+# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+# that will create temporary files in the current directory regardless of
+# the output directory.  Thus, making CWD read-only will cause this test
+# to fail, enabling locking or at least warning the user not to do parallel
+# builds.
+chmod -w .
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -o out/conftest2.o"
+echo "$progname:829: checking if $compiler supports -c -o file.o" >&5
+if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then
+
+  # The compiler can only warn and ignore the option if not recognized
+  # So say no if there are warnings
+    if test -s out/conftest.err; then
+      echo "$ac_t"no 1>&6
+      compiler_c_o=no
+    else
+      echo "$ac_t"yes 1>&6
+      compiler_c_o=yes
+    fi
+else
+  # Append any errors to the config.log.
+  cat out/conftest.err 1>&5
+  compiler_c_o=no
+  echo "$ac_t"no 1>&6
+fi
+CFLAGS="$save_CFLAGS"
+chmod u+w .
+$rm conftest* out/*
+rmdir out
+cd ..
+rmdir conftest
+$rm -r conftest 2>/dev/null
+
+if test x"$compiler_c_o" = x"yes"; then
+  # Check to see if we can write to a .lo
+  echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6
+  $rm conftest*
+  echo "int some_variable = 0;" > conftest.c
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -c -o conftest.lo"
+  echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5
+if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then
+
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+      if test -s conftest.err; then
+	echo "$ac_t"no 1>&6
+	compiler_o_lo=no
+      else
+	echo "$ac_t"yes 1>&6
+	compiler_o_lo=yes
+      fi
+  else
+    # Append any errors to the config.log.
+    cat conftest.err 1>&5
+    compiler_o_lo=no
+    echo "$ac_t"no 1>&6
+  fi
+  CFLAGS="$save_CFLAGS"
+  $rm conftest*
+else
+  compiler_o_lo=no
+fi
+
+# Check to see if we can do hard links to lock some files if needed
+hard_links="nottested"
+if test "$compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  echo "$ac_t$hard_links" 1>&6
+  $rm conftest*
+  if test "$hard_links" = no; then
+    echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+if test "$with_gcc" = yes; then
+  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
+  echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6
+  $rm conftest*
+  echo "int some_variable = 0;" > conftest.c
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c"
+  echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+  if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
+
+    # The compiler can only warn and ignore the option if not recognized
+    # So say no if there are warnings
+      if test -s conftest.err; then
+	echo "$ac_t"no 1>&6
+	compiler_rtti_exceptions=no
+      else
+	echo "$ac_t"yes 1>&6
+	compiler_rtti_exceptions=yes
+      fi
+  else
+    # Append any errors to the config.log.
+    cat conftest.err 1>&5
+    compiler_rtti_exceptions=no
+    echo "$ac_t"no 1>&6
+  fi
+  CFLAGS="$save_CFLAGS"
+  $rm conftest*
+
+  if test "$compiler_rtti_exceptions" = "yes"; then
+    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
+  else
+    no_builtin_flag=' -fno-builtin'
+  fi
+  
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$special_shlib_compile_flags"; then
+  echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
+  if echo "$old_CC $old_CFLAGS " | egrep -e "[ 	]$special_shlib_compile_flags[ 	]" >/dev/null; then :
+  else
+    echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
+    can_build_shared=no
+  fi
+fi
+
+echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
+$rm conftest*
+echo 'main(){return(0);}' > conftest.c
+save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS $link_static_flag"
+echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5
+if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  echo "$ac_t$link_static_flag" 1>&6
+else
+  echo "$ac_t"none 1>&6
+  link_static_flag=
+fi
+LDFLAGS="$save_LDFLAGS"
+$rm conftest*
+
+if test -z "$LN_S"; then
+  # Check to see if we can use ln -s, or we need hard links.
+  echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
+  $rm conftest.dat
+  if ln -s X conftest.dat 2>/dev/null; then
+    $rm conftest.dat
+    LN_S="ln -s"
+  else
+    LN_S=ln
+  fi
+  if test "$LN_S" = "ln -s"; then
+    echo "$ac_t"yes 1>&6
+  else
+    echo "$ac_t"no 1>&6
+  fi
+fi
+
+# Make sure LD is an absolute path.
+if test -z "$LD"; then
+  ac_prog=ld
+  if test "$with_gcc" = yes; then
+    # Check if gcc -print-prog-name=ld gives a path.
+    echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
+    echo "$progname:991: checking for ld used by GCC" >&5
+    ac_prog=`($CC -print-prog-name=ld) 2>&5`
+    case "$ac_prog" in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+    "")
+      # If it fails, then pretend we are not using GCC.
+      ac_prog=ld
+      ;;
+    *)
+      # If it is relative, then search for the first ld in PATH.
+      with_gnu_ld=unknown
+      ;;
+    esac
+  elif test "$with_gnu_ld" = yes; then
+    echo $ac_n "checking for GNU ld... $ac_c" 1>&6
+    echo "$progname:1015: checking for GNU ld" >&5
+  else
+    echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+    echo "$progname:1018: checking for non-GNU ld" >&5
+  fi
+
+  if test -z "$LD"; then
+    IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    for ac_dir in $PATH; do
+      test -z "$ac_dir" && ac_dir=.
+      if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+	LD="$ac_dir/$ac_prog"
+	# Check to see if the program is GNU ld.  I'd rather use --version,
+	# but apparently some GNU ld's only accept -v.
+	# Break only if it was the GNU/non-GNU ld that we prefer.
+	if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+	  test "$with_gnu_ld" != no && break
+	else
+	  test "$with_gnu_ld" != yes && break
+	fi
+      fi
+    done
+    IFS="$ac_save_ifs"
+  fi
+
+  if test -n "$LD"; then
+    echo "$ac_t$LD" 1>&6
+  else
+    echo "$ac_t"no 1>&6
+  fi
+
+  if test -z "$LD"; then
+    echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
+    exit 1
+  fi
+fi
+
+# Check to see if it really is or is not GNU ld.
+echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
+# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+echo "$ac_t$with_gnu_ld" 1>&6
+
+# See if the linker supports building shared libraries.
+echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
+
+allow_undefined_flag=
+no_undefined_flag=
+need_lib_prefix=unknown
+need_version=unknown
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+archive_cmds=
+archive_expsym_cmds=
+old_archive_from_new_cmds=
+export_dynamic_flag_spec=
+whole_archive_flag_spec=
+thread_safe_flag_spec=
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+always_export_symbols=no
+export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
+# include_expsyms should be a list of space-separated symbols to be *always*
+# included in the symbol list
+include_expsyms=
+# exclude_expsyms can be an egrep regular expression of symbols to exclude
+# it will be wrapped by ` (' and `)$', so one must not match beginning or
+# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+# as well as any symbol that contains `d'.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+# platforms (ab)use it in PIC code, but their linkers get confused if
+# the symbol is explicitly referenced.  Since portable code cannot
+# rely on this symbol name, it's probably fine to never include it in
+# preloaded symbol tables.
+
+case "$host_os" in
+cygwin* | mingw*)
+  # FIXME: the MSVC++ port hasn't been tested in a loooong time
+  # When not using gcc, we currently assume that we are using
+  # Microsoft Visual C++.
+  if test "$with_gcc" != yes; then
+    with_gnu_ld=no
+  fi
+  ;;
+
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # If archive_cmds runs LD, not CC, wlarc should be empty
+  wlarc='${wl}'
+
+  # See if GNU ld supports shared libraries.
+  case "$host_os" in
+  aix3* | aix4*)
+    # On AIX, the GNU linker is very broken
+    ld_shlibs=no
+    cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+    ;;
+
+  amigaos*)
+    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+
+    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+    # that the semantics of dynamic libraries on AmigaOS, at least up
+    # to version 4, is to share data among multiple programs linked
+    # with the same dynamic library.  Since this doesn't match the
+    # behavior of shared libraries on other platforms, we can use
+    # them.
+    ld_shlibs=no
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag=unsupported
+      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+
+  cygwin* | mingw*)
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec='-L$libdir'
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+
+    # Extract the symbol export list from an `--export-all' def file,
+    # then regenerate the def file from the symbol export list, so that
+    # the compiled dll only exports the symbol export list.
+    # Be careful not to strip the DATA tag left by newer dlltools.
+    export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
+      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
+      $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def  $objdir/$soname-ltdll.$objext $libobjs $convenience~
+      sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $objdir/$soname-def > $export_symbols'
+
+    # If DATA tags from a recent dlltool are present, honour them!
+    archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
+      _lt_hint=1;
+      cat $export_symbols | while read symbol; do
+        set dummy \$symbol;
+        case \$# in
+          2) echo "	\$2 @ \$_lt_hint ; " >> $objdir/$soname-def;;
+          *) echo "     \$2 @ \$_lt_hint \$3 ; " >> $objdir/$soname-def;;
+        esac;
+	_lt_hint=`expr 1 + \$_lt_hint`;
+      done~
+      test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
+      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
+      $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
+      $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
+      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
+      $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts'
+
+      old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' 
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib'
+      # can we support soname and/or expsyms with a.out? -oliva
+    fi
+    ;;
+
+  solaris* | sysv5*)
+    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+      ld_shlibs=no
+      cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;      
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts'
+    wlarc=
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
+      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+    else
+      ld_shlibs=no
+    fi
+    ;;
+  esac
+
+  if test "$ld_shlibs" = yes; then
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    case $host_os in
+    cygwin* | mingw*)
+      # dlltool doesn't understand --whole-archive et. al.
+      whole_archive_flag_spec=
+      ;;
+    *)
+      # ancient GNU ld didn't support --whole-archive et. al.
+      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
+        whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+        whole_archive_flag_spec=
+      fi
+      ;;
+    esac
+  fi
+else
+  # PORTME fill in a description of your system's linker (not GNU ld)
+  case "$host_os" in
+  aix3*)
+    allow_undefined_flag=unsupported
+    always_export_symbols=yes
+    archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'
+    # Note: this linker hardcodes the directories in LIBPATH if there
+    # are no directories specified by -L.
+    hardcode_minus_L=yes
+    if test "$with_gcc" = yes && test -z "$link_static_flag"; then
+      # Neither direct hardcoding nor static linking is supported with a
+      # broken collect2.
+      hardcode_direct=unsupported
+    fi
+    ;;
+
+  aix4*)
+    hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
+    hardcode_libdir_separator=':'
+    if test "$with_gcc" = yes; then
+      collect2name=`${CC} -print-prog-name=collect2`
+      if test -f "$collect2name" && \
+	 strings "$collect2name" | grep resolve_lib_name >/dev/null
+      then
+	# We have reworked collect2
+	hardcode_direct=yes
+      else
+	# We have old collect2
+	hardcode_direct=unsupported
+	# It fails to find uninstalled libraries when the uninstalled
+	# path is not listed in the libpath.  Setting hardcode_minus_L
+	# to unsupported forces relinking
+	hardcode_minus_L=yes
+	hardcode_libdir_flag_spec='-L$libdir'
+	hardcode_libdir_separator=
+      fi
+      shared_flag='-shared'
+    else
+      shared_flag='${wl}-bM:SRE'
+      hardcode_direct=yes
+    fi
+    allow_undefined_flag=' ${wl}-berok'
+    archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}'
+    archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}'
+    case "$host_os" in aix4.[01]|aix4.[01].*)
+      # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on
+      always_export_symbols=yes ;;
+    esac
+   ;;
+
+  amigaos*)
+    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    # see comment about different semantics on the GNU ld section
+    ld_shlibs=no
+    ;;
+
+  cygwin* | mingw*)
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    # hardcode_libdir_flag_spec is actually meaningless, as there is
+    # no search path for DLLs.
+    hardcode_libdir_flag_spec=' '
+    allow_undefined_flag=unsupported
+    # Tell ltmain to make .lib files, not .a files.
+    libext=lib
+    # FIXME: Setting linknames here is a bad hack.
+    archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+    # The linker will automatically build a .lib file if we build a DLL.
+    old_archive_from_new_cmds='true'
+    # FIXME: Should let the user specify the lib program.
+    old_archive_cmds='lib /OUT:$oldlib$oldobjs'
+    fix_srcfile_path='`cygpath -w $srcfile`'
+    ;;
+
+  freebsd1*)
+    ld_shlibs=no
+    ;;
+
+  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+  # support.  Future versions do this automatically, but an explicit c++rt0.o
+  # does not break anything, and helps significantly (at the cost of a little
+  # extra space).
+  freebsd2.2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+  freebsd2*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+  freebsd*)
+    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  hpux9* | hpux10* | hpux11*)
+    case "$host_os" in
+    hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;;
+    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;;
+    esac
+    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator=:
+    hardcode_direct=yes
+    hardcode_minus_L=yes # Not in the search PATH, but as the default
+			 # location of the library.
+    export_dynamic_flag_spec='${wl}-E'
+    ;;
+
+  irix5* | irix6*)
+    if test "$with_gcc" = yes; then
+      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+    else
+      archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  netbsd*)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'  # a.out
+    else
+      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts'      # ELF
+    fi
+    hardcode_libdir_flag_spec='${wl}-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  openbsd*)
+    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  os2*)
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_minus_L=yes
+    allow_undefined_flag=unsupported
+    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def'
+    old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
+    ;;
+
+  osf3*)
+    if test "$with_gcc" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+
+  osf4* | osf5*)  # As osf3* with the addition of the -msym flag
+    if test "$with_gcc" = yes; then
+      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+    else
+      allow_undefined_flag=' -expect_unresolved \*'
+      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+    fi
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator=:
+    ;;
+  rhapsody*)
+    archive_cmds='$CC -bundle -undefined suppress -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flags_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_shlibpath_var=no
+    ;;
+                                       
+  sco3.2v5*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_shlibpath_var=no
+    runpath_var=LD_RUN_PATH
+    hardcode_runpath_var=yes
+    ;;
+
+  solaris*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
+    hardcode_libdir_flag_spec='-R$libdir'
+    hardcode_shlibpath_var=no
+    case "$host_os" in
+    solaris2.[0-5] | solaris2.[0-5].*) ;;
+    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+    esac
+    ;;
+
+  sunos4*)
+    archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_direct=yes
+    hardcode_minus_L=yes
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4)
+    if test "x$host_vendor" = xsequent; then
+      # Use $CC to link under sequent, because it throws in some extra .o 
+      # files that make .init and .fini sections work.
+      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $linkopts'
+    else
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    fi
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    hardcode_direct=no #Motorola manual says yes, but my tests say they lie 
+    ;;  
+
+  sysv4.3*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_shlibpath_var=no
+    export_dynamic_flag_spec='-Bexport'
+    ;;
+
+  sysv5*)
+    no_undefined_flag=' -z text'
+    # $CC -shared without GNU ld will not create a library from C++
+    # object files and a static libstdc++, better avoid it by now
+    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
+    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
+    hardcode_libdir_flag_spec=
+    hardcode_shlibpath_var=no
+    runpath_var='LD_RUN_PATH'
+    ;;
+
+  uts4*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  dgux*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    hardcode_libdir_flag_spec='-L$libdir'
+    hardcode_shlibpath_var=no
+    ;;
+
+  sysv4*MP*)
+    if test -d /usr/nec; then
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+      hardcode_shlibpath_var=no
+      runpath_var=LD_RUN_PATH
+      hardcode_runpath_var=yes
+      ld_shlibs=yes
+    fi
+    ;;
+
+  sysv4.2uw2*)
+    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts'
+    hardcode_direct=yes
+    hardcode_minus_L=no
+    hardcode_shlibpath_var=no
+    hardcode_runpath_var=yes
+    runpath_var=LD_RUN_PATH
+    ;;
+
+  unixware7*)
+    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
+    runpath_var='LD_RUN_PATH'
+    hardcode_shlibpath_var=no
+    ;;
+
+  *)
+    ld_shlibs=no
+    ;;
+  esac
+fi
+echo "$ac_t$ld_shlibs" 1>&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+if test -z "$NM"; then
+  echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
+  case "$NM" in
+  [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path.
+  *)
+    IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
+    for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do
+      test -z "$ac_dir" && ac_dir=.
+      if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	  NM="$ac_dir/nm -B"
+	  break
+	elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+	  NM="$ac_dir/nm -p"
+	  break
+	else
+	  NM=${NM="$ac_dir/nm"} # keep the first match, but
+	  continue # so that we can try to find one that supports BSD flags
+	fi
+      fi
+    done
+    IFS="$ac_save_ifs"
+    test -z "$NM" && NM=nm
+    ;;
+  esac
+  echo "$ac_t$NM" 1>&6
+fi
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+  ;;
+irix*)
+  symcode='[BCDEGRST]'
+  ;;
+solaris*)
+  symcode='[BDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Write the raw and C identifiers.
+  global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode\)[ 	][ 	]*\($ac_symprfx\)$sympat$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+  $rm conftest*
+  cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  echo "$progname:1653: checking if global_symbol_pipe works" >&5
+  if { (eval echo $progname:1654: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { echo "$progname:1657: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
+
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+	if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c'
+
+	  cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+	  sed 's/^. \(.*\) \(.*\)$/  {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c
+	  cat <<\EOF >> conftest.c
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$objext conftstm.$objext
+	  save_LIBS="$LIBS"
+	  save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$objext"
+	  CFLAGS="$CFLAGS$no_builtin_flag"
+	  if { (eval echo $progname:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+	    pipe_works=yes
+	  else
+	    echo "$progname: failed program was:" >&5
+	    cat conftest.c >&5
+	  fi
+	  LIBS="$save_LIBS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.c >&5
+  fi
+  $rm conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    global_symbol_pipe=
+  fi
+done
+if test "$pipe_works" = yes; then
+  echo "${ac_t}ok" 1>&6
+else
+  echo "${ac_t}failed" 1>&6
+fi
+
+if test -z "$global_symbol_pipe"; then
+  global_symbol_to_cdecl=
+fi
+
+# Check hardcoding attributes.
+echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var"; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$hardcode_shlibpath_var" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+echo "$ac_t$hardcode_action" 1>&6
+
+
+reload_flag=
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
+# PORTME Some linkers may need a different reload flag.
+reload_flag='-r'
+echo "$ac_t$reload_flag" 1>&6
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
+# PORTME Fill in your ld.so characteristics
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+file_magic_cmd=
+file_magic_test_file=
+deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [regex]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given egrep regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
+case "$host_os" in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}.so$major'
+  ;;
+
+aix4*)
+  version_type=linux
+  # AIX has no versioning support, so currently we can not hardcode correct
+  # soname into executable. Probably we can add versioning support to
+  # collect2, so additional links can be useful in future.
+  # We preserve .a as extension for shared libraries though AIX4.2
+  # and later linker supports .so
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a'
+  shlibpath_var=LIBPATH
+  deplibs_check_method=pass_all
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}.so'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  deplibs_check_method=pass_all
+  lt_cv_dlopen="load_add_on"
+  lt_cv_dlopen_libs=
+  lt_cv_dlopen_self=yes
+  ;;
+
+bsdi4*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=/shlib/libc.so
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  export_dynamic_flag_spec=-rdynamic
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw*)
+  version_type=windows
+  need_version=no
+  need_lib_prefix=no
+  if test "$with_gcc" = yes; then
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
+  else
+    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+  fi
+  dynamic_linker='Win32 ld.exe'
+  deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+  file_magic_cmd='${OBJDUMP} -f'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  lt_cv_dlopen="LoadLibrary"
+  lt_cv_dlopen_libs=
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+  
+freebsd*)
+  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+  version_type=freebsd-$objformat
+  case "$version_type" in
+    freebsd-elf*)
+      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
+      file_magic_cmd=/usr/bin/file
+      file_magic_test_file=`echo /usr/lib/libc.so*`
+      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      deplibs_check_method=unknown
+      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case "$host_os" in
+  freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  *) # from 3.2 on
+    shlibpath_overrides_runpath=no
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  dynamic_linker="$host_os dld.sl"
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  shlibpath_var=SHLIB_PATH
+  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
+  soname_spec='${libname}${release}.sl$major'
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  case "$host_os" in
+  hpux10.20*)
+    # TODO:  Does this work for hpux-11 too?
+    deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    file_magic_cmd=/usr/bin/file
+    file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+irix5* | irix6*)
+  version_type=irix
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}.so.$major'
+  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so'
+  case "$host_os" in
+  irix5*)
+    libsuff= shlibsuff=
+    # this will be overridden with pass_all, but let us keep it just in case
+    deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+    ;;
+  *)
+    case "$LD" in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+  deplibs_check_method='pass_all'
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  deplibs_check_method=pass_all
+
+  if test -f /lib/ld.so.1; then
+    dynamic_linker='GNU ld.so'
+  else
+    # Only the GNU ld.so supports shared libraries on MkLinux.
+    case "$host_cpu" in
+    powerpc*) dynamic_linker=no ;;
+    *) dynamic_linker='Linux ld.so' ;;
+    esac
+  fi
+  ;;
+
+netbsd*)
+  version_type=sunos
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
+    soname_spec='${libname}${release}.so$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+openbsd*)
+  version_type=sunos
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+    need_version=no
+  fi
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+os2*)
+  libname_spec='$name'
+  need_lib_prefix=no
+  library_names_spec='$libname.dll $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_version=no
+  soname_spec='${libname}${release}.so'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  # this will be overridden with pass_all, but let us keep it just in case
+  deplibs_check_method='file_magic COFF format alpha shared library'
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=/shlib/libc.so
+  deplibs_check_method='pass_all'
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rhapsody*)
+  version_type=sunos
+  library_names_spec='${libname}.so'
+  soname_spec='${libname}.so'
+  shlibpath_var=DYLD_LIBRARY_PATH
+  deplibs_check_method=pass_all
+  ;;
+
+sco3.2v5*)
+  version_type=osf
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib"
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=/lib/libc.so
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case "$host_vendor" in
+    sequent)
+      file_magic_cmd='/bin/file'
+      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+      ;;
+    ncr)
+      deplibs_check_method='pass_all'
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+      file_magic_cmd=/usr/bin/file
+      file_magic_test_file=`echo /usr/lib/libc.so*`
+      ;;
+  esac
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
+    soname_spec='$libname.so.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+echo "$ac_t$dynamic_linker" 1>&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
+
+# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in
+# configure.in, otherwise build static only libraries.
+case "$host_os" in
+cygwin* | mingw* | os2*)
+  if test x$can_build_shared = xyes; then
+    test x$enable_win32_dll = xno && can_build_shared=no
+    echo "checking if package supports dlls... $can_build_shared" 1>&6
+  fi
+;;
+esac
+
+if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then
+  case "$deplibs_check_method" in
+  "file_magic "*)
+    file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+    if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+       egrep "$file_magic_regex" > /dev/null; then
+      :
+    else
+      cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+    fi ;;
+  esac
+fi
+
+echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix4*)
+  test "$enable_shared" = yes && enable_static=no
+  ;;
+esac
+
+echo "$ac_t$enable_shared" 1>&6
+
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+
+echo "checking whether to build static libraries... $enable_static" 1>&6
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+echo $ac_n "checking for objdir... $ac_c" 1>&6
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$ac_t$objdir" 1>&6
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then
+  lt_cv_dlopen=no lt_cv_dlopen_libs=
+echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "$progname:2248: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2256 "ltconfig"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo $progname:2269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen""... $ac_c" 1>&6
+echo "$progname:2288: checking for dlopen" >&5
+if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2293 "ltconfig"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+dlopen();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo $progname:2318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dlopen"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
+echo "$progname:2335: checking for dld_link in -ldld" >&5
+ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldld  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2343 "ltconfig"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link();
+
+int main() {
+dld_link()
+; return 0; }
+EOF
+if { (eval echo $progname:2356: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load""... $ac_c" 1>&6
+echo "$progname:2375: checking for shl_load" >&5
+if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2380 "ltconfig"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+shl_load();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo $progname:2405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_shl_load=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_shl_load=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="shl_load"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
+echo "$progname:2423: checking for shl_load in -ldld" >&5
+ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldld  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2431 "ltconfig"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load();
+
+int main() {
+shl_load()
+; return 0; }
+EOF
+if { (eval echo $progname:2445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+fi
+
+    
+fi
+
+  
+fi
+
+
+fi
+
+fi
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  fi
+
+  case "$lt_cv_dlopen" in
+  dlopen)
+for ac_hdr in dlfcn.h; do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "$progname:2488: 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 2493 "ltconfig"
+#include <$ac_hdr>
+int fnord = 0;
+EOF
+ac_try="$ac_compile >/dev/null 2>conftest.out"
+{ (eval echo $progname:2498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "$progname: 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
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+    if test "x$ac_cv_header_dlfcn_h" = xyes; then
+      CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    fi
+    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+  echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
+echo "$progname:2526: checking whether a program can dlopen itself" >&5
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    lt_cv_dlopen_self=cross
+  else
+    cat > conftest.c <<EOF
+#line 2534 "ltconfig"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LTDL_GLOBAL	RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+#  define LTDL_GLOBAL	DL_GLOBAL
+# else
+#  define LTDL_GLOBAL	0
+# endif
+#endif
+
+/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LTDL_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+#  define LTDL_LAZY_OR_NOW	RTLD_LAZY
+# else
+#  ifdef DL_LAZY
+#   define LTDL_LAZY_OR_NOW	DL_LAZY
+#  else
+#   ifdef RTLD_NOW
+#    define LTDL_LAZY_OR_NOW	RTLD_NOW
+#   else
+#    ifdef DL_NOW
+#     define LTDL_LAZY_OR_NOW	DL_NOW
+#    else
+#     define LTDL_LAZY_OR_NOW	0
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
+    if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+	       if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } 
+
+EOF
+if { (eval echo $progname:2580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  lt_cv_dlopen_self=yes
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  lt_cv_dlopen_self=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self" 1>&6
+
+  if test "$lt_cv_dlopen_self" = yes; then
+    LDFLAGS="$LDFLAGS $link_static_flag"
+  echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
+echo "$progname:2599: checking whether a statically linked program can dlopen itself" >&5
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+    lt_cv_dlopen_self_static=cross
+  else
+    cat > conftest.c <<EOF
+#line 2607 "ltconfig"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LTDL_GLOBAL	RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+#  define LTDL_GLOBAL	DL_GLOBAL
+# else
+#  define LTDL_GLOBAL	0
+# endif
+#endif
+
+/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LTDL_LAZY_OR_NOW
+# ifdef RTLD_LAZY
+#  define LTDL_LAZY_OR_NOW	RTLD_LAZY
+# else
+#  ifdef DL_LAZY
+#   define LTDL_LAZY_OR_NOW	DL_LAZY
+#  else
+#   ifdef RTLD_NOW
+#    define LTDL_LAZY_OR_NOW	RTLD_NOW
+#   else
+#    ifdef DL_NOW
+#     define LTDL_LAZY_OR_NOW	DL_NOW
+#    else
+#     define LTDL_LAZY_OR_NOW	0
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
+    if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+    if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } 
+
+EOF
+if { (eval echo $progname:2653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  lt_cv_dlopen_self_static=yes
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  lt_cv_dlopen_self_static=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6
+fi
+    ;;
+  esac
+
+  case "$lt_cv_dlopen_self" in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case "$lt_cv_dlopen_self_static" in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+# Copy echo and quote the copy, instead of the original, because it is
+# used later.
+ltecho="$echo"
+if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ltecho="$CONFIG_SHELL \$0 --fallback-echo"
+fi
+LTSHELL="$SHELL"
+
+LTCONFIG_VERSION="$VERSION"
+
+# Only quote variables if we're using ltmain.sh.
+case "$ltmain" in
+*.sh)
+  # Now quote all the things that may contain metacharacters.
+  for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \
+    old_LD old_LDFLAGS old_LIBS \
+    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \
+    AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \
+    reload_flag reload_cmds wl \
+    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
+    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
+    library_names_spec soname_spec \
+    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \
+    file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \
+    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
+    hardcode_libdir_flag_spec hardcode_libdir_separator  \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
+
+    case "$var" in
+    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case "$ltecho" in
+  *'\$0 --fallback-echo"')
+    ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+  trap "$rm \"$ofile\"; exit 1" 1 2 15
+  echo "creating $ofile"
+  $rm "$ofile"
+  cat <<EOF > "$ofile"
+#! $SHELL
+
+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
+#
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+### BEGIN LIBTOOL CONFIG
+EOF
+  cfgfile="$ofile"
+  ;;
+
+*)
+  # Double-quote the variables that need it (for aesthetics).
+  for var in old_CC old_CFLAGS old_CPPFLAGS \
+    old_LD old_LDFLAGS old_LIBS \
+    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do
+    eval "$var=\\\"\$var\\\""
+  done
+
+  # Just create a config file.
+  cfgfile="$ofile.cfg"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  echo "creating $cfgfile"
+  $rm "$cfgfile"
+  cat <<EOF > "$cfgfile"
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+EOF
+  ;;
+esac
+
+cat <<EOF >> "$cfgfile"
+# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
+# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\
+# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
+# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\
+#   $0$ltconfig_args
+#
+# Compiler and other test output produced by $progname, useful for
+# debugging $progname, is in ./config.log if it exists.
+
+# The version of $progname that generated this script.
+LTCONFIG_VERSION=$LTCONFIG_VERSION
+
+# Shell to use when invoking shell scripts.
+SHELL=$LTSHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$ltecho
+
+# The archiver.
+AR=$AR
+
+# The default C compiler.
+CC=$CC
+
+# The linker used to build libraries.
+LD=$LD
+
+# Whether we need hard or soft links.
+LN_S=$LN_S
+
+# A BSD-compatible nm program.
+NM=$NM
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$reload_flag
+reload_cmds=$reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$wl
+
+# Object file suffix (normally "o").
+objext="$objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$pic_flag
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$compiler_c_o
+
+# Can we write directly to a .lo ?
+compiler_o_lo=$compiler_o_lo
+
+# Must we lock files when doing compilation ?
+need_locks=$need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$link_static_flag
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$RANLIB
+old_archive_cmds=$old_archive_cmds
+old_postinstall_cmds=$old_postinstall_cmds
+old_postuninstall_cmds=$old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$old_archive_from_new_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$archive_cmds
+archive_expsym_cmds=$archive_expsym_cmds
+postinstall_cmds=$postinstall_cmds
+postuninstall_cmds=$postuninstall_cmds
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$global_symbol_to_cdecl
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$include_expsyms
+
+EOF
+
+case "$ltmain" in
+*.sh)
+  echo '### END LIBTOOL CONFIG' >> "$ofile"
+  echo >> "$ofile"
+  case "$host_os" in
+  aix3*)
+    cat <<\EOF >> "$ofile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # Append the ltmain.sh script.
+  sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+
+  chmod +x "$ofile"
+  ;;
+
+*)
+  # Compile the libtool program.
+  echo "FIXME: would compile $ltmain"
+  ;;
+esac
+
+test -n "$cache_file" || exit 0
+
+# AC_CACHE_SAVE
+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 | grep ac_space) 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
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
--- /dev/null
+++ b/common/libsndfile/ltmain.sh
@@ -1,0 +1,4024 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun ltconfig.
+#
+# Copyright (C) 1996-1999 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The name of this program.
+progname=`$echo "$0" | sed 's%^.*/%%'`
+modename="$progname"
+
+# Constants.
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.3.5
+TIMESTAMP=" (1.385.2.206 2000/05/27 11:12:27)"
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+SP2NL='tr \040 \012'
+NL2SP='tr \015\012 \040\040'
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+if test "$LTCONFIG_VERSION" != "$VERSION"; then
+  echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
+  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit 1
+fi
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  echo "$modename: not configured to build any kind of library" 1>&2
+  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit 1
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+# Parse our command line options once, thoroughly.
+while test $# -gt 0
+do
+  arg="$1"
+  shift
+
+  case "$arg" in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case "$prev" in
+    execute_dlfiles)
+      eval "$prev=\"\$$prev \$arg\""
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case "$arg" in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    exit 0
+    ;;
+
+  --config)
+    sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0
+    exit 0
+    ;;
+
+  --debug)
+    echo "$progname: enabling shell trace mode"
+    set -x
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+    exit 0
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --quiet | --silent)
+    show=:
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+fi
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    case "$nonopt" in
+    *cc | *++ | gcc* | *-gcc*)
+      mode=link
+      for arg
+      do
+	case "$arg" in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit 1
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case "$mode" in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    lastarg=
+    srcfile="$nonopt"
+    suppress_output=
+
+    user_target=no
+    for arg
+    do
+      # Accept any command-line options.
+      case "$arg" in
+      -o)
+	if test "$user_target" != "no"; then
+	  $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	  exit 1
+	fi
+	user_target=next
+	;;
+
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+      esac
+
+      case "$user_target" in
+      next)
+	# The next one is the -o target name
+	user_target=yes
+	continue
+	;;
+      yes)
+	# We got the output file
+	user_target=set
+	libobj="$arg"
+	continue
+	;;
+      esac
+
+      # Accept the current argument as the source file.
+      lastarg="$srcfile"
+      srcfile="$arg"
+
+      # Aesthetically quote the previous argument.
+
+      # Backslashify any backslashes, double quotes, and dollar signs.
+      # These are the only characters that are still specially
+      # interpreted inside of double-quoted scrings.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly in scan
+      # sets, so we specify it separately.
+      case "$lastarg" in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      # Add the previous argument to base_compile.
+      if test -z "$base_compile"; then
+	base_compile="$lastarg"
+      else
+	base_compile="$base_compile $lastarg"
+      fi
+    done
+
+    case "$user_target" in
+    set)
+      ;;
+    no)
+      # Get the name of the library object.
+      libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    *)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSfmso]'
+    case "$libobj" in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case "$libobj" in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit 1
+      ;;
+    esac
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $libobj"
+    else
+      removelist="$libobj"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit 1" 1 2 15
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit 1" 1 2 15
+    else
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until ln "$0" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+      echo $srcfile > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      # All platforms use -DPIC, to notify preprocessed assembler code.
+      command="$base_compile $srcfile $pic_flag -DPIC"
+      if test "$build_old_libs" = yes; then
+	lo_libobj="$libobj"
+	dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$dir" = "X$libobj"; then
+	  dir="$objdir"
+	else
+	  dir="$dir/$objdir"
+	fi
+	libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+
+	if test -d "$dir"; then
+	  $show "$rm $libobj"
+	  $run $rm $libobj
+	else
+	  $show "$mkdir $dir"
+	  $run $mkdir $dir
+	  status=$?
+	  if test $status -ne 0 && test ! -d $dir; then
+	    exit $status
+	  fi
+	fi
+      fi
+      if test "$compiler_o_lo" = yes; then
+	output_obj="$libobj"
+	command="$command -o $output_obj"
+      elif test "$compiler_c_o" = yes; then
+	output_obj="$obj"
+	command="$command -o $output_obj"
+      fi
+
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+	 test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+	echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test x"$output_obj" != x"$libobj"; then
+	$show "$mv $output_obj $libobj"
+	if $run $mv $output_obj $libobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # If we have no pic_flag, then copy the object into place and finish.
+      if test -z "$pic_flag" && test "$build_old_libs" = yes; then
+	# Rename the .lo from within objdir to obj
+	if test -f $obj; then
+	  $show $rm $obj
+	  $run $rm $obj
+	fi
+
+	$show "$mv $libobj $obj"
+	if $run $mv $libobj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+
+	xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$xdir" = "X$obj"; then
+	  xdir="."
+	else
+	  xdir="$xdir"
+	fi
+	baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
+	libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+	# Now arrange that obj and lo_libobj become the same file
+	$show "(cd $xdir && $LN_S $baseobj $libobj)"
+	if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
+	  exit 0
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Allow error messages only from the first compilation.
+      suppress_output=' >/dev/null 2>&1'
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      command="$base_compile $srcfile"
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+	output_obj="$obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit 1
+      fi
+
+      if test "$need_locks" = warn &&
+	 test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
+	echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit 1
+      fi
+
+      # Just move the object if needed
+      if test x"$output_obj" != x"$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Create an invalid libtool object if no PIC, so that we do not
+      # accidentally link it into a program.
+      if test "$build_libtool_libs" != yes; then
+	$show "echo timestamp > $libobj"
+	$run eval "echo timestamp > \$libobj" || exit $?
+      else
+	# Move the .lo from within objdir
+	$show "$mv $libobj $lo_libobj"
+	if $run $mv $libobj $lo_libobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+    fi
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $rm "$lockfile"
+    fi
+
+    exit 0
+    ;;
+
+  # libtool link mode
+  link)
+    modename="$modename: link"
+    case "$host" in
+    *-*-cygwin* | *-*-mingw* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invokation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+
+      # This is a source program that is used to create dlls on Windows
+      # Don't remove nor modify the starting and closing comments
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# #  ifdef __CYGWIN32__
+# #    define __CYGWIN__ __CYGWIN32__
+# #  endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+#   __hDllInstance_base = hInst;
+#   return TRUE;
+# }
+# /* ltdll.c ends here */
+      # This is a source program that is used to create import libraries
+      # on Windows for dlls which lack them. Don't remove nor modify the
+      # starting and closing comments
+# /* impgen.c starts here */
+# /*   Copyright (C) 1999 Free Software Foundation, Inc.
+# 
+#  This file is part of GNU libtool.
+# 
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+# 
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+# 
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  */
+# 
+#  #include <stdio.h>		/* for printf() */
+#  #include <unistd.h>		/* for open(), lseek(), read() */
+#  #include <fcntl.h>		/* for O_RDONLY, O_BINARY */
+#  #include <string.h>		/* for strdup() */
+# 
+#  static unsigned int
+#  pe_get16 (fd, offset)
+#       int fd;
+#       int offset;
+#  {
+#    unsigned char b[2];
+#    lseek (fd, offset, SEEK_SET);
+#    read (fd, b, 2);
+#    return b[0] + (b[1]<<8);
+#  }
+# 
+#  static unsigned int
+#  pe_get32 (fd, offset)
+#      int fd;
+#      int offset;
+#  {
+#    unsigned char b[4];
+#    lseek (fd, offset, SEEK_SET);
+#    read (fd, b, 4);
+#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+#  }
+# 
+#  static unsigned int
+#  pe_as32 (ptr)
+#       void *ptr;
+#  {
+#    unsigned char *b = ptr;
+#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
+#  }
+# 
+#  int
+#  main (argc, argv)
+#      int argc;
+#      char *argv[];
+#  {
+#      int dll;
+#      unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
+#      unsigned long export_rva, export_size, nsections, secptr, expptr;
+#      unsigned long name_rvas, nexp;
+#      unsigned char *expdata, *erva;
+#      char *filename, *dll_name;
+# 
+#      filename = argv[1];
+# 
+#      dll = open(filename, O_RDONLY|O_BINARY);
+#      if (!dll)
+#  	return 1;
+# 
+#      dll_name = filename;
+#    
+#      for (i=0; filename[i]; i++)
+#  	if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
+#  	    dll_name = filename + i +1;
+# 
+#      pe_header_offset = pe_get32 (dll, 0x3c);
+#      opthdr_ofs = pe_header_offset + 4 + 20;
+#      num_entries = pe_get32 (dll, opthdr_ofs + 92);
+# 
+#      if (num_entries < 1) /* no exports */
+#  	return 1;
+# 
+#      export_rva = pe_get32 (dll, opthdr_ofs + 96);
+#      export_size = pe_get32 (dll, opthdr_ofs + 100);
+#      nsections = pe_get16 (dll, pe_header_offset + 4 +2);
+#      secptr = (pe_header_offset + 4 + 20 +
+#  	      pe_get16 (dll, pe_header_offset + 4 + 16));
+# 
+#      expptr = 0;
+#      for (i = 0; i < nsections; i++)
+#      {
+#  	char sname[8];
+#  	unsigned long secptr1 = secptr + 40 * i;
+#  	unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
+#  	unsigned long vsize = pe_get32 (dll, secptr1 + 16);
+#  	unsigned long fptr = pe_get32 (dll, secptr1 + 20);
+#  	lseek(dll, secptr1, SEEK_SET);
+#  	read(dll, sname, 8);
+#  	if (vaddr <= export_rva && vaddr+vsize > export_rva)
+#  	{
+#  	    expptr = fptr + (export_rva - vaddr);
+#  	    if (export_rva + export_size > vaddr + vsize)
+#  		export_size = vsize - (export_rva - vaddr);
+#  	    break;
+#  	}
+#      }
+# 
+#      expdata = (unsigned char*)malloc(export_size);
+#      lseek (dll, expptr, SEEK_SET);
+#      read (dll, expdata, export_size);
+#      erva = expdata - export_rva;
+# 
+#      nexp = pe_as32 (expdata+24);
+#      name_rvas = pe_as32 (expdata+32);
+# 
+#      printf ("EXPORTS\n");
+#      for (i = 0; i<nexp; i++)
+#      {
+#  	unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
+#  	printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
+#      }
+# 
+#      return 0;
+#  }
+# /* impgen.c ends here */
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    linkopts=
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval lib_search_path=\`\$echo \"X \${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      lib_search_path=
+    fi
+    # now prepend the system-specific ones
+    eval lib_search_path=\"$sys_lib_search_path_spec\$lib_search_path\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+    
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    link_against_libtool_libs=
+    ltlibs=
+    module=no
+    objs=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case "$arg" in
+      -all-static | -static)
+	if test "X$arg" = "X-all-static"; then
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	prefer_static_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test $# -gt 0; do
+      arg="$1"
+      shift
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case "$prev" in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case "$prev" in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case "$arg" in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit 1
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case "$arg" in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit 1
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi
+
+      prevarg="$arg"
+
+      case "$arg" in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: not more than one -exported-symbols argument allowed"
+	  exit 1
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case "$dir" in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    absdir="$dir"
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case " $deplibs " in
+	*" $arg "*) ;;
+	*) deplibs="$deplibs $arg";;
+	esac
+	case " $lib_search_path " in
+	*" $dir "*) ;;
+	*) lib_search_path="$lib_search_path $dir";;
+	esac
+	case "$host" in
+	*-*-cygwin* | *-*-mingw* | *-*-os2*)
+	  dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
+	  case ":$dllsearchpath:" in
+	  ::) dllsearchpath="$dllsearchdir";;
+	  *":$dllsearchdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dllsearchdir";;
+	  esac
+	  ;;
+	esac
+	;;
+
+      -l*)
+	if test "$arg" = "-lc"; then
+	  case "$host" in
+	  *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
+	    # These systems don't actually have c library (as such)
+	    continue
+	    ;;
+	  esac
+	elif test "$arg" = "-lm"; then
+	  case "$host" in
+	  *-*-cygwin* | *-*-beos*)
+	    # These systems don't actually have math library (as such)
+	    continue
+	    ;;
+	  esac
+	fi
+	deplibs="$deplibs $arg"
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case "$dir" in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit 1
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# If we have no pic_flag, then this is the same as -all-static.
+	if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case "$arg" in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.o | *.obj | *.a | *.lib)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A library object.
+	if test "$prev" = dlfiles; then
+	  dlfiles="$dlfiles $arg"
+	  if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then
+	    prev=
+	    continue
+	  else
+	    # If libtool objects are unsupported, then we need to preload.
+	    prev=dlprefiles
+	  fi
+	fi
+
+	if test "$prev" = dlprefiles; then
+	  # Preload the old-style object.
+	  dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
+	  prev=
+	fi
+	libobjs="$libobjs $arg"
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	dlname=
+	libdir=
+	library_names=
+	old_library=
+
+	# Check to see that this really is a libtool archive.
+	if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
+	  exit 1
+	fi
+
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variable installed.
+	installed=yes
+
+	# Read the .la file
+	# If there is no directory component, then add one.
+	case "$arg" in
+	*/* | *\\*) . $arg ;;
+	*) . ./$arg ;;
+	esac
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
+	  exit 1
+	fi
+
+	# Find the relevant object directory and library name.
+	name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
+
+	if test "X$installed" = Xyes; then
+	  dir="$libdir"
+	else
+	  dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$dir" = "X$arg"; then
+	    dir="$objdir"
+	  else
+	    dir="$dir/$objdir"
+	  fi
+	fi
+
+	if test -n "$dependency_libs"; then
+	  # Extract -R and -L from dependency_libs
+	  temp_deplibs=
+	  for deplib in $dependency_libs; do
+	    case "$deplib" in
+	    -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+		 case " $rpath $xrpath " in
+		 *" $temp_xrpath "*) ;;
+		 *) xrpath="$xrpath $temp_xrpath";;
+		 esac;;
+	    -L*) case "$compile_command $temp_deplibs " in
+		 *" $deplib "*) ;;
+		 *) temp_deplibs="$temp_deplibs $deplib";;
+		 esac
+		 temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+		 case " $lib_search_path " in
+		 *" $temp_dir "*) ;;
+		 *) lib_search_path="$lib_search_path $temp_dir";;
+		 esac
+		 ;;
+	    *) temp_deplibs="$temp_deplibs $deplib";;
+	    esac
+	  done
+	  dependency_libs="$temp_deplibs"
+	fi
+
+	if test -z "$libdir"; then
+	  # It is a libtool convenience library, so add in its objects.
+	  convenience="$convenience $dir/$old_library"
+	  old_convenience="$old_convenience $dir/$old_library"
+	  deplibs="$deplibs$dependency_libs"
+	  compile_command="$compile_command $dir/$old_library$dependency_libs"
+	  finalize_command="$finalize_command $dir/$old_library$dependency_libs"
+	  continue
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$prev" = dlfiles; then
+	  dlfiles="$dlfiles $arg"
+	  if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking statically,
+	    # we need to preload.
+	    prev=dlprefiles
+	  else
+	    # We should not create a dependency on this library, but we
+	    # may need any libraries it requires.
+	    compile_command="$compile_command$dependency_libs"
+	    finalize_command="$finalize_command$dependency_libs"
+	    prev=
+	    continue
+	  fi
+	fi
+
+	# The library was specified with -dlpreopen.
+	if test "$prev" = dlprefiles; then
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    dlprefiles="$dlprefiles $dir/$old_library"
+	  else
+	    dlprefiles="$dlprefiles $dir/$linklib"
+	  fi
+	  prev=
+	fi
+
+	if test -n "$library_names" &&
+	   { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	  link_against_libtool_libs="$link_against_libtool_libs $arg"
+	  if test -n "$shlibpath_var"; then
+	    # Make sure the rpath contains only unique directories.
+	    case "$temp_rpath " in
+	    *" $dir "*) ;;
+	    *) temp_rpath="$temp_rpath $dir" ;;
+	    esac
+	  fi
+
+	  # We need an absolute path.
+	  case "$dir" in
+	  [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+	  *)
+	    absdir=`cd "$dir" && pwd`
+	    if test -z "$absdir"; then
+	      $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+	      $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	      absdir="$dir"
+	    fi
+	    ;;
+	  esac
+	  
+	  # This is the magic to use -rpath.
+	  # Skip directories that are in the system default run-time
+	  # search path, unless they have been requested with -R.
+	  case " $sys_lib_dlsearch_path " in
+	  *" $absdir "*) ;;
+	  *)
+	    case "$compile_rpath " in
+	    *" $absdir "*) ;;
+	    *) compile_rpath="$compile_rpath $absdir" 
+	    esac
+	    ;;
+	  esac
+
+	  case " $sys_lib_dlsearch_path " in
+	  *" $libdir "*) ;;
+	  *)
+	    case "$finalize_rpath " in
+	    *" $libdir "*) ;;
+	    *) finalize_rpath="$finalize_rpath $libdir"
+	    esac
+	    ;;
+	  esac
+
+	  lib_linked=yes
+	  case "$hardcode_action" in
+	  immediate | unsupported)
+	    if test "$hardcode_direct" = no; then
+	      compile_command="$compile_command $dir/$linklib"
+	      deplibs="$deplibs $dir/$linklib"
+	      case "$host" in
+	      *-*-cygwin* | *-*-mingw* | *-*-os2*)
+		dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
+		if test -n "$dllsearchpath"; then
+		  dllsearchpath="$dllsearchpath:$dllsearchdir"
+		else
+		  dllsearchpath="$dllsearchdir"
+		fi
+		;;
+	      esac
+	    elif test "$hardcode_minus_L" = no; then
+	      case "$host" in
+	      *-*-sunos*)
+		compile_shlibpath="$compile_shlibpath$dir:"
+		;;
+	      esac
+	      case "$compile_command " in
+	      *" -L$dir "*) ;;
+	      *) compile_command="$compile_command -L$dir";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -L$dir -l$name"
+	    elif test "$hardcode_shlibpath_var" = no; then
+	      case ":$compile_shlibpath:" in
+	      *":$dir:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$dir:";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -l$name"
+	    else
+	      lib_linked=no
+	    fi
+	    ;;
+
+	  relink)
+	    if test "$hardcode_direct" = yes; then
+	      compile_command="$compile_command $absdir/$linklib"
+	      deplibs="$deplibs $absdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      case "$compile_command " in
+	      *" -L$absdir "*) ;;
+	      *) compile_command="$compile_command -L$absdir";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -L$absdir -l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case ":$compile_shlibpath:" in
+	      *":$absdir:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$absdir:";;
+	      esac
+	      compile_command="$compile_command -l$name"
+	      deplibs="$deplibs -l$name"
+	    else
+	      lib_linked=no
+	    fi
+	    ;;
+
+	  *)
+	    lib_linked=no
+	    ;;
+	  esac
+
+	  if test "$lib_linked" != yes; then
+	    $echo "$modename: configuration error: unsupported hardcode properties"
+	    exit 1
+	  fi
+
+	  # Finalize command for both is simple: just hardcode it.
+	  if test "$hardcode_direct" = yes; then
+	    finalize_command="$finalize_command $libdir/$linklib"
+	  elif test "$hardcode_minus_L" = yes; then
+	    case "$finalize_command " in
+	    *" -L$libdir "*) ;;
+	    *) finalize_command="$finalize_command -L$libdir";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  elif test "$hardcode_shlibpath_var" = yes; then
+	    case ":$finalize_shlibpath:" in
+	    *":$libdir:"*) ;;
+	    *) finalize_shlibpath="$finalize_shlibpath$libdir:";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  else
+	    # We cannot seem to hardcode it, guess we'll fake it.
+	    case "$finalize_command " in
+	    *" -L$dir "*) ;;
+	    *) finalize_command="$finalize_command -L$libdir";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  fi
+	else
+	  # Transform directly to old archives if we don't build new libraries.
+	  if test -n "$pic_flag" && test -z "$old_library"; then
+	    $echo "$modename: cannot find static library for \`$arg'" 1>&2
+	    exit 1
+	  fi
+
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_command="$compile_command $dir/$linklib"
+	    finalize_command="$finalize_command $dir/$linklib"
+	  else
+	    case "$compile_command " in
+	    *" -L$dir "*) ;;
+	    *) compile_command="$compile_command -L$dir";;
+	    esac
+	    compile_command="$compile_command -l$name"
+	    case "$finalize_command " in
+	    *" -L$dir "*) ;;
+	    *) finalize_command="$finalize_command -L$dir";;
+	    esac
+	    finalize_command="$finalize_command -l$name"
+	  fi
+	fi
+
+	# Add in any libraries that this one depends upon.
+	compile_command="$compile_command$dependency_libs"
+	finalize_command="$finalize_command$dependency_libs"
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case "$arg" in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    case "$output" in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+      ;;
+
+    *.a | *.lib)
+      if test -n "$link_against_libtool_libs"; then
+	$echo "$modename: error: cannot link libtool libraries into archives" 1>&2
+	exit 1
+      fi
+
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      ;;
+
+    *.la)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case "$outputname" in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$output_objdir" = "X$output"; then
+	output_objdir="$objdir"
+      else
+	output_objdir="$output_objdir/$objdir"
+      fi
+
+      if test -n "$objs"; then
+	$echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
+	exit 1
+      fi
+
+      # How the heck are we supposed to write a wrapper for a shared library?
+      if test -n "$link_against_libtool_libs"; then
+	 $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2
+	 exit 1
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test $# -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  libext=al
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+	dependency_libs="$deplibs"
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	current="$2"
+	revision="$3"
+	age="$4"
+
+	# Check that each of the things are valid numbers.
+	case "$current" in
+	0 | [1-9] | [1-9][0-9]*) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	case "$revision" in
+	0 | [1-9] | [1-9][0-9]*) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	case "$age" in
+	0 | [1-9] | [1-9][0-9]*) ;;
+	*)
+	  $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	if test $age -gt $current; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit 1
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case "$version_type" in
+	none) ;;
+
+	irix)
+	  major=`expr $current - $age + 1`
+	  versuffix="$major.$revision"
+	  verstring="sgi$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test $loop != 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="sgi$major.$iface:$verstring"
+	  done
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test $loop != 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	windows)
+	  # Like Linux, but with '-' rather than '.', since we only
+	  # want one extension on Windows 95.
+	  major=`expr $current - $age`
+	  versuffix="-$major-$age-$revision"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  verstring="0.0"
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+	
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+	dependency_libs="$deplibs"
+	case "$host" in
+	*-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
+	  # these systems don't actually have a c library (as such)!
+	  ;;
+        *-*-rhapsody*)
+	  # rhapsody is a little odd...
+	  deplibs="$deplibs -framework System"
+	  ;;
+	*)
+	  # Add libc to deplibs on all other systems.
+	  deplibs="$deplibs -lc"
+	  ;;
+	esac
+      fi
+
+      # Create the output directory, or remove our outputs if we need to.
+      if test -d $output_objdir; then
+	$show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
+	$run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
+      else
+	$show "$mkdir $output_objdir"
+	$run $mkdir $output_objdir
+	status=$?
+	if test $status -ne 0 && test ! -d $output_objdir; then
+	  exit $status
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      if test "$build_libtool_libs" = yes; then
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case "$deplibs_check_method" in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behaviour.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  $CC -o conftest conftest.c $deplibs
+	  if test $? -eq 0 ; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name="`expr $i : '-l\(.*\)'`"
+	      # If $name is empty we are operating on a -L argument.
+	      if test "$name" != "" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		set dummy $deplib_matches
+		deplib_match=$2
+		if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		  newdeplibs="$newdeplibs $i"
+		else
+		  droppeddeps=yes
+		  echo
+		  echo "*** Warning: This library needs some functionality provided by $i."
+		  echo "*** I have the capability to make that library automatically link in when"
+		  echo "*** you link to this library.  But I can only do this if you have a"
+		  echo "*** shared version of the library, which you do not appear to have."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occured in the first compile.  Let's try to salvage the situation:
+	    # Compile a seperate program for each library.
+	    for i in $deplibs; do
+	      name="`expr $i : '-l\(.*\)'`"
+	     # If $name is empty we are operating on a -L argument.
+	      if test "$name" != "" ; then
+		$rm conftest
+		$CC -o conftest conftest.c $i
+		# Did it work?
+		if test $? -eq 0 ; then
+		  ldd_output=`ldd conftest`
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    echo "*** Warning: This library needs some functionality provided by $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which you do not appear to have."
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "***  make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex="`expr \"$deplibs_check_method\" : \"$2 \(.*\)\"`"
+	  for a_deplib in $deplibs; do
+	    name="`expr $a_deplib : '-l\(.*\)'`"
+	    # If $name is empty we are operating on a -L argument.
+	    if test "$name" != "" ; then
+	      libname=`eval \\$echo \"$libname_spec\"`
+	      for i in $lib_search_path; do
+		    potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		    for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue 
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | sed 's/.* -> //'`
+			case "$potliblink" in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | sed 10q \
+			 | egrep "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		    done
+	      done
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		echo "*** Warning: This library needs some functionality provided by $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have."
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	       -e 's/ -[LR][^ ]*//g' -e 's/[ 	]//g' |
+	     grep . >/dev/null; then
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+      
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Get the real and link names of the library.
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+
+	lib="$output_objdir/$realname"
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Ensure that we have .o objects for linkers which dislike .lo
+	# (e.g. aix) in case we are running --disable-static
+	for obj in $libobjs; do
+	  xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$obj"; then
+	    xdir="."
+	  else
+	    xdir="$xdir"
+	  fi
+	  baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	  oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+	  if test ! -f $xdir/$oldobj; then
+	    $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
+	    $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
+	  fi
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    eval cmds=\"$export_symbols_cmds\"
+	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd" || exit $?
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "mkdir $gentop"
+	    $run mkdir "$gentop"
+	    status=$?
+	    if test $status -ne 0 && test ! -d "$gentop"; then
+	      exit $status
+	    fi
+	    generated="$generated $gentop"
+
+	    for xlib in $convenience; do
+	      # Extract the objects.
+	      case "$xlib" in
+	      [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	      *) xabs=`pwd`"/$xlib" ;;
+	      esac
+	      xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	      xdir="$gentop/$xlib"
+
+	      $show "${rm}r $xdir"
+	      $run ${rm}r "$xdir"
+	      $show "mkdir $xdir"
+	      $run mkdir "$xdir"
+	      status=$?
+	      if test $status -ne 0 && test ! -d "$xdir"; then
+		exit $status
+	      fi
+	      $show "(cd $xdir && $AR x $xabs)"
+	      $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	      libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+	    done
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linkopts="$linkopts $flag"
+	fi
+
+	# Do each of the archive commands.
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval cmds=\"$archive_expsym_cmds\"
+	else
+	  eval cmds=\"$archive_cmds\"
+	fi
+	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    *.lo | *.o | *.obj)
+      if test -n "$link_against_libtool_libs"; then
+	$echo "$modename: error: cannot link libtool libraries into objects" 1>&2
+	exit 1
+      fi
+
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case "$output" in
+      *.lo)
+	if test -n "$objs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit 1
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl= 
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  $show "${rm}r $gentop"
+	  $run ${rm}r "$gentop"
+	  $show "mkdir $gentop"
+	  $run mkdir "$gentop"
+	  status=$?
+	  if test $status -ne 0 && test ! -d "$gentop"; then
+	    exit $status
+	  fi
+	  generated="$generated $gentop"
+
+	  for xlib in $convenience; do
+	    # Extract the objects.
+	    case "$xlib" in
+	    [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	    *) xabs=`pwd`"/$xlib" ;;
+	    esac
+	    xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	    xdir="$gentop/$xlib"
+
+	    $show "${rm}r $xdir"
+	    $run ${rm}r "$xdir"
+	    $show "mkdir $xdir"
+	    $run mkdir "$xdir"
+	    status=$?
+	    if test $status -ne 0 && test ! -d "$xdir"; then
+	      exit $status
+	    fi
+	    $show "(cd $xdir && $AR x $xabs)"
+	    $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	    reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
+	  done
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs"
+
+      output="$obj"
+      eval cmds=\"$reload_cmds\"
+      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit 0
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	$show "echo timestamp > $libobj"
+	$run eval "echo timestamp > $libobj" || exit $?
+	exit 0
+      fi
+
+      if test -n "$pic_flag"; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	eval cmds=\"$reload_cmds\"
+	IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      else
+	# Just create a symlink.
+	$show $rm $libobj
+	$run $rm $libobj
+	xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
+	if test "X$xdir" = "X$libobj"; then
+	  xdir="."
+	else
+	  xdir="$xdir"
+	fi
+	baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
+	oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
+	$show "(cd $xdir && $LN_S $oldobj $baseobj)"
+	$run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit 0
+      ;;
+
+    # Anything else should be a program.
+    *)
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi 
+      fi
+    
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$compile_rpath " in
+	  *" $libdir "*) ;;
+	  *) compile_rpath="$compile_rpath $libdir" ;;
+	  esac
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$output_objdir" = "X$output"; then
+	output_objdir="$objdir"
+      else
+	output_objdir="$output_objdir/$objdir"
+      fi
+
+      # Create the binary in the object directory, then wrap it.
+      if test ! -d $output_objdir; then
+	$show "$mkdir $output_objdir"
+	$run $mkdir $output_objdir
+	status=$?
+	if test $status -ne 0 && test ! -d $output_objdir; then
+	  exit $status
+	fi
+      fi
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case "$dlsyms" in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+	    
+	    if test -n "$export_symbols_regex"; then
+	      $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$output.exp"
+	      $run $rm $export_symbols
+	      $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	    else
+	      $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+	      $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`echo "$arg" | sed -e 's%^.*/%%'`
+	    $run eval 'echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    sed -n -e 's/^: \([^ ]*\) $/  {\"\1\", (lt_ptr_t) 0},/p' \
+		-e 's/^. \([^ ]*\) \([^ ]*\)$/  {"\2", (lt_ptr_t) \&\2},/p' \
+		  < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr_t) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case "$host" in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DPIC";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+	  compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit 1
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	status=$?
+	
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case "$dir" in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+	
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+      
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
+	case "$0" in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$0 --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
+	esac
+	$rm $output
+	trap "$rm $output; exit 1" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  link_against_libtool_libs='$link_against_libtool_libs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  echo >> $output "\
+  program=lt-'$outputname'
+  progdir=\"\$thisdir/$objdir\"
+  
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if (cd \"\$thisdir\" && eval \$relink_command); then :
+      else
+	$rm \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	  # win32 systems need to use the prog path for dll
+	  # lookup to work
+	*-*-cygwin*)
+	  $echo >> $output "\
+      exec \$progdir/\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      # Export the path to the program.
+      PATH=\"\$progdir:\$PATH\"
+      export PATH
+
+      exec \$program \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit 1
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit 0
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	$show "${rm}r $gentop"
+	$run ${rm}r "$gentop"
+	$show "mkdir $gentop"
+	$run mkdir "$gentop"
+	status=$?
+	if test $status -ne 0 && test ! -d "$gentop"; then
+	  exit $status
+	fi
+	generated="$generated $gentop"
+	  
+	# Add in members from convenience archives.
+	for xlib in $addlibs; do
+	  # Extract the objects.
+	  case "$xlib" in
+	  [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	  *) xabs=`pwd`"/$xlib" ;;
+	  esac
+	  xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	  xdir="$gentop/$xlib"
+
+	  $show "${rm}r $xdir"
+	  $run ${rm}r "$xdir"
+	  $show "mkdir $xdir"
+	  $run mkdir "$xdir"
+	  status=$?
+	  if test $status -ne 0 && test ! -d "$xdir"; then
+	    exit $status
+	  fi
+	  $show "(cd $xdir && $AR x $xabs)"
+	  $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+
+	  oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+	done
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	eval cmds=\"$old_archive_from_new_cmds\"
+      else
+	# Ensure that we have .o objects in place in case we decided
+	# not to build a shared library, and have fallen back to building
+	# static libs even though --disable-static was passed!
+	for oldobj in $oldobjs; do
+	  if test ! -f $oldobj; then
+	    xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$oldobj"; then
+	      xdir="."
+	    else
+	      xdir="$xdir"
+	    fi
+	    baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
+	    obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
+	    $show "(cd $xdir && ${LN_S} $obj $baseobj)"
+	    $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
+	  fi
+	done
+
+	eval cmds=\"$old_archive_cmds\"
+      fi
+      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case "$output" in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      if test -n "$xrpath"; then
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	done
+	dependency_libs="$temp_xrpath $dependency_libs"
+      fi
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	  fi
+	  $rm $output
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$dlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'\
+"
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $?
+      ;;
+    esac
+    exit 0
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case "$arg" in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg="$nonopt"
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case "$arg" in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest="$arg"
+	continue
+      fi
+
+      case "$arg" in
+      -d) isdir=yes ;;
+      -f) prev="-f" ;;
+      -g) prev="-g" ;;
+      -m) prev="-m" ;;
+      -o) prev="-o" ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*) ;;
+
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest="$arg"
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case "$arg" in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test $# -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit 1
+      fi
+    fi
+    case "$destdir" in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case "$file" in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case "$file" in
+      *.a | *.lib)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	library_names=
+	old_library=
+	# If there is no directory component, then add one.
+	case "$file" in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/"
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$realname $destdir/$realname"
+	  $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
+
+	  if test $# -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+		$show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+		$run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  eval cmds=\"$postinstall_cmds\"
+	  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case "$destfile" in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.o | *.obj)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit 0
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Do a test to see if this is really a libtool program.
+	if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  link_against_libtool_libs=
+	  relink_command=
+
+	  # If there is no directory component, then add one.
+	  case "$file" in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$link_against_libtool_libs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
+	    exit 1
+	  fi
+
+	  finalize=yes
+	  for lib in $link_against_libtool_libs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case "$lib" in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir="/tmp"
+	      test -n "$TMPDIR" && tmpdir="$TMPDIR"
+	      tmpdir="$tmpdir/libtool-$$"
+	      if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
+	      else
+		$echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+		continue
+	      fi
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      # Do each command in the postinstall commands.
+      eval cmds=\"$old_postinstall_cmds\"
+      IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec $SHELL $0 --finish$current_libdirs
+      exit 1
+    fi
+
+    exit 0
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  eval cmds=\"$finish_cmds\"
+	  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit 0
+
+    echo "----------------------------------------------------------------------"
+    echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      echo "   $libdir"
+    done
+    echo
+    echo "If you ever happen to want to link against installed libraries"
+    echo "in a given directory, LIBDIR, you must either use libtool, and"
+    echo "specify the full pathname of the library, or use \`-LLIBDIR'"
+    echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    echo
+    echo "See any operating system documentation about shared libraries for"
+    echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    echo "----------------------------------------------------------------------"
+    exit 0
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit 1
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit 1
+      fi
+
+      dir=
+      case "$file" in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit 1
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case "$file" in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit 1
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case "$file" in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case "$file" in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+        # Export the shlibpath_var.
+        eval "export $shlibpath_var"
+      fi
+
+      # Restore saved enviroment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now actually exec the command.
+      eval "exec \$cmd$args"
+
+      $echo "$modename: cannot exec \$cmd$args"
+      exit 1
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+        eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+        $echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit 0
+    fi
+    ;;
+
+  # libtool uninstall mode
+  uninstall)
+    modename="$modename: uninstall"
+    rm="$nonopt"
+    files=
+
+    for arg
+    do
+      case "$arg" in
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit 1
+    fi
+
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$dir" = "X$file" && dir=.
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      rmfiles="$file"
+
+      case "$name" in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $dir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"
+
+	  $show "$rm $rmfiles"
+	  $run $rm $rmfiles
+
+	  if test -n "$library_names"; then
+	    # Do each command in the postuninstall commands.
+	    eval cmds=\"$postuninstall_cmds\"
+	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd"
+	    done
+	    IFS="$save_ifs"
+	  fi
+
+	  if test -n "$old_library"; then
+	    # Do each command in the old_postuninstall commands.
+	    eval cmds=\"$old_postuninstall_cmds\"
+	    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      $show "$cmd"
+	      $run eval "$cmd"
+	    done
+	    IFS="$save_ifs"
+	  fi
+
+	  # FIXME: should reinstall the best remaining shared library.
+	fi
+	;;
+
+      *.lo)
+	if test "$build_old_libs" = yes; then
+	  oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
+	  rmfiles="$rmfiles $dir/$oldobj"
+	fi
+	$show "$rm $rmfiles"
+	$run $rm $rmfiles
+	;;
+
+      *)
+	$show "$rm $rmfiles"
+	$run $rm $rmfiles
+	;;
+      esac
+    done
+    exit 0
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit 1
+    ;;
+  esac
+
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$generic_help" 1>&2
+  exit 1
+fi # test -z "$show_help"
+
+# We need to display help for each of the modes.
+case "$mode" in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --version         print version information
+
+MODE must be one of the following:
+
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE."
+  exit 0
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit 1
+  ;;
+esac
+
+echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
--- /dev/null
+++ b/common/libsndfile/missing
@@ -1,0 +1,188 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`configure.in'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`configure.in'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`configure.in'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in`
+    if test -z "$files"; then
+      files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in`
+      test -z "$files" || files="$files.in"
+    else
+      files=`echo "$files" | sed -e 's/:/ /g'`
+    fi
+    test -z "$files" && files="config.h.in"
+    touch $files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print \
+      | sed 's/^\(.*\).am$/touch \1.in/' \
+      | sh
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
--- /dev/null
+++ b/common/libsndfile/mkinstalldirs
@@ -1,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 2002/01/14 19:15:51 menno Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+  	  errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
--- /dev/null
+++ b/common/libsndfile/reconf
@@ -1,0 +1,15 @@
+#!/bin/sh
+
+rm -f config.cache
+
+if [ -d m4 ]; then
+	echo "Looking in m4 directory."
+	aclocal -I m4
+else
+	aclocal
+	fi
+	
+autoconf
+autoheader
+automake -a
+exit
--- /dev/null
+++ b/common/libsndfile/src/G72x/ChangeLog
@@ -1,0 +1,50 @@
+2001-06-05  Erik de Castro Lopo  <erikd@zip.com.au>
+
+	* g72x.c
+	Added {} in function update () to prevent 'ambiguous else' warning messages.
+
+2000-07-14  Erik de Castro Lopo  <erikd@zip.com.au>
+
+	* g72x.c
+	Modified g72x_init_state () to fit in with the new structure of the code.
+	Implemented g72x_encode_block () and g72x_decode_block ().
+
+2000-07-12  Erik de Castro Lopo  <erikd@zip.com.au>
+
+    * g72x.h
+    Moved nearly all definitions and function prototypes from this file have been 
+    moved to private.h.
+    Added an enum defining the 4 different G72x ADPCM codecs.
+    Added new function prototypes to define a cleaner interface to the encoder 
+    and decoder. This new interface also allows samples to be processed in blocks
+    rather than on a sample by sample basis like the original code.
+    
+    * private.h
+    Added prototypes moved from g72x.h.
+    Changed struct g72x_state to a typedef struct { .. } G72x_PRIVATE.
+    Added fields to G72x_PRIVATE required for working on blocks of samples.
+
+2000-06-07  Erik de Castro Lopo  <erikd@zip.com.au>
+
+    * g72x.c
+    Fixed all compiler warnings.
+    Removed functions tandem_adjust() which is not required by libsndfile.
+    
+    * g721.c
+    Fixed all compiler warnings.
+    Removed functions tandem_adjust_alaw() and tandem_adjust_ulaw () which are not 
+    required by libsndfile.
+    Removed second parameter to g721_encoder () which is not required.
+
+    * g72x.h
+    Removed in_coding and out_coding parameters from all functions. These allowed
+    g72x encoding/decoding to/from A-law or u-law and are not required by libsndfile.
+    Removed unneeded defines for A-law, u-law and linear encoding.
+
+    * g723_16.c
+    Removed second parameter (in_coding) for g723_16_encoder().    
+    Removed second parameter (out_coding) for g723_16_decoder().
+    
+    * private.h
+    New file containing prototypes and tyepdefs private to G72x code.
+    
--- /dev/null
+++ b/common/libsndfile/src/G72x/Makefile.am
@@ -1,0 +1,14 @@
+# This file was automatically generated
+# DO NOT EDIT!
+
+EXTRA_DIST = README README.original ChangeLog
+
+noinst_HEADERS = g72x.h private.h
+noinst_LTLIBRARIES = libg72x.la
+
+CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c
+
+libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS)
+
+# Disable autoheader. 
+AUTOHEADER=echo
--- /dev/null
+++ b/common/libsndfile/src/G72x/Makefile.in
@@ -1,0 +1,310 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# This file was automatically generated
+# DO NOT EDIT!
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+VERSION = @VERSION@
+subdirs = @subdirs@
+
+EXTRA_DIST = README README.original ChangeLog
+
+noinst_HEADERS = g72x.h private.h
+noinst_LTLIBRARIES = libg72x.la
+
+CFILES = g72x.c g721.c g723_16.c g723_24.c g723_40.c
+
+libg72x_la_SOURCES = $(CFILES) $(noinst_HEADERS)
+
+# Disable autoheader. 
+AUTOHEADER = echo
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../src/config.h
+CONFIG_CLEAN_FILES = 
+LTLIBRARIES =  $(noinst_LTLIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../src
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libg72x_la_LDFLAGS = 
+libg72x_la_LIBADD = 
+libg72x_la_OBJECTS =  g72x.lo g721.lo g723_16.lo g723_24.lo g723_40.lo
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  README ChangeLog Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libg72x_la_SOURCES)
+OBJECTS = $(libg72x_la_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/G72x/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLTLIBRARIES:
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+
+distclean-noinstLTLIBRARIES:
+
+maintainer-clean-noinstLTLIBRARIES:
+
+.c.o:
+	$(COMPILE) -c $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.c.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.s.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libg72x.la: $(libg72x_la_OBJECTS) $(libg72x_la_DEPENDENCIES)
+	$(LINK)  $(libg72x_la_LDFLAGS) $(libg72x_la_OBJECTS) $(libg72x_la_LIBADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src/G72x
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+g721.lo g721.o : g721.c g72x.h private.h
+g723_16.lo g723_16.o : g723_16.c g72x.h private.h
+g723_24.lo g723_24.o : g723_24.c g72x.h private.h
+g723_40.lo g723_40.o : g723_40.c g72x.h private.h
+g72x.lo g72x.o : g72x.c g72x.h private.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLTLIBRARIES mostlyclean-compile \
+		mostlyclean-libtool mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLTLIBRARIES clean-compile clean-libtool \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLTLIBRARIES distclean-compile \
+		distclean-libtool distclean-tags distclean-generic \
+		clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLTLIBRARIES \
+		maintainer-clean-compile maintainer-clean-libtool \
+		maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLTLIBRARIES distclean-noinstLTLIBRARIES \
+clean-noinstLTLIBRARIES maintainer-clean-noinstLTLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+++ b/common/libsndfile/src/G72x/README.original
@@ -1,0 +1,94 @@
+The files in this directory comprise ANSI-C language reference implementations
+of the CCITT (International Telegraph and Telephone Consultative Committee)
+G.711, G.721 and G.723 voice compressions.  They have been tested on Sun
+SPARCstations and passed 82 out of 84 test vectors published by CCITT
+(Dec. 20, 1988) for G.721 and G.723.  [The two remaining test vectors,
+which the G.721 decoder implementation for u-law samples did not pass,
+may be in error because they are identical to two other vectors for G.723_40.]
+
+This source code is released by Sun Microsystems, Inc. to the public domain.
+Please give your acknowledgement in product literature if this code is used
+in your product implementation.
+
+Sun Microsystems supports some CCITT audio formats in Solaris 2.0 system
+software.  However, Sun's implementations have been optimized for higher
+performance on SPARCstations.
+
+
+The source files for CCITT conversion routines in this directory are:
+
+	g72x.h		header file for g721.c, g723_24.c and g723_40.c
+	g711.c		CCITT G.711 u-law and A-law compression
+	g72x.c		common denominator of G.721 and G.723 ADPCM codes
+	g721.c		CCITT G.721 32Kbps ADPCM coder (with g72x.c)
+	g723_24.c	CCITT G.723 24Kbps ADPCM coder (with g72x.c)
+	g723_40.c	CCITT G.723 40Kbps ADPCM coder (with g72x.c)
+
+
+Simple conversions between u-law, A-law, and 16-bit linear PCM are invoked
+as follows:
+
+	unsigned char		ucode, acode;
+	short			pcm_val;
+
+	ucode = linear2ulaw(pcm_val);
+	ucode = alaw2ulaw(acode);
+
+	acode = linear2alaw(pcm_val);
+	acode = ulaw2alaw(ucode);
+
+	pcm_val = ulaw2linear(ucode);
+	pcm_val = alaw2linear(acode);
+
+
+The other CCITT compression routines are invoked as follows:
+
+	#include "g72x.h"
+
+	struct g72x_state	state;
+	int			sample, code;
+
+	g72x_init_state(&state);
+	code = {g721,g723_24,g723_40}_encoder(sample, coding, &state);
+	sample = {g721,g723_24,g723_40}_decoder(code, coding, &state);
+
+where
+	coding = AUDIO_ENCODING_ULAW	for 8-bit u-law samples
+		 AUDIO_ENCODING_ALAW	for 8-bit A-law samples
+		 AUDIO_ENCODING_LINEAR	for 16-bit linear PCM samples
+
+
+
+This directory also includes the following sample programs:
+
+	encode.c	CCITT ADPCM encoder
+	decode.c	CCITT ADPCM decoder
+	Makefile	makefile for the sample programs
+
+
+The sample programs contain examples of how to call the various compression
+routines and pack/unpack the bits.  The sample programs read byte streams from
+stdin and write to stdout.  The input/output data is raw data (no file header
+or other identifying information is embedded).  The sample programs are
+invoked as follows:
+
+	encode [-3|4|5] [-a|u|l] <infile >outfile
+	decode [-3|4|5] [-a|u|l] <infile >outfile
+where:
+	-3	encode to (decode from) G.723 24kbps (3-bit) data
+	-4	encode to (decode from) G.721 32kbps (4-bit) data [the default]
+	-5	encode to (decode from) G.723 40kbps (5-bit) data
+	-a	encode from (decode to) A-law data
+	-u	encode from (decode to) u-law data [the default]
+	-l	encode from (decode to) 16-bit linear data
+
+Examples:
+	# Read 16-bit linear and output G.721
+	encode -4 -l <pcmfile >g721file
+
+	# Read 40Kbps G.723 and output A-law
+	decode -5 -a <g723file >alawfile
+
+	# Compress and then decompress u-law data using 24Kbps G.723
+	encode -3 <ulawin | deoced -3 >ulawout
+
--- /dev/null
+++ b/common/libsndfile/src/G72x/g721.c
@@ -1,0 +1,154 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g721.c
+ *
+ * Description:
+ *
+ * g721_encoder(), g721_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.721 ADPCM
+ * coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which
+ * take advantage of work station attributes, such as hardware 2's
+ * complement arithmetic and large memory.  Specifically, certain time
+ * consuming operations such as multiplications are replaced
+ * with lookup tables and software 2's complement operations are
+ * replaced with hardware 2's complement.
+ *
+ * The deviation from the bit level specification (lookup tables)
+ * preserves the bit level performance specifications.
+ *
+ * As outlined in the G.721 Recommendation, the algorithm is broken
+ * down into modules.  Each section of code below is preceded by
+ * the name of the module which it is implementing.
+ *
+ */
+
+#include "g72x.h"
+#include "private.h"
+
+static short qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400};
+/*
+ * Maps G.721 code word to reconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short	_dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425,
+				425, 373, 323, 273, 213, 135, 4, -2048};
+
+/* Maps G.721 code word to log of scale factor multiplier. */
+static short	_witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122,
+				1122, 355, 198, 112, 64, 41, 18, -12};
+/*
+ * Maps G.721 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short	_fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
+				0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0};
+
+/*
+ * g721_encoder()
+ *
+ * Encodes the input vale of linear PCM, A-law or u-law data sl and returns
+ * the resulting code. -1 is returned for unknown input coding value.
+ */
+int
+g721_encoder(
+	int		sl,
+	G72x_STATE *state_ptr)
+{
+	short		sezi, se, sez;		/* ACCUM */
+	short		d;			/* SUBTA */
+	short		sr;			/* ADDB */
+	short		y;			/* MIX */
+	short		dqsez;			/* ADDC */
+	short		dq, i;
+
+	/* linearize input sample to 14-bit PCM */
+	sl >>= 2;			/* 14-bit dynamic range */
+
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	se = (sezi + predictor_pole(state_ptr)) >> 1;	/* estimated signal */
+
+	d = sl - se;				/* estimation difference */
+
+	/* quantize the prediction difference */
+	y = step_size(state_ptr);		/* quantizer step size */
+	i = quantize(d, y, qtab_721, 7);	/* i = ADPCM code */
+
+	dq = reconstruct(i & 8, _dqlntab[i], y);	/* quantized est diff */
+
+	sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq;	/* reconst. signal */
+
+	dqsez = sr + sez - se;			/* pole prediction diff. */
+
+	update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (i);
+}
+
+/*
+ * g721_decoder()
+ *
+ * Description:
+ *
+ * Decodes a 4-bit code of G.721 encoded data of i and
+ * returns the resulting linear PCM, A-law or u-law value.
+ * return -1 for unknown out_coding value.
+ */
+int
+g721_decoder(
+	int		i,
+	G72x_STATE *state_ptr)
+{
+	short		sezi, sei, sez, se;	/* ACCUM */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dq;
+	short		dqsez;
+
+	i &= 0x0f;			/* mask to get proper bits */
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	y = step_size(state_ptr);	/* dynamic quantizer step size */
+
+	dq = reconstruct(i & 0x08, _dqlntab[i], y); /* quantized diff. */
+
+	sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq;	/* reconst. signal */
+
+	dqsez = sr - se + sez;			/* pole prediction diff. */
+
+	update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+
+	/* sr was 14-bit dynamic range */
+	return (sr << 2);	
+}
--- /dev/null
+++ b/common/libsndfile/src/G72x/g723_16.c
@@ -1,0 +1,161 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+/* 16kbps version created, used 24kbps code and changing as little as possible.
+ * G.726 specs are available from ITU's gopher or WWW site (http://www.itu.ch)
+ * If any errors are found, please contact me at mrand@tamu.edu
+ *      -Marc Randolph
+ */
+
+/*
+ * g723_16.c
+ *
+ * Description:
+ *
+ * g723_16_encoder(), g723_16_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.726 16 Kbps
+ * ADPCM coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which take advantage
+ * of workstation attributes, such as hardware 2's complement arithmetic.
+ *
+ */
+
+#include "g72x.h"
+#include "private.h"
+
+/*
+ * Maps G.723_16 code word to reconstructed scale factor normalized log
+ * magnitude values.  Comes from Table 11/G.726
+ */
+static short   _dqlntab[4] = { 116, 365, 365, 116}; 
+
+/* Maps G.723_16 code word to log of scale factor multiplier.
+ *
+ * _witab[4] is actually {-22 , 439, 439, -22}, but FILTD wants it
+ * as WI << 5  (multiplied by 32), so we'll do that here 
+ */
+static short   _witab[4] = {-704, 14048, 14048, -704};
+
+/*
+ * Maps G.723_16 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+
+/* Comes from FUNCTF */
+static short   _fitab[4] = {0, 0xE00, 0xE00, 0};
+
+/* Comes from quantizer decision level tables (Table 7/G.726)
+ */
+static short qtab_723_16[1] = {261};
+
+
+/*
+ * g723_16_encoder()
+ *
+ * Encodes a linear PCM, A-law or u-law input sample and returns its 2-bit code.
+ * Returns -1 if invalid input coding value.
+ */
+int
+g723_16_encoder(
+       int             sl,
+       G72x_STATE *state_ptr)
+{
+       short           sei, sezi, se, sez;     /* ACCUM */
+       short           d;                      /* SUBTA */
+       short           y;                      /* MIX */
+       short           sr;                     /* ADDB */
+       short           dqsez;                  /* ADDC */
+       short           dq, i;
+
+		/* linearize input sample to 14-bit PCM */
+		sl >>= 2;               /* sl of 14-bit dynamic range */
+
+       sezi = predictor_zero(state_ptr);
+       sez = sezi >> 1;
+       sei = sezi + predictor_pole(state_ptr);
+       se = sei >> 1;                  /* se = estimated signal */
+
+       d = sl - se;                    /* d = estimation diff. */
+
+       /* quantize prediction difference d */
+       y = step_size(state_ptr);       /* quantizer step size */
+       i = quantize(d, y, qtab_723_16, 1);  /* i = ADPCM code */
+
+             /* Since quantize() only produces a three level output
+              * (1, 2, or 3), we must create the fourth one on our own
+              */
+       if (i == 3)                          /* i code for the zero region */
+         if ((d & 0x8000) == 0)             /* If d > 0, i=3 isn't right... */
+           i = 0;
+           
+       dq = reconstruct(i & 2, _dqlntab[i], y); /* quantized diff. */
+
+       sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+
+       dqsez = sr + sez - se;          /* pole prediction diff. */
+
+       update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+       return (i);
+}
+
+/*
+ * g723_16_decoder()
+ *
+ * Decodes a 2-bit CCITT G.723_16 ADPCM code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int
+g723_16_decoder(
+       int             i,
+       G72x_STATE *state_ptr)
+{
+       short           sezi, sei, sez, se;     /* ACCUM */
+       short           y;                      /* MIX */
+       short           sr;                     /* ADDB */
+       short           dq;
+       short           dqsez;
+
+       i &= 0x03;                      /* mask to get proper bits */
+       sezi = predictor_zero(state_ptr);
+       sez = sezi >> 1;
+       sei = sezi + predictor_pole(state_ptr);
+       se = sei >> 1;                  /* se = estimated signal */
+
+       y = step_size(state_ptr);       /* adaptive quantizer step size */
+       dq = reconstruct(i & 0x02, _dqlntab[i], y); /* unquantize pred diff */
+
+       sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+
+       dqsez = sr - se + sez;                  /* pole prediction diff. */
+
+       update(2, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+		/* sr was of 14-bit dynamic range */
+		return (sr << 2);       
+}
--- /dev/null
+++ b/common/libsndfile/src/G72x/g723_24.c
@@ -1,0 +1,138 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g723_24.c
+ *
+ * Description:
+ *
+ * g723_24_encoder(), g723_24_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.723 24 Kbps
+ * ADPCM coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which take advantage
+ * of workstation attributes, such as hardware 2's complement arithmetic.
+ *
+ */
+
+#include "g72x.h"
+#include "private.h"
+
+/*
+ * Maps G.723_24 code word to reconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short	_dqlntab[8] = {-2048, 135, 273, 373, 373, 273, 135, -2048};
+
+/* Maps G.723_24 code word to log of scale factor multiplier. */
+static short	_witab[8] = {-128, 960, 4384, 18624, 18624, 4384, 960, -128};
+
+/*
+ * Maps G.723_24 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short	_fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0};
+
+static short qtab_723_24[3] = {8, 218, 331};
+
+/*
+ * g723_24_encoder()
+ *
+ * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code.
+ * Returns -1 if invalid input coding value.
+ */
+int
+g723_24_encoder(
+	int		sl,
+	G72x_STATE *state_ptr)
+{
+	short		sei, sezi, se, sez;	/* ACCUM */
+	short		d;			/* SUBTA */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dqsez;			/* ADDC */
+	short		dq, i;
+
+	/* linearize input sample to 14-bit PCM */
+	sl >>= 2;		/* sl of 14-bit dynamic range */
+
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	d = sl - se;			/* d = estimation diff. */
+
+	/* quantize prediction difference d */
+	y = step_size(state_ptr);	/* quantizer step size */
+	i = quantize(d, y, qtab_723_24, 3);	/* i = ADPCM code */
+	dq = reconstruct(i & 4, _dqlntab[i], y); /* quantized diff. */
+
+	sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+
+	dqsez = sr + sez - se;		/* pole prediction diff. */
+
+	update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (i);
+}
+
+/*
+ * g723_24_decoder()
+ *
+ * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int
+g723_24_decoder(
+	int		i,
+	G72x_STATE *state_ptr)
+{
+	short		sezi, sei, sez, se;	/* ACCUM */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dq;
+	short		dqsez;
+
+	i &= 0x07;			/* mask to get proper bits */
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	y = step_size(state_ptr);	/* adaptive quantizer step size */
+	dq = reconstruct(i & 0x04, _dqlntab[i], y); /* unquantize pred diff */
+
+	sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+
+	dqsez = sr - se + sez;			/* pole prediction diff. */
+
+	update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (sr << 2);	/* sr was of 14-bit dynamic range */
+}
--- /dev/null
+++ b/common/libsndfile/src/G72x/g723_40.c
@@ -1,0 +1,152 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g723_40.c
+ *
+ * Description:
+ *
+ * g723_40_encoder(), g723_40_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.723 40Kbps
+ * ADPCM coding algorithm.  Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which
+ * take advantage of workstation attributes, such as hardware 2's
+ * complement arithmetic.
+ *
+ * The deviation from the bit level specification (lookup tables),
+ * preserves the bit level performance specifications.
+ *
+ * As outlined in the G.723 Recommendation, the algorithm is broken
+ * down into modules.  Each section of code below is preceded by
+ * the name of the module which it is implementing.
+ *
+ */
+
+#include "g72x.h"
+#include "private.h"
+
+/*
+ * Maps G.723_40 code word to ructeconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short	_dqlntab[32] = {-2048, -66, 28, 104, 169, 224, 274, 318,
+				358, 395, 429, 459, 488, 514, 539, 566,
+				566, 539, 514, 488, 459, 429, 395, 358,
+				318, 274, 224, 169, 104, 28, -66, -2048};
+
+/* Maps G.723_40 code word to log of scale factor multiplier. */
+static short	_witab[32] = {448, 448, 768, 1248, 1280, 1312, 1856, 3200,
+			4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272,
+			22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512,
+			3200, 1856, 1312, 1280, 1248, 768, 448, 448};
+
+/*
+ * Maps G.723_40 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short	_fitab[32] = {0, 0, 0, 0, 0, 0x200, 0x200, 0x200,
+			0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00,
+			0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200,
+			0x200, 0x200, 0x200, 0, 0, 0, 0, 0};
+
+static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339,
+				378, 413, 445, 475, 502, 528, 553};
+
+/*
+ * g723_40_encoder()
+ *
+ * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens
+ * the resulting 5-bit CCITT G.723 40Kbps code.
+ * Returns -1 if the input coding value is invalid.
+ */
+int	g723_40_encoder (int sl, G72x_STATE *state_ptr)
+{
+	short		sei, sezi, se, sez;	/* ACCUM */
+	short		d;			/* SUBTA */
+	short		y;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dqsez;			/* ADDC */
+	short		dq, i;
+
+	/* linearize input sample to 14-bit PCM */
+	sl >>= 2;		/* sl of 14-bit dynamic range */
+
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	d = sl - se;			/* d = estimation difference */
+
+	/* quantize prediction difference */
+	y = step_size(state_ptr);	/* adaptive quantizer step size */
+	i = quantize(d, y, qtab_723_40, 15);	/* i = ADPCM code */
+
+	dq = reconstruct(i & 0x10, _dqlntab[i], y);	/* quantized diff */
+
+	sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq; /* reconstructed signal */
+
+	dqsez = sr + sez - se;		/* dqsez = pole prediction diff. */
+
+	update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (i);
+}
+
+/*
+ * g723_40_decoder()
+ *
+ * Decodes a 5-bit CCITT G.723 40Kbps code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int	g723_40_decoder	(int i, G72x_STATE *state_ptr)
+{
+	short		sezi, sei, sez, se;	/* ACCUM */
+	short		y ;			/* MIX */
+	short		sr;			/* ADDB */
+	short		dq;
+	short		dqsez;
+
+	i &= 0x1f;			/* mask to get proper bits */
+	sezi = predictor_zero(state_ptr);
+	sez = sezi >> 1;
+	sei = sezi + predictor_pole(state_ptr);
+	se = sei >> 1;			/* se = estimated signal */
+
+	y = step_size(state_ptr);	/* adaptive quantizer step size */
+	dq = reconstruct(i & 0x10, _dqlntab[i], y);	/* estimation diff. */
+
+	sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
+
+	dqsez = sr - se + sez;		/* pole prediction diff. */
+
+	update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+	return (sr << 2);	/* sr was of 14-bit dynamic range */
+}
--- /dev/null
+++ b/common/libsndfile/src/G72x/g72x.c
@@ -1,0 +1,621 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+/*
+ * g72x.c
+ *
+ * Common routines for G.721 and G.723 conversions.
+ */
+ 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "g72x.h"
+#include "private.h"
+
+static 
+short power2 [15] = 
+{	1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
+	0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000
+} ;
+
+/*
+ * quan()
+ *
+ * quantizes the input val against the table of size short integers.
+ * It returns i if table[i - 1] <= val < table[i].
+ *
+ * Using linear search for simple coding.
+ */
+static 
+int quan (int val, short *table, int size)
+{
+	int		i;
+
+	for (i = 0; i < size; i++)
+		if (val < *table++)
+			break;
+	return (i);
+}
+
+/*
+ * fmult()
+ *
+ * returns the integer product of the 14-bit integer "an" and
+ * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
+ */
+static 
+int fmult (int an, int srn)
+{
+	short		anmag, anexp, anmant;
+	short		wanexp, wanmant;
+	short		retval;
+
+	anmag = (an > 0) ? an : ((-an) & 0x1FFF);
+	anexp = quan(anmag, power2, 15) - 6;
+	anmant = (anmag == 0) ? 32 :
+	    (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
+	wanexp = anexp + ((srn >> 6) & 0xF) - 13;
+
+	wanmant = (anmant * (srn & 077) + 0x30) >> 4;
+	retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
+	    (wanmant >> -wanexp);
+
+	return (((an ^ srn) < 0) ? -retval : retval);
+}
+
+/*
+ * private_init_state()
+ *
+ * This routine initializes and/or resets the G72x_PRIVATE structure
+ * pointed to by 'state_ptr'.
+ * All the initial state values are specified in the CCITT G.721 document.
+ */
+static
+void private_init_state (G72x_STATE *state_ptr)
+{
+	int		cnta;
+
+	state_ptr->yl = 34816;
+	state_ptr->yu = 544;
+	state_ptr->dms = 0;
+	state_ptr->dml = 0;
+	state_ptr->ap = 0;
+	for (cnta = 0; cnta < 2; cnta++) {
+		state_ptr->a[cnta] = 0;
+		state_ptr->pk[cnta] = 0;
+		state_ptr->sr[cnta] = 32;
+	}
+	for (cnta = 0; cnta < 6; cnta++) {
+		state_ptr->b[cnta] = 0;
+		state_ptr->dq[cnta] = 32;
+	}
+	state_ptr->td = 0;
+}	/* private_init_state */
+
+int g72x_reader_init (G72x_DATA *data, int codec)
+{	G72x_STATE *pstate ;
+
+	if (sizeof (data->private) < sizeof (G72x_STATE))
+	{	/* This is for safety only. */
+		return 1 ;
+		} ;
+
+	memset (data, 0, sizeof (G72x_DATA)) ;
+	
+	pstate = (G72x_STATE*) data->private ;
+	private_init_state (pstate) ;
+		
+	pstate->encoder = NULL ;
+	
+	switch (codec)
+	{	case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
+				pstate->decoder = g723_16_decoder ;
+				data->blocksize = G723_16_BYTES_PER_BLOCK ;
+				data->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 2 ;
+				break ;
+				
+		case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */ 
+				pstate->decoder = g723_24_decoder ;
+				data->blocksize = G723_24_BYTES_PER_BLOCK ;
+				data->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 3 ;
+				break ;
+				
+		case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
+				pstate->decoder = g721_decoder ;
+				data->blocksize = G721_32_BYTES_PER_BLOCK ;
+				data->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 4 ;
+				break ;
+				
+		case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
+				pstate->decoder = g723_40_decoder ;
+				data->blocksize = G721_40_BYTES_PER_BLOCK ;
+				data->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 5 ;
+				break ;
+				
+		default : return 1 ;
+		} ;
+
+	return 0 ;
+}	/* g72x_reader_init */
+
+int g72x_writer_init (G72x_DATA *data, int codec)
+{	G72x_STATE *pstate ;
+
+	if (sizeof (data->private) < sizeof (G72x_STATE))
+	{	/* This is for safety only. Gets optimised out. */
+		return 1 ;
+		} ;
+
+	memset (data, 0, sizeof (G72x_DATA)) ;
+	
+	pstate = (G72x_STATE*) data->private ;
+	private_init_state (pstate) ;
+		
+	pstate->decoder = NULL ;
+	
+	switch (codec)
+	{	case G723_16_BITS_PER_SAMPLE : /* 2 bits per sample. */
+				pstate->encoder = g723_16_encoder ;
+				data->blocksize = G723_16_BYTES_PER_BLOCK ;
+				data->samplesperblock = G723_16_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 2 ;
+				break ;
+				
+		case G723_24_BITS_PER_SAMPLE : /* 3 bits per sample. */ 
+				pstate->encoder = g723_24_encoder ;
+				data->blocksize = G723_24_BYTES_PER_BLOCK ;
+				data->samplesperblock = G723_24_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 3 ;
+				break ;
+				
+		case G721_32_BITS_PER_SAMPLE : /* 4 bits per sample. */
+				pstate->encoder = g721_encoder ;
+				data->blocksize = G721_32_BYTES_PER_BLOCK ;
+				data->samplesperblock = G721_32_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 4 ;
+				break ;
+				
+		case G721_40_BITS_PER_SAMPLE : /* 5 bits per sample. */
+				pstate->encoder = g723_40_encoder ;
+				data->blocksize = G721_40_BYTES_PER_BLOCK ;
+				data->samplesperblock = G721_40_SAMPLES_PER_BLOCK ;
+				pstate->codec_bits = 5 ;
+				break ;
+				
+		default : return 1 ;
+		} ;
+
+	return 0 ;
+}	/* g72x_writer_init */
+
+static
+int unpack_bytes (G72x_DATA *data, int bits)
+{	unsigned int    in_buffer = 0 ;
+	unsigned char	in_byte ;
+	int				k, in_bits = 0, bindex = 0 ;
+	
+	for (k = 0 ; bindex <= data->blocksize && k < G72x_BLOCK_SIZE ; k++)
+	{	if (in_bits < bits) 
+		{	in_byte = data->block [bindex++] ;
+
+			in_buffer |= (in_byte << in_bits);
+			in_bits += 8;
+			}
+		data->samples [k] = in_buffer & ((1 << bits) - 1);
+		in_buffer >>= bits;
+		in_bits -= bits;
+		} ;
+		
+	return k ;
+} /* unpack_bytes */
+
+int g72x_decode_block (G72x_DATA *data)
+{	G72x_STATE *pstate ;
+	int	k, count ;
+	
+	pstate = (G72x_STATE*) data->private ;
+	
+	count = unpack_bytes (data, pstate->codec_bits) ;
+	
+	for (k = 0 ; k < count ; k++)
+		data->samples [k] = pstate->decoder (data->samples [k], pstate) ;
+	
+	return 0 ;
+}	/* g72x_decode_block */
+
+static
+int pack_bytes (G72x_DATA *data, int bits)
+{
+	unsigned int	out_buffer = 0 ;
+	int				k, bindex = 0, out_bits = 0 ;
+	unsigned char	out_byte ;
+
+	for (k = 0 ; k < G72x_BLOCK_SIZE ; k++)
+	{	out_buffer |= (data->samples [k] << out_bits) ;
+		out_bits += bits ;
+		if (out_bits >= 8) 
+		{	out_byte = out_buffer & 0xFF ;
+			out_bits -= 8 ;
+			out_buffer >>= 8 ;
+			data->block [bindex++] = out_byte ;
+			}
+		} ;
+
+	return bindex ;
+} /* pack_bytes */
+
+int g72x_encode_block (G72x_DATA *data)
+{	G72x_STATE *pstate ;
+	int k, count ;
+
+	pstate = (G72x_STATE*) data->private ;
+	
+	for (k = 0 ; k < data->samplesperblock ; k++)
+		data->samples [k] = pstate->encoder (data->samples [k], pstate) ;
+	
+	count = pack_bytes (data, pstate->codec_bits) ;
+	
+	return count ;
+}	/* g72x_encode_block */
+
+/*
+ * predictor_zero()
+ *
+ * computes the estimated signal from 6-zero predictor.
+ *
+ */
+int  predictor_zero (G72x_STATE *state_ptr)
+{
+	int		i;
+	int		sezi;
+
+	sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
+	for (i = 1; i < 6; i++)			/* ACCUM */
+		sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
+	return (sezi);
+}
+/*
+ * predictor_pole()
+ *
+ * computes the estimated signal from 2-pole predictor.
+ *
+ */
+int  predictor_pole(G72x_STATE *state_ptr)
+{
+	return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
+	    fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
+}
+/*
+ * step_size()
+ *
+ * computes the quantization step size of the adaptive quantizer.
+ *
+ */
+int  step_size (G72x_STATE *state_ptr)
+{
+	int		y;
+	int		dif;
+	int		al;
+
+	if (state_ptr->ap >= 256)
+		return (state_ptr->yu);
+	else {
+		y = state_ptr->yl >> 6;
+		dif = state_ptr->yu - y;
+		al = state_ptr->ap >> 2;
+		if (dif > 0)
+			y += (dif * al) >> 6;
+		else if (dif < 0)
+			y += (dif * al + 0x3F) >> 6;
+		return (y);
+	}
+}
+
+/*
+ * quantize()
+ *
+ * Given a raw sample, 'd', of the difference signal and a
+ * quantization step size scale factor, 'y', this routine returns the
+ * ADPCM codeword to which that sample gets quantized.  The step
+ * size scale factor division operation is done in the log base 2 domain
+ * as a subtraction.
+ */
+int quantize(
+	int		d,	/* Raw difference signal sample */
+	int		y,	/* Step size multiplier */
+	short	*table,	/* quantization table */
+	int		size)	/* table size of short integers */
+{
+	short		dqm;	/* Magnitude of 'd' */
+	short		exp;	/* Integer part of base 2 log of 'd' */
+	short		mant;	/* Fractional part of base 2 log */
+	short		dl;	/* Log of magnitude of 'd' */
+	short		dln;	/* Step size scale factor normalized log */
+	int		i;
+
+	/*
+	 * LOG
+	 *
+	 * Compute base 2 log of 'd', and store in 'dl'.
+	 */
+	dqm = abs(d);
+	exp = quan(dqm >> 1, power2, 15);
+	mant = ((dqm << 7) >> exp) & 0x7F;	/* Fractional portion. */
+	dl = (exp << 7) + mant;
+
+	/*
+	 * SUBTB
+	 *
+	 * "Divide" by step size multiplier.
+	 */
+	dln = dl - (y >> 2);
+
+	/*
+	 * QUAN
+	 *
+	 * Obtain codword i for 'd'.
+	 */
+	i = quan(dln, table, size);
+	if (d < 0)			/* take 1's complement of i */
+		return ((size << 1) + 1 - i);
+	else if (i == 0)		/* take 1's complement of 0 */
+		return ((size << 1) + 1); /* new in 1988 */
+	else
+		return (i);
+}
+/*
+ * reconstruct()
+ *
+ * Returns reconstructed difference signal 'dq' obtained from
+ * codeword 'i' and quantization step size scale factor 'y'.
+ * Multiplication is performed in log base 2 domain as addition.
+ */
+int
+reconstruct(
+	int		sign,	/* 0 for non-negative value */
+	int		dqln,	/* G.72x codeword */
+	int		y)	/* Step size multiplier */
+{
+	short		dql;	/* Log of 'dq' magnitude */
+	short		dex;	/* Integer part of log */
+	short		dqt;
+	short		dq;	/* Reconstructed difference signal sample */
+
+	dql = dqln + (y >> 2);	/* ADDA */
+
+	if (dql < 0) {
+		return ((sign) ? -0x8000 : 0);
+	} else {		/* ANTILOG */
+		dex = (dql >> 7) & 15;
+		dqt = 128 + (dql & 127);
+		dq = (dqt << 7) >> (14 - dex);
+		return ((sign) ? (dq - 0x8000) : dq);
+	}
+}
+
+
+/*
+ * update()
+ *
+ * updates the state variables for each output code
+ */
+void
+update(
+	int		code_size,	/* distinguish 723_40 with others */
+	int		y,		/* quantizer step size */
+	int		wi,		/* scale factor multiplier */
+	int		fi,		/* for long/short term energies */
+	int		dq,		/* quantized prediction difference */
+	int		sr,		/* reconstructed signal */
+	int		dqsez,		/* difference from 2-pole predictor */
+	G72x_STATE *state_ptr)	/* coder state pointer */
+{
+	int		cnt;
+	short		mag, exp;	/* Adaptive predictor, FLOAT A */
+	short		a2p = 0;	/* LIMC */
+	short		a1ul;		/* UPA1 */
+	short		pks1;		/* UPA2 */
+	short		fa1;
+	char		tr;		/* tone/transition detector */
+	short		ylint, thr2, dqthr;
+	short  		ylfrac, thr1;
+	short		pk0;
+
+	pk0 = (dqsez < 0) ? 1 : 0;	/* needed in updating predictor poles */
+
+	mag = dq & 0x7FFF;		/* prediction difference magnitude */
+	/* TRANS */
+	ylint = state_ptr->yl >> 15;	/* exponent part of yl */
+	ylfrac = (state_ptr->yl >> 10) & 0x1F;	/* fractional part of yl */
+	thr1 = (32 + ylfrac) << ylint;		/* threshold */
+	thr2 = (ylint > 9) ? 31 << 10 : thr1;	/* limit thr2 to 31 << 10 */
+	dqthr = (thr2 + (thr2 >> 1)) >> 1;	/* dqthr = 0.75 * thr2 */
+	if (state_ptr->td == 0)		/* signal supposed voice */
+		tr = 0;
+	else if (mag <= dqthr)		/* supposed data, but small mag */
+		tr = 0;			/* treated as voice */
+	else				/* signal is data (modem) */
+		tr = 1;
+
+	/*
+	 * Quantizer scale factor adaptation.
+	 */
+
+	/* FUNCTW & FILTD & DELAY */
+	/* update non-steady state step size multiplier */
+	state_ptr->yu = y + ((wi - y) >> 5);
+
+	/* LIMB */
+	if (state_ptr->yu < 544)	/* 544 <= yu <= 5120 */
+		state_ptr->yu = 544;
+	else if (state_ptr->yu > 5120)
+		state_ptr->yu = 5120;
+
+	/* FILTE & DELAY */
+	/* update steady state step size multiplier */
+	state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
+
+	/*
+	 * Adaptive predictor coefficients.
+	 */
+	if (tr == 1) {			/* reset a's and b's for modem signal */
+		state_ptr->a[0] = 0;
+		state_ptr->a[1] = 0;
+		state_ptr->b[0] = 0;
+		state_ptr->b[1] = 0;
+		state_ptr->b[2] = 0;
+		state_ptr->b[3] = 0;
+		state_ptr->b[4] = 0;
+		state_ptr->b[5] = 0;
+	} else {			/* update a's and b's */
+		pks1 = pk0 ^ state_ptr->pk[0];		/* UPA2 */
+
+		/* update predictor pole a[1] */
+		a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
+		if (dqsez != 0) {
+			fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
+			if (fa1 < -8191)	/* a2p = function of fa1 */
+				a2p -= 0x100;
+			else if (fa1 > 8191)
+				a2p += 0xFF;
+			else
+				a2p += fa1 >> 5;
+
+			if (pk0 ^ state_ptr->pk[1])
+			{	/* LIMC */
+				if (a2p <= -12160)
+					a2p = -12288;
+				else if (a2p >= 12416)
+					a2p = 12288;
+				else
+					a2p -= 0x80;
+				}
+			else if (a2p <= -12416)
+				a2p = -12288;
+			else if (a2p >= 12160)
+				a2p = 12288;
+			else
+				a2p += 0x80;
+		}
+
+		/* TRIGB & DELAY */
+		state_ptr->a[1] = a2p;
+
+		/* UPA1 */
+		/* update predictor pole a[0] */
+		state_ptr->a[0] -= state_ptr->a[0] >> 8;
+		if (dqsez != 0)
+		{	if (pks1 == 0)
+				state_ptr->a[0] += 192;
+			else
+				state_ptr->a[0] -= 192;
+			} ;
+
+		/* LIMD */
+		a1ul = 15360 - a2p;
+		if (state_ptr->a[0] < -a1ul)
+			state_ptr->a[0] = -a1ul;
+		else if (state_ptr->a[0] > a1ul)
+			state_ptr->a[0] = a1ul;
+
+		/* UPB : update predictor zeros b[6] */
+		for (cnt = 0; cnt < 6; cnt++) {
+			if (code_size == 5)		/* for 40Kbps G.723 */
+				state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
+			else			/* for G.721 and 24Kbps G.723 */
+				state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
+			if (dq & 0x7FFF) {			/* XOR */
+				if ((dq ^ state_ptr->dq[cnt]) >= 0)
+					state_ptr->b[cnt] += 128;
+				else
+					state_ptr->b[cnt] -= 128;
+			}
+		}
+	}
+
+	for (cnt = 5; cnt > 0; cnt--)
+		state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
+	/* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
+	if (mag == 0) {
+		state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
+	} else {
+		exp = quan(mag, power2, 15);
+		state_ptr->dq[0] = (dq >= 0) ?
+		    (exp << 6) + ((mag << 6) >> exp) :
+		    (exp << 6) + ((mag << 6) >> exp) - 0x400;
+	}
+
+	state_ptr->sr[1] = state_ptr->sr[0];
+	/* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
+	if (sr == 0) {
+		state_ptr->sr[0] = 0x20;
+	} else if (sr > 0) {
+		exp = quan(sr, power2, 15);
+		state_ptr->sr[0] = (exp << 6) + ((sr << 6) >> exp);
+	} else if (sr > -32768) {
+		mag = -sr;
+		exp = quan(mag, power2, 15);
+		state_ptr->sr[0] =  (exp << 6) + ((mag << 6) >> exp) - 0x400;
+	} else
+		state_ptr->sr[0] = (short) 0xFC20;
+
+	/* DELAY A */
+	state_ptr->pk[1] = state_ptr->pk[0];
+	state_ptr->pk[0] = pk0;
+
+	/* TONE */
+	if (tr == 1)		/* this sample has been treated as data */
+		state_ptr->td = 0;	/* next one will be treated as voice */
+	else if (a2p < -11776)	/* small sample-to-sample correlation */
+		state_ptr->td = 1;	/* signal may be data */
+	else				/* signal is voice */
+		state_ptr->td = 0;
+
+	/*
+	 * Adaptation speed control.
+	 */
+	state_ptr->dms += (fi - state_ptr->dms) >> 5;		/* FILTA */
+	state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7);	/* FILTB */
+
+	if (tr == 1)
+		state_ptr->ap = 256;
+	else if (y < 1536)					/* SUBTC */
+		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+	else if (state_ptr->td == 1)
+		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+	else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
+	    (state_ptr->dml >> 3))
+		state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+	else
+		state_ptr->ap += (-state_ptr->ap) >> 4;
+}
+
--- /dev/null
+++ b/common/libsndfile/src/G72x/g72x.h
@@ -1,0 +1,112 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+** This file is not the same as the original file from Sun Microsystems. Nearly
+** all the original definitions and function prototypes that were in the  file 
+** of this name have been moved to private.h.
+*/	
+
+#ifndef G72X_HEADER_FILE
+#define	G72X_HEADER_FILE
+
+/* 
+** Number of samples per block to process. 
+** Must be a common multiple of possible bits per sample : 2, 3, 4, 5 and 8.
+*/
+#define	G72x_BLOCK_SIZE		(3*5*8)  
+
+/*	
+**	Identifiers for the differing kinds of G72x ADPCM codecs.
+**	The identifiers also define the number of encoded bits per sample.
+*/
+
+enum
+{	G723_16_BITS_PER_SAMPLE = 2,
+	G723_24_BITS_PER_SAMPLE = 3, 
+	G721_32_BITS_PER_SAMPLE = 4,
+	G721_40_BITS_PER_SAMPLE = 5,
+	
+	G723_16_MIN_BYTES = 1,
+	G723_24_MIN_BYTES = 3, 
+	G721_32_MIN_BYTES = 1,
+	G721_40_MIN_BYTES = 5
+} ;
+
+enum	
+{	G723_16_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
+	G723_24_SAMPLES_PER_BLOCK = G723_24_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G723_24_BITS_PER_SAMPLE), 
+	G721_32_SAMPLES_PER_BLOCK = G72x_BLOCK_SIZE,
+	G721_40_SAMPLES_PER_BLOCK = G721_40_BITS_PER_SAMPLE * (G72x_BLOCK_SIZE / G721_40_BITS_PER_SAMPLE)
+} ;
+
+enum	
+{	G723_16_BYTES_PER_BLOCK = (G723_16_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G723_24_BYTES_PER_BLOCK = (G723_24_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G721_32_BYTES_PER_BLOCK = (G721_32_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8,
+	G721_40_BYTES_PER_BLOCK = (G721_40_BITS_PER_SAMPLE * G72x_BLOCK_SIZE) / 8
+} ; 
+
+/* 
+** This is the public structure for passing data between the caller and
+** the G72x encoder and decoder. 
+** The private array is used by the encoder and decoder for internal
+** state information and should not be changed in any way by the caller.
+** When decoding or encoding a stream, the same instance of this struct
+** should be used for every call so that the decoder/encoder keeps the
+** correct state data between calls.
+*/
+
+typedef struct 
+{	/* Private data. Don't mess with it. */
+	unsigned char	private [256] ;  
+
+	/* Public data. Read only. */
+	int				blocksize, max_bytes, samplesperblock, bytesperblock ;
+
+	/* Public data. Read and write. */
+	int				blocks, blockcount, samplecount ;
+	unsigned char	block	[G72x_BLOCK_SIZE] ;
+	short			samples	[G72x_BLOCK_SIZE] ;
+} G72x_DATA ;
+
+/* External function definitions. */
+
+int g72x_reader_init (G72x_DATA *data, int codec) ;
+int g72x_writer_init (G72x_DATA *data, int codec) ;
+/*
+**	Initialize the ADPCM state table for the given codec.
+**	Return 0 on success, 1 on fail.
+*/
+
+int g72x_decode_block (G72x_DATA *data) ;
+/*
+**	The caller fills data->block with data->bytes bytes before calling the 
+**	function. The value data->bytes must be an integer multiple of 
+**	data->blocksize and be <= data->max_bytes.
+**	When it returns, the caller can read out data->samples samples. 
+*/  
+
+int g72x_encode_block (G72x_DATA *data) ;
+/*	
+**	The caller fills state->samples some integer multiple data->samples_per_block
+**	(up to G72x_BLOCK_SIZE) samples before calling the function.
+**	When it returns, the caller can read out bytes encoded bytes. 
+*/
+
+#endif /* !G72X_HEADER_FILE */
--- /dev/null
+++ b/common/libsndfile/src/G72x/private.h
@@ -1,0 +1,108 @@
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use.  Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California  94043
+ */
+
+#ifndef G72X_PRIVATE_H
+#define G72X_PRIVATE_H
+
+
+/*
+** The following is the definition of the state structure used by the
+** G.721/G.723 encoder and decoder to preserve their internal state
+** between successive calls.  The meanings of the majority of the state 
+** structure fields are explained in detail in the CCITT Recommendation 
+** G.721.  The field names are essentially identical to variable names 
+** in the bit level description of the coding algorithm included in this 
+** Recommendation.
+*/
+
+typedef struct private_g72x
+{	long  yl;	/* Locked or steady state step size multiplier. */
+	short yu;	/* Unlocked or non-steady state step size multiplier. */
+	short dms;	/* Short term energy estimate. */
+	short dml;	/* Long term energy estimate. */
+	short ap;	/* Linear weighting coefficient of 'yl' and 'yu'. */
+
+	short a[2];	/* Coefficients of pole portion of prediction filter. */
+	short b[6];	/* Coefficients of zero portion of prediction filter. */
+	short pk[2];	/*
+					** Signs of previous two samples of a partially
+					** reconstructed signal.
+					**/
+	short dq[6];	/*
+					** Previous 6 samples of the quantized difference
+					** signal represented in an internal floating point
+					** format.
+					**/
+	short sr[2];	/*
+			 		** Previous 2 samples of the quantized difference
+					** signal represented in an internal floating point
+					** format.
+					*/
+	char td;	/* delayed tone detect, new in 1988 version */
+	
+	/*	The following struct members were added for libsndfile. The original 
+	**	code worked by calling a set of functions on a sample by sample basis 
+	**	which is slow on architectures like Intel x86. For libsndfile, this 
+	**	was changed so that the encoding and decoding routines could work on
+	**	a block of samples at a time to reduce the function call overhead.
+	*/
+	int		(*encoder) (int, struct private_g72x* state) ;
+	int		(*decoder) (int, struct private_g72x* state) ;
+	
+	int		codec_bits ;
+	int		byte_index, sample_index ;
+	
+} G72x_STATE ;
+
+
+
+int	predictor_zero(G72x_STATE *state_ptr);
+
+int	predictor_pole(G72x_STATE *state_ptr);
+
+int	step_size(G72x_STATE *state_ptr);
+
+int	quantize(int d, int	y, short *table, int size);
+
+int	reconstruct(int sign, int dqln,	int y);
+
+void update (int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, G72x_STATE *state_ptr);
+
+int g721_encoder	(int sample, G72x_STATE *state_ptr);
+int g721_decoder	(int code, G72x_STATE *state_ptr);
+
+int g723_16_encoder	(int sample, G72x_STATE *state_ptr);
+int g723_16_decoder	(int code, G72x_STATE *state_ptr);
+
+int g723_24_encoder	(int sample, G72x_STATE *state_ptr);
+int g723_24_decoder	(int code, G72x_STATE *state_ptr);
+
+int g723_40_encoder	(int sample, G72x_STATE *state_ptr);
+int g723_40_decoder	(int code, G72x_STATE *state_ptr);
+
+
+
+#endif /* G72X_PRIVATE_H */
--- /dev/null
+++ b/common/libsndfile/src/GSM610/COPYRIGHT
@@ -1,0 +1,16 @@
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener
+Carsten Bormann
--- /dev/null
+++ b/common/libsndfile/src/GSM610/ChangeLog
@@ -1,0 +1,21 @@
+2001-09-16  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * code.c
+    Added #includes fro string.h and stdlib.h.
+
+2000-10-27  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * config.h
+    Removed some commented out #defines (ie //*efine) which were causing problems on
+	the Sun cc compiler.
+
+2000-02-29  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * private.h
+    Added #defines to emulate normal compile time options.
+
+2000-02-28  Erik de Castro Lopo  <erikd AT zip DOT com DOT au>
+
+    * everthing
+    Created this directory and copied files from libgsm.
+    http://kbs.cs.tu-berlin.de/~jutta/toast.html
--- /dev/null
+++ b/common/libsndfile/src/GSM610/Makefile.am
@@ -1,0 +1,15 @@
+# This file was automatically generated
+# DO NOT EDIT!
+
+EXTRA_DIST = README COPYRIGHT ChangeLog
+
+noinst_HEADERS = gsm.h config.h private.h proto.h unproto.h
+noinst_LTLIBRARIES = libgsm.la
+
+CFILES = add.c decode.c gsm_decode.c gsm_encode.c long_term.c preprocess.c \
+	short_term.c code.c gsm_create.c gsm_destroy.c gsm_option.c lpc.c rpe.c table.c
+
+libgsm_la_SOURCES = $(CFILES) $(noinst_HEADERS)
+
+# Disable autoheader. 
+AUTOHEADER=echo
--- /dev/null
+++ b/common/libsndfile/src/GSM610/Makefile.in
@@ -1,0 +1,328 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# This file was automatically generated
+# DO NOT EDIT!
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+VERSION = @VERSION@
+subdirs = @subdirs@
+
+EXTRA_DIST = README COPYRIGHT ChangeLog
+
+noinst_HEADERS = gsm.h config.h private.h proto.h unproto.h
+noinst_LTLIBRARIES = libgsm.la
+
+CFILES = add.c decode.c gsm_decode.c gsm_encode.c long_term.c preprocess.c 	short_term.c code.c gsm_create.c gsm_destroy.c gsm_option.c lpc.c rpe.c table.c
+
+
+libgsm_la_SOURCES = $(CFILES) $(noinst_HEADERS)
+
+# Disable autoheader. 
+AUTOHEADER = echo
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../src/config.h
+CONFIG_CLEAN_FILES = 
+LTLIBRARIES =  $(noinst_LTLIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../../src
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libgsm_la_LDFLAGS = 
+libgsm_la_LIBADD = 
+libgsm_la_OBJECTS =  add.lo decode.lo gsm_decode.lo gsm_encode.lo \
+long_term.lo preprocess.lo short_term.lo code.lo gsm_create.lo \
+gsm_destroy.lo gsm_option.lo lpc.lo rpe.lo table.lo
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(noinst_HEADERS)
+
+DIST_COMMON =  README ChangeLog Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libgsm_la_SOURCES)
+OBJECTS = $(libgsm_la_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/GSM610/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLTLIBRARIES:
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+
+distclean-noinstLTLIBRARIES:
+
+maintainer-clean-noinstLTLIBRARIES:
+
+.c.o:
+	$(COMPILE) -c $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.c.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.s.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libgsm.la: $(libgsm_la_OBJECTS) $(libgsm_la_DEPENDENCIES)
+	$(LINK)  $(libgsm_la_LDFLAGS) $(libgsm_la_OBJECTS) $(libgsm_la_LIBADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src/GSM610
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+add.lo add.o : add.c private.h proto.h unproto.h gsm.h
+code.lo code.o : code.c config.h private.h proto.h unproto.h gsm.h
+decode.lo decode.o : decode.c private.h proto.h unproto.h gsm.h
+gsm_create.lo gsm_create.o : gsm_create.c config.h gsm.h private.h \
+	proto.h unproto.h
+gsm_decode.lo gsm_decode.o : gsm_decode.c private.h proto.h unproto.h \
+	gsm.h
+gsm_destroy.lo gsm_destroy.o : gsm_destroy.c gsm.h config.h proto.h
+gsm_encode.lo gsm_encode.o : gsm_encode.c private.h proto.h unproto.h \
+	gsm.h
+gsm_option.lo gsm_option.o : gsm_option.c private.h proto.h unproto.h \
+	gsm.h
+long_term.lo long_term.o : long_term.c private.h proto.h unproto.h gsm.h
+lpc.lo lpc.o : lpc.c private.h proto.h unproto.h gsm.h
+preprocess.lo preprocess.o : preprocess.c private.h proto.h unproto.h \
+	gsm.h
+rpe.lo rpe.o : rpe.c private.h proto.h unproto.h gsm.h
+short_term.lo short_term.o : short_term.c private.h proto.h unproto.h \
+	gsm.h
+table.lo table.o : table.c private.h proto.h unproto.h gsm.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLTLIBRARIES mostlyclean-compile \
+		mostlyclean-libtool mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLTLIBRARIES clean-compile clean-libtool \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLTLIBRARIES distclean-compile \
+		distclean-libtool distclean-tags distclean-generic \
+		clean-am
+	-rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLTLIBRARIES \
+		maintainer-clean-compile maintainer-clean-libtool \
+		maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLTLIBRARIES distclean-noinstLTLIBRARIES \
+clean-noinstLTLIBRARIES maintainer-clean-noinstLTLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+++ b/common/libsndfile/src/GSM610/README
@@ -1,0 +1,36 @@
+GSM 06.10 13 kbit/s RPE/LTP speech codec
+----------------------------------------
+
+All the file in this directory were written by Jutta Degener
+and Carsten Borman for The Communications and Operating Systems 
+Research Group (KBS) at the Technische Universitaet Berlin.
+
+Their work was released under the following license which is 
+assumed to be compatible with The GNU Lesser General Public License.
+
+----------------------------------------------------------------------------
+
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener (jutta@cs.tu-berlin.de)
+Carsten Bormann (cabo@cs.tu-berlin.de)
+
+----------------------------------------------------------------------------
+
+Jutta Degener and Carsten Bormann's work can be found on their homepage
+at:
+
+    http://kbs.cs.tu-berlin.de/~jutta/toast.html
+	
--- /dev/null
+++ b/common/libsndfile/src/GSM610/add.c
@@ -1,0 +1,251 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/add.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+/*
+ *  See private.h for the more commonly used macro versions.
+ */
+
+#include	<stdio.h>
+#include	<assert.h>
+
+#include	"private.h"
+#include	"gsm.h"
+#include	"proto.h"
+
+#define	saturate(x) 	\
+	((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
+
+word gsm_add P2((a,b), word a, word b)
+{
+	longword sum = (longword)a + (longword)b;
+	return saturate(sum);
+}
+
+word gsm_sub P2((a,b), word a, word b)
+{
+	longword diff = (longword)a - (longword)b;
+	return saturate(diff);
+}
+
+word gsm_mult P2((a,b), word a, word b)
+{
+	if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
+	else return SASR( (longword)a * (longword)b, 15 );
+}
+
+word gsm_mult_r P2((a,b), word a, word b)
+{
+	if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
+	else {
+		longword prod = (longword)a * (longword)b + 16384;
+		prod >>= 15;
+		return prod & 0xFFFF;
+	}
+}
+
+word gsm_abs P1((a), word a)
+{
+	return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+}
+
+longword gsm_L_mult P2((a,b),word a, word b)
+{
+	assert( a != MIN_WORD || b != MIN_WORD );
+	return ((longword)a * (longword)b) << 1;
+}
+
+longword gsm_L_add P2((a,b), longword a, longword b)
+{
+	if (a < 0) {
+		if (b >= 0) return a + b;
+		else {
+			ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
+			return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
+		}
+	}
+	else if (b <= 0) return a + b;
+	else {
+		ulongword A = (ulongword)a + (ulongword)b;
+		return A > MAX_LONGWORD ? MAX_LONGWORD : A;
+	}
+}
+
+longword gsm_L_sub P2((a,b), longword a, longword b)
+{
+	if (a >= 0) {
+		if (b >= 0) return a - b;
+		else {
+			/* a>=0, b<0 */
+
+			ulongword A = (ulongword)a + -(b + 1);
+			return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
+		}
+	}
+	else if (b <= 0) return a - b;
+	else {
+		/* a<0, b>0 */  
+
+		ulongword A = (ulongword)-(a + 1) + b;
+		return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
+	}
+}
+
+static unsigned char const bitoff[ 256 ] = {
+	 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+	 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+word gsm_norm P1((a), longword a )
+/*
+ * the number of left shifts needed to normalize the 32 bit
+ * variable L_var1 for positive values on the interval
+ *
+ * with minimum of
+ * minimum of 1073741824  (01000000000000000000000000000000) and 
+ * maximum of 2147483647  (01111111111111111111111111111111)
+ *
+ *
+ * and for negative values on the interval with
+ * minimum of -2147483648 (-10000000000000000000000000000000) and
+ * maximum of -1073741824 ( -1000000000000000000000000000000).
+ *
+ * in order to normalize the result, the following
+ * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
+ *
+ * (That's 'ffs', only from the left, not the right..)
+ */
+{
+	assert(a != 0);
+
+	if (a < 0) {
+		if (a <= -1073741824) return 0;
+		a = ~a;
+	}
+
+	return    a & 0xffff0000 
+		? ( a & 0xff000000
+		  ?  -1 + bitoff[ 0xFF & (a >> 24) ]
+		  :   7 + bitoff[ 0xFF & (a >> 16) ] )
+		: ( a & 0xff00
+		  ?  15 + bitoff[ 0xFF & (a >> 8) ]
+		  :  23 + bitoff[ 0xFF & a ] );
+}
+
+longword gsm_L_asl (longword a, int n)
+{
+	if (n >= 32) return 0;
+	if (n <= -32) return -(a < 0);
+	if (n < 0) return gsm_L_asr(a, -n);
+	return a << n;
+}
+
+word gsm_asr (word a, int n)
+{
+	if (n >= 16) return -(a < 0);
+	if (n <= -16) return 0;
+	if (n < 0) return a << -n;
+
+#	ifdef	SASR
+		return a >> n;
+#	else
+		if (a >= 0) return a >> n;
+		else return -(word)( -(uword)a >> n );
+#	endif
+}
+
+word gsm_asl (word a, int n)
+{
+	if (n >= 16) return 0;
+	if (n <= -16) return -(a < 0);
+	if (n < 0) return gsm_asr(a, -n);
+	return a << n;
+}
+
+longword gsm_L_asr (longword a, int n)
+{
+	if (n >= 32) return -(a < 0);
+	if (n <= -32) return 0;
+	if (n < 0) return a << -n;
+
+#	ifdef	SASR
+		return a >> n;
+#	else
+		if (a >= 0) return a >> n;
+		else return -(longword)( -(ulongword)a >> n );
+#	endif
+}
+
+/*
+**	word gsm_asr (word a, int n)
+**	{
+**		if (n >= 16) return -(a < 0);
+**		if (n <= -16) return 0;
+**		if (n < 0) return a << -n;
+**	
+**	#	ifdef	SASR
+**			return a >> n;
+**	#	else
+**			if (a >= 0) return a >> n;
+**			else return -(word)( -(uword)a >> n );
+**	#	endif
+**	}
+**	
+*/
+/* 
+ *  (From p. 46, end of section 4.2.5)
+ *
+ *  NOTE: The following lines gives [sic] one correct implementation
+ *  	  of the div(num, denum) arithmetic operation.  Compute div
+ *        which is the integer division of num by denum: with denum
+ *	  >= num > 0
+ */
+
+word gsm_div P2((num,denum), word num, word denum)
+{
+	longword	L_num   = num;
+	longword	L_denum = denum;
+	word		div 	= 0;
+	int		k 	= 15;
+
+	/* The parameter num sometimes becomes zero.
+	 * Although this is explicitly guarded against in 4.2.5,
+	 * we assume that the result should then be zero as well.
+	 */
+
+	/* assert(num != 0); */
+
+	assert(num >= 0 && denum >= num);
+	if (num == 0)
+	    return 0;
+
+	while (k--) {
+		div   <<= 1;
+		L_num <<= 1;
+
+		if (L_num >= L_denum) {
+			L_num -= L_denum;
+			div++;
+		}
+	}
+
+	return div;
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/code.c
@@ -1,0 +1,97 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/code.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+
+
+
+#include	<stdlib.h>
+#include	<string.h>
+
+#include	"config.h"
+
+#include	"private.h"
+#include	"gsm.h"
+#include	"proto.h"
+
+/* 
+ *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER 
+ */
+
+void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
+
+	struct gsm_state	* S,
+
+	word	* s,	/* [0..159] samples		  	IN	*/
+
+/*
+ * The RPE-LTD coder works on a frame by frame basis.  The length of
+ * the frame is equal to 160 samples.  Some computations are done
+ * once per frame to produce at the output of the coder the
+ * LARc[1..8] parameters which are the coded LAR coefficients and 
+ * also to realize the inverse filtering operation for the entire
+ * frame (160 samples of signal d[0..159]).  These parts produce at
+ * the output of the coder:
+ */
+
+	word	* LARc,	/* [0..7] LAR coefficients		OUT	*/
+
+/*
+ * Procedure 4.2.11 to 4.2.18 are to be executed four times per
+ * frame.  That means once for each sub-segment RPE-LTP analysis of
+ * 40 samples.  These parts produce at the output of the coder:
+ */
+
+	word	* Nc,	/* [0..3] LTP lag			OUT 	*/
+	word	* bc,	/* [0..3] coded LTP gain		OUT 	*/
+	word	* Mc,	/* [0..3] RPE grid selection		OUT     */
+	word	* xmaxc,/* [0..3] Coded maximum amplitude	OUT	*/
+	word	* xMc	/* [13*4] normalized RPE samples	OUT	*/
+)
+{
+	int	k;
+	word	* dp  = S->dp0 + 120;	/* [ -120...-1 ] */
+	word	* dpp = dp;		/* [ 0...39 ]	 */
+
+	static word e[50];
+
+	word	so[160];
+
+	Gsm_Preprocess			(S, s, so);
+	Gsm_LPC_Analysis		(S, so, LARc);
+	Gsm_Short_Term_Analysis_Filter	(S, LARc, so);
+
+	for (k = 0; k <= 3; k++, xMc += 13) {
+
+		Gsm_Long_Term_Predictor	( S,
+					 so+k*40, /* d      [0..39] IN	*/
+					 dp,	  /* dp  [-120..-1] IN	*/
+					e + 5,	  /* e      [0..39] OUT	*/
+					dpp,	  /* dpp    [0..39] OUT */
+					 Nc++,
+					 bc++);
+
+		Gsm_RPE_Encoding	( S,
+					e + 5,	/* e	  ][0..39][ IN/OUT */
+					  xmaxc++, Mc++, xMc );
+		/*
+		 * Gsm_Update_of_reconstructed_short_time_residual_signal
+		 *			( dpp, e + 5, dp );
+		 */
+
+		{ register int i;
+		  register longword ltmp;
+		  for (i = 0; i <= 39; i++)
+			dp[ i ] = GSM_ADD( e[5 + i], dpp[i] );
+		}
+		dp  += 40;
+		dpp += 40;
+
+	}
+	(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),
+		120 * sizeof(*S->dp0) );
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/config.h
@@ -1,0 +1,27 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/config.h,v 1.1 2002/01/14 19:15:54 menno Exp $*/
+
+#ifndef	CONFIG_H
+#define	CONFIG_H
+
+#define	HAS_STDLIB_H	1		/* /usr/include/stdlib.h	*/
+#define	HAS_FCNTL_H	1		/* /usr/include/fcntl.h		*/
+
+#define	HAS_FSTAT 	1		/* fstat syscall		*/
+#define	HAS_FCHMOD 	1		/* fchmod syscall		*/
+#define	HAS_CHMOD 	1		/* chmod syscall		*/
+#define	HAS_FCHOWN 	1		/* fchown syscall		*/
+#define	HAS_CHOWN 	1		/* chown syscall		*/
+
+#define	HAS_STRING_H 	1		/* /usr/include/string.h 	*/
+
+#define	HAS_UNISTD_H	1		/* /usr/include/unistd.h	*/
+#define	HAS_UTIME	1		/* POSIX utime(path, times)	*/
+#define	HAS_UTIME_H	1		/* UTIME header file		*/
+
+#endif	/* CONFIG_H */
--- /dev/null
+++ b/common/libsndfile/src/GSM610/decode.c
@@ -1,0 +1,63 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/decode.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+#include <stdio.h>
+
+#include	"private.h"
+#include	"gsm.h"
+#include	"proto.h"
+
+/*
+ *  4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
+ */
+
+static void Postprocessing P2((S,s),
+	struct gsm_state	* S,
+	register word 		* s)
+{
+	register int		k;
+	register word		msr = S->msr;
+	register longword	ltmp;	/* for GSM_ADD */
+	register word		tmp;
+
+	for (k = 160; k--; s++) {
+		tmp = GSM_MULT_R( msr, 28180 );
+		msr = GSM_ADD(*s, tmp);  	   /* Deemphasis 	     */
+		*s  = GSM_ADD(msr, msr) & 0xFFF8;  /* Truncation & Upscaling */
+	}
+	S->msr = msr;
+}
+
+void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s),
+	struct gsm_state	* S,
+
+	word		* LARcr,	/* [0..7]		IN	*/
+
+	word		* Ncr,		/* [0..3] 		IN 	*/
+	word		* bcr,		/* [0..3]		IN	*/
+	word		* Mcr,		/* [0..3] 		IN 	*/
+	word		* xmaxcr,	/* [0..3]		IN 	*/
+	word		* xMcr,		/* [0..13*4]		IN	*/
+
+	word		* s)		/* [0..159]		OUT 	*/
+{
+	int		j, k;
+	word		erp[40], wt[160];
+	word		* drp = S->dp0 + 120;
+
+	for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
+
+		Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );
+		Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
+
+		for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];
+	}
+
+	Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );
+	Postprocessing(S, s);
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/gsm.h
@@ -1,0 +1,71 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm.h,v 1.1 2002/01/14 19:15:54 menno Exp $*/
+
+#ifndef	GSM_H
+#define	GSM_H
+
+#ifdef __cplusplus
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#if __STDC__
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#ifdef _NO_PROTO
+#	undef	NeedFunctionPrototypes
+#endif
+
+#ifdef NeedFunctionPrototypes
+#   include	<stdio.h>		/* for FILE * 	*/
+#endif
+
+#undef GSM_P
+#if NeedFunctionPrototypes
+#	define	GSM_P( protos )	protos
+#else
+#	define  GSM_P( protos )	( /* protos */ )
+#endif
+
+/*
+ *	Interface
+ */
+
+typedef struct gsm_state * 	gsm;
+typedef short		   	gsm_signal;		/* signed 16 bit */
+typedef unsigned char		gsm_byte;
+typedef gsm_byte 		gsm_frame[33];		/* 33 * 8 bits	 */
+
+#define	GSM_MAGIC		0xD		  	/* 13 kbit/s RPE-LTP */
+
+#define	GSM_PATCHLEVEL		10
+#define	GSM_MINOR		0
+#define	GSM_MAJOR		1
+
+#define	GSM_OPT_VERBOSE		1
+#define	GSM_OPT_FAST		2
+#define	GSM_OPT_LTP_CUT		3
+#define	GSM_OPT_WAV49		4
+#define	GSM_OPT_FRAME_INDEX	5
+#define	GSM_OPT_FRAME_CHAIN	6
+
+extern gsm  gsm_create 	GSM_P((void));
+extern void gsm_destroy GSM_P((gsm));	
+
+extern int  gsm_print   GSM_P((FILE *, gsm, gsm_byte  *));
+extern int  gsm_option  GSM_P((gsm, int, int *));
+
+extern void gsm_encode  GSM_P((gsm, gsm_signal *, gsm_byte  *));
+extern int  gsm_decode  GSM_P((gsm, gsm_byte   *, gsm_signal *));
+
+extern int  gsm_explode GSM_P((gsm, gsm_byte   *, gsm_signal *));
+extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte   *));
+
+#undef	GSM_P
+
+#endif	/* GSM_H */
--- /dev/null
+++ b/common/libsndfile/src/GSM610/gsm_create.c
@@ -1,0 +1,45 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+static char const	ident[] = "$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_create.c,v 1.1 2002/01/14 19:15:54 menno Exp $";
+
+#include	"config.h"
+
+#ifdef	HAS_STRING_H
+#include	<string.h>
+#else
+#	include "proto.h"
+	extern char	* memset P((char *, int, int));
+#endif
+
+#ifdef	HAS_STDLIB_H
+#	include	<stdlib.h>
+#else
+#	ifdef	HAS_MALLOC_H
+#		include 	<malloc.h>
+#	else
+		extern char * malloc();
+#	endif
+#endif
+
+#include <stdio.h>
+
+#include "gsm.h"
+#include "private.h"
+#include "proto.h"
+
+gsm gsm_create P0()
+{
+	gsm  r;
+
+	r = (gsm)malloc(sizeof(struct gsm_state));
+	if (!r) return r;
+
+	memset((char *)r, 0, sizeof(*r));
+	r->nrp = 40;
+
+	return r;
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/gsm_decode.c
@@ -1,0 +1,361 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_decode.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
+{
+	word  	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+#ifdef WAV49
+	if (s->wav_fmt) {
+
+		uword sr = 0;
+
+		s->frame_index = !s->frame_index;
+		if (s->frame_index) {
+
+			sr = *c++;
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 2;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 4;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 2;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;			/* 5 */
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 10 */
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 15 */
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;			/* 20 */
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 25 */
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 30 */
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+
+			s->frame_chain = sr & 0xf;
+		}
+		else {
+			sr = s->frame_chain;
+			sr |= (uword)*c++ << 4;			/* 1 */
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr = *c++;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 3;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 5 */
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 10 */
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 15 */
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;			/* 20 */
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;	
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 25 */
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;		
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 30 */
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+		}
+	}
+	else
+#endif
+	{
+		/* GSM_MAGIC  = (*c >> 4) & 0xF; */
+
+		if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+		LARc[0]  = (*c++ & 0xF) << 2;		/* 1 */
+		LARc[0] |= (*c >> 6) & 0x3;
+		LARc[1]  = *c++ & 0x3F;
+		LARc[2]  = (*c >> 3) & 0x1F;
+		LARc[3]  = (*c++ & 0x7) << 2;
+		LARc[3] |= (*c >> 6) & 0x3;
+		LARc[4]  = (*c >> 2) & 0xF;
+		LARc[5]  = (*c++ & 0x3) << 2;
+		LARc[5] |= (*c >> 6) & 0x3;
+		LARc[6]  = (*c >> 3) & 0x7;
+		LARc[7]  = *c++ & 0x7;
+		Nc[0]  = (*c >> 1) & 0x7F;
+		bc[0]  = (*c++ & 0x1) << 1;
+		bc[0] |= (*c >> 7) & 0x1;
+		Mc[0]  = (*c >> 5) & 0x3;
+		xmaxc[0]  = (*c++ & 0x1F) << 1;
+		xmaxc[0] |= (*c >> 7) & 0x1;
+		xmc[0]  = (*c >> 4) & 0x7;
+		xmc[1]  = (*c >> 1) & 0x7;
+		xmc[2]  = (*c++ & 0x1) << 2;
+		xmc[2] |= (*c >> 6) & 0x3;
+		xmc[3]  = (*c >> 3) & 0x7;
+		xmc[4]  = *c++ & 0x7;
+		xmc[5]  = (*c >> 5) & 0x7;
+		xmc[6]  = (*c >> 2) & 0x7;
+		xmc[7]  = (*c++ & 0x3) << 1;		/* 10 */
+		xmc[7] |= (*c >> 7) & 0x1;
+		xmc[8]  = (*c >> 4) & 0x7;
+		xmc[9]  = (*c >> 1) & 0x7;
+		xmc[10]  = (*c++ & 0x1) << 2;
+		xmc[10] |= (*c >> 6) & 0x3;
+		xmc[11]  = (*c >> 3) & 0x7;
+		xmc[12]  = *c++ & 0x7;
+		Nc[1]  = (*c >> 1) & 0x7F;
+		bc[1]  = (*c++ & 0x1) << 1;
+		bc[1] |= (*c >> 7) & 0x1;
+		Mc[1]  = (*c >> 5) & 0x3;
+		xmaxc[1]  = (*c++ & 0x1F) << 1;
+		xmaxc[1] |= (*c >> 7) & 0x1;
+		xmc[13]  = (*c >> 4) & 0x7;
+		xmc[14]  = (*c >> 1) & 0x7;
+		xmc[15]  = (*c++ & 0x1) << 2;
+		xmc[15] |= (*c >> 6) & 0x3;
+		xmc[16]  = (*c >> 3) & 0x7;
+		xmc[17]  = *c++ & 0x7;
+		xmc[18]  = (*c >> 5) & 0x7;
+		xmc[19]  = (*c >> 2) & 0x7;
+		xmc[20]  = (*c++ & 0x3) << 1;
+		xmc[20] |= (*c >> 7) & 0x1;
+		xmc[21]  = (*c >> 4) & 0x7;
+		xmc[22]  = (*c >> 1) & 0x7;
+		xmc[23]  = (*c++ & 0x1) << 2;
+		xmc[23] |= (*c >> 6) & 0x3;
+		xmc[24]  = (*c >> 3) & 0x7;
+		xmc[25]  = *c++ & 0x7;
+		Nc[2]  = (*c >> 1) & 0x7F;
+		bc[2]  = (*c++ & 0x1) << 1;		/* 20 */
+		bc[2] |= (*c >> 7) & 0x1;
+		Mc[2]  = (*c >> 5) & 0x3;
+		xmaxc[2]  = (*c++ & 0x1F) << 1;
+		xmaxc[2] |= (*c >> 7) & 0x1;
+		xmc[26]  = (*c >> 4) & 0x7;
+		xmc[27]  = (*c >> 1) & 0x7;
+		xmc[28]  = (*c++ & 0x1) << 2;
+		xmc[28] |= (*c >> 6) & 0x3;
+		xmc[29]  = (*c >> 3) & 0x7;
+		xmc[30]  = *c++ & 0x7;
+		xmc[31]  = (*c >> 5) & 0x7;
+		xmc[32]  = (*c >> 2) & 0x7;
+		xmc[33]  = (*c++ & 0x3) << 1;
+		xmc[33] |= (*c >> 7) & 0x1;
+		xmc[34]  = (*c >> 4) & 0x7;
+		xmc[35]  = (*c >> 1) & 0x7;
+		xmc[36]  = (*c++ & 0x1) << 2;
+		xmc[36] |= (*c >> 6) & 0x3;
+		xmc[37]  = (*c >> 3) & 0x7;
+		xmc[38]  = *c++ & 0x7;
+		Nc[3]  = (*c >> 1) & 0x7F;
+		bc[3]  = (*c++ & 0x1) << 1;
+		bc[3] |= (*c >> 7) & 0x1;
+		Mc[3]  = (*c >> 5) & 0x3;
+		xmaxc[3]  = (*c++ & 0x1F) << 1;
+		xmaxc[3] |= (*c >> 7) & 0x1;
+		xmc[39]  = (*c >> 4) & 0x7;
+		xmc[40]  = (*c >> 1) & 0x7;
+		xmc[41]  = (*c++ & 0x1) << 2;
+		xmc[41] |= (*c >> 6) & 0x3;
+		xmc[42]  = (*c >> 3) & 0x7;
+		xmc[43]  = *c++ & 0x7;			/* 30  */
+		xmc[44]  = (*c >> 5) & 0x7;
+		xmc[45]  = (*c >> 2) & 0x7;
+		xmc[46]  = (*c++ & 0x3) << 1;
+		xmc[46] |= (*c >> 7) & 0x1;
+		xmc[47]  = (*c >> 4) & 0x7;
+		xmc[48]  = (*c >> 1) & 0x7;
+		xmc[49]  = (*c++ & 0x1) << 2;
+		xmc[49] |= (*c >> 6) & 0x3;
+		xmc[50]  = (*c >> 3) & 0x7;
+		xmc[51]  = *c & 0x7;			/* 33 */
+	}
+
+	Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
+
+	return 0;
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/gsm_destroy.c
@@ -1,0 +1,26 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_destroy.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+#include "gsm.h"
+#include "config.h"
+#include "proto.h"
+
+#ifdef	HAS_STDLIB_H
+#	include	<stdlib.h>
+#else
+#	ifdef	HAS_MALLOC_H
+#		include 	<malloc.h>
+#	else
+		extern void free();
+#	endif
+#endif
+
+void gsm_destroy P1((S), gsm S)
+{
+	if (S) free((char *)S);
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/gsm_encode.c
@@ -1,0 +1,451 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_encode.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+#include "private.h"
+#include "gsm.h"
+#include "proto.h"
+
+void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
+{
+	word	 	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+	Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);
+
+
+	/*	variable	size
+
+		GSM_MAGIC	4
+
+		LARc[0]		6
+		LARc[1]		6
+		LARc[2]		5
+		LARc[3]		5
+		LARc[4]		4
+		LARc[5]		4
+		LARc[6]		3
+		LARc[7]		3
+
+		Nc[0]		7
+		bc[0]		2
+		Mc[0]		2
+		xmaxc[0]	6
+		xmc[0]		3
+		xmc[1]		3
+		xmc[2]		3
+		xmc[3]		3
+		xmc[4]		3
+		xmc[5]		3
+		xmc[6]		3
+		xmc[7]		3
+		xmc[8]		3
+		xmc[9]		3
+		xmc[10]		3
+		xmc[11]		3
+		xmc[12]		3
+
+		Nc[1]		7
+		bc[1]		2
+		Mc[1]		2
+		xmaxc[1]	6
+		xmc[13]		3
+		xmc[14]		3
+		xmc[15]		3
+		xmc[16]		3
+		xmc[17]		3
+		xmc[18]		3
+		xmc[19]		3
+		xmc[20]		3
+		xmc[21]		3
+		xmc[22]		3
+		xmc[23]		3
+		xmc[24]		3
+		xmc[25]		3
+
+		Nc[2]		7
+		bc[2]		2
+		Mc[2]		2
+		xmaxc[2]	6
+		xmc[26]		3
+		xmc[27]		3
+		xmc[28]		3
+		xmc[29]		3
+		xmc[30]		3
+		xmc[31]		3
+		xmc[32]		3
+		xmc[33]		3
+		xmc[34]		3
+		xmc[35]		3
+		xmc[36]		3
+		xmc[37]		3
+		xmc[38]		3
+
+		Nc[3]		7
+		bc[3]		2
+		Mc[3]		2
+		xmaxc[3]	6
+		xmc[39]		3
+		xmc[40]		3
+		xmc[41]		3
+		xmc[42]		3
+		xmc[43]		3
+		xmc[44]		3
+		xmc[45]		3
+		xmc[46]		3
+		xmc[47]		3
+		xmc[48]		3
+		xmc[49]		3
+		xmc[50]		3
+		xmc[51]		3
+	*/
+
+#ifdef WAV49
+
+	if (s->wav_fmt) {
+		s->frame_index = !s->frame_index;
+		if (s->frame_index) {
+
+			uword sr;
+
+			sr = 0;
+			sr = sr >> 6 | LARc[0] << 10;
+			sr = sr >> 6 | LARc[1] << 10;
+			*c++ = sr >> 4;
+			sr = sr >> 5 | LARc[2] << 11;
+			*c++ = sr >> 7;
+			sr = sr >> 5 | LARc[3] << 11;
+			sr = sr >> 4 | LARc[4] << 12;
+			*c++ = sr >> 6;
+			sr = sr >> 4 | LARc[5] << 12;
+			sr = sr >> 3 | LARc[6] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | LARc[7] << 13;
+			sr = sr >> 7 | Nc[0] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[0] << 14;
+			sr = sr >> 2 | Mc[0] << 14;
+			sr = sr >> 6 | xmaxc[0] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[0] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[1] << 13;
+			sr = sr >> 3 | xmc[2] << 13;
+			sr = sr >> 3 | xmc[3] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[4] << 13;
+			sr = sr >> 3 | xmc[5] << 13;
+			sr = sr >> 3 | xmc[6] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[7] << 13;
+			sr = sr >> 3 | xmc[8] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[9] << 13;
+			sr = sr >> 3 | xmc[10] << 13;
+			sr = sr >> 3 | xmc[11] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[12] << 13;
+			sr = sr >> 7 | Nc[1] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[1] << 14;
+			sr = sr >> 2 | Mc[1] << 14;
+			sr = sr >> 6 | xmaxc[1] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[13] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[14] << 13;
+			sr = sr >> 3 | xmc[15] << 13;
+			sr = sr >> 3 | xmc[16] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[17] << 13;
+			sr = sr >> 3 | xmc[18] << 13;
+			sr = sr >> 3 | xmc[19] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[20] << 13;
+			sr = sr >> 3 | xmc[21] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[22] << 13;
+			sr = sr >> 3 | xmc[23] << 13;
+			sr = sr >> 3 | xmc[24] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[25] << 13;
+			sr = sr >> 7 | Nc[2] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[2] << 14;
+			sr = sr >> 2 | Mc[2] << 14;
+			sr = sr >> 6 | xmaxc[2] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[26] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[27] << 13;
+			sr = sr >> 3 | xmc[28] << 13;
+			sr = sr >> 3 | xmc[29] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[30] << 13;
+			sr = sr >> 3 | xmc[31] << 13;
+			sr = sr >> 3 | xmc[32] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[33] << 13;
+			sr = sr >> 3 | xmc[34] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[35] << 13;
+			sr = sr >> 3 | xmc[36] << 13;
+			sr = sr >> 3 | xmc[37] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[38] << 13;
+			sr = sr >> 7 | Nc[3] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[3] << 14;
+			sr = sr >> 2 | Mc[3] << 14;
+			sr = sr >> 6 | xmaxc[3] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[39] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[40] << 13;
+			sr = sr >> 3 | xmc[41] << 13;
+			sr = sr >> 3 | xmc[42] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[43] << 13;
+			sr = sr >> 3 | xmc[44] << 13;
+			sr = sr >> 3 | xmc[45] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[46] << 13;
+			sr = sr >> 3 | xmc[47] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[48] << 13;
+			sr = sr >> 3 | xmc[49] << 13;
+			sr = sr >> 3 | xmc[50] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[51] << 13;
+			sr = sr >> 4;
+			*c = sr >> 8;
+			s->frame_chain = *c;
+		}
+		else {
+			uword sr;
+
+			sr = 0;
+			sr = sr >> 4 | s->frame_chain << 12;
+			sr = sr >> 6 | LARc[0] << 10;
+			*c++ = sr >> 6;
+			sr = sr >> 6 | LARc[1] << 10;
+			*c++ = sr >> 8;
+			sr = sr >> 5 | LARc[2] << 11;
+			sr = sr >> 5 | LARc[3] << 11;
+			*c++ = sr >> 6;
+			sr = sr >> 4 | LARc[4] << 12;
+			sr = sr >> 4 | LARc[5] << 12;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | LARc[6] << 13;
+			sr = sr >> 3 | LARc[7] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[0] << 9;
+			sr = sr >> 2 | bc[0] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[0] << 14;
+			sr = sr >> 6 | xmaxc[0] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[0] << 13;
+			sr = sr >> 3 | xmc[1] << 13;
+			sr = sr >> 3 | xmc[2] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[3] << 13;
+			sr = sr >> 3 | xmc[4] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[5] << 13;
+			sr = sr >> 3 | xmc[6] << 13;
+			sr = sr >> 3 | xmc[7] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[8] << 13;
+			sr = sr >> 3 | xmc[9] << 13;
+			sr = sr >> 3 | xmc[10] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[11] << 13;
+			sr = sr >> 3 | xmc[12] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[1] << 9;
+			sr = sr >> 2 | bc[1] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[1] << 14;
+			sr = sr >> 6 | xmaxc[1] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[13] << 13;
+			sr = sr >> 3 | xmc[14] << 13;
+			sr = sr >> 3 | xmc[15] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[16] << 13;
+			sr = sr >> 3 | xmc[17] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[18] << 13;
+			sr = sr >> 3 | xmc[19] << 13;
+			sr = sr >> 3 | xmc[20] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[21] << 13;
+			sr = sr >> 3 | xmc[22] << 13;
+			sr = sr >> 3 | xmc[23] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[24] << 13;
+			sr = sr >> 3 | xmc[25] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[2] << 9;
+			sr = sr >> 2 | bc[2] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[2] << 14;
+			sr = sr >> 6 | xmaxc[2] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[26] << 13;
+			sr = sr >> 3 | xmc[27] << 13;
+			sr = sr >> 3 | xmc[28] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[29] << 13;
+			sr = sr >> 3 | xmc[30] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[31] << 13;
+			sr = sr >> 3 | xmc[32] << 13;
+			sr = sr >> 3 | xmc[33] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[34] << 13;
+			sr = sr >> 3 | xmc[35] << 13;
+			sr = sr >> 3 | xmc[36] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[37] << 13;
+			sr = sr >> 3 | xmc[38] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[3] << 9;
+			sr = sr >> 2 | bc[3] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[3] << 14;
+			sr = sr >> 6 | xmaxc[3] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[39] << 13;
+			sr = sr >> 3 | xmc[40] << 13;
+			sr = sr >> 3 | xmc[41] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[42] << 13;
+			sr = sr >> 3 | xmc[43] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[44] << 13;
+			sr = sr >> 3 | xmc[45] << 13;
+			sr = sr >> 3 | xmc[46] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[47] << 13;
+			sr = sr >> 3 | xmc[48] << 13;
+			sr = sr >> 3 | xmc[49] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[50] << 13;
+			sr = sr >> 3 | xmc[51] << 13;
+			*c++ = sr >> 8;
+		}
+	}
+
+	else
+
+#endif	/* WAV49 */
+	{
+
+		*c++ =   ((GSM_MAGIC & 0xF) << 4)		/* 1 */
+		       | ((LARc[0] >> 2) & 0xF);
+		*c++ =   ((LARc[0] & 0x3) << 6)
+		       | (LARc[1] & 0x3F);
+		*c++ =   ((LARc[2] & 0x1F) << 3)
+		       | ((LARc[3] >> 2) & 0x7);
+		*c++ =   ((LARc[3] & 0x3) << 6)
+		       | ((LARc[4] & 0xF) << 2)
+		       | ((LARc[5] >> 2) & 0x3);
+		*c++ =   ((LARc[5] & 0x3) << 6)
+		       | ((LARc[6] & 0x7) << 3)
+		       | (LARc[7] & 0x7);
+		*c++ =   ((Nc[0] & 0x7F) << 1)
+		       | ((bc[0] >> 1) & 0x1);
+		*c++ =   ((bc[0] & 0x1) << 7)
+		       | ((Mc[0] & 0x3) << 5)
+		       | ((xmaxc[0] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[0] & 0x1) << 7)
+		       | ((xmc[0] & 0x7) << 4)
+		       | ((xmc[1] & 0x7) << 1)
+		       | ((xmc[2] >> 2) & 0x1);
+		*c++ =   ((xmc[2] & 0x3) << 6)
+		       | ((xmc[3] & 0x7) << 3)
+		       | (xmc[4] & 0x7);
+		*c++ =   ((xmc[5] & 0x7) << 5)			/* 10 */
+		       | ((xmc[6] & 0x7) << 2)
+		       | ((xmc[7] >> 1) & 0x3);
+		*c++ =   ((xmc[7] & 0x1) << 7)
+		       | ((xmc[8] & 0x7) << 4)
+		       | ((xmc[9] & 0x7) << 1)
+		       | ((xmc[10] >> 2) & 0x1);
+		*c++ =   ((xmc[10] & 0x3) << 6)
+		       | ((xmc[11] & 0x7) << 3)
+		       | (xmc[12] & 0x7);
+		*c++ =   ((Nc[1] & 0x7F) << 1)
+		       | ((bc[1] >> 1) & 0x1);
+		*c++ =   ((bc[1] & 0x1) << 7)
+		       | ((Mc[1] & 0x3) << 5)
+		       | ((xmaxc[1] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[1] & 0x1) << 7)
+		       | ((xmc[13] & 0x7) << 4)
+		       | ((xmc[14] & 0x7) << 1)
+		       | ((xmc[15] >> 2) & 0x1);
+		*c++ =   ((xmc[15] & 0x3) << 6)
+		       | ((xmc[16] & 0x7) << 3)
+		       | (xmc[17] & 0x7);
+		*c++ =   ((xmc[18] & 0x7) << 5)
+		       | ((xmc[19] & 0x7) << 2)
+		       | ((xmc[20] >> 1) & 0x3);
+		*c++ =   ((xmc[20] & 0x1) << 7)
+		       | ((xmc[21] & 0x7) << 4)
+		       | ((xmc[22] & 0x7) << 1)
+		       | ((xmc[23] >> 2) & 0x1);
+		*c++ =   ((xmc[23] & 0x3) << 6)
+		       | ((xmc[24] & 0x7) << 3)
+		       | (xmc[25] & 0x7);
+		*c++ =   ((Nc[2] & 0x7F) << 1)			/* 20 */
+		       | ((bc[2] >> 1) & 0x1);
+		*c++ =   ((bc[2] & 0x1) << 7)
+		       | ((Mc[2] & 0x3) << 5)
+		       | ((xmaxc[2] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[2] & 0x1) << 7)
+		       | ((xmc[26] & 0x7) << 4)
+		       | ((xmc[27] & 0x7) << 1)
+		       | ((xmc[28] >> 2) & 0x1);
+		*c++ =   ((xmc[28] & 0x3) << 6)
+		       | ((xmc[29] & 0x7) << 3)
+		       | (xmc[30] & 0x7);
+		*c++ =   ((xmc[31] & 0x7) << 5)
+		       | ((xmc[32] & 0x7) << 2)
+		       | ((xmc[33] >> 1) & 0x3);
+		*c++ =   ((xmc[33] & 0x1) << 7)
+		       | ((xmc[34] & 0x7) << 4)
+		       | ((xmc[35] & 0x7) << 1)
+		       | ((xmc[36] >> 2) & 0x1);
+		*c++ =   ((xmc[36] & 0x3) << 6)
+		       | ((xmc[37] & 0x7) << 3)
+		       | (xmc[38] & 0x7);
+		*c++ =   ((Nc[3] & 0x7F) << 1)
+		       | ((bc[3] >> 1) & 0x1);
+		*c++ =   ((bc[3] & 0x1) << 7)
+		       | ((Mc[3] & 0x3) << 5)
+		       | ((xmaxc[3] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[3] & 0x1) << 7)
+		       | ((xmc[39] & 0x7) << 4)
+		       | ((xmc[40] & 0x7) << 1)
+		       | ((xmc[41] >> 2) & 0x1);
+		*c++ =   ((xmc[41] & 0x3) << 6)			/* 30 */
+		       | ((xmc[42] & 0x7) << 3)
+		       | (xmc[43] & 0x7);
+		*c++ =   ((xmc[44] & 0x7) << 5)
+		       | ((xmc[45] & 0x7) << 2)
+		       | ((xmc[46] >> 1) & 0x3);
+		*c++ =   ((xmc[46] & 0x1) << 7)
+		       | ((xmc[47] & 0x7) << 4)
+		       | ((xmc[48] & 0x7) << 1)
+		       | ((xmc[49] >> 2) & 0x1);
+		*c++ =   ((xmc[49] & 0x3) << 6)
+		       | ((xmc[50] & 0x7) << 3)
+		       | (xmc[51] & 0x7);
+
+	}
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/gsm_option.c
@@ -1,0 +1,69 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/gsm_option.c,v 1.1 2002/01/14 19:15:54 menno Exp $ */
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_option P3((r, opt, val), gsm r, int opt, int * val)
+{
+	int 	result = -1;
+
+	switch (opt) {
+	case GSM_OPT_LTP_CUT:
+#ifdef 	LTP_CUT
+		result = r->ltp_cut;
+		if (val) r->ltp_cut = *val;
+#endif
+		break;
+
+	case GSM_OPT_VERBOSE:
+#ifndef	NDEBUG
+		result = r->verbose;
+		if (val) r->verbose = *val;
+#endif
+		break;
+
+	case GSM_OPT_FAST:
+
+#if	defined(FAST) && defined(USE_FLOAT_MUL)
+		result = r->fast;
+		if (val) r->fast = !!*val;
+#endif
+		break;
+
+	case GSM_OPT_FRAME_CHAIN:
+
+#ifdef WAV49
+		result = r->frame_chain;
+		if (val) r->frame_chain = *val;
+#endif
+		break;
+
+	case GSM_OPT_FRAME_INDEX:
+
+#ifdef WAV49
+		result = r->frame_index;
+		if (val) r->frame_index = *val;
+#endif
+		break;
+
+	case GSM_OPT_WAV49:
+
+#ifdef WAV49 
+		result = r->wav_fmt;
+		if (val) r->wav_fmt = !!*val;
+#endif
+		break;
+
+	default:
+		break;
+	}
+	return result;
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/long_term.c
@@ -1,0 +1,949 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/long_term.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*
+ *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
+ */
+
+
+/*
+ * This module computes the LTP gain (bc) and the LTP lag (Nc)
+ * for the long term analysis filter.   This is done by calculating a
+ * maximum of the cross-correlation function between the current
+ * sub-segment short term residual signal d[0..39] (output of
+ * the short term analysis filter; for simplification the index
+ * of this array begins at 0 and ends at 39 for each sub-segment of the
+ * RPE-LTP analysis) and the previous reconstructed short term
+ * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be
+ * performed to avoid overflow.
+ */
+
+ /* The next procedure exists in six versions.  First two integer
+  * version (if USE_FLOAT_MUL is not defined); then four floating
+  * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
+  * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
+  * option used).  Every pair has first a Cut version (see the -C
+  * option to toast or the LTP_CUT option to gsm_option()), then the
+  * uncut one.  (For a detailed explanation of why this is altogether
+  * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
+  * Harmful''.)
+  */
+
+#ifndef  USE_FLOAT_MUL
+
+#ifdef	LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+
+	struct gsm_state * st,
+
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		wt[40];
+
+	longword	L_result;
+	longword	L_max, L_power;
+	word		R, S, dmax, scal, best_k;
+	word		ltp_cut;
+
+	register word	temp, wt_k;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) {
+			dmax = temp;
+			best_k = k;
+		}
+	}
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+	assert(scal >= 0);
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+	wt_k  = SASR(d[best_k], scal);
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+		L_result = (longword)wt_k * dp[best_k - lambda];
+		if (L_result > L_max) {
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+	*Nc_out = Nc;
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >= -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#endif 	/* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		wt[40];
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal );
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+
+# undef STEP
+#		define STEP(k) 	(longword)wt[k] * dp[k - lambda]
+
+		register longword L_result;
+
+		L_result  = STEP(0)  ; L_result += STEP(1) ;
+		L_result += STEP(2)  ; L_result += STEP(3) ;
+		L_result += STEP(4)  ; L_result += STEP(5)  ;
+		L_result += STEP(6)  ; L_result += STEP(7)  ;
+		L_result += STEP(8)  ; L_result += STEP(9)  ;
+		L_result += STEP(10) ; L_result += STEP(11) ;
+		L_result += STEP(12) ; L_result += STEP(13) ;
+		L_result += STEP(14) ; L_result += STEP(15) ;
+		L_result += STEP(16) ; L_result += STEP(17) ;
+		L_result += STEP(18) ; L_result += STEP(19) ;
+		L_result += STEP(20) ; L_result += STEP(21) ;
+		L_result += STEP(22) ; L_result += STEP(23) ;
+		L_result += STEP(24) ; L_result += STEP(25) ;
+		L_result += STEP(26) ; L_result += STEP(27) ;
+		L_result += STEP(28) ; L_result += STEP(29) ;
+		L_result += STEP(30) ; L_result += STEP(31) ;
+		L_result += STEP(32) ; L_result += STEP(33) ;
+		L_result += STEP(34) ; L_result += STEP(35) ;
+		L_result += STEP(36) ; L_result += STEP(37) ;
+		L_result += STEP(38) ; L_result += STEP(39) ;
+
+		if (L_result > L_max) {
+
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#else	/* USE_FLOAT_MUL */
+
+#ifdef	LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+	struct gsm_state * st,		/*              IN 	*/
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		ltp_cut;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+	ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; 
+
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k = 0; k < 40; k++) {
+		register word w = SASR( d[k], scal );
+		if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
+			wt_float[k] = 0.0;
+		}
+		else {
+			wt_float[k] =  w;
+		}
+	}
+	for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			if ((W = wt_float[K]) != 0.0) {	\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E; } else (a = lp[K])
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+
+	}
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k =    0; k < 40; k++) wt_float[k] =  SASR( d[k], scal );
+	for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			W = wt_float[K];		\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+	}
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#ifdef	FAST
+#ifdef	LTP_CUT
+
+static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st,
+							d,dp,bc_out,Nc_out),
+	struct gsm_state * st,		/*              IN	*/
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	register float	wt_float;
+	word		Nc, bc;
+	word		wt_max, best_k, ltp_cut;
+
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	register float	L_result, L_max, L_power;
+
+	wt_max = 0;
+
+	for (k = 0; k < 40; ++k) {
+		if      ( d[k] > wt_max) wt_max =  d[best_k = k];
+		else if (-d[k] > wt_max) wt_max = -d[best_k = k];
+	}
+
+	assert(wt_max >= 0);
+	wt_float = (float)wt_max;
+
+	for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+		L_result = wt_float * dp_float[best_k - lambda];
+		if (L_result > L_max) {
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+
+	*Nc_out = Nc;
+	if (L_max <= 0.)  {
+		*bc_out = 0;
+		return;
+	}
+
+	/*  Compute the power of the reconstructed short term residual
+	 *  signal dp[..]
+	 */
+	dp_float -= Nc;
+	L_power = 0;
+	for (k = 0; k < 40; ++k) {
+		register float f = dp_float[k];
+		L_power += f * f;
+	}
+
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	/*  Coding of the LTP gain
+	 *  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	lambda = L_max / L_power * 32768.;
+	for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+	*bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	register float	L_max, L_power;
+
+	for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k];
+	for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			W = wt_float[K];		\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+	}
+	*Nc_out = Nc;
+
+	if (L_max <= 0.)  {
+		*bc_out = 0;
+		return;
+	}
+
+	/*  Compute the power of the reconstructed short term residual
+	 *  signal dp[..]
+	 */
+	dp_float -= Nc;
+	L_power = 0;
+	for (k = 0; k < 40; ++k) {
+		register float f = dp_float[k];
+		L_power += f * f;
+	}
+
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	/*  Coding of the LTP gain
+	 *  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	lambda = L_max / L_power * 32768.;
+	for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+	*bc_out = bc;
+}
+
+#endif	/* FAST 	 */
+#endif	/* USE_FLOAT_MUL */
+
+
+/* 4.2.12 */
+
+static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),
+	word		bc,	/* 					IN  */
+	word		Nc,	/* 					IN  */
+	register word	* dp,	/* previous d	[-120..-1]		IN  */
+	register word	* d,	/* d		[0..39]			IN  */
+	register word	* dpp,	/* estimate	[0..39]			OUT */
+	register word	* e	/* long term res. signal [0..39]	OUT */
+)
+/*
+ *  In this part, we have to decode the bc parameter to compute
+ *  the samples of the estimate dpp[0..39].  The decoding of bc needs the
+ *  use of table 4.3b.  The long term residual signal e[0..39]
+ *  is then calculated to be fed to the RPE encoding section.
+ */
+{
+	register int      k;
+	register longword ltmp;
+
+#	undef STEP
+#	define STEP(BP)					\
+	for (k = 0; k <= 39; k++) {			\
+		dpp[k]  = GSM_MULT_R( BP, dp[k - Nc]);	\
+		e[k]	= GSM_SUB( d[k], dpp[k] );	\
+	}
+
+	switch (bc) {
+	case 0:	STEP(  3277 ); break;
+	case 1:	STEP( 11469 ); break;
+	case 2: STEP( 21299 ); break;
+	case 3: STEP( 32767 ); break; 
+	}
+}
+
+void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), 	/* 4x for 160 samples */
+
+	struct gsm_state	* S,
+
+	word	* d,	/* [0..39]   residual signal	IN	*/
+	word	* dp,	/* [-120..-1] d'		IN	*/
+
+	word	* e,	/* [0..39] 			OUT	*/
+	word	* dpp,	/* [0..39] 			OUT	*/
+	word	* Nc,	/* correlation lag		OUT	*/
+	word	* bc	/* gain factor			OUT	*/
+)
+{
+	assert( d  ); assert( dp ); assert( e  );
+	assert( dpp); assert( Nc ); assert( bc );
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+	if (S->fast) 
+#if   defined (LTP_CUT)
+		if (S->ltp_cut)
+			Cut_Fast_Calculation_of_the_LTP_parameters(S,
+				d, dp, bc, Nc);
+		else
+#endif /* LTP_CUT */
+			Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
+	else 
+#endif /* FAST & USE_FLOAT_MUL */
+#ifdef LTP_CUT
+		if (S->ltp_cut)
+			Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
+		else
+#endif
+			Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
+
+	Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
+}
+
+/* 4.3.2 */
+void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),
+	struct gsm_state	* S,
+
+	word			Ncr,
+	word			bcr,
+	register word		* erp,	   /* [0..39]		  	 IN */
+	register word		* drp	   /* [-120..-1] IN, [-120..40] OUT */
+)
+/*
+ *  This procedure uses the bcr and Ncr parameter to realize the
+ *  long term synthesis filtering.  The decoding of bcr needs
+ *  table 4.3b.
+ */
+{
+	register longword	ltmp;	/* for ADD */
+	register int 		k;
+	word			brp, drpp, Nr;
+
+	/*  Check the limits of Nr.
+	 */
+	Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
+	S->nrp = Nr;
+	assert(Nr >= 40 && Nr <= 120);
+
+	/*  Decoding of the LTP gain bcr
+	 */
+	brp = gsm_QLB[ bcr ];
+
+	/*  Computation of the reconstructed short term residual 
+	 *  signal drp[0..39]
+	 */
+	assert(brp != MIN_WORD);
+
+	for (k = 0; k <= 39; k++) {
+		drpp   = GSM_MULT_R( brp, drp[ k - Nr ] );
+		drp[k] = GSM_ADD( erp[k], drpp );
+	}
+
+	/*
+	 *  Update of the reconstructed short term residual signal
+	 *  drp[ -1..-120 ]
+	 */
+
+	for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/lpc.c
@@ -1,0 +1,341 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/lpc.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+#undef	P
+
+/*
+ *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
+ */
+
+/* 4.2.4 */
+
+
+static void Autocorrelation P2((s, L_ACF),
+	word     * s,		/* [0..159]	IN/OUT  */
+ 	longword * L_ACF)	/* [0..8]	OUT     */
+/*
+ *  The goal is to compute the array L_ACF[k].  The signal s[i] must
+ *  be scaled in order to avoid an overflow situation.
+ */
+{
+	register int	k, i;
+
+	word		temp, smax, scalauto;
+
+#ifdef	USE_FLOAT_MUL
+	float		float_s[160];
+#endif
+
+	/*  Dynamic scaling of the array  s[0..159]
+	 */
+
+	/*  Search for the maximum.
+	 */
+	smax = 0;
+	for (k = 0; k <= 159; k++) {
+		temp = GSM_ABS( s[k] );
+		if (temp > smax) smax = temp;
+	}
+
+	/*  Computation of the scaling factor.
+	 */
+	if (smax == 0) scalauto = 0;
+	else {
+		assert(smax > 0);
+		scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
+	}
+
+	/*  Scaling of the array s[0...159]
+	 */
+
+	if (scalauto > 0) {
+
+# ifdef USE_FLOAT_MUL
+#   define SCALE(n)	\
+	case n: for (k = 0; k <= 159; k++) \
+			float_s[k] = (float)	\
+				(s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
+		break;
+# else 
+#   define SCALE(n)	\
+	case n: for (k = 0; k <= 159; k++) \
+			s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\
+		break;
+# endif /* USE_FLOAT_MUL */
+
+		switch (scalauto) {
+		SCALE(1)
+		SCALE(2)
+		SCALE(3)
+		SCALE(4)
+		}
+# undef	SCALE
+	}
+# ifdef	USE_FLOAT_MUL
+	else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
+# endif
+
+	/*  Compute the L_ACF[..].
+	 */
+	{
+# ifdef	USE_FLOAT_MUL
+		register float * sp = float_s;
+		register float   sl = *sp;
+
+#		define STEP(k)	 L_ACF[k] += (longword)(sl * sp[ -(k) ]);
+# else
+		word  * sp = s;
+		word    sl = *sp;
+
+#		define STEP(k)	 L_ACF[k] += ((longword)sl * sp[ -(k) ]);
+# endif
+
+#	define NEXTI	 sl = *++sp
+
+
+	for (k = 9; k--; L_ACF[k] = 0) ;
+
+	STEP (0);
+	NEXTI;
+	STEP(0); STEP(1);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
+
+	for (i = 8; i <= 159; i++) {
+
+		NEXTI;
+
+		STEP(0);
+		STEP(1); STEP(2); STEP(3); STEP(4);
+		STEP(5); STEP(6); STEP(7); STEP(8);
+	}
+
+	for (k = 9; k--; L_ACF[k] <<= 1) ; 
+
+	}
+	/*   Rescaling of the array s[0..159]
+	 */
+	if (scalauto > 0) {
+		assert(scalauto <= 4); 
+		for (k = 160; k--; *s++ <<= scalauto) ;
+	}
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Autocorrelation P2((s, L_ACF),
+	word * s,		/* [0..159]	IN/OUT  */
+ 	longword * L_ACF)	/* [0..8]	OUT     */
+{
+	register int	k, i;
+	float f_L_ACF[9];
+	float scale;
+
+	float          s_f[160];
+	register float *sf = s_f;
+
+	for (i = 0; i < 160; ++i) sf[i] = s[i];
+	for (k = 0; k <= 8; k++) {
+		register float L_temp2 = 0;
+		register float *sfl = sf - k;
+		for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
+		f_L_ACF[k] = L_temp2;
+	}
+	scale = MAX_LONGWORD / f_L_ACF[0];
+
+	for (k = 0; k <= 8; k++) {
+		L_ACF[k] = f_L_ACF[k] * scale;
+	}
+}
+#endif	/* defined (USE_FLOAT_MUL) && defined (FAST) */
+
+/* 4.2.5 */
+
+static void Reflection_coefficients P2( (L_ACF, r),
+	longword	* L_ACF,		/* 0...8	IN	*/
+	register word	* r			/* 0...7	OUT 	*/
+)
+{
+	register int	i, m, n;
+	register word	temp;
+	register longword ltmp;
+	word		ACF[9];	/* 0..8 */
+	word		P[  9];	/* 0..8 */
+	word		K[  9]; /* 2..8 */
+
+	/*  Schur recursion with 16 bits arithmetic.
+	 */
+
+	if (L_ACF[0] == 0) {
+		for (i = 8; i--; *r++ = 0) ;
+		return;
+	}
+
+	assert( L_ACF[0] != 0 );
+	temp = gsm_norm( L_ACF[0] );
+
+	assert(temp >= 0 && temp < 32);
+
+	/* ? overflow ? */
+	for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 );
+
+	/*   Initialize array P[..] and K[..] for the recursion.
+	 */
+
+	for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
+	for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
+
+	/*   Compute reflection coefficients
+	 */
+	for (n = 1; n <= 8; n++, r++) {
+
+		temp = P[1];
+		temp = GSM_ABS(temp);
+		if (P[0] < temp) {
+			for (i = n; i <= 8; i++) *r++ = 0;
+			return;
+		}
+
+		*r = gsm_div( temp, P[0] );
+
+		assert(*r >= 0);
+		if (P[1] > 0) *r = -*r;		/* r[n] = sub(0, r[n]) */
+		assert (*r != MIN_WORD);
+		if (n == 8) return; 
+
+		/*  Schur recursion
+		 */
+		temp = GSM_MULT_R( P[1], *r );
+		P[0] = GSM_ADD( P[0], temp );
+
+		for (m = 1; m <= 8 - n; m++) {
+			temp     = GSM_MULT_R( K[ m   ],    *r );
+			P[m]     = GSM_ADD(    P[ m+1 ],  temp );
+
+			temp     = GSM_MULT_R( P[ m+1 ],    *r );
+			K[m]     = GSM_ADD(    K[ m   ],  temp );
+		}
+	}
+}
+
+/* 4.2.6 */
+
+static void Transformation_to_Log_Area_Ratios P1((r),
+	register word	* r 			/* 0..7	   IN/OUT */
+)
+/*
+ *  The following scaling for r[..] and LAR[..] has been used:
+ *
+ *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.
+ *  LAR[..] = integer( real_LAR[..] * 16384 );
+ *  with -1.625 <= real_LAR <= 1.625
+ */
+{
+	register word	temp;
+	register int	i;
+
+
+	/* Computation of the LAR[0..7] from the r[0..7]
+	 */
+	for (i = 1; i <= 8; i++, r++) {
+
+		temp = *r;
+		temp = GSM_ABS(temp);
+		assert(temp >= 0);
+
+		if (temp < 22118) {
+			temp >>= 1;
+		} else if (temp < 31130) {
+			assert( temp >= 11059 );
+			temp -= 11059;
+		} else {
+			assert( temp >= 26112 );
+			temp -= 26112;
+			temp <<= 2;
+		}
+
+		*r = *r < 0 ? -temp : temp;
+		assert( *r != MIN_WORD );
+	}
+}
+
+/* 4.2.7 */
+
+static void Quantization_and_coding P1((LAR),
+	register word * LAR    	/* [0..7]	IN/OUT	*/
+)
+{
+	register word	temp;
+	longword	ltmp;
+
+
+	/*  This procedure needs four tables; the following equations
+	 *  give the optimum scaling for the constants:
+	 *  
+	 *  A[0..7] = integer( real_A[0..7] * 1024 )
+	 *  B[0..7] = integer( real_B[0..7] *  512 )
+	 *  MAC[0..7] = maximum of the LARc[0..7]
+	 *  MIC[0..7] = minimum of the LARc[0..7]
+	 */
+
+#	undef STEP
+#	define	STEP( A, B, MAC, MIC )		\
+		temp = GSM_MULT( A,   *LAR );	\
+		temp = GSM_ADD(  temp,   B );	\
+		temp = GSM_ADD(  temp, 256 );	\
+		temp = SASR(     temp,   9 );	\
+		*LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
+		LAR++;
+
+	STEP(  20480,     0,  31, -32 );
+	STEP(  20480,     0,  31, -32 );
+	STEP(  20480,  2048,  15, -16 );
+	STEP(  20480, -2560,  15, -16 );
+
+	STEP(  13964,    94,   7,  -8 );
+	STEP(  15360, -1792,   7,  -8 );
+	STEP(   8534,  -341,   3,  -4 );
+	STEP(   9036, -1144,   3,  -4 );
+
+#	undef	STEP
+}
+
+void Gsm_LPC_Analysis P3((S, s,LARc),
+	struct gsm_state *S,
+	word 		 * s,		/* 0..159 signals	IN/OUT	*/
+        word 		 * LARc)	/* 0..7   LARc's	OUT	*/
+{
+	longword	L_ACF[9];
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+	if (S->fast) Fast_Autocorrelation (s,	  L_ACF );
+	else
+#endif
+	Autocorrelation			  (s,	  L_ACF	);
+	Reflection_coefficients		  (L_ACF, LARc	);
+	Transformation_to_Log_Area_Ratios (LARc);
+	Quantization_and_coding		  (LARc);
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/preprocess.c
@@ -1,0 +1,113 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/preprocess.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+
+#include	<stdio.h>
+#include	<assert.h>
+
+#include "private.h"
+
+#include	"gsm.h"
+#include 	"proto.h"
+
+/*	4.2.0 .. 4.2.3	PREPROCESSING SECTION
+ *  
+ *  	After A-law to linear conversion (or directly from the
+ *   	Ato D converter) the following scaling is assumed for
+ * 	input to the RPE-LTP algorithm:
+ *
+ *      in:  0.1.....................12
+ *	     S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
+ *
+ *	Where S is the sign bit, v a valid bit, and * a "don't care" bit.
+ * 	The original signal is called sop[..]
+ *
+ *      out:   0.1................... 12 
+ *	     S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
+ */
+
+
+void Gsm_Preprocess P3((S, s, so),
+	struct gsm_state * S,
+	word		 * s,
+	word 		 * so )		/* [0..159] 	IN/OUT	*/
+{
+
+	word       z1 = S->z1;
+	longword L_z2 = S->L_z2;
+	word 	   mp = S->mp;
+
+	word 	   	s1;
+	longword      L_s2;
+
+	longword      L_temp;
+
+	word		msp, lsp;
+	word		SO;
+
+	longword	ltmp;		/* for   ADD */
+	ulongword	utmp;		/* for L_ADD */
+
+	register int		k = 160;
+
+	while (k--) {
+
+	/*  4.2.1   Downscaling of the input signal
+	 */
+		SO = SASR( *s, 3 ) << 2;
+		s++;
+
+		assert (SO >= -0x4000);	/* downscaled by     */
+		assert (SO <=  0x3FFC);	/* previous routine. */
+
+
+	/*  4.2.2   Offset compensation
+	 * 
+	 *  This part implements a high-pass filter and requires extended
+	 *  arithmetic precision for the recursive part of this filter.
+	 *  The input of this procedure is the array so[0...159] and the
+	 *  output the array sof[ 0...159 ].
+	 */
+		/*   Compute the non-recursive part
+		 */
+
+		s1 = SO - z1;			/* s1 = gsm_sub( *so, z1 ); */
+		z1 = SO;
+
+		assert(s1 != MIN_WORD);
+
+		/*   Compute the recursive part
+		 */
+		L_s2 = s1;
+		L_s2 <<= 15;
+
+		/*   Execution of a 31 bv 16 bits multiplication
+		 */
+
+		msp = SASR( L_z2, 15 );
+		lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
+
+		L_s2  += GSM_MULT_R( lsp, 32735 );
+		L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
+		L_z2   = GSM_L_ADD( L_temp, L_s2 );
+
+		/*    Compute sof[k] with rounding
+		 */
+		L_temp = GSM_L_ADD( L_z2, 16384 );
+
+	/*   4.2.3  Preemphasis
+	 */
+
+		msp   = GSM_MULT_R( mp, -28180 );
+		mp    = SASR( L_temp, 15 );
+		*so++ = GSM_ADD( mp, msp );
+	}
+
+	S->z1   = z1;
+	S->L_z2 = L_z2;
+	S->mp   = mp;
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/private.h
@@ -1,0 +1,278 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/private.h,v 1.1 2002/01/14 19:15:55 menno Exp $*/
+
+#ifndef	PRIVATE_H
+#define	PRIVATE_H
+
+/* Added by Erik de Castro Lopo */
+#define	NeedFunctionPrototypes	1
+#define	SASR  
+#define	USE_FLOAT_MUL
+#define	FAST
+#define	WAV49  
+/* Added by Erik de Castro Lopo */
+
+
+
+typedef short				word;		/* 16 bit signed int	*/
+typedef int					longword;	/* 32 bit signed int	*/
+
+typedef unsigned short		uword;		/* unsigned word	*/
+typedef unsigned int		ulongword;	/* unsigned longword	*/
+
+struct gsm_state {
+
+	word		dp0[ 280 ];
+
+	word		z1;		/* preprocessing.c, Offset_com. */
+	longword	L_z2;		/*                  Offset_com. */
+	int			mp;		/*                  Preemphasis	*/
+
+	word		u[8];		/* short_term_aly_filter.c	*/
+	word		LARpp[2][8]; 	/*                              */
+	word		j;		/*                              */
+
+	word        ltp_cut;        /* long_term.c, LTP crosscorr.  */
+	word		nrp; /* 40 */	/* long_term.c, synthesis	*/
+	word		v[9];		/* short_term.c, synthesis	*/
+	word		msr;		/* decoder.c,	Postprocessing	*/
+
+	char		verbose;	/* only used if !NDEBUG		*/
+	char		fast;		/* only used if FAST		*/
+
+	char		wav_fmt;	/* only used if WAV49 defined	*/
+	unsigned char	frame_index;	/*            odd/even chaining	*/
+	unsigned char	frame_chain;	/*   half-byte to carry forward	*/
+};
+
+
+#define	MIN_WORD	(-32767 - 1)
+#define	MAX_WORD	  32767
+
+#define	MIN_LONGWORD	(-2147483647 - 1)
+#define	MAX_LONGWORD	  2147483647
+
+#ifdef	SASR		/* flag: >> is a signed arithmetic shift right */
+#undef	SASR
+#define	SASR(x, by)	((x) >> (by))
+#else
+#define	SASR(x, by)	((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))
+#endif	/* SASR */
+
+#include "proto.h"
+
+/*
+ *	Prototypes from add.c
+ */
+extern word	gsm_mult 		(word a, word b);
+extern longword gsm_L_mult 	(word a, word b);
+extern word	gsm_mult_r		(word a, word b);
+
+extern word	gsm_div  		(word num, word denum);
+
+extern word	gsm_add 		(word a, word b );
+extern longword gsm_L_add 	(longword a, longword b );
+
+extern word	gsm_sub 		(word a, word b);
+extern longword gsm_L_sub 	(longword a, longword b);
+
+extern word	gsm_abs 		(word a);
+
+extern word	gsm_norm 		(longword a );
+
+extern longword gsm_L_asl  	(longword a, int n);
+extern word	gsm_asl 		(word a, int n);
+
+extern longword gsm_L_asr  	(longword a, int n);
+extern word	gsm_asr  		(word a, int n);
+
+/*
+ *  Inlined functions from add.h 
+ */
+
+/* 
+ * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *)	\
+ *	(0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15))
+ */
+#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */	\
+	(SASR( ((longword)(a) * (longword)(b) + 16384), 15 ))
+
+# define GSM_MULT(a,b)	 /* word a, word b, !(a == b == MIN_WORD) */	\
+	(SASR( ((longword)(a) * (longword)(b)), 15 ))
+
+# define GSM_L_MULT(a, b) /* word a, word b */	\
+	(((longword)(a) * (longword)(b)) << 1)
+
+# define GSM_L_ADD(a, b)	\
+	( (a) <  0 ? ( (b) >= 0 ? (a) + (b)	\
+		 : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \
+		   >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 )   \
+	: ((b) <= 0 ? (a) + (b)   \
+	          : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \
+		    ? MAX_LONGWORD : utmp))
+
+/*
+ * # define GSM_ADD(a, b)	\
+ * 	((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \
+ * 	? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
+ */
+/* Nonportable, but faster: */
+
+#define	GSM_ADD(a, b)	\
+	((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \
+		MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)
+
+# define GSM_SUB(a, b)	\
+	((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \
+	? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
+
+# define GSM_ABS(a)	((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))
+
+/* Use these if necessary:
+
+# define GSM_MULT_R(a, b)	gsm_mult_r(a, b)
+# define GSM_MULT(a, b)		gsm_mult(a, b)
+# define GSM_L_MULT(a, b)	gsm_L_mult(a, b)
+
+# define GSM_L_ADD(a, b)	gsm_L_add(a, b)
+# define GSM_ADD(a, b)		gsm_add(a, b)
+# define GSM_SUB(a, b)		gsm_sub(a, b)
+
+# define GSM_ABS(a)		gsm_abs(a)
+
+*/
+
+/*
+ *  More prototypes from implementations..
+ */
+extern void Gsm_Coder P((
+		struct gsm_state	* S,
+		word	* s,	/* [0..159] samples		IN	*/
+		word	* LARc,	/* [0..7] LAR coefficients	OUT	*/
+		word	* Nc,	/* [0..3] LTP lag		OUT 	*/
+		word	* bc,	/* [0..3] coded LTP gain	OUT 	*/
+		word	* Mc,	/* [0..3] RPE grid selection	OUT     */
+		word	* xmaxc,/* [0..3] Coded maximum amplitude OUT	*/
+		word	* xMc	/* [13*4] normalized RPE samples OUT	*/));
+
+extern void Gsm_Long_Term_Predictor P((		/* 4x for 160 samples */
+		struct gsm_state * S,
+		word	* d,	/* [0..39]   residual signal	IN	*/
+		word	* dp,	/* [-120..-1] d'		IN	*/
+		word	* e,	/* [0..40] 			OUT	*/
+		word	* dpp,	/* [0..40] 			OUT	*/
+		word	* Nc,	/* correlation lag		OUT	*/
+		word	* bc	/* gain factor			OUT	*/));
+
+extern void Gsm_LPC_Analysis P((
+		struct gsm_state * S,
+		word * s,	 /* 0..159 signals	IN/OUT	*/
+	        word * LARc));   /* 0..7   LARc's	OUT	*/
+
+extern void Gsm_Preprocess P((
+		struct gsm_state * S,
+		word * s, word * so));
+
+extern void Gsm_Encoding P((
+		struct gsm_state * S,
+		word	* e,	
+		word	* ep,	
+		word	* xmaxc,
+		word	* Mc,	
+		word	* xMc));
+
+extern void Gsm_Short_Term_Analysis_Filter P((
+		struct gsm_state * S,
+		word	* LARc,	/* coded log area ratio [0..7]  IN	*/
+		word	* d	/* st res. signal [0..159]	IN/OUT	*/));
+
+extern void Gsm_Decoder P((
+		struct gsm_state * S,
+		word	* LARcr,	/* [0..7]		IN	*/
+		word	* Ncr,		/* [0..3] 		IN 	*/
+		word	* bcr,		/* [0..3]		IN	*/
+		word	* Mcr,		/* [0..3] 		IN 	*/
+		word	* xmaxcr,	/* [0..3]		IN 	*/
+		word	* xMcr,		/* [0..13*4]		IN	*/
+		word	* s));		/* [0..159]		OUT 	*/
+
+extern void Gsm_Decoding P((
+		struct gsm_state * S,
+		word 	xmaxcr,
+		word	Mcr,
+		word	* xMcr,  	/* [0..12]		IN	*/
+		word	* erp)); 	/* [0..39]		OUT 	*/
+
+extern void Gsm_Long_Term_Synthesis_Filtering P((
+		struct gsm_state* S,
+		word	Ncr,
+		word	bcr,
+		word	* erp,		/* [0..39]		  IN 	*/
+		word	* drp)); 	/* [-120..-1] IN, [0..40] OUT 	*/
+
+void Gsm_RPE_Decoding P((
+	struct gsm_state *S,
+		word xmaxcr,
+		word Mcr,
+		word * xMcr,  /* [0..12], 3 bits             IN      */
+		word * erp)); /* [0..39]                     OUT     */
+
+void Gsm_RPE_Encoding P((
+		struct gsm_state * S,
+		word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
+		word    * xmaxc,        /*                              OUT */
+		word    * Mc,           /*                              OUT */
+		word    * xMc));        /* [0..12]                      OUT */
+
+extern void Gsm_Short_Term_Synthesis_Filter P((
+		struct gsm_state * S,
+		word	* LARcr, 	/* log area ratios [0..7]  IN	*/
+		word	* drp,		/* received d [0...39]	   IN	*/
+		word	* s));		/* signal   s [0..159]	  OUT	*/
+
+extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((
+		word	* dpp,		/* [0...39]	IN	*/
+		word	* ep,		/* [0...39]	IN	*/
+		word	* dp));		/* [-120...-1]  IN/OUT 	*/
+
+/*
+ *  Tables from table.c
+ */
+#ifndef	GSM_TABLE_C
+
+extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];
+extern word gsm_INVA[8];
+extern word gsm_DLB[4], gsm_QLB[4];
+extern word gsm_H[11];
+extern word gsm_NRFAC[8];
+extern word gsm_FAC[8];
+
+#endif	/* GSM_TABLE_C */
+
+/*
+ *  Debugging
+ */
+#ifdef NDEBUG
+
+#	define	gsm_debug_words(a, b, c, d)		/* nil */
+#	define	gsm_debug_longwords(a, b, c, d)		/* nil */
+#	define	gsm_debug_word(a, b)			/* nil */
+#	define	gsm_debug_longword(a, b)		/* nil */
+
+#else	/* !NDEBUG => DEBUG */
+
+	extern void  gsm_debug_words     P((char * name, int, int, word *));
+	extern void  gsm_debug_longwords P((char * name, int, int, longword *));
+	extern void  gsm_debug_longword  P((char * name, longword));
+	extern void  gsm_debug_word      P((char * name, word));
+
+#endif /* !NDEBUG */
+
+#include "unproto.h"
+
+#endif	/* PRIVATE_H */
--- /dev/null
+++ b/common/libsndfile/src/GSM610/proto.h
@@ -1,0 +1,65 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/proto.h,v 1.1 2002/01/14 19:15:55 menno Exp $*/
+
+#ifndef	PROTO_H
+#define	PROTO_H
+
+/*#if __cplusplus*/
+#	define	NeedFunctionPrototypes	1
+/*#endif*/
+
+#if __STDC__
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#ifdef	_NO_PROTO
+#	undef	NeedFunctionPrototypes
+#endif
+
+#undef	P	/* gnu stdio.h actually defines this... 	*/
+#undef	P0
+#undef	P1
+#undef	P2
+#undef	P3
+#undef	P4
+#undef	P5
+#undef	P6
+#undef	P7
+#undef	P8
+
+#if NeedFunctionPrototypes
+
+#	define	P( protos )	protos
+
+#	define	P0()				(void)
+#	define	P1(x, a)			(a)
+#	define	P2(x, a, b)			(a, b)
+#	define	P3(x, a, b, c)			(a, b, c)
+#	define	P4(x, a, b, c, d)		(a, b, c, d)	
+#	define	P5(x, a, b, c, d, e)		(a, b, c, d, e)
+#	define	P6(x, a, b, c, d, e, f)		(a, b, c, d, e, f)
+#	define	P7(x, a, b, c, d, e, f, g)	(a, b, c, d, e, f, g)
+#	define	P8(x, a, b, c, d, e, f, g, h)	(a, b, c, d, e, f, g, h)
+
+#else /* !NeedFunctionPrototypes */
+
+#	define	P( protos )	( /* protos */ )
+
+#	define	P0()				()
+#	define	P1(x, a)			x a;
+#	define	P2(x, a, b)			x a; b;
+#	define	P3(x, a, b, c)			x a; b; c;
+#	define	P4(x, a, b, c, d)		x a; b; c; d;
+#	define	P5(x, a, b, c, d, e)		x a; b; c; d; e;
+#	define	P6(x, a, b, c, d, e, f)		x a; b; c; d; e; f;
+#	define	P7(x, a, b, c, d, e, f, g)	x a; b; c; d; e; f; g;
+#	define	P8(x, a, b, c, d, e, f, g, h)	x a; b; c; d; e; f; g; h;
+
+#endif  /* !NeedFunctionPrototypes */
+
+#endif	/* PROTO_H */
--- /dev/null
+++ b/common/libsndfile/src/GSM610/rpe.c
@@ -1,0 +1,488 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/rpe.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*  4.2.13 .. 4.2.17  RPE ENCODING SECTION
+ */
+
+/* 4.2.13 */
+
+static void Weighting_filter P2((e, x),
+	register word	* e,		/* signal [-5..0.39.44]	IN  */
+	word		* x		/* signal [0..39]	OUT */
+)
+/*
+ *  The coefficients of the weighting filter are stored in a table
+ *  (see table 4.4).  The following scaling is used:
+ *
+ *	H[0..10] = integer( real_H[ 0..10] * 8192 ); 
+ */
+{
+	/* word			wt[ 50 ]; */
+
+	register longword	L_result;
+	register int		k /* , i */ ;
+
+	/*  Initialization of a temporary working array wt[0...49]
+	 */
+
+	/* for (k =  0; k <=  4; k++) wt[k] = 0;
+	 * for (k =  5; k <= 44; k++) wt[k] = *e++;
+	 * for (k = 45; k <= 49; k++) wt[k] = 0;
+	 *
+	 *  (e[-5..-1] and e[40..44] are allocated by the caller,
+	 *  are initially zero and are not written anywhere.)
+	 */
+	e -= 5;
+
+	/*  Compute the signal x[0..39]
+	 */ 
+	for (k = 0; k <= 39; k++) {
+
+		L_result = 8192 >> 1;
+
+		/* for (i = 0; i <= 10; i++) {
+		 *	L_temp   = GSM_L_MULT( wt[k+i], gsm_H[i] );
+		 *	L_result = GSM_L_ADD( L_result, L_temp );
+		 * }
+		 */
+
+#undef	STEP
+#define	STEP( i, H )	(e[ k + i ] * (longword)H)
+
+		/*  Every one of these multiplications is done twice --
+		 *  but I don't see an elegant way to optimize this. 
+		 *  Do you?
+		 */
+
+#ifdef	STUPID_COMPILER
+		L_result += STEP(	0, 	-134 ) ;
+		L_result += STEP(	1, 	-374 )  ;
+	               /* + STEP(	2, 	0    )  */
+		L_result += STEP(	3, 	2054 ) ;
+		L_result += STEP(	4, 	5741 ) ;
+		L_result += STEP(	5, 	8192 ) ;
+		L_result += STEP(	6, 	5741 ) ;
+		L_result += STEP(	7, 	2054 ) ;
+	 	       /* + STEP(	8, 	0    )  */
+		L_result += STEP(	9, 	-374 ) ;
+		L_result += STEP(	10, 	-134 ) ;
+#else
+		L_result +=
+		  STEP(	0, 	-134 ) 
+		+ STEP(	1, 	-374 ) 
+	     /* + STEP(	2, 	0    )  */
+		+ STEP(	3, 	2054 ) 
+		+ STEP(	4, 	5741 ) 
+		+ STEP(	5, 	8192 ) 
+		+ STEP(	6, 	5741 ) 
+		+ STEP(	7, 	2054 ) 
+	     /* + STEP(	8, 	0    )  */
+		+ STEP(	9, 	-374 ) 
+		+ STEP(10, 	-134 )
+		;
+#endif
+
+		/* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
+		 * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
+		 *
+		 * x[k] = SASR( L_result, 16 );
+		 */
+
+		/* 2 adds vs. >>16 => 14, minus one shift to compensate for
+		 * those we lost when replacing L_MULT by '*'.
+		 */
+
+		L_result = SASR( L_result, 13 );
+		x[k] =  (  L_result < MIN_WORD ? MIN_WORD
+			: (L_result > MAX_WORD ? MAX_WORD : L_result ));
+	}
+}
+
+/* 4.2.14 */
+
+static void RPE_grid_selection P3((x,xM,Mc_out),
+	word		* x,		/* [0..39]		IN  */ 
+	word		* xM,		/* [0..12]		OUT */
+	word		* Mc_out	/*			OUT */
+)
+/*
+ *  The signal x[0..39] is used to select the RPE grid which is
+ *  represented by Mc.
+ */
+{
+	/* register word	temp1;	*/
+	register int		/* m, */  i;
+	register longword	L_result, L_temp;
+	longword		EM;	/* xxx should be L_EM? */
+	word			Mc;
+
+	longword		L_common_0_3;
+
+	EM = 0;
+	Mc = 0;
+
+	/* for (m = 0; m <= 3; m++) {
+	 *	L_result = 0;
+	 *
+	 *
+	 *	for (i = 0; i <= 12; i++) {
+	 *
+	 *		temp1    = SASR( x[m + 3*i], 2 );
+	 *
+	 *		assert(temp1 != MIN_WORD);
+	 *
+	 *		L_temp   = GSM_L_MULT( temp1, temp1 );
+	 *		L_result = GSM_L_ADD( L_temp, L_result );
+	 *	}
+	 * 
+	 *	if (L_result > EM) {
+	 *		Mc = m;
+	 *		EM = L_result;
+	 *	}
+	 * }
+	 */
+
+#undef	STEP
+#define	STEP( m, i )		L_temp = SASR( x[m + 3 * i], 2 );	\
+				L_result += L_temp * L_temp;
+
+	/* common part of 0 and 3 */
+
+	L_result = 0;
+	STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
+	STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
+	STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
+	L_common_0_3 = L_result;
+
+	/* i = 0 */
+
+	STEP( 0, 0 );
+	L_result <<= 1;	/* implicit in L_MULT */
+	EM = L_result;
+
+	/* i = 1 */
+
+	L_result = 0;
+	STEP( 1, 0 );
+	STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
+	STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
+	STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 1;
+	 	EM = L_result;
+	}
+
+	/* i = 2 */
+
+	L_result = 0;
+	STEP( 2, 0 );
+	STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
+	STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
+	STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 2;
+	 	EM = L_result;
+	}
+
+	/* i = 3 */
+
+	L_result = L_common_0_3;
+	STEP( 3, 12 );
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 3;
+	 	EM = L_result;
+	}
+
+	/**/
+
+	/*  Down-sampling by a factor 3 to get the selected xM[0..12]
+	 *  RPE sequence.
+	 */
+	for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
+	*Mc_out = Mc;
+}
+
+/* 4.12.15 */
+
+static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out),
+	word		xmaxc,		/* IN 	*/
+	word		* exp_out,	/* OUT	*/
+	word		* mant_out )	/* OUT  */
+{
+	word	exp, mant;
+
+	/* Compute exponent and mantissa of the decoded version of xmaxc
+	 */
+
+	exp = 0;
+	if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1;
+	mant = xmaxc - (exp << 3);
+
+	if (mant == 0) {
+		exp  = -4;
+		mant = 7;
+	}
+	else {
+		while (mant <= 7) {
+			mant = mant << 1 | 1;
+			exp--;
+		}
+		mant -= 8;
+	}
+
+	assert( exp  >= -4 && exp <= 6 );
+	assert( mant >= 0 && mant <= 7 );
+
+	*exp_out  = exp;
+	*mant_out = mant;
+}
+
+static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),
+	word		* xM,		/* [0..12]		IN	*/
+
+	word		* xMc,		/* [0..12]		OUT	*/
+	word		* mant_out,	/* 			OUT	*/
+	word		* exp_out,	/*			OUT	*/
+	word		* xmaxc_out	/*			OUT	*/
+)
+{
+	int	i, itest;
+
+	word	xmax, xmaxc, temp, temp1, temp2;
+	word	exp, mant;
+
+
+	/*  Find the maximum absolute value xmax of xM[0..12].
+	 */
+
+	xmax = 0;
+	for (i = 0; i <= 12; i++) {
+		temp = xM[i];
+		temp = GSM_ABS(temp);
+		if (temp > xmax) xmax = temp;
+	}
+
+	/*  Qantizing and coding of xmax to get xmaxc.
+	 */
+
+	exp   = 0;
+	temp  = SASR( xmax, 9 );
+	itest = 0;
+
+	for (i = 0; i <= 5; i++) {
+
+		itest |= (temp <= 0);
+		temp = SASR( temp, 1 );
+
+		assert(exp <= 5);
+		if (itest == 0) exp++;		/* exp = add (exp, 1) */
+	}
+
+	assert(exp <= 6 && exp >= 0);
+	temp = exp + 5;
+
+	assert(temp <= 11 && temp >= 0);
+	xmaxc = gsm_add( SASR(xmax, temp), exp << 3 );
+
+	/*   Quantizing and coding of the xM[0..12] RPE sequence
+	 *   to get the xMc[0..12]
+	 */
+
+	APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant );
+
+	/*  This computation uses the fact that the decoded version of xmaxc
+	 *  can be calculated by using the exponent and the mantissa part of
+	 *  xmaxc (logarithmic table).
+	 *  So, this method avoids any division and uses only a scaling
+	 *  of the RPE samples by a function of the exponent.  A direct 
+	 *  multiplication by the inverse of the mantissa (NRFAC[0..7]
+	 *  found in table 4.5) gives the 3 bit coded version xMc[0..12]
+	 *  of the RPE samples.
+	 */
+
+
+	/* Direct computation of xMc[0..12] using table 4.5
+	 */
+
+	assert( exp <= 4096 && exp >= -4096);
+	assert( mant >= 0 && mant <= 7 ); 
+
+	temp1 = 6 - exp;		/* normalization by the exponent */
+	temp2 = gsm_NRFAC[ mant ];  	/* inverse mantissa 		 */
+
+	for (i = 0; i <= 12; i++) {
+
+		assert(temp1 >= 0 && temp1 < 16);
+
+		temp = xM[i] << temp1;
+		temp = GSM_MULT( temp, temp2 );
+		temp = SASR(temp, 12);
+		xMc[i] = temp + 4;		/* see note below */
+	}
+
+	/*  NOTE: This equation is used to make all the xMc[i] positive.
+	 */
+
+	*mant_out  = mant;
+	*exp_out   = exp;
+	*xmaxc_out = xmaxc;
+}
+
+/* 4.2.16 */
+
+static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),
+	register word	* xMc,	/* [0..12]			IN 	*/
+	word		mant,
+	word		exp,
+	register word	* xMp)	/* [0..12]			OUT 	*/
+/* 
+ *  This part is for decoding the RPE sequence of coded xMc[0..12]
+ *  samples to obtain the xMp[0..12] array.  Table 4.6 is used to get
+ *  the mantissa of xmaxc (FAC[0..7]).
+ */
+{
+	int	i;
+	word	temp, temp1, temp2, temp3;
+	longword	ltmp;
+
+	assert( mant >= 0 && mant <= 7 ); 
+
+	temp1 = gsm_FAC[ mant ];	/* see 4.2-15 for mant */
+	temp2 = gsm_sub( 6, exp );	/* see 4.2-15 for exp  */
+	temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
+
+	for (i = 13; i--;) {
+
+		assert( *xMc <= 7 && *xMc >= 0 ); 	/* 3 bit unsigned */
+
+		/* temp = gsm_sub( *xMc++ << 1, 7 ); */
+		temp = (*xMc++ << 1) - 7;	        /* restore sign   */
+		assert( temp <= 7 && temp >= -7 ); 	/* 4 bit signed   */
+
+		temp <<= 12;				/* 16 bit signed  */
+		temp = GSM_MULT_R( temp1, temp );
+		temp = GSM_ADD( temp, temp3 );
+		*xMp++ = gsm_asr( temp, temp2 );
+	}
+}
+
+/* 4.2.17 */
+
+static void RPE_grid_positioning P3((Mc,xMp,ep),
+	word		Mc,		/* grid position	IN	*/
+	register word	* xMp,		/* [0..12]		IN	*/
+	register word	* ep		/* [0..39]		OUT	*/
+)
+/*
+ *  This procedure computes the reconstructed long term residual signal
+ *  ep[0..39] for the LTP analysis filter.  The inputs are the Mc
+ *  which is the grid position selection and the xMp[0..12] decoded
+ *  RPE samples which are upsampled by a factor of 3 by inserting zero
+ *  values.
+ */
+{
+	int	i = 13;
+
+	assert(0 <= Mc && Mc <= 3);
+
+        switch (Mc) {
+                case 3: *ep++ = 0;
+                case 2:  do {
+                                *ep++ = 0;
+                case 1:         *ep++ = 0;
+                case 0:         *ep++ = *xMp++;
+                         } while (--i);
+        }
+        while (++Mc < 4) *ep++ = 0;
+
+	/*
+
+	int i, k;
+	for (k = 0; k <= 39; k++) ep[k] = 0;
+	for (i = 0; i <= 12; i++) {
+		ep[ Mc + (3*i) ] = xMp[i];
+	}
+	*/
+}
+
+/* 4.2.18 */
+
+/*  This procedure adds the reconstructed long term residual signal
+ *  ep[0..39] to the estimated signal dpp[0..39] from the long term
+ *  analysis filter to compute the reconstructed short term residual
+ *  signal dp[-40..-1]; also the reconstructed short term residual
+ *  array dp[-120..-41] is updated.
+ */
+
+#if 0	/* Has been inlined in code.c */
+void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),
+	word	* dpp,		/* [0...39]	IN	*/
+	word	* ep,		/* [0...39]	IN	*/
+	word	* dp)		/* [-120...-1]  IN/OUT 	*/
+{
+	int 		k;
+
+	for (k = 0; k <= 79; k++) 
+		dp[ -120 + k ] = dp[ -80 + k ];
+
+	for (k = 0; k <= 39; k++)
+		dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
+}
+#endif	/* Has been inlined in code.c */
+
+void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc),
+
+	struct gsm_state * S,
+
+	word	* e,		/* -5..-1][0..39][40..44	IN/OUT  */
+	word	* xmaxc,	/* 				OUT */
+	word	* Mc,		/* 			  	OUT */
+	word	* xMc)		/* [0..12]			OUT */
+{
+	word	x[40];
+	word	xM[13], xMp[13];
+	word	mant, exp;
+
+	Weighting_filter(e, x);
+	RPE_grid_selection(x, xM, Mc);
+
+	APCM_quantization(	xM, xMc, &mant, &exp, xmaxc);
+	APCM_inverse_quantization(  xMc,  mant,  exp, xMp);
+
+	RPE_grid_positioning( *Mc, xMp, e );
+
+}
+
+void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp),
+	struct gsm_state	* S,
+
+	word 		xmaxcr,
+	word		Mcr,
+	word		* xMcr,  /* [0..12], 3 bits 		IN	*/
+	word		* erp	 /* [0..39]			OUT 	*/
+)
+{
+	word	exp, mant;
+	word	xMp[ 13 ];
+
+	APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant );
+	APCM_inverse_quantization( xMcr, mant, exp, xMp );
+	RPE_grid_positioning( Mcr, xMp, erp );
+
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/short_term.c
@@ -1,0 +1,429 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/short_term.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*
+ *  SHORT TERM ANALYSIS FILTERING SECTION
+ */
+
+/* 4.2.8 */
+
+static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
+	word 	* LARc,		/* coded log area ratio	[0..7] 	IN	*/
+	word	* LARpp)	/* out: decoded ..			*/
+{
+	register word	temp1 /* , temp2 */;
+	register long	ltmp;	/* for GSM_ADD */
+
+	/*  This procedure requires for efficient implementation
+	 *  two tables.
+ 	 *
+	 *  INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
+	 *  MIC[1..8]  = minimum value of the LARc[1..8]
+	 */
+
+	/*  Compute the LARpp[1..8]
+	 */
+
+	/* 	for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
+	 *
+	 *		temp1  = GSM_ADD( *LARc, *MIC ) << 10;
+	 *		temp2  = *B << 1;
+	 *		temp1  = GSM_SUB( temp1, temp2 );
+	 *
+	 *		assert(*INVA != MIN_WORD);
+	 *
+	 *		temp1  = GSM_MULT_R( *INVA, temp1 );
+	 *		*LARpp = GSM_ADD( temp1, temp1 );
+	 *	}
+	 */
+
+#undef	STEP
+#define	STEP( B, MIC, INVA )	\
+		temp1    = GSM_ADD( *LARc++, MIC ) << 10;	\
+		temp1    = GSM_SUB( temp1, B << 1 );		\
+		temp1    = GSM_MULT_R( INVA, temp1 );		\
+		*LARpp++ = GSM_ADD( temp1, temp1 );
+
+	STEP(      0,  -32,  13107 );
+	STEP(      0,  -32,  13107 );
+	STEP(   2048,  -16,  13107 );
+	STEP(  -2560,  -16,  13107 );
+
+	STEP(     94,   -8,  19223 );
+	STEP(  -1792,   -8,  17476 );
+	STEP(   -341,   -4,  31454 );
+	STEP(  -1144,   -4,  29708 );
+
+	/* NOTE: the addition of *MIC is used to restore
+	 * 	 the sign of *LARc.
+	 */
+}
+
+/* 4.2.9 */
+/* Computation of the quantized reflection coefficients 
+ */
+
+/* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8]
+ */
+
+/*
+ *  Within each frame of 160 analyzed speech samples the short term
+ *  analysis and synthesis filters operate with four different sets of
+ *  coefficients, derived from the previous set of decoded LARs(LARpp(j-1))
+ *  and the actual set of decoded LARs (LARpp(j))
+ *
+ * (Initial value: LARpp(j-1)[1..8] = 0.)
+ */
+
+static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int 	i;
+	register longword ltmp;
+
+	for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
+		*LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
+		*LARp = GSM_ADD( *LARp,  SASR( *LARpp_j_1, 1));
+	}
+}
+
+static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+	register longword ltmp;
+	for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+		*LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
+	}
+}
+
+static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+	register longword ltmp;
+
+	for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+		*LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
+		*LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
+	}
+}
+
+
+static void Coefficients_40_159 P2((LARpp_j, LARp),
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+
+	for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
+		*LARp = *LARpp_j;
+}
+
+/* 4.2.9.2 */
+
+static void LARp_to_rp P1((LARp),
+	register word * LARp)	/* [0..7] IN/OUT  */
+/*
+ *  The input of this procedure is the interpolated LARp[0..7] array.
+ *  The reflection coefficients, rp[i], are used in the analysis
+ *  filter and in the synthesis filter.
+ */
+{
+	register int 		i;
+	register word		temp;
+	register longword	ltmp;
+
+	for (i = 1; i <= 8; i++, LARp++) {
+
+		/* temp = GSM_ABS( *LARp );
+	         *
+		 * if (temp < 11059) temp <<= 1;
+		 * else if (temp < 20070) temp += 11059;
+		 * else temp = GSM_ADD( temp >> 2, 26112 );
+		 *
+		 * *LARp = *LARp < 0 ? -temp : temp;
+		 */
+
+		if (*LARp < 0) {
+			temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
+			*LARp = - ((temp < 11059) ? temp << 1
+				: ((temp < 20070) ? temp + 11059
+				:  GSM_ADD( temp >> 2, 26112 )));
+		} else {
+			temp  = *LARp;
+			*LARp =    (temp < 11059) ? temp << 1
+				: ((temp < 20070) ? temp + 11059
+				:  GSM_ADD( temp >> 2, 26112 ));
+		}
+	}
+}
+
+
+/* 4.2.10 */
+static void Short_term_analysis_filtering P4((S,rp,k_n,s),
+	struct gsm_state * S,
+	register word	* rp,	/* [0..7]	IN	*/
+	register int 	k_n, 	/*   k_end - k_start	*/
+	register word	* s	/* [0..n-1]	IN/OUT	*/
+)
+/*
+ *  This procedure computes the short term residual signal d[..] to be fed
+ *  to the RPE-LTP loop from the s[..] signal and from the local rp[..]
+ *  array (quantized reflection coefficients).  As the call of this
+ *  procedure can be done in many ways (see the interpolation of the LAR
+ *  coefficient), it is assumed that the computation begins with index
+ *  k_start (for arrays d[..] and s[..]) and stops with index k_end
+ *  (k_start and k_end are defined in 4.2.9.1).  This procedure also
+ *  needs to keep the array u[0..7] in memory for each call.
+ */
+{
+	register word		* u = S->u;
+	register int		i;
+	register word		di, zzz, ui, sav, rpi;
+	register longword 	ltmp;
+
+	for (; k_n--; s++) {
+
+		di = sav = *s;
+
+		for (i = 0; i < 8; i++) {		/* YYY */
+
+			ui    = u[i];
+			rpi   = rp[i];
+			u[i]  = sav;
+
+			zzz   = GSM_MULT_R(rpi, di);
+			sav   = GSM_ADD(   ui,  zzz);
+
+			zzz   = GSM_MULT_R(rpi, ui);
+			di    = GSM_ADD(   di,  zzz );
+		}
+
+		*s = di;
+	}
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s),
+	struct gsm_state * S,
+	register word	* rp,	/* [0..7]	IN	*/
+	register int 	k_n, 	/*   k_end - k_start	*/
+	register word	* s	/* [0..n-1]	IN/OUT	*/
+)
+{
+	register word		* u = S->u;
+	register int		i;
+
+	float 	  uf[8],
+		 rpf[8];
+
+	register float scalef = 3.0517578125e-5;
+	register float		sav, di, temp;
+
+	for (i = 0; i < 8; ++i) {
+		uf[i]  = u[i];
+		rpf[i] = rp[i] * scalef;
+	}
+	for (; k_n--; s++) {
+		sav = di = *s;
+		for (i = 0; i < 8; ++i) {
+			register float rpfi = rpf[i];
+			register float ufi  = uf[i];
+
+			uf[i] = sav;
+			temp  = rpfi * di + ufi;
+			di   += rpfi * ufi;
+			sav   = temp;
+		}
+		*s = di;
+	}
+	for (i = 0; i < 8; ++i) u[i] = uf[i];
+}
+#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
+
+static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+	struct gsm_state * S,
+	register word	* rrp,	/* [0..7]	IN	*/
+	register int	k,	/* k_end - k_start	*/
+	register word	* wt,	/* [0..k-1]	IN	*/
+	register word	* sr	/* [0..k-1]	OUT	*/
+)
+{
+	register word		* v = S->v;
+	register int		i;
+	register word		sri, tmp1, tmp2;
+	register longword	ltmp;	/* for GSM_ADD  & GSM_SUB */
+
+	while (k--) {
+		sri = *wt++;
+		for (i = 8; i--;) {
+
+			/* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
+			 */
+			tmp1 = rrp[i];
+			tmp2 = v[i];
+			tmp2 =  ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+				? MAX_WORD
+				: 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
+					     + 16384) >> 15)) ;
+
+			sri  = GSM_SUB( sri, tmp2 );
+
+			/* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+			 */
+			tmp1  = ( tmp1 == MIN_WORD && sri == MIN_WORD
+				? MAX_WORD
+				: 0x0FFFF & (( (longword)tmp1 * (longword)sri
+					     + 16384) >> 15)) ;
+
+			v[i+1] = GSM_ADD( v[i], tmp1);
+		}
+		*sr++ = v[0] = sri;
+	}
+}
+
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+	struct gsm_state * S,
+	register word	* rrp,	/* [0..7]	IN	*/
+	register int	k,	/* k_end - k_start	*/
+	register word	* wt,	/* [0..k-1]	IN	*/
+	register word	* sr	/* [0..k-1]	OUT	*/
+)
+{
+	register word		* v = S->v;
+	register int		i;
+
+	float va[9], rrpa[8];
+	register float scalef = 3.0517578125e-5, temp;
+
+	for (i = 0; i < 8; ++i) {
+		va[i]   = v[i];
+		rrpa[i] = (float)rrp[i] * scalef;
+	}
+	while (k--) {
+		register float sri = *wt++;
+		for (i = 8; i--;) {
+			sri -= rrpa[i] * va[i];
+			if     (sri < -32768.) sri = -32768.;
+			else if (sri > 32767.) sri =  32767.;
+
+			temp = va[i] + rrpa[i] * sri;
+			if     (temp < -32768.) temp = -32768.;
+			else if (temp > 32767.) temp =  32767.;
+			va[i+1] = temp;
+		}
+		*sr++ = va[0] = sri;
+	}
+	for (i = 0; i < 9; ++i) v[i] = va[i];
+}
+
+#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
+
+void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),
+
+	struct gsm_state * S,
+
+	word	* LARc,		/* coded log area ratio [0..7]  IN	*/
+	word	* s		/* signal [0..159]		IN/OUT	*/
+)
+{
+	word		* LARpp_j	= S->LARpp[ S->j      ];
+	word		* LARpp_j_1	= S->LARpp[ S->j ^= 1 ];
+
+	word		LARp[8];
+
+#undef	FILTER
+#if 	defined(FAST) && defined(USE_FLOAT_MUL)
+# 	define	FILTER 	(* (S->fast			\
+			   ? Fast_Short_term_analysis_filtering	\
+		    	   : Short_term_analysis_filtering	))
+
+#else
+# 	define	FILTER	Short_term_analysis_filtering
+#endif
+
+	Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
+
+	Coefficients_0_12(  LARpp_j_1, LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, s);
+
+	Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 14, s + 13);
+
+	Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, s + 27);
+
+	Coefficients_40_159( LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 120, s + 40);
+}
+
+void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
+	struct gsm_state * S,
+
+	word	* LARcr,	/* received log area ratios [0..7] IN  */
+	word	* wt,		/* received d [0..159]		   IN  */
+
+	word	* s		/* signal   s [0..159]		  OUT  */
+)
+{
+	word		* LARpp_j	= S->LARpp[ S->j     ];
+	word		* LARpp_j_1	= S->LARpp[ S->j ^=1 ];
+
+	word		LARp[8];
+
+#undef	FILTER
+#if 	defined(FAST) && defined(USE_FLOAT_MUL)
+
+# 	define	FILTER 	(* (S->fast			\
+			   ? Fast_Short_term_synthesis_filtering	\
+		    	   : Short_term_synthesis_filtering	))
+#else
+#	define	FILTER	Short_term_synthesis_filtering
+#endif
+
+	Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
+
+	Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, wt, s );
+
+	Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 14, wt + 13, s + 13 );
+
+	Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, wt + 27, s + 27 );
+
+	Coefficients_40_159( LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER(S, LARp, 120, wt + 40, s + 40);
+}
--- /dev/null
+++ b/common/libsndfile/src/GSM610/table.c
@@ -1,0 +1,63 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/table.c,v 1.1 2002/01/14 19:15:55 menno Exp $ */
+
+/*  Most of these tables are inlined at their point of use.
+ */
+
+/*  4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP
+ *      CODER AND DECODER
+ *
+ *	(Most of them inlined, so watch out.)
+ */
+
+#define	GSM_TABLE_C
+#include "private.h"
+#include	"gsm.h"
+
+/*  Table 4.1  Quantization of the Log.-Area Ratios
+ */
+/* i 		     1      2      3        4      5      6        7       8 */
+word gsm_A[8]   = {20480, 20480, 20480,  20480,  13964,  15360,   8534,  9036};
+word gsm_B[8]   = {    0,     0,  2048,  -2560,     94,  -1792,   -341, -1144};
+word gsm_MIC[8] = { -32,   -32,   -16,    -16,     -8,     -8,     -4,    -4 };
+word gsm_MAC[8] = {  31,    31,    15,     15,      7,      7,      3,     3 };
+
+
+/*  Table 4.2  Tabulation  of 1/A[1..8]
+ */
+word gsm_INVA[8]={ 13107, 13107,  13107, 13107,  19223, 17476,  31454, 29708 };
+
+
+/*   Table 4.3a  Decision level of the LTP gain quantizer
+ */
+/*  bc		      0	        1	  2	     3			*/
+word gsm_DLB[4] = {  6554,    16384,	26214,	   32767	};
+
+
+/*   Table 4.3b   Quantization levels of the LTP gain quantizer
+ */
+/* bc		      0          1        2          3			*/
+word gsm_QLB[4] = {  3277,    11469,	21299,	   32767	};
+
+
+/*   Table 4.4	 Coefficients of the weighting filter
+ */
+/* i		    0      1   2    3   4      5      6     7   8   9    10  */
+word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+
+
+/*   Table 4.5 	 Normalized inverse mantissa used to compute xM/xmax 
+ */
+/* i		 	0        1    2      3      4      5     6      7   */
+word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+
+
+/*   Table 4.6	 Normalized direct mantissa used to compute xM/xmax
+ */
+/* i                  0      1       2      3      4      5      6      7   */
+word gsm_FAC[8]	= { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };
--- /dev/null
+++ b/common/libsndfile/src/GSM610/unproto.h
@@ -1,0 +1,23 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header: /home/cvs/f/fa/faac/faad2/common/libsndfile/src/GSM610/Attic/unproto.h,v 1.1 2002/01/14 19:15:55 menno Exp $*/
+
+#ifdef	PROTO_H		/* sic */
+#undef	PROTO_H
+
+#undef	P
+#undef	P0
+#undef	P1
+#undef	P2
+#undef	P3
+#undef	P4
+#undef	P5
+#undef	P6
+#undef	P7
+#undef	P8
+
+#endif	/* PROTO_H */
--- /dev/null
+++ b/common/libsndfile/src/Makefile.am
@@ -1,0 +1,23 @@
+# This file was automatically generated
+# DO NOT EDIT!
+#
+DIST_SUBDIRS = GSM610 G72x
+SUBDIRS = GSM610 G72x
+
+lib_LTLIBRARIES = libsndfile.la
+include_HEADERS = sndfile.h
+INCLUDES = -I$(srcdir)/../src -I$(srcdir)
+
+noinst_HEADERS = common.h sfendian.h floatcast.h wav.h au.h
+
+COMMON = common.c pcm.c ulaw.c alaw.c float32.c sndfile.c  
+FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c \
+				svx.c wav.c wav_gsm610.c wav_ima_adpcm.c \
+				wav_ms_adpcm.c voc.c ircam.c
+
+libsndfile_la_SOURCES = $(COMMON) $(FILESPECIFIC) sndfile.h
+libsndfile_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
+libsndfile_la_LIBADD  = GSM610/libgsm.la G72x/libg72x.la
+
+# Disable autoheader. 
+AUTOHEADER=echo
--- /dev/null
+++ b/common/libsndfile/src/Makefile.in
@@ -1,0 +1,484 @@
+# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# This file was automatically generated
+# DO NOT EDIT!
+#
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SHARED_VERSION_INFO = @SHARED_VERSION_INFO@
+VERSION = @VERSION@
+subdirs = @subdirs@
+
+DIST_SUBDIRS = GSM610 G72x
+SUBDIRS = GSM610 G72x
+
+lib_LTLIBRARIES = libsndfile.la
+include_HEADERS = sndfile.h
+INCLUDES = -I$(srcdir)/../src -I$(srcdir)
+
+noinst_HEADERS = common.h sfendian.h floatcast.h wav.h au.h
+
+COMMON = common.c pcm.c ulaw.c alaw.c float32.c sndfile.c  
+FILESPECIFIC = aiff.c au.c au_g72x.c nist.c paf.c raw.c samplitude.c 				svx.c wav.c wav_gsm610.c wav_ima_adpcm.c 				wav_ms_adpcm.c voc.c ircam.c
+
+
+libsndfile_la_SOURCES = $(COMMON) $(FILESPECIFIC) sndfile.h
+libsndfile_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@
+libsndfile_la_LIBADD = GSM610/libgsm.la G72x/libg72x.la
+
+# Disable autoheader. 
+AUTOHEADER = echo
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = 
+LTLIBRARIES =  $(lib_LTLIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I.
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libsndfile_la_DEPENDENCIES =  GSM610/libgsm.la G72x/libg72x.la
+libsndfile_la_OBJECTS =  common.lo pcm.lo ulaw.lo alaw.lo float32.lo \
+sndfile.lo aiff.lo au.lo au_g72x.lo nist.lo paf.lo raw.lo samplitude.lo \
+svx.lo wav.lo wav_gsm610.lo wav_ima_adpcm.lo wav_ms_adpcm.lo voc.lo \
+ircam.lo
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS =  $(include_HEADERS) $(noinst_HEADERS)
+
+DIST_COMMON =  ./stamp-h.in Makefile.am Makefile.in config.h.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libsndfile_la_SOURCES)
+OBJECTS = $(libsndfile_la_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+config.h: stamp-h
+	@if test ! -f $@; then \
+		rm -f stamp-h; \
+		$(MAKE) stamp-h; \
+	else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
+	     $(SHELL) ./config.status
+	@echo timestamp > stamp-h 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+	@if test ! -f $@; then \
+		rm -f $(srcdir)/stamp-h.in; \
+		$(MAKE) $(srcdir)/stamp-h.in; \
+	else :; fi
+$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+	cd $(top_srcdir) && $(AUTOHEADER)
+	@echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+	-rm -f config.h
+
+maintainer-clean-hdr:
+
+mostlyclean-libLTLIBRARIES:
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+
+distclean-libLTLIBRARIES:
+
+maintainer-clean-libLTLIBRARIES:
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(libdir)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo "$(LIBTOOL)  --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \
+	    $(LIBTOOL)  --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \
+	  else :; fi; \
+	done
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  $(LIBTOOL)  --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
+	done
+
+.c.o:
+	$(COMPILE) -c $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.c.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.s.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+	$(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libsndfile.la: $(libsndfile_la_OBJECTS) $(libsndfile_la_DEPENDENCIES)
+	$(LINK) -rpath $(libdir) $(libsndfile_la_LDFLAGS) $(libsndfile_la_OBJECTS) $(libsndfile_la_LIBADD) $(LIBS)
+
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(includedir)
+	@list='$(include_HEADERS)'; for p in $$list; do \
+	  if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \
+	  echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \
+	  $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	list='$(include_HEADERS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(includedir)/$$p; \
+	done
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@set fnord $(MAKEFLAGS); amf=$$2; \
+	dot_seen=no; \
+	rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+	  rev="$$subdir $$rev"; \
+	  test "$$subdir" = "." && dot_seen=yes; \
+	done; \
+	test "$$dot_seen" = "no" && rev=". $$rev"; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	here=`pwd` && cd $(srcdir) \
+	  && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+	    test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)'; \
+	unique=`for i in $$list; do echo $$i; done | \
+	  awk '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+	  || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+	-rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$d/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+	for subdir in $(DIST_SUBDIRS); do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d $(distdir)/$$subdir \
+	    || mkdir $(distdir)/$$subdir \
+	    || exit 1; \
+	    chmod 777 $(distdir)/$$subdir; \
+	    (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+aiff.lo aiff.o : aiff.c sndfile.h config.h sfendian.h common.h
+alaw.lo alaw.o : alaw.c sndfile.h floatcast.h common.h
+au.lo au.o : au.c sndfile.h config.h sfendian.h common.h au.h
+au_g72x.lo au_g72x.o : au_g72x.c config.h sndfile.h sfendian.h \
+	floatcast.h common.h au.h G72x/g72x.h
+common.lo common.o : common.c sndfile.h sfendian.h config.h common.h
+float32.lo float32.o : float32.c sndfile.h config.h sfendian.h common.h
+ircam.lo ircam.o : ircam.c sndfile.h config.h sfendian.h common.h
+nist.lo nist.o : nist.c sndfile.h config.h sfendian.h common.h
+paf.lo paf.o : paf.c config.h sndfile.h sfendian.h floatcast.h common.h
+pcm.lo pcm.o : pcm.c config.h sndfile.h sfendian.h floatcast.h common.h
+raw.lo raw.o : raw.c sndfile.h config.h sfendian.h common.h
+samplitude.lo samplitude.o : samplitude.c sndfile.h config.h sfendian.h \
+	common.h
+sndfile.lo sndfile.o : sndfile.c sndfile.h config.h sfendian.h common.h
+svx.lo svx.o : svx.c sndfile.h config.h sfendian.h common.h
+ulaw.lo ulaw.o : ulaw.c sndfile.h floatcast.h common.h
+voc.lo voc.o : voc.c sndfile.h config.h sfendian.h common.h
+wav.lo wav.o : wav.c sndfile.h config.h sfendian.h common.h wav.h
+wav_gsm610.lo wav_gsm610.o : wav_gsm610.c sndfile.h config.h sfendian.h \
+	floatcast.h common.h wav.h GSM610/gsm.h
+wav_ima_adpcm.lo wav_ima_adpcm.o : wav_ima_adpcm.c sndfile.h config.h \
+	sfendian.h floatcast.h common.h wav.h
+wav_ms_adpcm.lo wav_ms_adpcm.o : wav_ms_adpcm.c sndfile.h config.h \
+	sfendian.h floatcast.h common.h wav.h
+
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am: install-libLTLIBRARIES
+install-exec: install-exec-recursive
+
+install-data-am: install-includeHEADERS
+install-data: install-data-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-libLTLIBRARIES uninstall-includeHEADERS
+uninstall: uninstall-recursive
+all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h
+all-redirect: all-recursive-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+	$(mkinstalldirs)  $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+	-rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-libLTLIBRARIES \
+		mostlyclean-compile mostlyclean-libtool \
+		mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-libLTLIBRARIES clean-compile clean-libtool \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-libLTLIBRARIES distclean-compile \
+		distclean-libtool distclean-tags distclean-generic \
+		clean-am
+	-rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am:  maintainer-clean-hdr \
+		maintainer-clean-libLTLIBRARIES \
+		maintainer-clean-compile maintainer-clean-libtool \
+		maintainer-clean-tags maintainer-clean-generic \
+		distclean-am
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \
+clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \
+uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \
+distclean-compile clean-compile maintainer-clean-compile \
+mostlyclean-libtool distclean-libtool clean-libtool \
+maintainer-clean-libtool uninstall-includeHEADERS \
+install-includeHEADERS install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+++ b/common/libsndfile/src/aiff.c
@@ -1,0 +1,713 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+ */
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+	#define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+	#define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+	#error "Cannot determine endian-ness of processor."
+#endif
+
+#define FORM_MARKER	(MAKE_MARKER ('F', 'O', 'R', 'M')) 
+#define AIFF_MARKER	(MAKE_MARKER ('A', 'I', 'F', 'F')) 
+#define AIFC_MARKER	(MAKE_MARKER ('A', 'I', 'F', 'C')) 
+#define COMM_MARKER	(MAKE_MARKER ('C', 'O', 'M', 'M')) 
+#define SSND_MARKER	(MAKE_MARKER ('S', 'S', 'N', 'D')) 
+#define MARK_MARKER	(MAKE_MARKER ('M', 'A', 'R', 'K')) 
+#define INST_MARKER	(MAKE_MARKER ('I', 'N', 'S', 'T')) 
+#define APPL_MARKER	(MAKE_MARKER ('A', 'P', 'P', 'L')) 
+
+#define c_MARKER	(MAKE_MARKER ('(', 'c', ')', ' ')) 
+#define NAME_MARKER	(MAKE_MARKER ('N', 'A', 'M', 'E')) 
+#define AUTH_MARKER	(MAKE_MARKER ('A', 'U', 'T', 'H')) 
+#define ANNO_MARKER	(MAKE_MARKER ('A', 'N', 'N', 'O')) 
+#define COMT_MARKER	(MAKE_MARKER ('C', 'O', 'M', 'T')) 
+#define FVER_MARKER	(MAKE_MARKER ('F', 'V', 'E', 'R')) 
+#define SFX_MARKER	(MAKE_MARKER ('S', 'F', 'X', '!')) 
+
+
+#define PEAK_MARKER	(MAKE_MARKER ('P', 'E', 'A', 'K')) 
+
+/* Supported AIFC encodings.*/
+#define NONE_MARKER	(MAKE_MARKER ('N', 'O', 'N', 'E')) 
+#define sowt_MARKER	(MAKE_MARKER ('s', 'o', 'w', 't')) 
+#define twos_MARKER	(MAKE_MARKER ('t', 'w', 'o', 's')) 
+#define fl32_MARKER	(MAKE_MARKER ('f', 'l', '3', '2')) 
+#define FL32_MARKER	(MAKE_MARKER ('F', 'L', '3', '2')) 
+
+/* Unsupported AIFC encodings.*/
+#define fl64_MARKER	(MAKE_MARKER ('f', 'l', '6', '4')) 
+#define FL64_MARKER	(MAKE_MARKER ('F', 'L', '6', '4')) 
+#define MAC3_MARKER	(MAKE_MARKER ('M', 'A', 'C', '3')) 
+#define MAC6_MARKER	(MAKE_MARKER ('M', 'A', 'C', '6')) 
+#define ima4_MARKER	(MAKE_MARKER ('i', 'm', 'a', '4')) 
+#define ulaw_MARKER	(MAKE_MARKER ('a', 'l', 'a', 'w')) 
+#define alaw_MARKER	(MAKE_MARKER ('u', 'l', 'a', 'w')) 
+#define ADP4_MARKER	(MAKE_MARKER ('A', 'D', 'P', '4')) 
+
+/* Predfined chunk sizes. */
+#define AIFF_COMM_SIZE		18
+#define AIFC_COMM_SIZE		24
+#define SSND_CHUNK_SIZE		8
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+ */
+
+enum
+{	HAVE_FORM	= 0x01,
+	HAVE_AIFF	= 0x02,
+	HAVE_COMM	= 0x04,
+	HAVE_SSND	= 0x08
+} ;
+
+typedef struct
+{	unsigned int	type ;
+	unsigned int	size ;
+	short			numChannels ;
+	unsigned int	numSampleFrames ;
+	short			sampleSize ;
+	unsigned char	sampleRate [10] ;
+	unsigned int	encoding ;
+	char			zero_bytes [2] ;
+} COMM_CHUNK ; 
+
+typedef struct
+{	unsigned int	offset ;
+	unsigned int	blocksize ;
+} SSND_CHUNK ; 
+
+typedef struct 
+{	short           playMode;
+    int		        beginLoop;
+	int		        endLoop;
+} INST_CHUNK ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+
+static	int		aiff_close	(SF_PRIVATE  *psf) ;
+
+static	int     tenbytefloat2int (unsigned char *bytes) ;
+static	void	uint2tenbytefloat (unsigned int num, unsigned char *bytes) ;
+
+static  int  	aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt) ;
+
+static int		aiff_write_header (SF_PRIVATE *psf) ;
+static int		aiff_write_tailer (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+aiff_open_read	(SF_PRIVATE *psf)
+{	COMM_CHUNK	comm_fmt ;
+	SSND_CHUNK	ssnd_fmt ;
+	int			marker, dword ;
+	long		FORMsize, SSNDsize ;
+	int			filetype, found_chunk = 0, done = 0, error = 0 ;
+	char		*cptr ;
+
+	psf->sf.seekable = SF_TRUE ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "p", 0) ;	
+
+	memset (&comm_fmt, 0, sizeof (comm_fmt)) ;
+
+	/* Until recently AIF* file were all BIG endian. */ 	
+	psf->endian = SF_ENDIAN_BIG ;
+
+	/* 	AIFF files can apparently have their chunks in any order. However, they must
+	**	a FORM chunk. Approach here is to read allthe chunks one by one and then 
+	**	check for the mandatory chunks at the end.
+	*/
+	while (! done)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+		switch (marker)
+		{	case FORM_MARKER :
+					if (found_chunk)
+						return SFE_AIFF_NO_FORM ;
+
+					psf_binheader_readf (psf, "L", &FORMsize) ;
+
+					if (FORMsize != psf->filelength - 2 * sizeof (dword))
+					{	dword = psf->filelength - 2 * sizeof (dword);
+						psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
+						FORMsize = dword ;
+						}
+					else
+						psf_log_printf (psf, "FORM : %d\n", FORMsize) ;
+					found_chunk |= HAVE_FORM ;
+					break ;
+					
+			case AIFC_MARKER :
+			case AIFF_MARKER :
+					if (! (found_chunk & HAVE_FORM))
+						return SFE_AIFF_AIFF_NO_FORM ;
+					filetype = marker ;
+					psf_log_printf (psf, " %D\n", marker) ;
+					found_chunk |= HAVE_AIFF ;
+					break ;
+
+			case COMM_MARKER :
+					error = aiff_read_comm_chunk (psf, &comm_fmt) ;
+
+					psf->sf.samplerate 		= tenbytefloat2int (comm_fmt.sampleRate) ;
+					psf->sf.samples 		= comm_fmt.numSampleFrames ;
+					psf->sf.channels 		= comm_fmt.numChannels ;
+					psf->sf.pcmbitwidth 	= comm_fmt.sampleSize ;
+					psf->sf.sections 		= 1 ;
+					
+					if (error)
+						return error ;
+						
+					found_chunk |= HAVE_COMM ;
+					break ;
+
+			case PEAK_MARKER :
+					/* Must have COMM chunk before PEAK chunk. */
+					if ((found_chunk & (HAVE_FORM | HAVE_AIFF | HAVE_COMM)) != (HAVE_FORM | HAVE_AIFF | HAVE_COMM))
+						return SFE_AIFF_PEAK_B4_COMM ;
+
+					psf_binheader_readf (psf, "L", &dword) ;
+					
+					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+					if (dword > sizeof (psf->peak))
+					{	psf_binheader_readf (psf, "j", dword) ;
+						psf_log_printf (psf, "*** File PEAK chunk bigger than sizeof (PEAK_CHUNK).\n") ;
+						return SFE_WAV_BAD_PEAK ;
+						} ;
+					if (dword != sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS))
+					{	psf_binheader_readf (psf, "j", dword) ;
+						psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels.\n") ;
+						return SFE_WAV_BAD_PEAK ;
+						} ;
+					
+					/* read in rest of PEAK chunk. */	
+					psf_binheader_readf (psf, "LL", &(psf->peak.version), &(psf->peak.timestamp)) ;
+
+					if (psf->peak.version != 1)
+						psf_log_printf (psf, "  version    : %d *** (should be version 1)\n", psf->peak.version) ;
+					else
+						psf_log_printf (psf, "  version    : %d\n", psf->peak.version) ;
+						
+					psf_log_printf (psf, "  time stamp : %d\n", psf->peak.timestamp) ;
+					psf_log_printf (psf, "    Ch   Position       Value\n") ;
+
+					cptr = (char *) psf->buffer ;
+					for (dword = 0 ; dword < psf->sf.channels ; dword++)
+					{	psf_binheader_readf (psf, "FL", &(psf->peak.peak[dword].value), 
+														&(psf->peak.peak[dword].position)) ;
+					
+						snprintf (cptr, sizeof (psf->buffer), "    %2d   %-12d   %g\n", 
+								dword, psf->peak.peak[dword].position, psf->peak.peak[dword].value) ;
+						cptr [sizeof (psf->buffer) - 1] = 0 ;
+						psf_log_printf (psf, cptr) ;
+						};
+
+					psf->has_peak = SF_TRUE ;
+					break ;
+
+			case SSND_MARKER :
+					psf_binheader_readf (psf, "LLL", &SSNDsize, &(ssnd_fmt.offset), &(ssnd_fmt.blocksize)) ;
+											
+					psf->dataoffset = ftell (psf->file) ;
+					psf->datalength = psf->filelength - psf->dataoffset ;
+					if (SSNDsize > psf->datalength + sizeof (SSND_CHUNK))
+						psf_log_printf (psf, " SSND : %d (should be %d)\n", SSNDsize, psf->datalength + sizeof (SSND_CHUNK)) ;
+					else
+						psf_log_printf (psf, " SSND : %d\n", SSNDsize) ;
+					
+					psf_log_printf (psf, "  Offset     : %d\n", ssnd_fmt.offset) ;
+					psf_log_printf (psf, "  Block Size : %d\n", ssnd_fmt.blocksize) ;
+					
+					found_chunk |= HAVE_SSND ;
+
+					if (! psf->sf.seekable)
+						break ;
+
+					/* 	Seek to end of SSND chunk. */
+					fseek (psf->file, SSNDsize - 8, SEEK_CUR) ;
+					break ;
+
+			case c_MARKER :
+			case ANNO_MARKER :
+			case AUTH_MARKER :
+			case COMT_MARKER :
+			case NAME_MARKER :
+					psf_binheader_readf (psf, "L", &dword);
+					dword += (dword & 1) ;
+					if (dword == 0)
+						break ;
+					if (dword > sizeof (psf->buffer))
+					{	psf_log_printf (psf, "  *** %D : %d (too big)\n", marker, dword) ;
+						return SFE_INTERNAL ;
+						} ;
+					psf_binheader_readf (psf, "B", psf->buffer, dword) ;
+					psf->buffer [dword - 1] = 0 ;
+					psf_log_printf (psf, "***    %D : %s\n", marker, psf->buffer) ;
+					break ;
+
+			case FVER_MARKER :
+			case SFX_MARKER :
+					psf_binheader_readf (psf, "L", &dword) ;
+					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case APPL_MARKER :
+			case INST_MARKER :
+			case MARK_MARKER :
+					psf_binheader_readf (psf, "L", &dword) ;
+					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			default : 
+					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
+						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
+					{	psf_binheader_readf (psf, "L", &dword) ;
+						psf_log_printf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
+
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+					if ((dword = ftell (psf->file)) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resyncing.\n", dword - 4) ;
+
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					done = 1 ;
+					break ;
+			} ;	/* switch (marker) */
+			
+		if ((! psf->sf.seekable) && (found_chunk & HAVE_SSND))
+			break ;
+
+		if (ferror (psf->file))
+		{	psf_log_printf (psf, "*** Error on file handle. ***\n") ;
+			clearerr (psf->file) ;
+			break ;
+			} ;
+
+		if (ftell (psf->file) >= (long) (psf->filelength - (2 * sizeof (dword))))
+			break ;
+		} ; /* while (1) */
+		
+	if (! (found_chunk & HAVE_FORM))
+		return SFE_AIFF_NO_FORM ;
+
+	if (! (found_chunk & HAVE_AIFF))
+		return SFE_AIFF_COMM_NO_FORM ;
+
+	if (! (found_chunk & HAVE_COMM))
+		return SFE_AIFF_SSND_NO_COMM ;
+
+	if (! psf->dataoffset)
+		return SFE_AIFF_NO_DATA ;
+
+	psf->current     = 0 ;
+	psf->sf.seekable = SF_TRUE ;
+	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+	psf->blockwidth  = psf->sf.channels * psf->bytewidth ;
+	
+	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+
+	psf->close = (func_close) aiff_close ;
+
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM :
+		case SF_FORMAT_PCM_LE :
+		case SF_FORMAT_PCM_BE :
+				if (psf->bytewidth == 1)
+					psf->chars = SF_CHARS_SIGNED ;
+
+				error = pcm_read_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_FLOAT :
+				error = float32_read_init (psf) ;
+				break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* aiff_open_read */
+
+/*------------------------------------------------------------------------------
+ */
+
+int
+aiff_open_write	(SF_PRIVATE *psf)
+{	int error ;
+
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_AIFF)
+		return	SFE_BAD_OPEN_FORMAT ;
+	
+	psf->sf.seekable = SF_TRUE ;
+	psf->error       = 0 ;
+
+	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+
+	/* Set sample count artifically high and fix later. */ 
+	psf->sf.samples = 0x7FFFFFFF / psf->blockwidth ; 
+	
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = 0x7FFFFFFF ;
+
+	if ((error = aiff_write_header (psf)))
+		return error ;
+
+	psf->close        = (func_close)  aiff_close ;
+	psf->write_header = (func_wr_hdr) aiff_write_header ;
+
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM :
+		case SF_FORMAT_PCM_LE :
+		case SF_FORMAT_PCM_BE :
+				if (psf->bytewidth == 1)
+					psf->chars = SF_CHARS_SIGNED ;
+
+				error = pcm_write_init (psf) ;
+				break ;
+				
+		case SF_FORMAT_FLOAT :
+				error = float32_write_init (psf) ;
+				break ;
+
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return error ;
+} /* aiff_open_write */
+
+/*==========================================================================================
+** Private functions.
+*/
+
+static int	
+aiff_close	(SF_PRIVATE  *psf)
+{
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can re-write 
+		**	correct values for the FORM, COMM and SSND chunks.
+		*/
+		 
+		aiff_write_tailer (psf) ;
+
+		fseek (psf->file, 0, SEEK_END) ;		
+		psf->filelength = ftell (psf->file) ;
+		fseek (psf->file, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset ;
+ 		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+		
+		aiff_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* aiff_close */
+
+static int
+aiff_read_comm_chunk (SF_PRIVATE *psf, COMM_CHUNK *comm_fmt)
+{	int error = 0, bytesread ;
+
+	bytesread = psf_binheader_readf (psf, "L", &(comm_fmt->size)) ;
+	
+	/* The COMM chunk has an int aligned to an odd word boundary. Some 
+	** procesors are not able to deal with this (ie bus fault) so we have 
+	** to take special care.
+	*/
+
+	bytesread +=
+	psf_binheader_readf (psf, "WLWB", &(comm_fmt->numChannels), &(comm_fmt->numSampleFrames), 
+			&(comm_fmt->sampleSize), &(comm_fmt->sampleRate), sizeof (comm_fmt->sampleRate)) ;
+
+	if (comm_fmt->size == AIFF_COMM_SIZE)
+		comm_fmt->encoding = NONE_MARKER ;
+	else if (comm_fmt->size >= AIFC_COMM_SIZE)
+	{	bytesread +=
+		psf_binheader_readf (psf, "mB", &(comm_fmt->encoding), &(comm_fmt->zero_bytes), 2) ;
+
+		psf_binheader_readf (psf, "B", psf->header, comm_fmt->size - AIFC_COMM_SIZE) ;
+		} ;
+		
+	psf_log_printf (psf, " COMM : %d\n", comm_fmt->size) ;
+	psf_log_printf (psf, "  Sample Rate : %d\n", tenbytefloat2int (comm_fmt->sampleRate)) ;
+	psf_log_printf (psf, "  Samples     : %d\n", comm_fmt->numSampleFrames) ;
+	psf_log_printf (psf, "  Channels    : %d\n", comm_fmt->numChannels) ;
+
+	/*	Found some broken 'fl32' files with comm.samplesize == 16. Fix it here. */ 
+
+	if ((comm_fmt->encoding == fl32_MARKER || comm_fmt->encoding == FL32_MARKER) && comm_fmt->sampleSize != 32)
+	{	psf_log_printf (psf, "  Sample Size : %d (should be 32)\n", comm_fmt->sampleSize) ;
+		comm_fmt->sampleSize = 32 ;
+		}
+	else
+		psf_log_printf (psf, "  Sample Size : %d\n", comm_fmt->sampleSize) ;
+
+	switch (comm_fmt->encoding)
+	{	case NONE_MARKER :
+				psf->endian = SF_ENDIAN_BIG ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM) ;
+				break ;
+				
+		case twos_MARKER :
+				psf->endian = SF_ENDIAN_BIG ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_BE) ;
+				break ;
+
+		case sowt_MARKER :
+				psf->endian = SF_ENDIAN_LITTLE ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_PCM_LE) ;
+				break ;
+				
+		case fl32_MARKER :
+		case FL32_MARKER :
+				psf->endian = SF_ENDIAN_BIG ;
+				psf->sf.format = (SF_FORMAT_AIFF | SF_FORMAT_FLOAT) ;
+				break ;
+
+		default :
+			psf_log_printf (psf, "AIFC : Unimplemented format : %D\n", comm_fmt->encoding) ;
+			error = SFE_UNIMPLEMENTED ;
+		} ;
+
+	psf_log_printf (psf, "  Encoding    : %D\n", comm_fmt->encoding) ;
+	
+	return error ;
+} /* aiff_read_comm_chunk */
+
+static int
+aiff_write_header (SF_PRIVATE *psf)
+{	unsigned char 	comm_sample_rate [10], comm_zero_bytes [2] = { 0, 0 } ;
+	unsigned int 	comm_type, comm_size, comm_encoding ;
+	int				k ;
+	
+	switch (psf->sf.format & SF_FORMAT_SUBMASK)
+	{	case SF_FORMAT_PCM :					/* Standard big endian AIFF. */
+				psf->endian = SF_ENDIAN_BIG ;			
+				comm_type = AIFF_MARKER ;
+				comm_size = AIFF_COMM_SIZE ;
+				comm_encoding = 0 ;
+				break ;
+
+		case SF_FORMAT_PCM_BE :					/* Big endian AIFC. */
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = twos_MARKER ;
+				break ;
+				
+		case SF_FORMAT_PCM_LE :					/* Little endian AIFC. */
+				psf->endian = SF_ENDIAN_LITTLE ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = sowt_MARKER ;
+				break ;
+
+		case SF_FORMAT_FLOAT :					/* Big endian floating point. */
+				psf->endian = SF_ENDIAN_BIG ;
+				comm_type = AIFC_MARKER ;
+				comm_size = AIFC_COMM_SIZE ;
+				comm_encoding = FL32_MARKER ; /* Use 'FL32' because its easier to read. */
+				psf->has_peak = SF_TRUE ;
+				psf->peak_loc = SF_PEAK_START ;
+				break ;
+
+		default :	return	SFE_BAD_OPEN_FORMAT ;
+		} ;
+	
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	psf_binheader_writef (psf, "mL", FORM_MARKER, psf->filelength - 8) ;
+	
+	/* Write COMM chunk. */
+	psf_binheader_writef (psf, "mmL", comm_type, COMM_MARKER, comm_size) ;
+
+	uint2tenbytefloat (psf->sf.samplerate, comm_sample_rate)  ;
+
+	psf_binheader_writef (psf, "WLW", psf->sf.channels, psf->sf.samples, psf->sf.pcmbitwidth) ;
+	psf_binheader_writef (psf, "B", comm_sample_rate, sizeof (comm_sample_rate)) ;
+	
+	/* AIFC chunks have some extra data. */
+	if (comm_type == AIFC_MARKER)
+		psf_binheader_writef (psf, "mB", comm_encoding, comm_zero_bytes, sizeof (comm_zero_bytes)) ;
+		
+	if (psf->has_peak && psf->peak_loc == SF_PEAK_START)
+	{	psf_binheader_writef (psf, "mL", PEAK_MARKER, 
+			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+		psf_binheader_writef (psf, "LL", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "FL", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+		} ;
+		
+	/* Write SSND chunk. */
+	psf_binheader_writef (psf, "mLLL", SSND_MARKER, psf->datalength + SSND_CHUNK_SIZE, 0, 0) ;
+
+	/* Header cunstruction complete so write it out. */
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+
+	return 0 ;
+} /* aiff_write_header */
+
+static int
+aiff_write_tailer (SF_PRIVATE *psf)
+{	int		k ;
+	
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	if (psf->has_peak && psf->peak_loc == SF_PEAK_END)
+	{	psf_binheader_writef (psf, "mL", PEAK_MARKER, 
+			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+		psf_binheader_writef (psf, "LL", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "FL", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+		} ;
+		
+	if (psf->headindex)
+		fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	return 0 ;
+} /* aiff_write_tailer */
+
+/*-
+static void
+endswap_comm_fmt (COMM_CHUNK *comm)
+{	comm->size            = ENDSWAP_INT (comm->size) ;
+	comm->numChannels     = ENDSWAP_SHORT (comm->numChannels) ;
+	comm->numSampleFrames = ENDSWAP_INT (comm->numSampleFrames) ;
+	comm->sampleSize      = ENDSWAP_SHORT (comm->sampleSize) ;
+} /+* endswap_comm_fmt *+/
+
+static void
+endswap_ssnd_fmt (SSND_CHUNK *ssnd)
+{	ssnd->offset 	= ENDSWAP_INT (ssnd->offset) ;
+	ssnd->blocksize = ENDSWAP_INT (ssnd->blocksize) ;
+} /+* endswap_ssnd_fmt *+/
+-*/
+
+/*==========================================================================================
+**	Rough hack at converting from 80 bit IEEE float in AIFF header to an int and
+**	back again. It assumes that all sample rates are between 1 and 800MHz, which 
+**	should be OK as other sound file formats use a 32 bit integer to store sample 
+**	rate.
+**	There is another (probably better) version in the source code to the SoX but it
+**	has a copyright which probably prevents it from being allowable as GPL/LGPL.
+*/
+
+static int
+tenbytefloat2int (unsigned char *bytes)
+{       int val = 3 ;
+
+	if (bytes [0] & 0x80)   /* Negative number. */
+		return 0 ;
+
+	if (bytes [0] <= 0x3F)  /* Less than 1. */
+		return 1 ;
+		
+	if (bytes [0] > 0x40)   /* Way too big. */
+		return  0x4000000 ;
+
+	if (bytes [0] == 0x40 && bytes [1] > 0x1C) /* Too big. */
+		return 800000000 ;
+		
+	/* Ok, can handle it. */
+		
+	val = (bytes [2] << 23) | (bytes [3] << 15) | (bytes [4] << 7)  | (bytes [5] >> 1) ;
+	
+	val >>= (29 - bytes [1]) ;
+	
+	return val ;
+} /* tenbytefloat2int */
+
+static void
+uint2tenbytefloat (unsigned int num, unsigned char *bytes)
+{	int		count, mask = 0x40000000 ;
+
+	memset (bytes, 0, 10) ;
+
+	if (num <= 1)
+	{	bytes [0] = 0x3F ;
+		bytes [1] = 0xFF ;
+		bytes [2] = 0x80 ;
+		return ;
+		} ;
+
+	bytes [0] = 0x40 ;
+	
+	if (num >= mask)
+	{	bytes [1] = 0x1D ;
+		return ;
+		} ;
+	
+	for (count = 0 ; count <= 32 ; count ++)
+	{	if (num & mask)
+			break ;
+		mask >>= 1 ;
+		} ;
+		
+	num <<= count + 1 ;
+	bytes [1] = 29 - count ;
+	bytes [2] = (num >> 24) & 0xFF ;
+	bytes [3] = (num >> 16) & 0xFF ;
+	bytes [4] = (num >>  8) & 0xFF ;
+	bytes [5] = num & 0xFF ;
+	
+} /* uint2tenbytefloat */
+
--- /dev/null
+++ b/common/libsndfile/src/alaw.c
@@ -1,0 +1,588 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<unistd.h>
+
+#include	"sndfile.h"
+#include	"floatcast.h"
+#include	"common.h"
+
+static int		alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int		alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int		alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int		alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
+static int		alaw_write_s2alaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int		alaw_write_i2alaw (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int		alaw_write_f2alaw (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int		alaw_write_d2alaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
+static  void    alaw2s_array      (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index) ;
+static  void    alaw2i_array      (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index) ;
+static  void    alaw2f_array      (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact) ;
+static  void    alaw2d_array      (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact) ;
+
+static  void    s2alaw_array      (short *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
+static  void    i2alaw_array      (int *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
+static  void    f2alaw_array      (float *buffer, unsigned int count, unsigned char *ptr, unsigned int index, float normfact) ;
+static  void    d2alaw_array      (double *buffer, unsigned int count, unsigned char *ptr, unsigned int index, double normfact) ;
+
+int
+alaw_read_init (SF_PRIVATE *psf)
+{
+	psf->read_short  = (func_short)  alaw_read_alaw2s ;
+	psf->read_int    = (func_int)    alaw_read_alaw2i ;
+	psf->read_float  = (func_float)  alaw_read_alaw2f ;
+	psf->read_double = (func_double) alaw_read_alaw2d ;
+
+	return 0 ;
+} /* alaw_read_init */
+
+int
+alaw_write_init (SF_PRIVATE *psf)
+{
+	psf->write_short  = (func_short)  alaw_write_s2alaw ;
+	psf->write_int    = (func_int)    alaw_write_i2alaw ;
+	psf->write_float  = (func_float)  alaw_write_f2alaw ;
+	psf->write_double = (func_double) alaw_write_d2alaw ;
+
+	return 0 ;
+} /* alaw_read_init */
+
+static int
+alaw_read_alaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		alaw2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_read_alaw2s */
+
+static int
+alaw_read_alaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		alaw2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_read_alaw2i */
+
+static int
+alaw_read_alaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		alaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_read_alaw2f */
+
+static int
+alaw_read_alaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		alaw2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_read_alaw2d */
+
+/*=============================================================================================
+*/
+
+static int
+alaw_write_s2alaw	(SF_PRIVATE *psf, short *ptr, unsigned int len)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_write_s2alaw */
+
+static int
+alaw_write_i2alaw	(SF_PRIVATE *psf, int *ptr, unsigned int len)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_write_i2alaw */
+
+static int
+alaw_write_f2alaw	(SF_PRIVATE *psf, float *ptr, unsigned int len)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_write_f2alaw */
+
+static int
+alaw_write_d2alaw	(SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2alaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* alaw_write_d2alaw */
+
+/*=============================================================================================
+ *	Private static functions and data.
+ */
+
+static	
+short	alaw_decode [128] =
+{	 -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736, 
+	 -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784, 
+	 -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368, 
+	 -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392, 
+	-22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944, 
+	-30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136, 
+	-11008, -10496, -12032, -11520,  -8960,  -8448,  -9984,  -9472, 
+	-15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568, 
+	  -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296, 
+	  -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424, 
+	   -88,    -72,   -120,   -104,    -24,     -8,    -56,    -40, 
+	  -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168, 
+	 -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184, 
+	 -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696, 
+	  -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592, 
+	  -944,   -912,  -1008,   -976,   -816,   -784,   -880,   -848
+} ; /* alaw_decode */
+
+static	
+unsigned char	alaw_encode [2049] =
+{	0xD5, 0xD4, 0xD7, 0xD6, 0xD1, 0xD0, 0xD3, 0xD2, 0xDD, 0xDC, 0xDF, 0xDE, 
+	0xD9, 0xD8, 0xDB, 0xDA, 0xC5, 0xC4, 0xC7, 0xC6, 0xC1, 0xC0, 0xC3, 0xC2, 
+	0xCD, 0xCC, 0xCF, 0xCE, 0xC9, 0xC8, 0xCB, 0xCA, 0xF5, 0xF5, 0xF4, 0xF4, 
+	0xF7, 0xF7, 0xF6, 0xF6, 0xF1, 0xF1, 0xF0, 0xF0, 0xF3, 0xF3, 0xF2, 0xF2, 
+	0xFD, 0xFD, 0xFC, 0xFC, 0xFF, 0xFF, 0xFE, 0xFE, 0xF9, 0xF9, 0xF8, 0xF8, 
+	0xFB, 0xFB, 0xFA, 0xFA, 0xE5, 0xE5, 0xE5, 0xE5, 0xE4, 0xE4, 0xE4, 0xE4, 
+	0xE7, 0xE7, 0xE7, 0xE7, 0xE6, 0xE6, 0xE6, 0xE6, 0xE1, 0xE1, 0xE1, 0xE1, 
+	0xE0, 0xE0, 0xE0, 0xE0, 0xE3, 0xE3, 0xE3, 0xE3, 0xE2, 0xE2, 0xE2, 0xE2, 
+	0xED, 0xED, 0xED, 0xED, 0xEC, 0xEC, 0xEC, 0xEC, 0xEF, 0xEF, 0xEF, 0xEF, 
+	0xEE, 0xEE, 0xEE, 0xEE, 0xE9, 0xE9, 0xE9, 0xE9, 0xE8, 0xE8, 0xE8, 0xE8, 
+	0xEB, 0xEB, 0xEB, 0xEB, 0xEA, 0xEA, 0xEA, 0xEA, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0xB5, 0xB5, 0xB5, 0xB5, 
+	0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 
+	0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 
+	0xB5, 0xB5, 0xB5, 0xB5, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 
+	0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 
+	0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 
+	0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 
+	0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 
+	0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, 0xB6, 0xB6, 0xB6, 
+	0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 
+	0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 
+	0xB6, 0xB6, 0xB6, 0xB6, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 
+	0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 
+	0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 
+	0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 
+	0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 
+	0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB3, 0xB3, 0xB3, 0xB3, 
+	0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 
+	0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 
+	0xB3, 0xB3, 0xB3, 0xB3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 
+	0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 
+	0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 
+	0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 
+	0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 
+	0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBC, 0xBC, 0xBC, 0xBC, 
+	0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 
+	0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 
+	0xBC, 0xBC, 0xBC, 0xBC, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 
+	0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 
+	0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 
+	0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 
+	0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 
+	0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xB9, 0xB9, 0xB9, 0xB9, 
+	0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 
+	0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 
+	0xB9, 0xB9, 0xB9, 0xB9, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 
+	0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 
+	0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 
+	0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 
+	0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 
+	0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBA, 0xBA, 0xBA, 0xBA, 
+	0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 
+	0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 
+	0xBA, 0xBA, 0xBA, 0xBA, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x2A
+} ; /* alaw_encode */
+
+static void	
+alaw2s_array	(unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -1 * alaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = alaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* alaw2s_array */
+
+static void	
+alaw2i_array	(unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -1 * alaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = alaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* alaw2i_array */
+
+static void	
+alaw2f_array	(unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* alaw2d_array */
+
+static void	
+alaw2d_array	(unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = normfact * alaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* alaw2d_array */
+
+static void    
+s2alaw_array      (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = alaw_encode [ptr [index] / 16] ;
+		else
+			buffer [k] = 0x7F & alaw_encode [ptr [index] / -16] ;
+		index ++ ;
+		} ;
+} /* s2alaw_array */
+
+static void    
+i2alaw_array      (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = alaw_encode [ptr [index] / 16] ;
+		else
+			buffer [k] = 0x7F & alaw_encode [ptr [index] / -16] ;
+		index ++ ;
+		} ;
+} /* i2alaw_array */
+
+static void    
+f2alaw_array      (float *ptr, unsigned int index, unsigned char *buffer, unsigned int count, float normfact)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = alaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / 16] ;
+		else
+			buffer [k] = 0x7F & alaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / -16] ;
+		index ++ ;
+		} ;
+} /* f2alaw_array */
+
+static void    
+d2alaw_array      (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = alaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / 16] ;
+		else
+			buffer [k] = 0x7F & alaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / -16] ;
+		index ++ ;
+		} ;
+} /* d2alaw_array */
+
--- /dev/null
+++ b/common/libsndfile/src/au.c
@@ -1,0 +1,449 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"au.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define DOTSND_MARKER	(MAKE_MARKER ('.', 's', 'n', 'd')) 
+#define DNSDOT_MARKER	(MAKE_MARKER ('d', 'n', 's', '.')) 
+
+#define AU_DATA_OFFSET	24
+
+/*------------------------------------------------------------------------------
+** Known AU file encoding types.
+*/
+
+enum
+{	AU_ENCODING_ULAW_8					= 1,	/* 8-bit u-law samples */
+	AU_ENCODING_PCM_8					= 2,	/* 8-bit linear samples */
+	AU_ENCODING_PCM_16					= 3,	/* 16-bit linear samples */
+	AU_ENCODING_PCM_24					= 4,	/* 24-bit linear samples */
+	AU_ENCODING_PCM_32					= 5,	/* 32-bit linear samples */
+	
+	AU_ENCODING_FLOAT					= 6,	/* floating-point samples */
+	AU_ENCODING_DOUBLE					= 7,	/* double-precision float samples */
+	AU_ENCODING_INDIRECT				= 8,	/* fragmented sampled data */
+	AU_ENCODING_NESTED					= 9,	/* ? */
+	AU_ENCODING_DSP_CORE				= 10,	/* DSP program */
+	AU_ENCODING_DSP_DATA_8				= 11,	/* 8-bit fixed-point samples */
+	AU_ENCODING_DSP_DATA_16				= 12,	/* 16-bit fixed-point samples */
+	AU_ENCODING_DSP_DATA_24				= 13,	/* 24-bit fixed-point samples */
+	AU_ENCODING_DSP_DATA_32				= 14,	/* 32-bit fixed-point samples */
+
+	AU_ENCODING_DISPLAY					= 16,	/* non-audio display data */
+	AU_ENCODING_MULAW_SQUELCH			= 17,	/* ? */
+	AU_ENCODING_EMPHASIZED				= 18,	/* 16-bit linear with emphasis */
+	AU_ENCODING_NEXT					= 19,	/* 16-bit linear with compression (NEXT) */
+	AU_ENCODING_COMPRESSED_EMPHASIZED	= 20,	/* A combination of the two above */
+	AU_ENCODING_DSP_COMMANDS			= 21,	/* Music Kit DSP commands */
+	AU_ENCODING_DSP_COMMANDS_SAMPLES	= 22,	/* ? */
+
+	AU_ENCODING_ADPCM_G721_32			= 23,	/* G721 32 kbs ADPCM - 4 bits per sample. */
+	AU_ENCODING_ADPCM_G722				= 24,
+	AU_ENCODING_ADPCM_G723_24			= 25,	/* G723 24 kbs ADPCM - 3 bits per sample. */
+	AU_ENCODING_ADPCM_G723_5			= 26,
+	
+	AU_ENCODING_ALAW_8					= 27
+} ;
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+ 
+typedef	struct
+{	int		dataoffset ;
+	int		datasize ;
+	int		encoding ;
+    int		samplerate ;
+    int		channels ;
+} AU_FMT ;
+
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int				au_close		(SF_PRIVATE *psf) ;
+
+static	int 			get_encoding	(unsigned int format, unsigned int	bitwidth) ;
+static	char const* 	get_encoding_str(int format) ;
+
+static int				au_write_header (SF_PRIVATE *psf) ;
+
+/*
+static	void			endswap_au_fmt	(AU_FMT *pau_fmt) ;
+*/
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+au_open_read	(SF_PRIVATE *psf)
+{	AU_FMT			au_fmt ;
+	unsigned int	marker, dword ;
+	int				error = SFE_NO_ERROR ;
+	
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+	psf_log_printf (psf, "%D\n", marker) ;
+
+	if (marker == DOTSND_MARKER)
+	{	psf->endian = SF_ENDIAN_BIG ;
+
+		psf_binheader_readf (psf, "LLLLL", &(au_fmt.dataoffset), &(au_fmt.datasize),
+					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+		}
+	else if (marker == DNSDOT_MARKER)
+	{	psf->endian = SF_ENDIAN_LITTLE ;
+		psf_binheader_readf (psf, "lllll", &(au_fmt.dataoffset), &(au_fmt.datasize),
+					&(au_fmt.encoding), &(au_fmt.samplerate), &(au_fmt.channels)) ;
+		}
+	else
+		return SFE_AU_NO_DOTSND ;
+		
+	
+	psf_log_printf (psf, "  Data Offset : %d\n", au_fmt.dataoffset) ;
+	
+	if (au_fmt.datasize == 0xFFFFFFFF || au_fmt.dataoffset + au_fmt.datasize == psf->filelength)
+		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
+	else if (au_fmt.dataoffset + au_fmt.datasize < psf->filelength)
+	{	psf->filelength = au_fmt.dataoffset + au_fmt.dataoffset ;
+		psf_log_printf (psf, "  Data Size   : %d\n", au_fmt.datasize) ;
+		}
+	else
+	{	dword = psf->filelength - au_fmt.dataoffset ;
+		psf_log_printf (psf, "  Data Size   : %d (should be %d)\n", au_fmt.datasize, dword) ;
+		au_fmt.datasize = dword ;
+		} ;
+		
+ 	psf->dataoffset = au_fmt.dataoffset ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+ 	psf->current  = 0 ;
+ 	
+ 	if (fseek (psf->file, psf->dataoffset, SEEK_SET))
+		return SFE_BAD_SEEK ;
+
+	psf->close = (func_close) au_close ;
+	
+	psf->sf.samplerate	= au_fmt.samplerate ;
+	psf->sf.channels 	= au_fmt.channels ;
+					
+	/* Only fill in type major. */
+	if (psf->endian == SF_ENDIAN_BIG)
+		psf->sf.format = SF_FORMAT_AU ;
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+		psf->sf.format = SF_FORMAT_AULE ;
+
+	psf->sf.sections 	= 1 ;
+
+	psf_log_printf (psf, "  Encoding    : %d => %s\n", au_fmt.encoding, get_encoding_str (au_fmt.encoding)) ;
+
+	psf_log_printf (psf, "  Sample Rate : %d\n", au_fmt.samplerate) ;
+	psf_log_printf (psf, "  Channels    : %d\n", au_fmt.channels) ;
+	
+	switch (au_fmt.encoding)
+	{	case  AU_ENCODING_PCM_8 :	
+				psf->sf.pcmbitwidth = 8 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format |= SF_FORMAT_PCM ;
+
+				psf->chars = SF_CHARS_SIGNED ;
+									
+				if ((error = pcm_read_init (psf)))
+					return error ;
+				break ;
+
+		case  AU_ENCODING_PCM_16 :	
+				psf->sf.pcmbitwidth = 16 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				psf->sf.format |= SF_FORMAT_PCM ;
+					
+				if ((error = pcm_read_init (psf)))
+					return error ;
+				break ;
+
+		case  AU_ENCODING_PCM_24 :	
+				psf->sf.pcmbitwidth = 24 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+					
+				psf->sf.format |= SF_FORMAT_PCM ;
+
+				if ((error = pcm_read_init (psf)))
+					return error ;
+				break ;
+
+		case  AU_ENCODING_PCM_32 :	
+				psf->sf.pcmbitwidth = 32 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+					
+				psf->sf.format |= SF_FORMAT_PCM ;
+					
+				if ((error = pcm_read_init (psf)))
+					return error ;
+				break ;
+					
+		case  AU_ENCODING_FLOAT :	
+				psf->sf.pcmbitwidth = 32 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+					
+				psf->sf.format |= SF_FORMAT_FLOAT ;
+
+				float32_read_init (psf) ;
+				break ;
+
+		default : 
+				error = SFE_AU_UNKNOWN_FORMAT ;
+				break ;
+		} ;
+
+	if (error)
+		return error ;
+
+	if (! psf->sf.samples && psf->blockwidth)
+		psf->sf.samples = au_fmt.datasize / psf->blockwidth ;
+
+
+	return 0 ;
+} /* au_open_read */
+
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+au_open_write	(SF_PRIVATE *psf)
+{	unsigned int	encoding, format, subformat ;
+	int				error = 0 ;
+
+	format = psf->sf.format & SF_FORMAT_TYPEMASK ;
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+	if (format == SF_FORMAT_AU)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (format == SF_FORMAT_AULE)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else
+		return	SFE_BAD_OPEN_FORMAT ;
+		
+	if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW || 
+		subformat == SF_FORMAT_G721_32 || subformat == SF_FORMAT_G723_24)
+		psf->bytewidth = 1 ;
+	else
+		psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+		
+	psf->sf.seekable = SF_TRUE ;
+	psf->error       = 0 ;
+
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+ 	psf->dataoffset  = AU_DATA_OFFSET ;
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = psf->datalength + psf->dataoffset ;
+
+	if (! (encoding = au_write_header (psf)))
+		return psf->error ;
+
+	psf->close        = (func_close)  au_close ;
+	psf->write_header = (func_wr_hdr) au_write_header ;
+	
+	switch (encoding)
+	{	case  AU_ENCODING_PCM_8 :	/* 8-bit linear PCM. */
+				psf->chars = SF_CHARS_SIGNED ;
+
+				error = pcm_write_init (psf) ;				
+				break ;
+
+		case  AU_ENCODING_PCM_16 :	/* 16-bit linear PCM. */
+		case  AU_ENCODING_PCM_24 :	/* 24-bit linear PCM */
+		case  AU_ENCODING_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_write_init (psf) ;
+				break ;
+
+		case  AU_ENCODING_FLOAT :	/* 32-bit linear PCM. */
+				error = float32_write_init (psf) ;
+				break ;
+				
+		default :   break ;
+		} ;
+		
+	return error ;
+} /* au_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+au_close	(SF_PRIVATE  *psf)
+{
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can
+		 *  re-write correct values for the datasize header element.
+		 */
+
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+
+		psf->datalength = psf->filelength - AU_DATA_OFFSET ;
+		fseek (psf->file, 0, SEEK_SET) ;
+		
+		psf->sf.samples = psf->datalength / psf->blockwidth ;
+		au_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* au_close */
+
+static int
+au_write_header (SF_PRIVATE *psf)
+{	int		encoding ;
+
+	encoding = get_encoding (psf->sf.format & SF_FORMAT_SUBMASK, psf->bytewidth * 8) ;
+	if (! encoding)
+	{	psf->error = SFE_BAD_OPEN_FORMAT ;
+		return	encoding ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	if (psf->endian == SF_ENDIAN_BIG)
+	{	psf_binheader_writef (psf, "mL", DOTSND_MARKER, AU_DATA_OFFSET) ;
+		psf_binheader_writef (psf, "LLLL", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+		}
+	else if  (psf->endian == SF_ENDIAN_LITTLE)
+	{	psf_binheader_writef (psf, "ml", DNSDOT_MARKER, AU_DATA_OFFSET) ;
+		psf_binheader_writef (psf, "llll", psf->datalength, encoding, psf->sf.samplerate, psf->sf.channels) ;
+		}
+	else
+	{	psf->error = SFE_BAD_OPEN_FORMAT ;
+		return	encoding ;
+		} ;
+
+	/* Header construction complete so write it out. */
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+	
+	return encoding ;
+} /* au_write_header */ 
+
+static int
+get_encoding (unsigned int format, unsigned int	bitwidth)
+{	if (format == SF_FORMAT_ULAW)
+		return AU_ENCODING_ULAW_8 ;
+		
+	if (format == SF_FORMAT_ALAW)
+		return AU_ENCODING_ALAW_8 ;
+
+	if (format == SF_FORMAT_G721_32)
+		return AU_ENCODING_ADPCM_G721_32 ;
+
+	if (format == SF_FORMAT_G723_24)
+		return AU_ENCODING_ADPCM_G723_24 ;
+
+	if (format == SF_FORMAT_FLOAT)
+		return AU_ENCODING_FLOAT ;
+
+	if (format != SF_FORMAT_PCM)
+		return 0 ;
+
+	/* For PCM encoding, the header encoding field depends on the bitwidth. */
+	switch (bitwidth)
+	{	case	8  : return AU_ENCODING_PCM_8 ;
+		case	16 : return AU_ENCODING_PCM_16 ;
+		case	24 : return AU_ENCODING_PCM_24 ;
+		case	32 : return	AU_ENCODING_PCM_32 ;
+		default : break ;
+		} ;
+	return 0 ;
+} /* get_encoding */
+
+/*-
+static void
+endswap_au_fmt (AU_FMT *pau_fmt)
+{	pau_fmt->dataoffset = ENDSWAP_INT (pau_fmt->dataoffset) ;
+	pau_fmt->datasize   = ENDSWAP_INT (pau_fmt->datasize) ;
+	pau_fmt->encoding   = ENDSWAP_INT (pau_fmt->encoding) ;
+    pau_fmt->samplerate = ENDSWAP_INT (pau_fmt->samplerate) ;
+    pau_fmt->channels   = ENDSWAP_INT (pau_fmt->channels) ;
+} /+* endswap_au_fmt *+/
+-*/
+
+static	char const* 
+get_encoding_str (int format)
+{	switch (format)
+	{	case  AU_ENCODING_ULAW_8 :	
+				return "8-bit ISDN u-law" ;
+										
+		case  AU_ENCODING_PCM_8 :	
+				return "8-bit linear PCM" ;
+
+		case  AU_ENCODING_PCM_16 :	
+				return "16-bit linear PCM" ;
+
+		case  AU_ENCODING_PCM_24 :	
+				return "24-bit linear PCM" ;
+
+		case  AU_ENCODING_PCM_32 :	
+				return "32-bit linear PCM" ;
+					
+		case  AU_ENCODING_FLOAT :	
+				return "32-bit float" ;
+					
+		case  AU_ENCODING_ALAW_8 :
+				return "8-bit ISDN A-law" ;
+					
+		case  AU_ENCODING_ADPCM_G721_32 :  
+				return "G721 32kbs ADPCM" ;
+										
+		case  AU_ENCODING_ADPCM_G723_24 :  
+				return "G723 24kbs ADPCM" ;
+										
+		case  AU_ENCODING_NEXT :	
+				return "Weird NeXT encoding format (unsupported)" ;
+		} ;
+	return "Unknown!!" ;
+} /* get_encoding_str */	
+
+
--- /dev/null
+++ b/common/libsndfile/src/au.h
@@ -1,0 +1,31 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef AU_HEADER_FILE
+#define	AU_HEADER_FILE
+
+
+enum 
+{	AU_H_G721_32	= 200,
+	AU_H_G723_24	= 201
+} ;
+
+int	au_g72x_reader_init (SF_PRIVATE *psf, int codec) ;
+int	au_g72x_writer_init (SF_PRIVATE *psf, int codec) ;
+
+#endif /* AU_HEADER_FILE */
--- /dev/null
+++ b/common/libsndfile/src/au_g72x.c
@@ -1,0 +1,565 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"config.h"
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"floatcast.h"
+#include	"common.h"
+#include	"au.h"
+#include	"G72x/g72x.h"
+
+static	int	au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
+static	int au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len) ;
+
+static	int	au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x) ;
+static	int au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len) ;
+
+static	int	au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static	int	au_g72x_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static	int	au_g72x_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static	int	au_g72x_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static	int	au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static	int	au_g72x_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static	int	au_g72x_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static	int	au_g72x_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static  long au_g72x_seek (SF_PRIVATE *psf, long offset, int whence) ;
+
+static	int	au_g72x_close	(SF_PRIVATE  *psf) ;
+
+
+/*============================================================================================
+** WAV G721 Reader initialisation function.
+*/
+
+int	
+au_g72x_reader_init (SF_PRIVATE *psf, int codec)
+{	G72x_DATA	*pg72x ;
+	int	bitspersample ;
+	
+	psf->sf.seekable = SF_FALSE ;
+	
+	if (psf->mode != SF_MODE_READ)
+		return SFE_BAD_MODE_RW ;
+
+	if (! (pg72x = malloc (sizeof (G72x_DATA))))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pg72x ;
+
+	pg72x->blockcount  = 0 ;
+	pg72x->samplecount = 0 ;
+
+	switch (codec)
+	{	case AU_H_G721_32 :
+				g72x_reader_init (pg72x, G721_32_BITS_PER_SAMPLE) ;
+				pg72x->bytesperblock = G721_32_BYTES_PER_BLOCK ;
+				bitspersample = G721_32_BITS_PER_SAMPLE ;
+				break ;
+				
+		case AU_H_G723_24:
+				g72x_reader_init (pg72x, G723_24_BITS_PER_SAMPLE) ;
+				pg72x->bytesperblock = G723_24_BYTES_PER_BLOCK ;
+				bitspersample = G723_24_BITS_PER_SAMPLE ;
+				break ;
+		default : return 0 ;
+		} ;
+				
+	psf->read_short  = (func_short)  au_g72x_read_s ;
+	psf->read_int    = (func_int)    au_g72x_read_i ;
+	psf->read_float  = (func_float)  au_g72x_read_f ;
+	psf->read_double = (func_double) au_g72x_read_d ;
+ 
+ 	psf->seek_func   = (func_seek)   au_g72x_seek ;
+ 	psf->close       = (func_close)  au_g72x_close ;
+
+	if (psf->datalength % pg72x->blocksize)
+		pg72x->blocks = (psf->datalength / pg72x->blocksize) + 1 ;
+	else
+		pg72x->blocks = psf->datalength / pg72x->blocksize ;
+
+	psf->sf.samples = (8 * psf->datalength) / bitspersample ;
+
+	if ((psf->sf.samples * bitspersample) / 8 != psf->datalength)
+		psf_log_printf (psf, "*** Warning : weird psf->datalength.\n") ;
+			
+	psf->blockwidth = psf->bytewidth = 1 ;
+
+	au_g72x_read_block (psf, pg72x) ;
+	
+	return 0 ;	
+} /* au_g72x_reader_init */
+
+/*============================================================================================
+** WAV G721 writer initialisation function.
+*/
+
+int	
+au_g72x_writer_init (SF_PRIVATE *psf, int codec)
+{	G72x_DATA	*pg72x ;
+	
+	psf->sf.seekable = SF_FALSE ;
+	
+	if (psf->mode != SF_MODE_WRITE)
+		return SFE_BAD_MODE_RW ;
+
+	if (! (pg72x = malloc (sizeof (G72x_DATA))))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pg72x ;
+
+	pg72x->blockcount  = 0 ;
+	pg72x->samplecount = 0 ;
+
+	switch (codec)
+	{	case AU_H_G721_32 :
+				g72x_writer_init (pg72x, G721_32_BITS_PER_SAMPLE) ;
+				pg72x->bytesperblock = G721_32_BYTES_PER_BLOCK ;
+				break ;
+				
+		case AU_H_G723_24:
+				g72x_writer_init (pg72x, G723_24_BITS_PER_SAMPLE) ;
+				pg72x->bytesperblock = G723_24_BYTES_PER_BLOCK ;
+				break ;
+		default : return 0 ;
+		} ;
+
+	psf->write_short  = (func_short)  au_g72x_write_s ;
+	psf->write_int    = (func_int)    au_g72x_write_i ;
+	psf->write_float  = (func_float)  au_g72x_write_f ;
+	psf->write_double = (func_double) au_g72x_write_d ;
+ 
+ 	psf->seek_func   = (func_seek)    au_g72x_seek ;
+ 	psf->close       = (func_close)   au_g72x_close ;
+ 
+	psf->blockwidth = psf->bytewidth = 1 ;
+
+	return 0 ;
+} /* au_g72x_writer_init */
+
+
+
+/*============================================================================================
+** G721 Read Functions.
+*/
+
+static int
+au_g72x_read_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
+{	int	k ;
+	
+	pg72x->blockcount ++ ;
+	pg72x->samplecount = 0 ;
+	
+	if (pg72x->samplecount > pg72x->blocksize)
+	{	memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = fread (pg72x->block, 1, pg72x->bytesperblock, psf->file)) != pg72x->bytesperblock)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pg72x->bytesperblock) ;
+
+	pg72x->blocksize = k ;
+	g72x_decode_block (pg72x) ;
+
+	return 1 ;
+} /* au_g72x_read_block */
+
+static int 
+au_g72x_read (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+
+	while (index < len)
+	{	if (pg72x->blockcount >= pg72x->blocks && pg72x->samplecount >= pg72x->samplesperblock)
+		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
+			return total ;
+			} ;
+		
+		if (pg72x->samplecount >= pg72x->samplesperblock)
+			au_g72x_read_block (psf, pg72x) ;
+		
+		count = pg72x->samplesperblock - pg72x->samplecount ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pg72x->samples [pg72x->samplecount]), count * sizeof (short)) ;
+		index += count ;
+		pg72x->samplecount += count ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* au_g72x_read */
+
+static int		
+au_g72x_read_s (SF_PRIVATE *psf, short *ptr, int len)
+{	G72x_DATA 	*pg72x ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	total = au_g72x_read (psf, pg72x, ptr, len) ;
+
+	return total ;
+} /* au_g72x_read_s */
+
+static int		
+au_g72x_read_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	G72x_DATA *pg72x ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (int) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* au_g72x_read_i */
+
+static int
+au_g72x_read_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	G72x_DATA *pg72x ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float 		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * sptr [k] ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* au_g72x_read_f */
+
+static int		
+au_g72x_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	G72x_DATA *pg72x ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	normfact = (normalize) ? 1.0 / ((double) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = SF_BUFFER_LEN / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = au_g72x_read (psf, pg72x, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (double) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+
+	return total ;
+} /* au_g72x_read_d */
+
+static long    
+au_g72x_seek   (SF_PRIVATE *psf, long offset, int whence)
+{
+
+	/*	No simple solution. To do properly, would need to seek
+	**	to start of file and decode everything up to seek position.
+	**	Maybe implement SEEK_SET to 0 only?
+	*/
+	return 0 ;
+	
+/*
+**		G72x_DATA	*pg72x ; 
+**		int			newblock, newsample, samplecount ;
+**	
+**		if (! psf->fdata)
+**			return 0 ;
+**		pg72x = (G72x_DATA*) psf->fdata ;
+**	
+**		if (! (psf->datalength && psf->dataoffset))
+**		{	psf->error = SFE_BAD_SEEK ;
+**			return	((long) -1) ;
+**			} ;
+**			
+**		samplecount = (8 * psf->datalength) / G721_32_BITS_PER_SAMPLE ;
+**			
+**		switch (whence)
+**		{	case SEEK_SET :
+**					if (offset < 0 || offset > samplecount)
+**					{	psf->error = SFE_BAD_SEEK ;
+**						return	((long) -1) ;
+**						} ;
+**					newblock  = offset / pg72x->samplesperblock ;
+**					newsample = offset % pg72x->samplesperblock ;
+**					break ;
+**					
+**			case SEEK_CUR :
+**					if (psf->current + offset < 0 || psf->current + offset > samplecount)
+**					{	psf->error = SFE_BAD_SEEK ;
+**						return	((long) -1) ;
+**						} ;
+**					newblock  = (8 * (psf->current + offset)) / pg72x->samplesperblock ;
+**					newsample = (8 * (psf->current + offset)) % pg72x->samplesperblock ;
+**					break ;
+**					
+**			case SEEK_END :
+**					if (offset > 0 || samplecount + offset < 0)
+**					{	psf->error = SFE_BAD_SEEK ;
+**						return	((long) -1) ;
+**						} ;
+**					newblock  = (samplecount + offset) / pg72x->samplesperblock ;
+**					newsample = (samplecount + offset) % pg72x->samplesperblock ;
+**					break ;
+**					
+**			default : 
+**					psf->error = SFE_BAD_SEEK ;
+**					return	((long) -1) ;
+**			} ;
+**			
+**		if (psf->mode == SF_MODE_READ)
+**		{	fseek (psf->file, (int) (psf->dataoffset + newblock * pg72x->blocksize), SEEK_SET) ;
+**			pg72x->blockcount  = newblock ;
+**			au_g72x_read_block (psf, pg72x) ;
+**			pg72x->samplecount = newsample ;
+**			}
+**		else
+**		{	/+* What to do about write??? *+/ 
+**			psf->error = SFE_BAD_SEEK ;
+**			return	((long) -1) ;
+**			} ;
+**	
+**		psf->current = newblock * pg72x->samplesperblock + newsample ;
+**		return psf->current ;
+**	
+*/
+} /* au_g72x_seek */
+
+/*==========================================================================================
+** G72x Write Functions.
+*/
+
+static int		
+au_g72x_write_block (SF_PRIVATE *psf, G72x_DATA *pg72x)
+{	int k ;
+
+	/* Encode the samples. */
+	g72x_encode_block (pg72x) ;
+
+	/* Write the block to disk. */
+	if ((k = fwrite (pg72x->block, 1, pg72x->blocksize, psf->file)) != pg72x->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pg72x->blocksize) ;
+
+	pg72x->samplecount = 0 ;
+	pg72x->blockcount ++ ;
+
+	/* Set samples to zero for next block. */
+	memset (pg72x->samples, 0, G72x_BLOCK_SIZE * sizeof (short)) ;
+			
+	return 1 ;
+} /* au_g72x_write_block */
+
+static int 
+au_g72x_write (SF_PRIVATE *psf, G72x_DATA *pg72x, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = pg72x->samplesperblock - pg72x->samplecount ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pg72x->samples [pg72x->samplecount]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pg72x->samplecount += count ;
+		total = index ;
+
+		if (pg72x->samplecount >= pg72x->samplesperblock)
+			au_g72x_write_block (psf, pg72x) ;	
+		} ;
+
+	return total ;		
+} /* au_g72x_write */
+
+static int		
+au_g72x_write_s (SF_PRIVATE *psf, short *ptr, int len)
+{	G72x_DATA 	*pg72x ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	total = au_g72x_write (psf, pg72x, ptr, len) ;
+
+	return total ;
+} /* au_g72x_write_s */
+
+static int		
+au_g72x_write_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	G72x_DATA *pg72x ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = ptr [index+k] ;
+		count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* au_g72x_write_i */
+
+static int		
+au_g72x_write_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	G72x_DATA *pg72x ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k])  ;
+		count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* au_g72x_write_f */
+
+static int		
+au_g72x_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	G72x_DATA *pg72x ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pg72x = (G72x_DATA*) psf->fdata ;
+	
+	normfact = (normalize) ? ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k])  ;
+		count = au_g72x_write (psf, pg72x, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* au_g72x_write_d */
+
+static int	
+au_g72x_close	(SF_PRIVATE  *psf)
+{	G72x_DATA *pg72x ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pg72x = (G72x_DATA*) psf->fdata ;
+
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+	
+		if (pg72x->samplecount && pg72x->samplecount < G72x_BLOCK_SIZE)
+			au_g72x_write_block (psf, pg72x) ;	
+
+		/*  Now we know for certain the length of the file we can
+		**  re-write correct values for the RIFF and data chunks.
+		*/
+		
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+
+		psf->sf.samples = pg72x->samplesperblock * pg72x->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		if (psf->write_header)
+			psf->write_header (psf) ; 
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* au_g72x_close */
+
--- /dev/null
+++ b/common/libsndfile/src/common.c
@@ -1,0 +1,683 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdarg.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*-----------------------------------------------------------------------------------------------
+** Generic functions for performing endian swapping on short and int arrays.
+*/
+
+void
+endswap_short_array (short *ptr, int len)
+{	int k ;
+	for (k = 0 ; k < len ; k++)
+		ptr[k] = ((((ptr[k])>>8)&0xFF)|(((ptr[k])&0xFF)<<8)) ;
+} /* endswap_short_array */
+
+void
+endswap_int_array (int *ptr, int len)
+{	int k ;
+	for (k = 0 ; k < len ; k++)
+		ptr[k] = ((((ptr[k])>>24)&0xFF)|(((ptr[k])>>8)&0xFF00)|
+					(((ptr[k])&0xFF00)<<8)|(((ptr[k])&0xFF)<<24)) ;		
+} /* endswap_int_array */
+
+/*-----------------------------------------------------------------------------------------------
+** psf_log_printf allows libsndfile internal functions to print to an internal logbuffer which
+** can later be displayed. 
+** The format specifiers are as for printf but without the field width and other modifiers.
+** Printing is performed to the logbuffer char array of the SF_PRIVATE struct. 
+** Printing is done in such a way as to guarantee that the log never overflows the end of the
+** logbuffer array.  
+*/
+
+#define psf_putchar(a,b)									\
+			if ((a)->logindex < SF_BUFFER_LEN - 1)			\
+			{	(a)->logbuffer [(a)->logindex++] = (b) ;	\
+				(a)->logbuffer [(a)->logindex] = 0 ;		\
+				} ;
+
+void
+psf_log_printf (SF_PRIVATE *psf, char *format, ...)
+{	va_list	ap ;
+	int     d, tens, shift ;
+	char    c, *strptr, istr [5] ;
+
+	va_start(ap, format);
+	
+	/* printf ("psf_log_printf : %s\n", format) ; */
+	
+	while ((c = *format++))
+	{	if (c != '%')
+		{	psf_putchar (psf, c) ;
+			continue ;
+			} ;
+		
+		switch((c = *format++)) 
+		{	case 's': /* string */
+					strptr = va_arg (ap, char *) ;
+					while (*strptr)
+						psf_putchar (psf, *strptr++) ;
+					break;
+		    
+			case 'd': /* int */
+					d = va_arg (ap, int) ;
+
+					if (d == 0)
+					{	psf_putchar (psf, '0') ;
+						break ;
+						} 
+					if (d < 0)
+					{	psf_putchar (psf, '-') ;
+						d = -d ;
+						} ;
+					tens = 1 ;
+					while (d / tens >= 10) 
+						tens *= 10 ;
+					while (tens > 0)
+					{	psf_putchar (psf, '0' + d / tens) ;
+						d %= tens ;
+						tens /= 10 ;
+						} ;
+					break;
+					
+			case 'X': /* hex */
+					d = va_arg (ap, int) ;
+					
+					if (d == 0)
+					{	psf_putchar (psf, '0') ;
+						break ;
+						} ;
+					shift = 28 ;
+					while (! ((0xF << shift) & d))
+						shift -= 4 ;
+					while (shift >= 0)
+					{	c = (d >> shift) & 0xF ;
+						psf_putchar (psf, (c > 9) ? c + 'A' - 10 : c + '0') ;
+						shift -= 4 ;
+						} ;
+					break;
+					
+			case 'c': /* char */
+					c = va_arg (ap, int) & 0xFF ;
+					psf_putchar (psf, c);
+					break;
+					
+			case 'D': /* int2str */
+					d = va_arg (ap, int);
+					if (CPU_IS_LITTLE_ENDIAN)
+					{	istr [0] = d & 0xFF ;
+						istr [1] = (d >> 8) & 0xFF ;
+						istr [2] = (d >> 16) & 0xFF ;
+						istr [3] = (d >> 24) & 0xFF ;
+						}
+					else
+					{	istr [3] = d & 0xFF ;
+						istr [2] = (d >> 8) & 0xFF ;
+						istr [1] = (d >> 16) & 0xFF ;
+						istr [0] = (d >> 24) & 0xFF ;
+						} ;
+					istr [4] = 0 ;
+					strptr = istr ;
+					while (*strptr)
+					{	c = *strptr++ ;
+						psf_putchar (psf, c) ;
+						} ;
+					break;
+					
+			default :
+					psf_putchar (psf, '*') ;
+					psf_putchar (psf, c) ;
+					psf_putchar (psf, '*') ;
+					break ;
+			} /* switch */
+		} /* while */
+
+	va_end(ap);
+	return ;
+} /* psf_log_printf */
+
+/*-----------------------------------------------------------------------------------------------
+**  ASCII header printf functions.
+**  Some formats (ie NIST) use ascii text in their headers.
+**  Format specifiers are the same as the standard printf specifiers (uses vsnprintf).
+**  If this generates a compile error on any system, the author should be notified
+**  so an alternative vsnprintf can be provided.
+*/
+
+void
+psf_asciiheader_printf (SF_PRIVATE *psf, char *format, ...)
+{	va_list	argptr ;
+	int  maxlen ;
+	char *start ;
+	
+	start  = (char*) psf->header + strlen ((char*) psf->header) ;
+	maxlen = sizeof (psf->header) - strlen ((char*) psf->header) ;
+	
+	va_start (argptr, format) ;
+	vsnprintf (start, maxlen, format, argptr) ;
+	va_end (argptr) ;
+
+	/* Make sure the string is properly terminated. */
+	start [maxlen - 1] = 0 ;	
+
+	return ;
+} /* psf_asciiheader_printf */
+
+/*-----------------------------------------------------------------------------------------------
+**  Binary header writing functions. Returns number of bytes written.
+**
+**  Format specifiers for psf_binheader_writef are as follows
+**		m	- marker - four bytes - no endian manipulation
+**
+**		b   - byte
+**
+**		w	- two byte value - little endian
+**		W	- two byte value - big endian
+**		l	- four byte value - little endian
+**		L	- four byte value - big endian
+**
+**		s   - string preceded by a little endian four byte length
+**		S   - string preceded by a big endian four byte length
+**
+**		f	- little endian 32 bit float
+**		F   - big endian 32 bit float
+**
+**		B	- binary data (see below)
+**		z   - zero bytes (se below)
+**
+**	To write a word followed by a long (both little endian) use:
+**		psf_binheader_writef ("wl", wordval, longval) ;
+**
+**	To write binary data use:
+**		psf_binheader_writef ("B", &bindata, sizeof (bindata)) ;
+**
+**	To write N zero bytes use:
+**		psf_binheader_writef ("z", N) ;
+*/
+
+/* These macros may seem a bit messy but do prevent problems with processors which 
+** seg. fault when asked to write an int or short to a non-int/short aligned address.
+*/
+
+#if (CPU_IS_BIG_ENDIAN == 1)
+#define	PUT_INT(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 4)					\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >>  8) & 0xFF ;		\
+								(psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
+								                                                                   
+#define	PUT_SHORT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 2)					\
+							{	(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ;		\
+								(psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
+
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
+#define	PUT_INT(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 4)					\
+							{	(psf)->header [(psf)->headindex++] = (x) & 0xFF ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >>  8) & 0xFF ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 16) & 0xFF ;		\
+								(psf)->header [(psf)->headindex++] = ((x) >> 24) & 0xFF ;   }
+                                                                        
+#define	PUT_SHORT(psf,x)	if ((psf)->headindex < sizeof ((psf)->header) - 2)					\
+							{	(psf)->header [(psf)->headindex++] = (x) & 0xFF ;				\
+								(psf)->header [(psf)->headindex++] = ((x) >> 8) & 0xFF ;   }
+
+#else
+#       error "Cannot determine endian-ness of processor."
+#endif
+
+#define	PUT_BYTE(psf,x)		if ((psf)->headindex < sizeof ((psf)->header) - 1)					\
+							{	(psf)->header [(psf)->headindex++] = (x) & 0xFF ;   }
+
+int
+psf_binheader_writef (SF_PRIVATE *psf, char *format, ...)
+{	va_list	argptr ;
+	unsigned int 	data ;
+	float			floatdata ;
+	void			*bindata ;
+	size_t			size ;
+	char    		c, *strptr ;
+	int				count = 0 ;
+	
+	va_start(argptr, format);
+	
+	while ((c = *format++))
+	{	switch (c)
+		{	case 'm' : 
+					data = va_arg (argptr, unsigned int) ;
+					PUT_INT (psf, data) ;
+					count += 4 ;
+					break ;
+					
+			case 'b' :
+					data = va_arg (argptr, unsigned int) ;
+					PUT_BYTE (psf, data) ;
+					count += 1 ;
+					break ;
+					
+			case 'w' :
+					data = va_arg (argptr, unsigned int) ;
+					data = H2LE_SHORT (data) ;
+					PUT_SHORT (psf, data) ;
+					count += 2 ;
+					break ;
+
+			case 'W' :
+					data = va_arg (argptr, unsigned int) ;
+					data = H2BE_SHORT (data) ;
+					PUT_SHORT (psf, data) ;
+					count += 2 ;
+					break ;
+					
+			case 'l' :
+					data = va_arg (argptr, unsigned int) ;
+					data = H2LE_INT (data) ;
+					PUT_INT (psf, data) ;
+					count += 4 ;
+					break ;
+
+			case 'L' :
+					data = va_arg (argptr, unsigned int) ;
+					data = H2BE_INT (data) ;
+					PUT_INT (psf, data) ;
+					count += 4 ;
+					break ;
+
+			case 'f' :
+					floatdata = (float) va_arg (argptr, double) ;
+					float32_write (floatdata, (unsigned char *) &data) ;
+					data = H2LE_INT (data) ;
+					PUT_INT (psf, data) ;
+					count += 4 ;
+					break ;
+
+			case 'F' :
+					floatdata = (float) va_arg (argptr, double) ;
+					float32_write (floatdata, (unsigned char *) &data) ;
+					data = H2BE_INT (data) ;
+					PUT_INT (psf, data) ;
+					count += 4 ;
+					break ;
+
+			case 's' :
+					strptr = va_arg (argptr, char *) ;
+					size   = strlen (strptr) + 1 ;
+					size  += (size & 1) ;
+					data = H2LE_INT (size) ;
+					PUT_INT (psf, data) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
+					psf->headindex += size ;
+					count += 4 + size ;
+					break ;
+					
+			case 'S' :
+					strptr = va_arg (argptr, char *) ;
+					size   = strlen (strptr) + 1 ;
+					size  += (size & 1) ;
+					data = H2BE_INT (size) ;
+					PUT_INT (psf, data) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
+					psf->headindex += size ;
+					count += 4 + size ;
+					break ;
+					
+			case 'B' :
+					bindata = va_arg (argptr, void *) ;
+					size    = va_arg (argptr, size_t) ;
+					memcpy (&(psf->header [psf->headindex]), bindata, size) ;
+					psf->headindex += size ;
+					count += size ;
+					break ;
+					
+			case 'z' :
+					size    = va_arg (argptr, size_t) ;
+					count += size ;
+					while (size)
+					{	psf->header [psf->headindex] = 0 ;
+						psf->headindex ++ ;
+						size -- ;
+						} ;
+					break ;
+					
+			default : 
+				psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
+				psf->error = SFE_INTERNAL ; 
+				break ;
+			} ;
+		} ;
+	
+	va_end(argptr);
+	return count ;
+} /* psf_binheader_writef */
+
+/*-----------------------------------------------------------------------------------------------
+**  Binary header reading functions. Returns number of bytes read.
+**
+**	Format specifiers are the same as for header write function above with the following
+**	additions:
+**
+**		p   - jump a given number of position from start of file.
+**
+**	If format is NULL, psf_binheader_readf returns the current offset.
+*/
+
+#if (CPU_IS_BIG_ENDIAN == 1)
+#define	GET_INT(psf)	( ((psf)->header [0] << 24) + ((psf)->header [1] << 16) +	\
+						  ((psf)->header [2] <<  8) + ((psf)->header [3]) )
+
+#define	GET_3BYTE(psf)	( ((psf)->header [0] << 16) + ((psf)->header [1] << 8) +	\
+						  ((psf)->header [2]) )
+
+#define	GET_SHORT(psf)	( ((psf)->header [0] <<  8) + ((psf)->header [1]) )
+
+#elif (CPU_IS_LITTLE_ENDIAN == 1)
+#define	GET_INT(psf)	( ((psf)->header [0]      ) + ((psf)->header [1] <<  8) +	\
+						  ((psf)->header [2] << 16) + ((psf)->header [3] << 24) )
+
+#define	GET_3BYTE(psf)	( ((psf)->header [0]      ) + ((psf)->header [1] <<  8) +	\
+						  ((psf)->header [2] << 16) )
+
+#define	GET_SHORT(psf)	( ((psf)->header [0]) + ((psf)->header [1] <<  8) )
+
+#else
+#       error "Cannot determine endian-ness of processor."
+#endif
+
+#define	GET_BYTE(psf)	( (psf)->header [0] )
+
+int
+psf_binheader_readf (SF_PRIVATE *psf, char const *format, ...)
+{	va_list	argptr ;
+	unsigned int 	*longptr, longdata ;
+	unsigned short	*wordptr, worddata ;
+	char    		*charptr ;
+	int				position ;
+	float			*floatptr ;
+	size_t			size ;
+	char			c ;
+	int				count = 0 ;
+	
+	if (! format)
+		return ftell (psf->file) ;
+			
+	va_start(argptr, format);
+	
+	while ((c = *format++))
+	{	switch (c)
+		{	case 'm' : 
+					longptr = va_arg (argptr, unsigned int*) ;
+					fread (psf->header, 1, sizeof (int), psf->file) ;
+					*longptr = GET_INT (psf) ;
+					count += 4 ;
+					break ;
+					
+			case 'b' :
+					charptr = va_arg (argptr, char*) ;
+					fread (psf->header, 1, sizeof (char), psf->file) ;
+					*charptr = GET_BYTE (psf) ;
+					count += 1 ;
+					break ;
+					
+			case 'w' :
+					wordptr = va_arg (argptr, unsigned short*) ;
+					fread (psf->header, 1, sizeof (short), psf->file) ;
+					worddata = GET_SHORT (psf) ;
+					*wordptr = H2LE_SHORT (worddata) ;
+					count += 2 ;
+					break ;
+
+			case 'W' :
+					wordptr = va_arg (argptr, unsigned short*) ;
+					fread (psf->header, 1, sizeof (short), psf->file) ;
+					worddata = GET_SHORT (psf) ;
+					*wordptr = H2BE_SHORT (worddata) ;
+					count += 2 ;
+					break ;
+					
+			case 'l' :
+					longptr = va_arg (argptr, unsigned int*) ;
+					fread (psf->header, 1, sizeof (int), psf->file) ;
+					longdata = GET_INT (psf) ;
+					*longptr = H2LE_INT (longdata) ;
+					count += 4 ;
+					break ;
+
+			case 'L' :
+					longptr = va_arg (argptr, unsigned int*) ;
+					fread (psf->header, 1, sizeof (int), psf->file) ;
+					longdata = GET_INT (psf) ;
+					*longptr = H2BE_INT (longdata) ;
+					count += 4 ;
+					break ;
+
+			case 't' :
+					longptr = va_arg (argptr, unsigned int*) ;
+					fread (psf->header, 1, 3, psf->file) ;
+					longdata = GET_3BYTE (psf) ;
+					*longptr = H2LE_INT (longdata) ;
+					count += 3 ;
+					break ;
+
+			case 'T' :
+					longptr = va_arg (argptr, unsigned int*) ;
+					fread (psf->header, 1, 3, psf->file) ;
+					longdata = GET_3BYTE (psf) ;
+					*longptr = H2BE_INT (longdata) ;
+					count += 3 ;
+					break ;
+
+			case 'f' :
+					floatptr = va_arg (argptr, float *) ;
+					fread (psf->header, 1, sizeof (float), psf->file) ;
+					longdata = GET_INT (psf) ;
+					longdata = H2LE_INT (longdata) ;
+					*floatptr = float32_read ((unsigned char*) &longdata) ;
+					count += 4 ;
+					break ;
+
+			case 'F' :
+					floatptr = va_arg (argptr, float *) ;
+					fread (psf->header, 1, sizeof (float), psf->file) ;
+					longdata = GET_INT (psf) ;
+					longdata = H2BE_INT (longdata) ;
+					*floatptr = float32_read ((unsigned char*) &longdata) ;
+					count += 4 ;
+					break ;
+
+			case 's' :
+					printf ("Format conversion not implemented yet.\n") ;
+					/*
+					strptr = va_arg (argptr, char *) ;
+					size   = strlen (strptr) + 1 ;
+					size  += (size & 1) ;
+					longdata = H2LE_INT (size) ;
+					get_int (psf, longdata) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
+					psf->headindex += size ;
+					*/
+					break ;
+					
+			case 'S' :
+					printf ("Format conversion not implemented yet.\n") ;
+					/*
+					strptr = va_arg (argptr, char *) ;
+					size   = strlen (strptr) + 1 ;
+					size  += (size & 1) ;
+					longdata = H2BE_INT (size) ;
+					get_int (psf, longdata) ;
+					memcpy (&(psf->header [psf->headindex]), strptr, size) ;
+					psf->headindex += size ;
+					*/
+					break ;
+					
+			case 'B' :
+					charptr = va_arg (argptr, char*) ;
+					size = va_arg (argptr, size_t) ;
+					if (size > 0)
+					{	memset (charptr, 0, size) ;
+						fread (charptr, 1, size, psf->file) ;
+						count += size ;
+						} ;
+					break ;
+					
+			case 'z' :
+					printf ("Format conversion not implemented yet.\n") ;
+					/*
+					size    = va_arg (argptr, size_t) ;
+					while (size)
+					{	psf->header [psf->headindex] = 0 ;
+						psf->headindex ++ ;
+						size -- ;
+						} ;
+					*/
+					break ;
+					
+			case 'p' :
+					/* Get the seek position first. */ 
+					position = va_arg (argptr, int) ;
+					fseek (psf->file, position, SEEK_SET) ;
+					count = 0 ;
+					break ;
+
+			case 'j' :
+					/* Get the seek position first. */ 
+					position = va_arg (argptr, int) ;
+					fseek (psf->file, position, SEEK_CUR) ;
+					count = 0 ;
+					break ;
+
+			default :
+				psf_log_printf (psf, "*** Invalid format specifier `%c'\n", c) ;
+				psf->error = SFE_INTERNAL ; 
+				break ;
+			} ;
+		} ;
+	
+	va_end (argptr);
+	
+	return count ;
+} /* psf_binheader_readf */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+void
+psf_log_SF_INFO (SF_PRIVATE *psf)
+{	psf_log_printf (psf, "---------------------------------\n") ;
+
+	psf_log_printf (psf, " Sample rate :   %d\n", psf->sf.samplerate) ;
+	psf_log_printf (psf, " Samples     :   %d\n", psf->sf.samples) ;
+	psf_log_printf (psf, " Channels    :   %d\n", psf->sf.channels) ;
+
+	psf_log_printf (psf, " Bit width   :   %d\n", psf->sf.pcmbitwidth) ;
+	psf_log_printf (psf, " Format      :   %X\n", psf->sf.format) ;
+	psf_log_printf (psf, " Sections    :   %d\n", psf->sf.sections) ;
+	psf_log_printf (psf, " Seekable    :   %s\n", psf->sf.seekable ? "TRUE" : "FALSE") ;
+	
+	psf_log_printf (psf, "---------------------------------\n") ;
+} /* psf_dump_SFINFO */ 
+
+/*========================================================================================
+**	Functions used in the write function for updating the peak chunk. 
+*/
+
+/*-void	
+peak_update_short	(SF_PRIVATE *psf, short *ptr, size_t items)
+{	int		chan, k, position ;
+	short	maxval ;
+	float	fmaxval ;
+	
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	maxval = abs (ptr [chan]) ;
+		position = 0 ;
+		for (k = chan ; k < items ; k += psf->sf.channels)
+			if (maxval < abs (ptr [k]))
+			{	maxval = abs (ptr [k]) ;
+				position = k ;
+				} ;
+				
+		fmaxval   = maxval / 32767.0 ;
+		position /= psf->sf.channels ;
+		
+		if (fmaxval > psf->peak.peak[chan].value)
+		{	psf->peak.peak[chan].value = fmaxval ;
+			psf->peak.peak[chan].position = psf->current - position ;
+			} ;
+		} ;
+	
+	return ;		
+} /+* peak_update_short *+/
+
+void	
+peak_update_int		(SF_PRIVATE *psf, int *ptr, size_t items)
+{	int		chan, k, position ;
+	int		maxval ;
+	float	fmaxval ;
+	
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	maxval = abs (ptr [chan]) ;
+		position = 0 ;
+		for (k = chan ; k < items ; k += psf->sf.channels)
+			if (maxval < abs (ptr [k]))
+			{	maxval = abs (ptr [k]) ;
+				position = k ;
+				} ;
+				
+		fmaxval   = maxval / 0x7FFFFFFF ;
+		position /= psf->sf.channels ;
+		
+		if (fmaxval > psf->peak.peak[chan].value)
+		{	psf->peak.peak[chan].value = fmaxval ;
+			psf->peak.peak[chan].position = psf->current - position ;
+			} ;
+		} ;
+	
+	return ;		
+} /+* peak_update_int *+/
+
+void	
+peak_update_double	(SF_PRIVATE *psf, double *ptr, size_t items)
+{	int		chan, k, position ;
+	double	fmaxval ;
+	
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	fmaxval = fabs (ptr [chan]) ;
+		position = 0 ;
+		for (k = chan ; k < items ; k += psf->sf.channels)
+			if (fmaxval < fabs (ptr [k]))
+			{	fmaxval = fabs (ptr [k]) ;
+				position = k ;
+				} ;
+
+		position /= psf->sf.channels ;
+		
+		if (fmaxval > psf->peak.peak[chan].value)
+		{	psf->peak.peak[chan].value = fmaxval ;
+			psf->peak.peak[chan].position = psf->current - position ;
+			} ;
+		} ;
+	
+	return ;		
+} /+* peak_update_double *+/
+-*/
--- /dev/null
+++ b/common/libsndfile/src/common.h
@@ -1,0 +1,373 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef COMMON_H_INCLUDED
+#define COMMON_H_INCLUDED
+
+#ifdef _WIN32
+	#pragma pack(push,1)
+#endif
+
+
+#define	SF_BUFFER_LEN			(4096)
+#define	SF_FILENAME_LEN			(256)
+#define	SF_HEADER_LEN			(2048)
+#define	SF_TEXT_LEN				(1024)
+
+#define		BITWIDTH2BYTES(x)	(((x) + 7) / 8)
+
+#define		PEAK_CHANNEL_COUNT	16
+
+enum
+{	SF_MODE_READ		= 11, 
+	SF_MODE_WRITE		= 12,
+	SF_MODE_RW			= 13,	/* Unlikely that RW will ever be implemented. */ 
+	
+	/* PEAK chunk location. */
+	SF_PEAK_START		= 42,
+	SF_PEAK_END			= 43,
+
+	/* Two endian enums. */
+	SF_ENDIAN_LITTLE	= 100, 
+	SF_ENDIAN_BIG		= 101,
+	
+	/* Char type for 8 bit files. */
+	SF_CHARS_SIGNED		= 200,
+	SF_CHARS_UNSIGNED	= 201
+} ; 
+
+/*	Processor floating point capabilities. float32_get_capabilities () in
+**	src/float32.c returns one of the latter three values.
+*/
+enum
+{	FLOAT_UNKNOWN		= 0x00,
+	FLOAT_CAN_RW_LE		= 0x23,
+	FLOAT_CAN_RW_BE		= 0x34,
+	FLOAT_BROKEN_LE		= 0x35,
+	FLOAT_BROKEN_BE		= 0x36
+} ;
+
+enum
+{	SF_FALSE = 0, 
+	SF_TRUE = 1
+} ; 
+
+/* Command values for sf_command (). These are obtained using the Python
+** script sf_command.py in the top level directory of the libsndfile sources.
+*/
+enum
+{	SFC_LIB_VERSION	= 0x1048C,
+	SFC_READ_TEXT	= 0x054F0,
+	SFC_WRITE_TEXT	= 0x0B990,
+	SFC_NORM_FLOAT	= 0x0914A,
+	SFC_NORM_DOUBLE	= 0x1226D,
+	SFC_SCALE_MODE	= 0x0A259,
+	SFC_ADD_PEAK	= 0x96F53
+} ;
+
+/*	Function pointer typedefs. */
+
+typedef	int	(*func_seek) 	(void*, long, int) ;
+
+typedef	int	(*func_short)	(void*, short *ptr, unsigned int len) ;
+typedef	int	(*func_int)		(void*, int *ptr, unsigned int len) ;
+typedef	int	(*func_float)	(void*, float *ptr, unsigned int len) ;
+typedef	int	(*func_double)	(void*, double *ptr, unsigned int len, int normalize) ;
+
+typedef	int	(*func_wr_hdr)	(void*) ;
+typedef	int	(*func_command)	(void*, int command, void *data, int datasize) ;
+
+typedef	int	(*func_close)	(void*) ;
+
+/*---------------------------------------------------------------------------------------
+**	PEAK_CHUNK - This chunk type is common to both AIFF and WAVE files although their 
+**	endian encodings are different. 
+*/
+
+typedef struct 
+{	float        value ;    	/* signed value of peak */ 
+	unsigned int position ; 	/* the sample frame for the peak */ 
+} PEAK_POS ; 
+
+typedef struct 
+{	unsigned int  version ;						/* version of the PEAK chunk */ 
+	unsigned int  timestamp ;					/* secs since 1/1/1970  */ 
+	PEAK_POS      peak [PEAK_CHANNEL_COUNT] ;	/* the peak info */ 
+} PEAK_CHUNK ; 
+
+/*=======================================================================================
+**	SF_PRIVATE stuct - a pointer to this struct is passed back to the caller of the
+**	sf_open_XXXX functions. The caller however has no knowledge of the struct's
+**	contents. 
+*/
+
+typedef struct
+{	/* Force the compiler to double align the start of buffer. */
+	double			buffer		[SF_BUFFER_LEN/sizeof(double)] ;
+	char			filename	[SF_FILENAME_LEN] ;
+
+	/* logbuffer and logindex should only be changed within the logging functions 
+	** of common.c
+	*/
+	char			logbuffer	[SF_BUFFER_LEN] ;
+	unsigned char	header		[SF_HEADER_LEN] ;
+
+	/* For storing text from header. */
+	char			headertext	[SF_TEXT_LEN] ;
+	
+	/* Guard value. If this changes the buffers above have overflowed. */ 
+	int				Magick ;
+	
+	/* Index variables for maintaining logbuffer and header above. */
+	unsigned int	logindex ;
+	unsigned int	headindex, headcurrent ;
+	int				has_text ;
+	
+	FILE 			*file ;
+	int				error ;
+	
+	int				mode ;			/* Open mode : SF_MODE_READ or SF_MODE_WRITE. */
+	int				endian ;		/* File endianness : SF_ENDIAN_LITTLE or SF_ENDIAN_BIG. */
+	int				chars ;			/* Chars are SF_CHARS_SIGNED or SF_CHARS_UNSIGNED. */
+	int				fl32_endswap ;	/* Need to endswap float32s? */
+	
+	SF_INFO			sf ; 	
+
+	int				has_peak ;		/* Has a PEAK chunk (AIFF and WAVE) been read? */
+	int				peak_loc ;		/* Write a PEAK chunk at the start or end of the file? */
+	PEAK_CHUNK		peak ;			
+	
+	long			dataoffset ;	/* Offset in number of bytes from beginning of file. */
+	long			datalength ;	/* Length in bytes of the audio data. */
+	long			tailstart ;		/* Offset to file tailer. */
+	unsigned int	blockwidth ;	/* Size in bytes of one set of interleaved samples. */
+	unsigned int	bytewidth ;		/* Size in bytes of one sample (one channel). */
+
+	long			filelength ;
+	long			current ;
+
+	void			*fdata ;
+	
+	int				scale_mode ;
+	int				norm_double ;
+	int				norm_float ;
+
+	func_seek		seek_func ;
+
+	func_short		read_short ;
+	func_int		read_int ;
+	func_float		read_float ;
+	func_double		read_double ;
+
+	func_short		write_short ;
+	func_int		write_int ;
+	func_float		write_float ;
+	func_double		write_double ;
+
+	func_wr_hdr		write_header ;
+	func_command	command ;
+	func_close		close ;
+
+} SF_PRIVATE ;
+
+enum
+{	SFE_NO_ERROR	= 0,
+
+	SFE_BAD_FILE,
+	SFE_OPEN_FAILED,
+	SFE_BAD_OPEN_FORMAT,
+	SFE_BAD_SNDFILE_PTR,
+	SFE_BAD_SF_INFO_PTR,
+	SFE_BAD_INT_FD,
+	SFE_BAD_INT_PTR,
+	SFE_MALLOC_FAILED, 
+	SFE_BAD_SEEK, 
+	SFE_NOT_SEEKABLE,
+	SFE_UNIMPLEMENTED,
+	SFE_BAD_READ_ALIGN,
+	SFE_BAD_WRITE_ALIGN,
+	SFE_UNKNOWN_FORMAT,
+	SFE_NOT_READMODE,
+	SFE_NOT_WRITEMODE,
+	SFE_BAD_MODE_RW,
+	SFE_BAD_SF_INFO,
+	SFE_SHORT_READ,
+	SFE_SHORT_WRITE,
+	SFE_INTERNAL,
+	SFE_BAD_CONTROL_CMD,
+	
+	SFE_WAV_NO_RIFF,
+	SFE_WAV_NO_WAVE,
+	SFE_WAV_NO_FMT,
+	SFE_WAV_FMT_SHORT,
+	SFE_WAV_FMT_TOO_BIG,
+	SFE_WAV_BAD_FACT,
+	SFE_WAV_BAD_PEAK,
+	SFE_WAV_PEAK_B4_FMT,
+	SFE_WAV_BAD_FORMAT,
+	SFE_WAV_BAD_BLOCKALIGN,
+	SFE_WAV_NO_DATA,
+	SFE_WAV_ADPCM_NOT4BIT,
+	SFE_WAV_ADPCM_CHANNELS,
+	SFE_WAV_GSM610_FORMAT,
+	SFE_WAV_UNKNOWN_CHUNK,
+
+	SFE_AIFF_NO_FORM,
+	SFE_AIFF_AIFF_NO_FORM,
+	SFE_AIFF_COMM_NO_FORM,
+	SFE_AIFF_SSND_NO_COMM,
+	SFE_AIFF_UNKNOWN_CHUNK,
+	SFE_AIFF_COMM_CHUNK_SIZE,
+	SFE_AIFF_BAD_COMM_CHUNK,
+	SFE_AIFF_PEAK_B4_COMM,
+	SFE_AIFF_BAD_PEAK,
+	SFE_AIFF_NO_SSND,
+	SFE_AIFF_NO_DATA,
+
+	SFE_AU_UNKNOWN_FORMAT,
+	SFE_AU_NO_DOTSND,
+	
+	SFE_RAW_READ_BAD_SPEC,
+	SFE_RAW_BAD_BITWIDTH,
+	
+	SFE_PAF_NO_MARKER,
+	SFE_PAF_VERSION,
+	SFE_PAF_UNKNOWN_FORMAT,
+	SFE_PAF_SHORT_HEADER,
+	
+	SFE_SVX_NO_FORM, 
+	SFE_SVX_NO_BODY,
+	SFE_SVX_NO_DATA,
+	SFE_SVX_BAD_COMP, 	
+
+	SFE_NIST_BAD_HEADER,
+	SFE_NIST_BAD_ENCODING,
+
+	SFE_SMTD_NO_SEKD, 
+	SFE_SMTD_NO_SAMR, 
+
+	SFE_VOC_NO_CREATIVE, 
+	SFE_VOC_BAD_VERSION, 
+	SFE_VOC_BAD_MARKER, 
+
+	SFE_IRCAM_NO_MARKER,
+	SFE_IRCAM_BAD_CHANNELS,
+	SFE_IRCAM_UNKNOWN_FORMAT,
+
+	SFE_MAX_ERROR			/* This must be last in list. */
+} ;
+
+/* Get the float32 capability of the processor at run time.
+**	Implemented in src/float32.c.
+*/
+int		float32_get_capability (int endianness) ;
+float	float32_read  (unsigned char *cptr) ;
+void	float32_write (float in, unsigned char *out) ;
+
+
+/* Endian swapping routines implemented in src/common.h. */
+
+void	endswap_short_array	(short *ptr, int len) ;
+void	endswap_int_array 	(int *ptr, int len) ;
+
+/* Functions for writing to the internal logging buffer. */
+
+void	psf_log_printf		(SF_PRIVATE *psf, char *format, ...) ;
+void	psf_log_SF_INFO 		(SF_PRIVATE *psf) ;
+
+/* Functions used when writing file headers. */
+
+int		psf_binheader_writef	(SF_PRIVATE *psf, char *format, ...) ;
+void	psf_asciiheader_printf	(SF_PRIVATE *psf, char *format, ...) ;
+
+/* Functions used when reading file headers. */
+
+int		psf_binheader_readf	(SF_PRIVATE *psf, char const *format, ...) ;
+
+/* Functions used in the write function for updating the peak chunk. */
+
+void	peak_update_short	(SF_PRIVATE *psf, short *ptr, size_t items) ;
+void	peak_update_int		(SF_PRIVATE *psf, int *ptr, size_t items) ;
+void	peak_update_double	(SF_PRIVATE *psf, double *ptr, size_t items) ;
+
+/* Init functions for a number of common data encodings. */
+
+int 	pcm_read_init  (SF_PRIVATE *psf) ;
+int 	pcm_write_init (SF_PRIVATE *psf) ;
+
+int 	ulaw_read_init  (SF_PRIVATE *psf) ;
+int 	ulaw_write_init (SF_PRIVATE *psf) ;
+
+int 	alaw_read_init  (SF_PRIVATE *psf) ;
+int 	alaw_write_init (SF_PRIVATE *psf) ;
+
+int 	float32_read_init  (SF_PRIVATE *psf) ;
+int 	float32_write_init (SF_PRIVATE *psf) ;
+
+/* Functions for reading and writing different file formats.*/
+
+int		aiff_open_read	(SF_PRIVATE *psf) ;
+int		aiff_open_write	(SF_PRIVATE *psf) ;
+
+int		au_open_read	(SF_PRIVATE *psf) ;
+int		au_nh_open_read	(SF_PRIVATE *psf) ;	/* Headerless version of AU. */
+int		au_open_write	(SF_PRIVATE *psf) ;
+
+int		wav_open_read	(SF_PRIVATE *psf) ;
+int		wav_open_write	(SF_PRIVATE *psf) ;
+
+int		raw_open_read	(SF_PRIVATE *psf) ;
+int		raw_open_write	(SF_PRIVATE *psf) ;
+
+int		paf_open_read	(SF_PRIVATE *psf) ;
+int		paf_open_write	(SF_PRIVATE *psf) ;
+
+int		svx_open_read	(SF_PRIVATE *psf) ;
+int		svx_open_write	(SF_PRIVATE *psf) ;
+
+int		nist_open_read	(SF_PRIVATE *psf) ;
+int		nist_open_write	(SF_PRIVATE *psf) ;
+
+int		smpltd_open_read	(SF_PRIVATE *psf) ;
+int		smpltd_open_write	(SF_PRIVATE *psf) ;
+
+int		voc_open_read	(SF_PRIVATE *psf) ;
+int		voc_open_write	(SF_PRIVATE *psf) ;
+
+int		rx2_open_read	(SF_PRIVATE *psf) ;
+int		rx2_open_write	(SF_PRIVATE *psf) ;
+
+int		ircam_open_read		(SF_PRIVATE *psf) ;
+int		ircam_open_write	(SF_PRIVATE *psf) ;
+
+
+/*	Win32 does seem to have snprintf and vsnprintf but prepends
+**	the names with an underscore. Why?
+*/
+
+#ifdef	WIN32
+#define	snprintf	_snprintf
+#define	vsnprintf	_vsnprintf
+#endif
+
+#ifdef _WIN32
+	#pragma pack(pop,1)
+#endif
+
+#endif /* COMMON_H_INCLUDED */
+
--- /dev/null
+++ b/common/libsndfile/src/config.h.in
@@ -1,0 +1,87 @@
+/* src/config.h.in.  Generated automatically from configure.in by autoheader 2.13.  */
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Set to 1 if the processor is big endian, otherwise set to 0.  */
+#undef GUESS_BIG_ENDIAN
+
+/* Set to 1 if the processor is little endian, otherwise set to 0.  */
+#undef GUESS_LITTLE_ENDIAN
+
+/* Set to 1 to force the use of code for processors with broken floats */
+/* Otherwise set it to 0.  */
+#undef FORCE_BROKEN_FLOAT
+
+/* The number of bytes in a double.  */
+#undef SIZEOF_DOUBLE
+
+/* The number of bytes in a float.  */
+#undef SIZEOF_FLOAT
+
+/* The number of bytes in a int.  */
+#undef SIZEOF_INT
+
+/* The number of bytes in a long.  */
+#undef SIZEOF_LONG
+
+/* The number of bytes in a short.  */
+#undef SIZEOF_SHORT
+
+/* The number of bytes in a void*.  */
+#undef SIZEOF_VOIDP
+
+/* Define if you have the fclose function.  */
+#undef HAVE_FCLOSE
+
+/* Define if you have the fopen function.  */
+#undef HAVE_FOPEN
+
+/* Define if you have the fread function.  */
+#undef HAVE_FREAD
+
+/* Define if you have the free function.  */
+#undef HAVE_FREE
+
+/* Define if you have the fseek function.  */
+#undef HAVE_FSEEK
+
+/* Define if you have the ftell function.  */
+#undef HAVE_FTELL
+
+/* Define if you have the fwrite function.  */
+#undef HAVE_FWRITE
+
+/* Define if you have the malloc function.  */
+#undef HAVE_MALLOC
+
+/* Define if you have the snprintf function.  */
+#undef HAVE_SNPRINTF
+
+/* Define if you have the vsnprintf function.  */
+#undef HAVE_VSNPRINTF
+
+/* Define if you have the <endian.h> header file.  */
+#undef HAVE_ENDIAN_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
--- /dev/null
+++ b/common/libsndfile/src/float32.c
@@ -1,0 +1,968 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*--------------------------------------------------------------------------------------------
+*/
+
+/*--------------------------------------------------------------------------------------------
+**	Prototypes for private functions.
+*/
+
+static int		host_read_f2s   (SF_PRIVATE *psf, short *ptr, int len) ;
+static int		host_read_f2i   (SF_PRIVATE *psf, int *ptr, int len) ;
+static int		host_read_f     (SF_PRIVATE *psf, float *ptr, int len) ;
+static int		host_read_f2d   (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int		host_write_s2f   (SF_PRIVATE *psf, short *ptr, int len) ;
+static int		host_write_i2f   (SF_PRIVATE *psf, int *ptr, int len) ;
+static int		host_write_f     (SF_PRIVATE *psf, float *ptr, int len) ;
+static int		host_write_d2f   (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static	void	f2s_array 	(float *buffer, unsigned int count, short *ptr, int index) ;
+static	void	f2i_array 	(float *buffer, unsigned int count, int *ptr, int index) ;
+static	void	f2d_array 	(float *buffer, unsigned int count, double *ptr, int index) ;
+
+static 	void	s2f_array 	(short *ptr, int index, float *buffer, unsigned int count) ;
+static 	void	i2f_array 	(int *ptr, int index, float *buffer, unsigned int count) ;
+static 	void	d2f_array 	(double *ptr, int index, float *buffer, unsigned int count) ;
+
+static void		float32_peak_update (SF_PRIVATE *psf, float *buffer, int count, int index) ;
+
+static int		broken_read_f2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int		broken_read_f2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int		broken_read_f   (SF_PRIVATE *psf, float *ptr, int len) ;
+static int		broken_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int		broken_write_s2f (SF_PRIVATE *psf, short *ptr, int len) ;
+static int		broken_write_i2f (SF_PRIVATE *psf, int *ptr, int len) ;
+static int		broken_write_f   (SF_PRIVATE *psf, float *ptr, int len) ;
+static int		broken_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static	void	bf2f_array (float *buffer, unsigned int count) ;
+static	void	f2bf_array (float *buffer, unsigned int count) ;
+
+/*--------------------------------------------------------------------------------------------
+**	Exported functions.
+*/
+
+int
+float32_read_init (SF_PRIVATE *psf)
+{	static int float_caps = FLOAT_UNKNOWN ;
+
+	if (float_caps == FLOAT_UNKNOWN)
+		float_caps = float32_get_capability (psf->endian) ;
+	
+	switch (psf->endian + 0x1000 * float_caps)
+	{	case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_BE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->read_short  = (func_short)  host_read_f2s ;
+				psf->read_int    = (func_int)    host_read_f2i ;
+				psf->read_float  = (func_float)  host_read_f ;
+				psf->read_double = (func_double) host_read_f2d ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_LE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->read_short  = (func_short)  host_read_f2s ;
+				psf->read_int    = (func_int)    host_read_f2i ;
+				psf->read_float  = (func_float)  host_read_f ;
+				psf->read_double = (func_double) host_read_f2d ;
+				break ;
+
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_LE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->read_short  = (func_short)  host_read_f2s ;
+				psf->read_int    = (func_int)    host_read_f2i ;
+				psf->read_float  = (func_float)  host_read_f ;
+				psf->read_double = (func_double) host_read_f2d ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_BE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->read_short  = (func_short)  host_read_f2s ;
+				psf->read_int    = (func_int)    host_read_f2i ;
+				psf->read_float  = (func_float)  host_read_f ;
+				psf->read_double = (func_double) host_read_f2d ;
+				break ;
+				
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_LE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->read_short  = (func_short)  broken_read_f2s ;
+				psf->read_int    = (func_int)    broken_read_f2i ;
+				psf->read_float  = (func_float)  broken_read_f ;
+				psf->read_double = (func_double) broken_read_f2d ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_LE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->read_short  = (func_short)  broken_read_f2s ;
+				psf->read_int    = (func_int)    broken_read_f2i ;
+				psf->read_float  = (func_float)  broken_read_f ;
+				psf->read_double = (func_double) broken_read_f2d ;
+				break ;
+				
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_BE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->read_short  = (func_short)  broken_read_f2s ;
+				psf->read_int    = (func_int)    broken_read_f2i ;
+				psf->read_float  = (func_float)  broken_read_f ;
+				psf->read_double = (func_double) broken_read_f2d ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_BE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->read_short  = (func_short)  broken_read_f2s ;
+				psf->read_int    = (func_int)    broken_read_f2i ;
+				psf->read_float  = (func_float)  broken_read_f ;
+				psf->read_double = (func_double) broken_read_f2d ;
+				break ;
+				
+		default : break ;
+		} ;
+
+	return 0 ;
+} /* float32_read_init */
+
+int
+float32_write_init (SF_PRIVATE *psf)
+{	static int float_caps = FLOAT_UNKNOWN ;
+
+	if (float_caps == FLOAT_UNKNOWN)
+		float_caps = float32_get_capability (psf->endian) ;
+	
+	switch (psf->endian + 0x1000 * float_caps)
+	{	case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_LE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->write_short  = (func_short)  host_write_s2f ;
+				psf->write_int    = (func_int)    host_write_i2f ;
+				psf->write_float  = (func_float)  host_write_f ;
+				psf->write_double = (func_double) host_write_d2f ;
+				break ;
+
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_BE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->write_short  = (func_short)  host_write_s2f ;
+				psf->write_int    = (func_int)    host_write_i2f ;
+				psf->write_float  = (func_float)  host_write_f ;
+				psf->write_double = (func_double) host_write_d2f ;
+				break ;
+				
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_CAN_RW_LE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->write_short  = (func_short)  host_write_s2f ;
+				psf->write_int    = (func_int)    host_write_i2f ;
+				psf->write_float  = (func_float)  host_write_f ;
+				psf->write_double = (func_double) host_write_d2f ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_CAN_RW_BE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->write_short  = (func_short)  host_write_s2f ;
+				psf->write_int    = (func_int)    host_write_i2f ;
+				psf->write_float  = (func_float)  host_write_f ;
+				psf->write_double = (func_double) host_write_d2f ;
+				break ;
+				
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_LE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->write_short  = (func_short)  broken_write_s2f ;
+				psf->write_int    = (func_int)    broken_write_i2f ;
+				psf->write_float  = (func_float)  broken_write_f ;
+				psf->write_double = (func_double) broken_write_d2f ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_LE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->write_short  = (func_short)  broken_write_s2f ;
+				psf->write_int    = (func_int)    broken_write_i2f ;
+				psf->write_float  = (func_float)  broken_write_f ;
+				psf->write_double = (func_double) broken_write_d2f ;
+				break ;
+				
+		case (SF_ENDIAN_BIG + 0x1000 * FLOAT_BROKEN_BE) :
+				psf->fl32_endswap = SF_FALSE ;
+				psf->write_short  = (func_short)  broken_write_s2f ;
+				psf->write_int    = (func_int)    broken_write_i2f ;
+				psf->write_float  = (func_float)  broken_write_f ;
+				psf->write_double = (func_double) broken_write_d2f ;
+				break ;
+				
+		case (SF_ENDIAN_LITTLE + 0x1000 * FLOAT_BROKEN_BE) :
+				psf->fl32_endswap = SF_TRUE ;
+				psf->write_short  = (func_short)  broken_write_s2f ;
+				psf->write_int    = (func_int)    broken_write_i2f ;
+				psf->write_float  = (func_float)  broken_write_f ;
+				psf->write_double = (func_double) broken_write_d2f ;
+				break ;
+				
+		default : break ;
+		} ;
+
+	return 0 ;
+} /* float32_write_init */	
+
+float	
+float32_read (unsigned char *cptr)
+{	int		exponent, mantissa, negative ;
+	float	fvalue ;
+
+	if (CPU_IS_LITTLE_ENDIAN)
+	{	negative = cptr [3] & 0x80 ;
+		exponent = ((cptr [3] & 0x7F) << 1) | ((cptr [2] & 0x80) ? 1 : 0);
+		mantissa = ((cptr [2] & 0x7F) << 16) | (cptr [1] << 8) | (cptr [0]) ;
+		}
+	else
+	{	negative = cptr [0] & 0x80 ;
+		exponent = ((cptr [0] & 0x7F) << 1) | ((cptr [1] & 0x80) ? 1 : 0);
+		mantissa = ((cptr [1] & 0x7F) << 16) | (cptr [2] << 8) | (cptr [3]) ;
+		} ;
+
+	if (! (exponent || mantissa))
+		return 0.0 ;
+
+	mantissa |= 0x800000 ;
+	exponent = exponent ? exponent - 127 : 0 ;
+                
+	fvalue = mantissa ? ((float) mantissa) / ((float) 0x800000) : 0.0 ;
+                
+	if (negative)
+		fvalue *= -1 ;
+                
+	if (exponent > 0)
+		fvalue *= (1 << exponent) ;
+	else if (exponent < 0)
+		fvalue /= (1 << abs (exponent)) ;
+
+	return fvalue ;
+} /* float32_read */
+
+void	
+float32_write (float in, unsigned char *out)
+{	int		exponent, mantissa, negative = 0 ;
+
+	*((int*) out) = 0 ;
+	
+	if (in == 0.0)
+		return ;
+	
+	if (in < 0.0)
+	{	in *= -1.0 ;
+		negative = 1 ;
+		} ;
+		
+	in = frexp (in, &exponent) ;
+	
+	exponent += 126 ;
+	
+	in *= (float) 0x1000000 ;
+	mantissa = (((int) in) & 0x7FFFFF) ;
+
+	if (CPU_IS_LITTLE_ENDIAN)	
+	{	if (negative)
+			out [3] |= 0x80 ;
+			
+		if (exponent & 0x01)
+			out [2] |= 0x80 ;
+	
+		out [0]  = mantissa & 0xFF ;
+		out [1]  = (mantissa >> 8) & 0xFF ;
+		out [2] |= (mantissa >> 16) & 0x7F ;
+		out [3] |= (exponent >> 1) & 0x7F ;
+		}
+	else
+	{	if (negative)
+			out [0] |= 0x80 ;
+			
+		if (exponent & 0x01)
+			out [1] |= 0x80 ;
+	
+		out [3]  = mantissa & 0xFF ;
+		out [2]  = (mantissa >> 8) & 0xFF ;
+		out [1] |= (mantissa >> 16) & 0x7F ;
+		out [0] |= (exponent >> 1) & 0x7F ;
+		}
+	
+	return ;
+} /* float32_write */
+
+/*==============================================================================================
+**	Private functions.
+*/
+
+static void
+float32_peak_update (SF_PRIVATE *psf, float *buffer, int count, int index)
+{	int		k, chan, position ;
+	float	fmaxval;
+	
+	for (chan = 0 ; chan < psf->sf.channels ; chan++)
+	{	fmaxval = fabs (buffer [chan]) ;
+		position = 0 ;
+		for (k = chan ; k < count ; k += psf->sf.channels)
+			if (fmaxval < fabs (buffer [k]))
+			{	fmaxval = fabs (buffer [k]) ;
+				position = k ;
+				} ;
+				
+		if (fmaxval > psf->peak.peak[chan].value)
+		{	psf->peak.peak[chan].value = fmaxval ;
+			psf->peak.peak[chan].position = psf->current + index + (position /psf->sf.channels) ;
+			} ;
+		} ;
+
+	return ;	
+} /* float32_peak_update */
+
+int
+float32_get_capability (int endianness)
+{	union 
+	{	float			f ;
+		int				i ;
+		unsigned char	c [4] ;
+	} data ;
+
+	data.f = 1.23456789 ; /* Some abitrary value. */
+	
+	if (FORCE_BROKEN_FLOAT || data.i != 0x3f9e0652)
+		return (CPU_IS_LITTLE_ENDIAN) ? FLOAT_BROKEN_LE : FLOAT_BROKEN_BE ;
+
+	/* If this test is true ints and floats are compatible and little endian. */
+	if (data.c [0] == 0x52 && data.c [1] == 0x06 && data.c [2] == 0x9e && data.c [3] == 0x3f)
+		return FLOAT_CAN_RW_LE ;
+
+	/* If this test is true ints and floats are compatible and big endian. */
+	if (data.c [3] == 0x52 && data.c [2] == 0x06 && data.c [1] == 0x9e && data.c [0] == 0x3f)
+		return FLOAT_CAN_RW_BE ;
+		
+	/* Floats are broken. Don't expect reading or writing to be fast. */
+	return 0 ;
+} /* float32_get_capability */
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+
+static int
+host_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_f2s */
+
+static int
+host_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_f2i */
+
+static int
+host_read_f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int	index = 0, total = 0 ;
+	
+	if (psf->fl32_endswap != SF_TRUE)
+		return fread (ptr, sizeof (float), len, psf->file) ; 
+	
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		
+		endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		memcpy (ptr + index, psf->buffer, thisread) ;
+
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_f */
+
+static int
+host_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int	index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* host_read_f2d */
+
+static int
+host_write_s2f	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_s2f */
+
+static int
+host_write_i2f	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_i2f */
+
+static int
+host_write_f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	float32_peak_update (psf, ptr, len, 0) ;
+			
+	if (psf->fl32_endswap != SF_TRUE)
+		return fwrite (ptr, sizeof (float), len, psf->file) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+
+		memcpy (psf->buffer, ptr + index, writecount) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_f */
+
+static int
+host_write_d2f	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+			
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* host_write_d2f */
+
+/*=======================================================================================
+*/
+
+static void	
+f2s_array (float *buffer, unsigned int count, short *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((double) buffer [k]) ;
+		index ++ ;
+		} ;
+} /* f2s_array */
+
+static void	
+f2i_array (float *buffer, unsigned int count, int *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = (int) ((double) buffer [k]) ;
+		index ++ ;
+		} ;
+} /* f2i_array */
+
+static void	
+f2d_array (float *buffer, unsigned int count, double *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((double) buffer [k]) ;
+		index ++ ;
+		} ;
+} /* f2d_array */
+
+static  void	
+s2f_array (short *ptr, int index, float *buffer, unsigned int count)
+{	int		k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (float) (ptr [index]) ;
+		index ++ ;
+		} ;
+		
+} /* s2f_array */
+
+static void	
+i2f_array (int *ptr, int index, float *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (float) (ptr [index]) ;
+		index ++ ;
+		} ;
+} /* i2f_array */
+
+static void	
+d2f_array (double *ptr, int index, float *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (float) (ptr [index]) ;
+		index ++ ;
+		} ;
+} /* d2f_array */
+
+/*=======================================================================================
+*/
+
+static int		
+broken_read_f2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	bytecount, readcount, bufferlen, thisread ;
+	int				index = 0, total = 0 ;
+		
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+		f2s_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* broken_read_f2s */
+
+static int		
+broken_read_f2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	bytecount, readcount, bufferlen, thisread ;
+	int				index = 0, total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+		f2i_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* broken_read_f2i */
+
+static int		
+broken_read_f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	bytecount, readcount, bufferlen, thisread ;
+	int				index = 0, total = 0 ;
+	
+	/* FIX THIS */
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+		memcpy (ptr + index, psf->buffer, readcount) ;
+		
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* broken_read_f */
+
+static int		
+broken_read_f2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	bytecount, readcount, bufferlen, thisread ;
+	int				index = 0, total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, readcount / sizeof (int)) ;
+
+		bf2f_array ((float *) (psf->buffer), readcount / psf->bytewidth) ;
+
+		f2d_array ((float*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* broken_read_f2d */
+
+static int	
+broken_write_s2f (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
+	int				index = 0, total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* broken_write_s2f */
+
+static int	
+broken_write_i2f (SF_PRIVATE *psf, int *ptr, int len) 
+{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
+	int				index = 0, total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* broken_write_i2f */
+
+static int	
+broken_write_f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
+	int				index = 0, total = 0 ;
+	
+	/* FIX THIS */
+	float32_peak_update (psf, ptr, len, 0) ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+
+		memcpy (psf->buffer, ptr + index, writecount) ;
+
+		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+		
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* broken_write_f */
+
+static int	
+broken_write_d2f (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	bytecount, writecount, bufferlen, thiswrite ;
+	int				index = 0, total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2f_array (ptr, index, (float*) (psf->buffer), writecount / psf->bytewidth) ;
+
+		float32_peak_update (psf, (float *) (psf->buffer), writecount / psf->bytewidth, index / psf->sf.channels) ;
+
+		f2bf_array ((float *) (psf->buffer), writecount / psf->bytewidth) ;
+
+		if (psf->fl32_endswap == SF_TRUE)
+			endswap_int_array ((int*) psf->buffer, writecount / sizeof (int)) ;
+
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* broken_write_d2f */
+
+/*==============================================================================
+*/
+
+/*----------------------------------------------------------------------------------------------
+*/
+
+static void	
+bf2f_array (float *buffer, unsigned int count)
+{	int	k ;
+	
+	for (k = 0 ; k < count ; k++)
+		buffer [k] = float32_read ((unsigned char *) (buffer + k)) ;
+} /* bf2f_array */
+
+static void	
+f2bf_array (float *buffer, unsigned int count)
+{	int	k ;
+	
+	for (k = 0 ; k < count ; k++)
+		float32_write (buffer [k], (unsigned char*) (buffer + k)) ;
+} /* f2bf_array */
+
--- /dev/null
+++ b/common/libsndfile/src/floatcast.h
@@ -1,0 +1,37 @@
+/*
+** Copyright (C) 2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* On Intel Pentium processors (especially PIII and probably P4), converting
+** from float to int is very slow. To meet the C specs, the code produced by 
+** most C compilers targeting Pentium needs to change the FPU rounding mode 
+** before the float to int conversion is performed. 
+**
+** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It 
+** is this flushing of the pipeline which is so slow.
+*/
+
+
+/* These macros are place holders for inline functions which will replace 
+** them in the near future.
+*/
+
+#define	FLOAT_TO_INT(x)		((int)(x))
+#define	FLOAT_TO_SHORT(x)	((short)(x))
+
+#define	DOUBLE_TO_INT(x)	((int)(x))
+#define	DOUBLE_TO_SHORT(x)	((short)(x))
--- /dev/null
+++ b/common/libsndfile/src/ircam.c
@@ -1,0 +1,332 @@
+/*
+** Copyright (C) 2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+/* The IRCAM magic number is weird in that one byte in the number can have
+** values of 0x1, 0x2, 0x03 or 0x04. Hence the need for a marker and a mask.
+*/
+
+#define IRCAM_02_MARKER	(MAKE_MARKER (0x00, 0x02, 0xA3, 0x64)) 
+#define IRCAM_03_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x03, 0x00)) 
+#define IRCAM_04_MARKER	(MAKE_MARKER (0x64, 0xA3, 0x04, 0x00)) 
+
+#define IRCAM_DATA_OFFSET	(1024)
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+enum
+{	IRCAM_PCM_16	= 0x00002,
+	IRCAM_FLOAT		= 0x00004,
+	IRCAM_ALAW		= 0x10001,
+	IRCAM_ULAW		= 0x20001,
+	IRCAM_PCM_32	= 0x40004
+} ;
+
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int		ircam_close		(SF_PRIVATE *psf) ;
+static	int		ircam_write_header (SF_PRIVATE *psf) ;
+
+static	int		get_encoding (SF_PRIVATE *psf) ;
+
+static	char*	get_encoding_str (int encoding) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+ircam_open_read	(SF_PRIVATE *psf)
+{	unsigned int	marker, encoding ;
+	float			samplerate ;
+	int				error = SFE_NO_ERROR ;
+	
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+	
+	if (marker == IRCAM_03_MARKER)
+	{	psf->endian = SF_ENDIAN_LITTLE ;
+		
+		if (CPU_IS_LITTLE_ENDIAN)
+			marker = ENDSWAP_INT (marker) ;
+		psf_log_printf (psf, "marker: 0x%X => little endian\n", marker) ;
+
+		psf_binheader_readf (psf, "fll", &samplerate, &(psf->sf.channels), &encoding) ;
+		
+		psf->sf.samplerate = (int) samplerate ;
+		psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;
+		psf_log_printf (psf, "  Channels    : %d\n", psf->sf.channels) ;
+		psf_log_printf (psf, "  Encoding    : %X => %s\n", encoding, get_encoding_str (encoding)) ;
+		}
+	else if (marker == IRCAM_02_MARKER || marker == IRCAM_04_MARKER)
+	{	psf->endian = SF_ENDIAN_BIG ;
+		
+		if (CPU_IS_BIG_ENDIAN)
+			marker = ENDSWAP_INT (marker) ;
+		psf_log_printf (psf, "marker: 0x%X => big endian\n", marker) ;
+
+		psf_binheader_readf (psf, "FLL", &samplerate, &(psf->sf.channels), &encoding) ;
+
+		psf->sf.samplerate = (int) samplerate ;
+		psf_log_printf (psf, "  Sample Rate : %d\n", psf->sf.samplerate) ;
+		psf_log_printf (psf, "  Channels    : %d\n", psf->sf.channels) ;
+		psf_log_printf (psf, "  Encoding    : %X => %s\n", encoding, get_encoding_str (encoding)) ;
+		}
+	else	
+		return SFE_IRCAM_NO_MARKER ;
+		
+	/* Sanit checking for endian-ness detection. */
+	if (psf->sf.channels > 256)
+		return SFE_IRCAM_BAD_CHANNELS ;
+
+	psf->sf.sections = 1 ;
+	psf->sf.seekable = SF_TRUE ;
+
+	switch (encoding)
+	{	case  IRCAM_PCM_16 :	
+				psf->sf.pcmbitwidth = 16 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				if (psf->endian == SF_ENDIAN_BIG)
+					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_BE ;
+				else
+					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_LE ;
+					
+				error = pcm_read_init (psf) ;
+				break ;
+
+		case IRCAM_PCM_32 :
+				psf->sf.pcmbitwidth = 32 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+				if (psf->endian == SF_ENDIAN_BIG)
+					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_BE ;
+				else
+					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_PCM_LE ;
+					
+				error = pcm_read_init (psf) ;
+				break ;
+	
+		case  IRCAM_FLOAT :
+				psf->sf.pcmbitwidth = 32 ;
+				psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+				psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+					
+				if (psf->endian == SF_ENDIAN_BIG)
+					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT_BE ;
+				else
+					psf->sf.format = SF_FORMAT_IRCAM | SF_FORMAT_FLOAT_LE ;
+					
+				error = float32_read_init (psf) ;
+				break ;
+
+		default : 
+				error = SFE_IRCAM_UNKNOWN_FORMAT ;
+				break ;
+		} ;
+
+	if (error)
+		return error ;
+		
+	psf->dataoffset = IRCAM_DATA_OFFSET ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	if (! psf->sf.samples && psf->blockwidth)
+		psf->sf.samples = psf->datalength / psf->blockwidth ;
+
+	psf_log_printf (psf, "  Samples     : %d\n", psf->sf.samples) ;
+
+	psf_binheader_readf (psf, "p", IRCAM_DATA_OFFSET) ;
+
+	return 0 ;
+} /* ircam_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+ircam_open_write	(SF_PRIVATE *psf)
+{	unsigned int	encoding, subformat ;
+	int				error = SFE_NO_ERROR ;
+
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_IRCAM)
+		return	SFE_BAD_OPEN_FORMAT ;
+		
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+		psf->bytewidth = 1 ;
+	else
+		psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+		
+	psf->sf.seekable = SF_TRUE ;
+	psf->error       = 0 ;
+
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+ 	psf->dataoffset  = IRCAM_DATA_OFFSET ;
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = psf->datalength + psf->dataoffset ;
+
+	if (! (encoding = ircam_write_header (psf)))
+		return psf->error ;
+
+	psf->close        = (func_close)  ircam_close ;
+	psf->write_header = (func_wr_hdr) ircam_write_header ;
+	
+	switch (encoding)
+	{	case  IRCAM_PCM_16 :	/* 16-bit linear PCM. */
+		case  IRCAM_PCM_32 :	/* 32-bit linear PCM. */
+				error = pcm_write_init (psf) ;
+				break ;
+				
+		case  IRCAM_FLOAT :	/* 32-bit linear PCM. */
+				error = float32_write_init (psf) ;
+				break ;
+				
+		default :   break ;
+		} ;
+		
+	return error ;
+} /* ircam_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int
+ircam_close	(SF_PRIVATE  *psf)
+{
+	return 0 ;
+} /* ircam_close */
+
+static int
+ircam_write_header (SF_PRIVATE *psf)
+{	int		encoding ;
+	float	samplerate ;
+
+	/* This also sets psf->endian. */
+	encoding = get_encoding (psf) ;
+	
+	if (! encoding)
+	{	psf->error = SFE_BAD_OPEN_FORMAT ;
+		return	encoding ;
+		} ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+	
+	samplerate = psf->sf.samplerate ;
+
+	if (psf->endian == SF_ENDIAN_BIG)
+	{	psf_binheader_writef (psf, "mF", IRCAM_02_MARKER, samplerate) ;
+		psf_binheader_writef (psf, "LL", psf->sf.channels, encoding) ;
+		}
+	else if  (psf->endian == SF_ENDIAN_LITTLE)
+	{	psf_binheader_writef (psf, "mf", IRCAM_03_MARKER, samplerate) ;
+		psf_binheader_writef (psf, "ll", psf->sf.channels, encoding) ;
+		}
+	else
+	{	psf->error = SFE_BAD_OPEN_FORMAT ;
+		return	encoding ;
+		} ;
+
+	psf_binheader_writef (psf, "z", IRCAM_DATA_OFFSET - psf->headindex) ;
+	
+	/* Header construction complete so write it out. */
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	return encoding ;
+} /* ircam_write_header */ 
+
+static int
+get_encoding (SF_PRIVATE *psf)
+{	unsigned int format, bitwidth ;
+
+	format = psf->sf.format & SF_FORMAT_SUBMASK ;
+	bitwidth = psf->bytewidth * 8 ;
+
+	/* Default endian-ness is the same as host processor unless overridden. */
+	if (format == SF_FORMAT_PCM_BE || format == SF_FORMAT_FLOAT_BE)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (format == SF_FORMAT_PCM_LE || format == SF_FORMAT_FLOAT_LE)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else if (CPU_IS_BIG_ENDIAN)
+		psf->endian = SF_ENDIAN_BIG ;
+	else	
+		psf->endian = SF_ENDIAN_LITTLE ;
+
+	switch (format)
+	{	case SF_FORMAT_ULAW :	return IRCAM_ULAW ;
+		case SF_FORMAT_ALAW :	return IRCAM_ALAW ;
+
+		case SF_FORMAT_PCM :
+		case SF_FORMAT_PCM_BE :
+		case SF_FORMAT_PCM_LE :
+				/* For PCM encoding, the header encoding field depends on the bitwidth. */
+				switch (bitwidth)
+				{	case	16 : return IRCAM_PCM_16 ;
+					case	32 : return	IRCAM_PCM_32 ;
+					default : break ;
+					} ;
+				break ;
+
+		case SF_FORMAT_FLOAT :
+		case SF_FORMAT_FLOAT_BE :	
+		case SF_FORMAT_FLOAT_LE :	
+				return IRCAM_FLOAT ;
+					
+		default : break ;
+		} ;
+
+	return 0 ;
+} /* get_encoding */
+
+static	char*	
+get_encoding_str (int encoding)
+{	switch (encoding)
+	{	case IRCAM_PCM_16	: return "16 bit PCM" ;
+		case IRCAM_FLOAT	: return "32 bit float" ;
+		case IRCAM_ALAW		: return "A law" ;
+		case IRCAM_ULAW		: return "u law" ;
+		case IRCAM_PCM_32	: return "32 bit PCM" ;
+		} ;
+	return "Unknown encoding" ;
+} /* get_encoding_str */
+
--- /dev/null
+++ b/common/libsndfile/src/nist.c
@@ -1,0 +1,274 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+**	Some of the information used to read NIST files was gleaned from 
+**	reading the code of Bill Schottstaedt's sndlib library 
+**		ftp://ccrma-ftp.stanford.edu/pub/Lisp/sndlib.tar.gz
+**	However, no code from that package was used.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+*/
+
+#define  NIST_HEADER_LENGTH    1024
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static	int	nist_close	(SF_PRIVATE *psf) ;
+static	void nist_write_header (SF_PRIVATE  *psf) ;
+
+/*------------------------------------------------------------------------------
+*/
+
+int 	
+nist_open_read	(SF_PRIVATE *psf)
+{	char	*psf_header ;
+	int		error ;
+
+	fseek (psf->file, 0, SEEK_SET) ;
+	
+	psf_header = (char*) psf->header ;
+
+	fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+	psf_log_printf (psf, psf_header) ;
+	if (strlen (psf_header) != 8 || strcmp (psf_header, "NIST_1A\n"))
+		return SFE_NIST_BAD_HEADER ;
+	
+	fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+	psf_log_printf (psf, psf_header) ;
+	if (strlen (psf_header) != 8 || atoi (psf_header) != 1024)
+		return SFE_NIST_BAD_HEADER ;
+
+	while (ftell (psf->file) < 1024 && !ferror (psf->file))
+	{	fgets (psf_header, SF_HEADER_LEN, psf->file) ;
+		psf_log_printf (psf, psf_header) ;
+		
+		if (strstr (psf_header, "channel_count -i ") == psf_header)
+			sscanf (psf_header, "channel_count -i %u", &(psf->sf.channels)) ;
+		
+		if (strstr (psf_header, "sample_count -i ") == psf_header)
+			sscanf (psf_header, "sample_count -i %u", &(psf->sf.samples)) ;
+
+		if (strstr (psf_header, "sample_rate -i ") == psf_header)
+			sscanf (psf_header, "sample_rate -i %u", &(psf->sf.samplerate)) ;
+
+		if (strstr (psf_header, "sample_n_bytes -i ") == psf_header)
+			sscanf (psf_header, "sample_n_bytes -i %u", &(psf->bytewidth)) ;
+
+		if (strstr (psf_header, "sample_sig_bits -i ") == psf_header)
+			sscanf (psf_header, "sample_sig_bits -i %u", &(psf->sf.pcmbitwidth)) ;
+
+		if (strstr (psf_header, "sample_byte_format -s") == psf_header)
+		{	int bytes ;
+			char str [8] = { 0, 0, 0, 0, 0, 0, 0, 0 } ;
+			
+			sscanf (psf_header, "sample_byte_format -s%d %5s", &bytes, str) ;
+			if (bytes < 2 || bytes > 4)
+				return SFE_NIST_BAD_ENCODING ;
+				
+			psf->bytewidth = bytes ;
+				
+			if (strstr (str, "01") == str)
+			{	psf->endian    = SF_ENDIAN_LITTLE ;
+				psf->sf.format = SF_FORMAT_NIST | SF_FORMAT_PCM_LE ;
+				}
+			else if (strstr (str, "10"))
+			{	psf->endian    = SF_ENDIAN_BIG ;
+				psf->sf.format = SF_FORMAT_NIST | SF_FORMAT_PCM_BE ;
+				} ;
+			} ;
+
+		if (strstr (psf_header, "sample_coding -s") == psf_header)
+			return SFE_NIST_BAD_ENCODING ;
+
+		if (strstr (psf_header, "end_head") == psf_header)
+			break ;
+		} ;
+		
+ 	psf->dataoffset = NIST_HEADER_LENGTH ;
+ 	psf->current  = 0 ;
+	psf->sf.seekable = SF_TRUE ;
+	psf->sf.sections = 1 ;
+
+	psf->close = (func_close) nist_close ;
+
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+	if ((error = pcm_read_init (psf)))
+		return error ;
+
+	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+
+	return 0 ;
+} /* nist_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+int 	
+nist_open_write	(SF_PRIVATE *psf)
+{	int subformat, error ;
+	
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_NIST)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (subformat == SF_FORMAT_PCM_BE)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (subformat == SF_FORMAT_PCM_LE)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else if (CPU_IS_BIG_ENDIAN && subformat == SF_FORMAT_PCM)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (CPU_IS_LITTLE_ENDIAN && subformat == SF_FORMAT_PCM)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else
+		return	SFE_BAD_OPEN_FORMAT ;
+		
+	psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+		
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+ 	psf->dataoffset  = NIST_HEADER_LENGTH ;
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = psf->datalength + psf->dataoffset ;
+	psf->error       = 0 ;
+
+	if ((error = pcm_write_init (psf)))
+		return error ;
+
+	psf->close        = (func_close)  nist_close ;
+	psf->write_header = (func_wr_hdr) nist_write_header ;
+		
+	nist_write_header (psf) ;
+	
+	return 0 ;
+} /* nist_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int	
+nist_close	(SF_PRIVATE  *psf)
+{
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can
+		**  re-write correct values for the datasize header element.
+		*/
+
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+
+		psf->dataoffset = NIST_HEADER_LENGTH ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		psf->sf.samples = psf->datalength / psf->blockwidth ;
+
+		nist_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* nist_close */
+
+/*=========================================================================
+*/
+
+static void 
+nist_write_header (SF_PRIVATE  *psf)
+{	char	*end_str ;
+
+	if (psf->endian == SF_ENDIAN_BIG)
+		end_str = "10" ;
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+		end_str = "01" ;
+	else
+		end_str = "error" ;
+
+	/* Clear the whole header. */
+	memset (psf->header, 0, sizeof (psf->header)) ;
+		
+	psf_asciiheader_printf (psf, "NIST_1A\n   1024\n") ;
+	psf_asciiheader_printf (psf, "channel_count -i %d\n", psf->sf.channels) ;
+	psf_asciiheader_printf (psf, "sample_rate -i %d\n", psf->sf.samplerate) ;
+	psf_asciiheader_printf (psf, "sample_n_bytes -i %d\n", psf->bytewidth) ;
+	psf_asciiheader_printf (psf, "sample_byte_format -s%d %s\n", psf->bytewidth, end_str) ;
+	psf_asciiheader_printf (psf, "sample_sig_bits -i %d\n", psf->sf.pcmbitwidth) ;
+	psf_asciiheader_printf (psf, "sample_count -i %d\n", psf->sf.samples) ;
+	psf_asciiheader_printf (psf, "end_head\n") ;
+
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	/* Zero fill to dataoffset. */
+	psf_binheader_writef (psf, "z", NIST_HEADER_LENGTH - psf->headindex) ;
+
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	return ;		
+} /* nist_write_header */
+
+/*-
+
+These were used to parse the sample_byte_format field but were discarded in favour
+os a simpler method using strstr ().
+
+static  
+int strictly_ascending (char *str)
+{	int  k ;
+
+	if (strlen (str) < 2)
+		return 0 ;
+
+	for (k = 1 ; str [k] ; k++) 
+		if (str [k] != str [k-1] + 1)
+			return 0 ;
+	
+	return 1 ;
+} /+* strictly_ascending *+/
+
+static  int strictly_descending (char *str)
+{	int  k ;
+
+	if (strlen (str) < 2)
+		return 0 ;
+
+	for (k = 1 ; str [k] ; k++) 
+		if (str [k] + 1 != str [k-1])
+			return 0 ;
+	
+	return 1 ;
+} /+* strictly_descending *+/
+
+-*/
--- /dev/null
+++ b/common/libsndfile/src/paf.c
@@ -1,0 +1,798 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"config.h"
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"floatcast.h"
+#include	"common.h"
+
+/*------------------------------------------------------------------------------
+** Macros to handle big/little endian issues.
+*/
+
+#define FAP_MARKER	(MAKE_MARKER ('f', 'a', 'p', ' ')) 
+#define PAF_MARKER	(MAKE_MARKER (' ', 'p', 'a', 'f')) 
+
+/*------------------------------------------------------------------------------
+** Other defines.
+*/
+
+#define	PAF_HEADER_LENGTH 	2048
+
+/*------------------------------------------------------------------------------
+** Typedefs.
+*/
+
+typedef	struct
+{	unsigned int	version ;
+	unsigned int	endianness ;
+    unsigned int	samplerate ;
+    unsigned int	format ;
+	unsigned int	channels ;
+	unsigned int	source ;
+} PAF_FMT ;
+
+typedef struct
+{	unsigned int	index, blocks, channels, samplesperblock, blockcount, blocksize, samplecount ;
+	unsigned char	*block ;
+	int				*samples ;
+	unsigned char	data [1] ; /* Data size fixed during malloc (). */
+} PAF24_PRIVATE ;
+
+/*------------------------------------------------------------------------------
+** Private static functions.
+*/
+
+static int paf24_reader_init (SF_PRIVATE  *psf) ;
+static int paf24_writer_init (SF_PRIVATE  *psf) ;
+
+static int paf24_read_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24) ;
+	
+static int paf24_close (SF_PRIVATE  *psf) ;
+
+static int paf24_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int paf24_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int paf24_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int paf24_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int paf24_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int paf24_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static long paf24_seek (SF_PRIVATE *psf, long offset, int whence) ;
+
+/*
+static void	endswap_paf_fmt (PAF_FMT *ppaf_fmt) ;
+*/
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+paf_open_read	(SF_PRIVATE *psf)
+{	PAF_FMT			paf_fmt ;
+	unsigned int	marker ;
+	int				error ;
+	
+	psf_binheader_readf (psf, "pm", 0, &marker) ;
+	
+	psf_log_printf (psf, "Signature   : %D\n", marker) ;
+
+	if (marker == PAF_MARKER)
+	{	psf_binheader_readf (psf, "LLLLLL", &(paf_fmt.version), &(paf_fmt.endianness), 
+			&(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ;
+		}
+	else if (marker == FAP_MARKER)
+	{	psf_binheader_readf (psf, "llllll", &(paf_fmt.version), &(paf_fmt.endianness), 
+			&(paf_fmt.samplerate), &(paf_fmt.format), &(paf_fmt.channels), &(paf_fmt.source)) ;
+		}
+	else
+		return SFE_PAF_NO_MARKER ;
+		
+	psf_log_printf (psf, "Version     : %d\n", paf_fmt.version) ;
+	if (paf_fmt.version != 0)
+	{	psf_log_printf (psf, "*** Bad version number. should be zero.\n") ;
+		return SFE_PAF_VERSION ;
+		} ;
+		
+	psf_log_printf (psf, "Endianness  : %d => ", paf_fmt.endianness) ;
+	if (paf_fmt.endianness)
+		psf_log_printf (psf, "Little\n", paf_fmt.endianness) ;
+	else
+		psf_log_printf (psf, "Big\n", paf_fmt.endianness) ;
+	psf_log_printf (psf, "Sample Rate : %d\n", paf_fmt.samplerate) ;
+
+	if (psf->filelength < PAF_HEADER_LENGTH)
+		return SFE_PAF_SHORT_HEADER ;
+		
+ 	psf->dataoffset = PAF_HEADER_LENGTH ;
+	psf->datalength = psf->filelength - psf->dataoffset ;
+
+ 	psf->current  = 0 ;
+	psf->endian   = paf_fmt.endianness ? SF_ENDIAN_LITTLE : SF_ENDIAN_BIG ;
+
+	psf_binheader_readf (psf, "p", psf->dataoffset) ;
+	
+	psf->sf.samplerate	= paf_fmt.samplerate ;
+	psf->sf.channels 	= paf_fmt.channels ;
+					
+	/* Only fill in type major. */
+	psf->sf.format = SF_FORMAT_PAF ;
+
+	psf->sf.sections 	= 1 ;
+
+	psf_log_printf (psf, "Format      : %d => ", paf_fmt.format) ;
+
+	switch (paf_fmt.format)
+	{	case  0 :	psf_log_printf (psf, "16 bit linear PCM\n") ;
+					psf->sf.pcmbitwidth = 16 ;
+					psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+					psf->sf.format |= paf_fmt.endianness ? SF_FORMAT_PCM_LE : SF_FORMAT_PCM_BE ; ;
+					
+					if ((error = pcm_read_init (psf)))
+						return error ;
+
+					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+
+	psf_log_printf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
+
+					if (psf->blockwidth)
+						psf->sf.samples = psf->datalength / psf->blockwidth ;
+					else
+						psf_log_printf (psf, "*** Warning : blockwidth == 0.\n") ;
+					
+	psf_log_printf (psf, "X samples : %d\n", psf->sf.samples) ;
+					break ;
+
+		case  1 :	psf_log_printf (psf, "24 bit linear PCM\n") ;
+					psf->sf.pcmbitwidth = 24 ;
+					psf->bytewidth      = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+					psf->sf.format |= paf_fmt.endianness ? SF_FORMAT_PCM_LE : SF_FORMAT_PCM_BE ; ;
+					
+					psf->read_short  = (func_short)  paf24_read_s ;
+					psf->read_int    = (func_int)    paf24_read_i ;
+					psf->read_float  = (func_float) paf24_read_f ;
+					psf->read_double = (func_double) paf24_read_d ;
+
+					if ((error = paf24_reader_init (psf)))
+						return error ;
+
+					psf->seek_func = (func_seek) paf24_seek ;
+					psf->close = (func_close) paf24_close ;
+
+					psf->blockwidth = psf->bytewidth * psf->sf.channels ;
+	psf_log_printf (psf, "X blockwidth : %d\n", psf->blockwidth) ;
+					psf->sf.samples = 10 * psf->datalength / (32 * psf->sf.channels) ;
+	psf_log_printf (psf, "X samples : %d\n", psf->sf.samples) ;
+					break ;
+		
+		default :   psf_log_printf (psf, "Unknown\n") ;
+					return SFE_PAF_UNKNOWN_FORMAT ;
+					break ;
+		} ;
+
+	psf_log_printf (psf, "Channels    : %d\n", paf_fmt.channels) ;
+	psf_log_printf (psf, "Source      : %d => ", paf_fmt.source) ;
+	
+	switch (paf_fmt.source)
+	{	case  1 : psf_log_printf (psf, "Analog Recording\n") ;
+					break ;
+		case  2 : psf_log_printf (psf, "Digital Transfer\n") ;
+					break ;
+		case  3 : psf_log_printf (psf, "Multi-track Mixdown\n") ;
+					break ;
+		case  5 : psf_log_printf (psf, "Audio Resulting From DSP Processing\n") ;
+					break ;
+		default : psf_log_printf (psf, "Unknown\n") ;
+					break ;
+		} ;
+
+	return 0 ;
+} /* paf_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+paf_open_write	(SF_PRIVATE *psf)
+{	PAF_FMT			paf_fmt ;
+	int				subformat, error, paf_format ;
+	
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_PAF)
+		return	SFE_BAD_OPEN_FORMAT ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (subformat == SF_FORMAT_PCM_BE)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (subformat == SF_FORMAT_PCM_LE)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else if (CPU_IS_BIG_ENDIAN && subformat == SF_FORMAT_PCM)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (CPU_IS_LITTLE_ENDIAN && subformat == SF_FORMAT_PCM)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else
+		return	SFE_BAD_OPEN_FORMAT ;
+		
+	psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+ 	psf->dataoffset  = PAF_HEADER_LENGTH ;
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = psf->datalength + psf->dataoffset ;
+	psf->error       = 0 ;
+
+	switch (psf->sf.pcmbitwidth)
+	{	case  16 : 	paf_format = 0 ;
+					psf->bytewidth = 2 ;
+					break ;
+
+		case  24 :	paf_format = 1 ;
+					psf->bytewidth = 3 ;
+					break ;
+	
+		default : return SFE_PAF_UNKNOWN_FORMAT ;
+		} ;
+		
+	switch (paf_format)
+	{	case  0 :	/* 16-bit linear PCM. */
+					if ((error = pcm_write_init (psf)))
+						return error ;
+					break ;
+
+		case  1 :	/* 24-bit linear PCM */
+					psf->write_short  = (func_short)  paf24_write_s ;
+					psf->write_int    = (func_int)    paf24_write_i ;
+					psf->write_float  = (func_float)  paf24_write_f ;
+					psf->write_double = (func_double) paf24_write_d ;
+					
+					if ((error = paf24_writer_init (psf)))
+						return error ;
+					
+					psf->seek_func = (func_seek) paf24_seek ;
+					psf->close = (func_close) paf24_close ;
+					break ;
+
+		default :   break ;
+		} ;
+	
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	
+	if (psf->endian == SF_ENDIAN_BIG)
+	{	/* Marker, version, endianness, samplerate */
+		psf_binheader_writef (psf, "mLLL", PAF_MARKER, 0, 0, psf->sf.samplerate) ;
+		/* format, channels, source */
+		psf_binheader_writef (psf, "LLL", paf_format, psf->sf.channels, paf_fmt.source) ;	
+		}
+	else if (psf->endian == SF_ENDIAN_LITTLE)
+	{	/* Marker, version, endianness, samplerate */
+		psf_binheader_writef (psf, "mlll", FAP_MARKER, 0, 1, psf->sf.samplerate) ;
+		/* format, channels, source */
+		psf_binheader_writef (psf, "lll", paf_format, psf->sf.channels, 0) ;
+		} ;
+
+	/* Zero fill to dataoffset. */
+	psf_binheader_writef (psf, "z", psf->dataoffset - psf->headindex) ;
+
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	return 0 ;
+} /* paf_open_write */
+
+/*===============================================================================
+**	24 bit PAF files have a really weird encoding. 
+**  For a mono file, 10 samples (each being 3 bytes) are packed into a 32 byte 
+**	block. The 8 ints in this 32 byte block are then endian swapped (as ints) 
+**	if necessary before being written to disk.
+**  For a stereo file, blocks of 10 samples from the same channel are encoded 
+**  into 32 bytes as fro the mono case. The 32 block bytes are then interleaved 
+**	on disk.
+**	Reading has to reverse the above process :-).
+**	Weird!!!
+**
+**	The code below attempts to gain efficiency while maintaining readability.
+*/
+
+static int 
+paf24_reader_init (SF_PRIVATE  *psf)
+{	PAF24_PRIVATE	*ppaf24 ; 
+	unsigned int	paf24size ;	
+	
+	paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * (32 + 10 * sizeof (int)) ;
+	if (! (psf->fdata = malloc (paf24size)))
+		return SFE_MALLOC_FAILED ;
+		
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	memset (ppaf24, 0, paf24size) ;
+	
+	ppaf24->channels = psf->sf.channels ;
+	ppaf24->block    = (unsigned char*) ppaf24->data ;
+	ppaf24->samples  = (int*) (ppaf24->data + 32 * ppaf24->channels) ;
+	
+	ppaf24->blocksize = 32 * ppaf24->channels ;
+	ppaf24->samplesperblock = 10 ;
+	
+	if (psf->datalength % ppaf24->blocksize)
+	{	psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
+		ppaf24->blocks = psf->datalength / ppaf24->blocksize  + 1 ;
+		}
+	else
+		ppaf24->blocks = psf->datalength / ppaf24->blocksize ;
+		
+	psf->sf.samples = ppaf24->samplesperblock * ppaf24->blocks ;
+
+	paf24_read_block (psf, ppaf24) ;	/* Read first block. */
+	
+	return 0 ;
+} /* paf24_reader_init */
+
+
+static int	
+paf24_read_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24)
+{	int				k, *iptr, newsample, channel ;
+	unsigned char	*cptr ;
+	
+	ppaf24->blockcount ++ ;
+	ppaf24->samplecount = 0 ;
+	
+	if (ppaf24->blockcount > ppaf24->blocks)
+	{	memset (ppaf24->samples, 0, ppaf24->samplesperblock * ppaf24->channels) ;
+		return 1 ;
+		} ;
+		
+	/* Read the block. */
+
+	if ((k = fread (ppaf24->block, 1, ppaf24->blocksize, psf->file)) != ppaf24->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, ppaf24->blocksize) ;
+
+	/* Do endian swapping if necessary. */
+
+	iptr = (int*) (ppaf24->data) ;
+	if ((CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_LITTLE) ||
+			(CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_BIG))
+	{	for (k = 0 ; k < 8 * ppaf24->channels ; k++)
+			iptr [k] = ENDSWAP_INT (iptr [k]) ;
+		} ;
+		
+	/* Unpack block. */	
+
+	for (k = 0 ; k < 10 * ppaf24->channels ; k++)
+	{	channel = k % ppaf24->channels ;
+		cptr = ppaf24->block + 32 * channel + 3 * (k / ppaf24->channels) ;
+		newsample = (cptr [0] << 8) | (cptr [1] << 16) | (cptr [2] << 24) ;
+		ppaf24->samples [k] = newsample / 256 ;
+		} ;
+
+	return 1 ;
+} /* paf24_read_block */
+
+static int 
+paf24_read (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	if (ppaf24->blockcount >= ppaf24->blocks && ppaf24->samplecount >= ppaf24->samplesperblock)
+		{	memset (&(ptr[index]), 0, (len - index) * sizeof (int)) ;
+			return total ;
+			} ;
+		
+		if (ppaf24->samplecount >= ppaf24->samplesperblock)
+			paf24_read_block (psf, ppaf24) ;
+		
+		count = (ppaf24->samplesperblock - ppaf24->samplecount) * ppaf24->channels ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(ppaf24->samples [ppaf24->samplecount * ppaf24->channels]), count * sizeof (int)) ;
+		index += count ;
+		ppaf24->samplecount += count / ppaf24->channels ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* paf24_read */
+
+static int 
+paf24_read_s (SF_PRIVATE *psf, short *ptr, int len)
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				*iptr ;
+	int				k, bufferlen, readcount = 0, count ;
+	int				index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = paf24_read (psf, ppaf24, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (short) (iptr [k] / 256) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* paf24_read_s */
+
+static int 
+paf24_read_i (SF_PRIVATE *psf, int *ptr, int len) 
+{	PAF24_PRIVATE *ppaf24 ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	total = paf24_read (psf, ppaf24, ptr, len) ;
+
+	return total ;
+} /* paf24_read_i */
+
+static int 
+paf24_read_f (SF_PRIVATE *psf, float *ptr, int len)
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				*iptr ;
+	int				k, bufferlen, readcount = 0, count ;
+	int				index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = paf24_read (psf, ppaf24, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (float) (iptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* paf24_read_f */
+
+static int 
+paf24_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				*iptr ;
+	int				k, bufferlen, readcount = 0, count ;
+	int				index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = paf24_read (psf, ppaf24, iptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (double) (iptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* paf24_read_d */
+
+/*---------------------------------------------------------------------------
+*/
+
+static int 
+paf24_writer_init (SF_PRIVATE  *psf)
+{	PAF24_PRIVATE	*ppaf24 ; 
+	unsigned int	paf24size ;	
+	
+	paf24size = sizeof (PAF24_PRIVATE) + psf->sf.channels * (32 + 10 * sizeof (int)) ;
+	if (! (psf->fdata = malloc (paf24size)))
+		return SFE_MALLOC_FAILED ;
+		
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	memset (ppaf24, 0, paf24size) ;
+	
+	ppaf24->channels = psf->sf.channels ;
+	ppaf24->block    = (unsigned char*) ppaf24->data ;
+	ppaf24->samples  = (int*) (ppaf24->data + 32 * ppaf24->channels) ;
+	
+	ppaf24->blocksize = 32 * ppaf24->channels ;
+	ppaf24->samplesperblock = 10 ;
+	
+	if (psf->datalength % ppaf24->blocksize)
+	{	psf_log_printf (psf, "*** Warning : file seems to be truncated.\n") ;
+		ppaf24->blocks = psf->datalength / ppaf24->blocksize  + 1 ;
+		}
+	else
+		ppaf24->blocks = psf->datalength / ppaf24->blocksize ;
+		
+	psf->sf.samples = ppaf24->samplesperblock * ppaf24->blocks ;
+
+	return 0 ;
+} /* paf24_writer_init */
+
+
+static int	
+paf24_write_block (SF_PRIVATE  *psf, PAF24_PRIVATE *ppaf24)
+{	int				k, *iptr, nextsample, channel ;
+	unsigned char	*cptr ;
+	
+	/* First pack block. */	
+
+	for (k = 0 ; k < 10 * ppaf24->channels ; k++)
+	{	channel = k % ppaf24->channels ;
+		cptr = ppaf24->block + 32 * channel + 3 * (k / ppaf24->channels) ;
+		nextsample = ppaf24->samples [k] ;
+		cptr [0] = nextsample & 0xFF ;
+		cptr [1] = (nextsample >> 8) & 0xFF ;
+		cptr [2] = (nextsample >> 16) & 0xFF ;
+		} ;
+	
+	/* Do endian swapping if necessary. */
+
+	iptr = (int*) (ppaf24->data) ;
+	if ((CPU_IS_BIG_ENDIAN && psf->endian == SF_ENDIAN_LITTLE) ||
+			(CPU_IS_LITTLE_ENDIAN && psf->endian == SF_ENDIAN_BIG))
+	{	for (k = 0 ; k < 8 * ppaf24->channels ; k++)
+			iptr [k] = ENDSWAP_INT (iptr [k]) ;
+		} ;
+		
+	/* Write block to disk. */
+	
+	if ((k = fwrite (ppaf24->block, 1, ppaf24->blocksize, psf->file)) != ppaf24->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, ppaf24->blocksize) ;
+
+	ppaf24->blockcount ++ ;
+	ppaf24->samplecount = 0 ;
+	
+	return 1 ;
+} /* paf24_write_block */
+
+static int 
+paf24_write (SF_PRIVATE *psf, PAF24_PRIVATE *ppaf24, int *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = (ppaf24->samplesperblock - ppaf24->samplecount) * ppaf24->channels ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(ppaf24->samples [ppaf24->samplecount * ppaf24->channels]), &(ptr [index]), count * sizeof (int)) ;
+		index += count ;
+		ppaf24->samplecount += count / ppaf24->channels ;
+		total = index ;
+
+		if (ppaf24->samplecount >= ppaf24->samplesperblock)
+			paf24_write_block (psf, ppaf24) ;	
+		} ;
+
+	return total ;		
+} /* paf24_write */
+
+static int 
+paf24_write_s (SF_PRIVATE *psf, short *ptr, int len)
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				*iptr ;
+	int				k, bufferlen, writecount = 0, count ;
+	int				index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = ((int) ptr [index+k]) * 256 ;
+		count = paf24_write (psf, ppaf24, iptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* paf24_write_s */
+
+static int 
+paf24_write_i (SF_PRIVATE *psf, int *ptr, int len)
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	total = paf24_write (psf, ppaf24, ptr, len) ;
+
+	return total ;
+} /* paf24_write_i */
+
+static int 
+paf24_write_f (SF_PRIVATE *psf, float *ptr, int len) 
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				*iptr ;
+	int				k, bufferlen, writecount = 0, count ;
+	int				index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = FLOAT_TO_INT (ptr [index+k]) ;
+		count = paf24_write (psf, ppaf24, iptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* paf24_write_f */
+
+static int 
+paf24_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) 
+{	PAF24_PRIVATE 	*ppaf24 ; 
+	int				*iptr ;
+	int				k, bufferlen, writecount = 0, count ;
+	int				index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	iptr = (int*) psf->buffer ;
+	bufferlen = psf->sf.channels * ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (int) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			iptr [k] = DOUBLE_TO_INT (ptr [index+k]) ;
+		count = paf24_write (psf, ppaf24, iptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* paf24_write_d */
+
+/*---------------------------------------------------------------------------
+*/
+
+static long 
+paf24_seek (SF_PRIVATE *psf, long offset, int whence)
+{	PAF24_PRIVATE	*ppaf24 ; 
+	int				newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+
+	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+		
+	switch (whence)
+	{	case SEEK_SET :
+				if (offset < 0 || offset > ppaf24->blocks * ppaf24->samplesperblock)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = offset / ppaf24->samplesperblock ;
+				newsample = offset % ppaf24->samplesperblock ;
+				break ;
+				
+		case SEEK_CUR :
+				if (psf->current + offset < 0 || psf->current + offset > ppaf24->blocks * ppaf24->samplesperblock)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (psf->current + offset) / ppaf24->samplesperblock ;
+				newsample = (psf->current + offset) % ppaf24->samplesperblock ;
+				break ;
+				
+		case SEEK_END :
+				if (offset > 0 || ppaf24->samplesperblock * ppaf24->blocks + offset < 0)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (ppaf24->samplesperblock * ppaf24->blocks + offset) / ppaf24->samplesperblock ;
+				newsample = (ppaf24->samplesperblock * ppaf24->blocks + offset) % ppaf24->samplesperblock ;
+				break ;
+				
+		default : 
+				psf->error = SFE_BAD_SEEK ;
+				return	((long) -1) ;
+		} ;
+		
+	if (psf->mode == SF_MODE_READ)
+	{	fseek (psf->file, (int) (psf->dataoffset + newblock * ppaf24->blocksize), SEEK_SET) ;
+		ppaf24->blockcount  = newblock ;
+		paf24_read_block (psf, ppaf24) ;
+		ppaf24->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	psf->current = newblock * ppaf24->samplesperblock + newsample ;
+
+	return psf->current ;
+} /* paf24_seek */
+
+/*---------------------------------------------------------------------------
+*/
+
+static int 
+paf24_close (SF_PRIVATE  *psf)
+{	PAF24_PRIVATE *ppaf24 ; 
+	
+	if (! psf->fdata)
+		return 0 ;
+		
+	ppaf24 = (PAF24_PRIVATE*) psf->fdata ;
+	
+	if (psf->mode == SF_MODE_WRITE)
+	{	if (ppaf24->samplecount && ppaf24->samplecount < ppaf24->samplesperblock)
+			paf24_write_block (psf, ppaf24) ;	
+		} ;
+		
+	free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* paf24_close */
+
+/*---------------------------------------------------------------------------
+*/
+
+/*-
+static void
+endswap_paf_fmt (PAF_FMT *ppaf_fmt)
+{	ppaf_fmt->version    = ENDSWAP_INT (ppaf_fmt->version) ;
+	ppaf_fmt->endianness = ENDSWAP_INT (ppaf_fmt->endianness) ;
+	ppaf_fmt->samplerate = ENDSWAP_INT (ppaf_fmt->samplerate) ;
+	ppaf_fmt->format     = ENDSWAP_INT (ppaf_fmt->format) ;
+	ppaf_fmt->channels   = ENDSWAP_INT (ppaf_fmt->channels) ;
+	ppaf_fmt->source     = ENDSWAP_INT (ppaf_fmt->source) ;
+} /+* endswap_paf_fmt *+/
+-*/
--- /dev/null
+++ b/common/libsndfile/src/pcm.c
@@ -1,0 +1,2659 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<unistd.h>
+
+#include	"config.h"
+#include	"sndfile.h"
+#include	"sfendian.h"
+#include	"floatcast.h"
+#include	"common.h"
+
+/* Important!!! Do not assume that sizeof (tribyte) == 3. Some compilers 
+** (Metrowerks CodeWarrior for Mac is one) pad the struct with an extra byte.
+*/
+
+typedef	struct
+{	char	bytes [3] ;
+} tribyte ;
+
+static int	pcm_read_sc2s  (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_uc2s  (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len) ;
+
+static int	pcm_read_sc2i  (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_uc2i  (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len) ;
+
+static int	pcm_read_sc2f  (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_uc2f  (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len) ;
+
+static int	pcm_read_sc2d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_uc2d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+
+static int	pcm_write_s2sc  (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2uc  (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2bes (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2les (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2bet (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2let (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2bei (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	pcm_write_s2lei (SF_PRIVATE *psf, short *ptr, int len) ;
+
+static int	pcm_write_i2sc  (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2uc  (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2bes (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2les (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2bet (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2let (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2bei (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	pcm_write_i2lei (SF_PRIVATE *psf, int *ptr, int len) ;
+
+static int	pcm_write_f2sc  (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2uc  (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2bes (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2les (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2bet (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2let (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2bei (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	pcm_write_f2lei (SF_PRIVATE *psf, float *ptr, int len) ;
+
+static int	pcm_write_d2sc  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2uc  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2bes (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2les (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2bet (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2let (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2bei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+static int	pcm_write_d2lei (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static	void	sc2s_array	(signed char *buffer, unsigned int count, short *ptr, int index) ;
+static	void	uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr, int index) ;
+static	void	bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
+static	void	let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index) ;
+static	void	bei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
+static	void	lei2s_array (int *buffer, unsigned int count, short *ptr, int index) ;
+
+static	void	sc2i_array	(signed char *buffer, unsigned int count, int *ptr, int index) ;
+static	void	uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr, int index) ;
+static	void	bes2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
+static	void	les2i_array (short *buffer, unsigned int count, int *ptr, int index) ;
+static	void	bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
+static	void	let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index) ;
+
+static	void	sc2f_array	(signed char *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+static	void	lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact) ;
+
+static	void	sc2d_array	(signed char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+static	void	lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact) ;
+
+
+static	void	s2sc_array	(short *ptr, int index, signed char *buffer, unsigned int count) ;
+static	void	s2uc_array	(short *ptr, int index, unsigned char *buffer, unsigned int count) ;
+static	void	s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
+static	void	s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count) ;
+static	void	s2bei_array (short *ptr, int index, int *buffer, unsigned int count) ;
+static	void	s2lei_array (short *ptr, int index, int *buffer, unsigned int count) ;
+
+static	void	i2sc_array	(int *ptr, int index, signed char *buffer, unsigned int count) ;
+static	void	i2uc_array	(int *ptr, int index, unsigned char *buffer, unsigned int count) ;
+static	void	i2bes_array (int *ptr, int index, short *buffer, unsigned int count) ;
+static	void	i2les_array (int *ptr, int index, short *buffer, unsigned int count) ;
+static	void	i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
+static	void	i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count) ;
+
+static	void	f2sc_array	(float *ptr, int index, signed char *buffer, unsigned int count, float normfact) ;
+static	void	f2uc_array	(float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact) ;
+static	void	f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;
+static	void	f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact) ;
+static	void	f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;
+static	void	f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact) ;
+static 	void	f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;
+static 	void	f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact) ;
+
+static	void	d2sc_array	(double *ptr, int index, signed char *buffer, unsigned int count, double normfact) ;
+static	void	d2uc_array	(double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact) ;
+static	void	d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
+static	void	d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact) ;
+static	void	d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
+static	void	d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact) ;
+static 	void	d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
+static 	void	d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact) ;
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+int
+pcm_read_init (SF_PRIVATE *psf)
+{
+	if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)
+	{	psf->read_short  = (func_short)  pcm_read_sc2s ;
+		psf->read_int    = (func_int)    pcm_read_sc2i ;
+		psf->read_float  = (func_float)  pcm_read_sc2f ;
+		psf->read_double = (func_double) pcm_read_sc2d ;
+		return 0 ;
+		} 
+	else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)
+	{	psf->read_short  = (func_short)  pcm_read_uc2s ;
+		psf->read_int    = (func_int)    pcm_read_uc2i ;
+		psf->read_float  = (func_float)  pcm_read_uc2f ;
+		psf->read_double = (func_double) pcm_read_uc2d ;
+		return 0 ;
+		} ;
+		
+	switch (psf->bytewidth * 0x10000 + psf->endian)
+	{	case  (2 * 0x10000 + SF_ENDIAN_BIG) :
+				psf->read_short  = (func_short)  pcm_read_bes2s ;
+				psf->read_int    = (func_int)    pcm_read_bes2i ;
+				psf->read_float  = (func_float)  pcm_read_bes2f ;
+				psf->read_double = (func_double) pcm_read_bes2d ;
+				break ;
+		case  (3 * 0x10000 + SF_ENDIAN_BIG) :
+				psf->read_short  = (func_short)  pcm_read_bet2s ;
+				psf->read_int    = (func_int)    pcm_read_bet2i ;
+				psf->read_float  = (func_float)  pcm_read_bet2f ;
+				psf->read_double = (func_double) pcm_read_bet2d ;
+				break ;
+		case  (4 * 0x10000 + SF_ENDIAN_BIG) :
+				psf->read_short  = (func_short)  pcm_read_bei2s ;
+				psf->read_int    = (func_int)    pcm_read_bei2i ;
+				psf->read_float  = (func_float)  pcm_read_bei2f ;
+				psf->read_double = (func_double) pcm_read_bei2d ;
+				break ;
+				
+		case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+				psf->read_short  = (func_short)  pcm_read_les2s ;
+				psf->read_int    = (func_int)    pcm_read_les2i ;
+				psf->read_float  = (func_float)  pcm_read_les2f ;
+				psf->read_double = (func_double) pcm_read_les2d ;
+				break ;
+		case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+				psf->read_short  = (func_short)  pcm_read_let2s ;
+				psf->read_int    = (func_int)    pcm_read_let2i ;
+				psf->read_float  = (func_float)  pcm_read_let2f ;
+				psf->read_double = (func_double) pcm_read_let2d ;
+				break ;
+		case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+				psf->read_short  = (func_short)  pcm_read_lei2s ;
+				psf->read_int    = (func_int)    pcm_read_lei2i ;
+				psf->read_float  = (func_float)  pcm_read_lei2f ;
+				psf->read_double = (func_double) pcm_read_lei2d ;
+				break ;
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return 0 ;
+} /* pcm_read_init */
+
+int
+pcm_write_init (SF_PRIVATE *psf)
+{
+	if (psf->bytewidth == 1 && psf->chars == SF_CHARS_SIGNED)
+	{	psf->write_short  = (func_short)  pcm_write_s2sc ;
+		psf->write_int    = (func_int)    pcm_write_i2sc ;
+		psf->write_float  = (func_float)  pcm_write_f2sc ;
+		psf->write_double = (func_double) pcm_write_d2sc ;
+		return 0 ;
+		} 
+	else if (psf->bytewidth == 1 && psf->chars == SF_CHARS_UNSIGNED)
+	{	psf->write_short  = (func_short)  pcm_write_s2uc ;
+		psf->write_int    = (func_int)    pcm_write_i2uc ;
+		psf->write_float  = (func_float)  pcm_write_f2uc ;
+		psf->write_double = (func_double) pcm_write_d2uc ;
+		return 0 ;
+		} ;
+		
+	switch (psf->bytewidth * 0x10000 + psf->endian)
+	{	case  (2 * 0x10000 + SF_ENDIAN_BIG) :
+				psf->write_short  = (func_short)  pcm_write_s2bes ;
+				psf->write_int    = (func_int)    pcm_write_i2bes ;
+				psf->write_float  = (func_float)  pcm_write_f2bes ;
+				psf->write_double = (func_double) pcm_write_d2bes ;
+				break ;
+				
+		case  (3 * 0x10000 + SF_ENDIAN_BIG) :
+				psf->write_short  = (func_short)  pcm_write_s2bet ;
+				psf->write_int    = (func_int)    pcm_write_i2bet ;
+				psf->write_float  = (func_float)  pcm_write_f2bet ;
+				psf->write_double = (func_double) pcm_write_d2bet ;
+				break ;
+				
+		case  (4 * 0x10000 + SF_ENDIAN_BIG) :
+				psf->write_short  = (func_short)  pcm_write_s2bei ;
+				psf->write_int    = (func_int)    pcm_write_i2bei ;
+				psf->write_float  = (func_float)  pcm_write_f2bei ;
+				psf->write_double = (func_double) pcm_write_d2bei ;
+				break ;
+				
+		case  (2 * 0x10000 + SF_ENDIAN_LITTLE) :
+				psf->write_short  = (func_short)  pcm_write_s2les ;
+				psf->write_int    = (func_int)    pcm_write_i2les ;
+				psf->write_float  = (func_float)  pcm_write_f2les ;
+				psf->write_double = (func_double) pcm_write_d2les ;
+				break ;
+				
+		case  (3 * 0x10000 + SF_ENDIAN_LITTLE) :
+				psf->write_short  = (func_short)  pcm_write_s2let ;
+				psf->write_int    = (func_int)    pcm_write_i2let ;
+				psf->write_float  = (func_float)  pcm_write_f2let ;
+				psf->write_double = (func_double) pcm_write_d2let ;
+				break ;
+				
+		case  (4 * 0x10000 + SF_ENDIAN_LITTLE) :
+				psf->write_short  = (func_short)  pcm_write_s2lei ;
+				psf->write_int    = (func_int)    pcm_write_i2lei ;
+				psf->write_float  = (func_float)  pcm_write_f2lei ;
+				psf->write_double = (func_double) pcm_write_d2lei ;
+				break ;
+				
+		default : return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return 0 ;
+} /* pcm_read_init */
+
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int		
+pcm_read_sc2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		sc2s_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_sc2s */
+
+static int
+pcm_read_uc2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		uc2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_uc2s */
+
+static int
+pcm_read_bes2s (SF_PRIVATE *psf, short *ptr, int len)
+{	int		total ;
+
+	total = fread (ptr, 1, len * sizeof (short), psf->file) ;
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_short_array	(ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bes2s */
+
+static int
+pcm_read_les2s (SF_PRIVATE *psf, short *ptr, int len)
+{	int		total ;
+
+	total = fread (ptr, 1, len * sizeof (short), psf->file) ;
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_short_array	(ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_les2s */
+
+static int
+pcm_read_bet2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bet2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bet2s */
+
+static int
+pcm_read_let2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		let2s_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_let2s */
+
+static int
+pcm_read_bei2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bei2s */
+
+static int
+pcm_read_lei2s (SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		lei2s_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_lei2s */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_read_sc2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		sc2i_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+	
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_sc2i */
+
+static int
+pcm_read_uc2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		uc2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+	
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_uc2i */
+
+static int
+pcm_read_bes2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bes2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bes2i */
+
+static int
+pcm_read_les2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		les2i_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_les2i */
+
+static int
+pcm_read_bet2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bet2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bet2i */
+
+static int
+pcm_read_let2i (SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		let2i_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_let2i */
+
+static int
+pcm_read_bei2i (SF_PRIVATE *psf, int *ptr, int len)
+{	int		total ;
+
+	total = fread (ptr, 1, len * sizeof (int), psf->file) ;
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_int_array	(ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bei2i */
+
+static int
+pcm_read_lei2i (SF_PRIVATE *psf, int *ptr, int len)
+{	int		total ;
+
+	total = fread (ptr, 1, len * sizeof (int), psf->file) ;
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_int_array	(ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_lei2i */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_read_sc2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		sc2f_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_sc2f */
+
+static int
+pcm_read_uc2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		uc2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_uc2f */
+
+static int
+pcm_read_bes2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bes2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bes2f */
+
+static int
+pcm_read_les2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		les2f_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_les2f */
+
+static int
+pcm_read_bet2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x800000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bet2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bet2f */
+
+static int
+pcm_read_let2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x800000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		let2f_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_let2f */
+
+static int
+pcm_read_bei2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bei2f */
+
+static int
+pcm_read_lei2f (SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x80000000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		lei2f_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_lei2f */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_read_sc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x80) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		sc2d_array ((signed char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_sc2d */
+
+static int
+pcm_read_uc2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x80) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		uc2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_uc2d */
+
+static int
+pcm_read_bes2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bes2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bes2d */
+
+static int
+pcm_read_les2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		les2d_array ((short*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_les2d */
+
+static int
+pcm_read_bet2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x800000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bet2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bet2d */
+
+static int
+pcm_read_let2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x800000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		let2d_array ((tribyte*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_let2d */
+
+static int
+pcm_read_bei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x80000000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		bei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_bei2d */
+
+static int
+pcm_read_lei2d (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int readcount, thisread ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double		normfact ;
+
+	normfact = (normalize ? 1.0 / ((double) 0x80000000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		lei2d_array ((int*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* pcm_read_lei2d */
+
+/*===============================================================================================
+**-----------------------------------------------------------------------------------------------
+**===============================================================================================
+*/
+
+static int
+pcm_write_s2sc	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2sc */
+
+static int
+pcm_write_s2uc	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2uc */
+
+static int
+pcm_write_s2bes	(SF_PRIVATE *psf, short *ptr, int len)
+{	int		total ;
+
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_short_array (ptr, len) ;
+	total = fwrite (ptr, 1, len * sizeof (short), psf->file) ;
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_short_array (ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2bes */
+
+static int
+pcm_write_s2les	(SF_PRIVATE *psf, short *ptr, int len)
+{	int		total ;
+
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_short_array (ptr, len) ;
+	total = fwrite (ptr, 1, len * sizeof (short), psf->file) ;
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_short_array (ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2les */
+
+static int
+pcm_write_s2bet	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2bet */
+
+static int
+pcm_write_s2let	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2let */
+
+static int
+pcm_write_s2bei	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2bei */
+
+static int
+pcm_write_s2lei	(SF_PRIVATE *psf, short *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_s2lei */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_write_i2sc	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2sc */
+
+static int
+pcm_write_i2uc	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2uc */
+
+static int
+pcm_write_i2bes	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2bes */
+
+static int
+pcm_write_i2les	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2les */
+
+static int
+pcm_write_i2bet	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2bet */
+
+static int
+pcm_write_i2let	(SF_PRIVATE *psf, int *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2les */
+
+static int
+pcm_write_i2bei	(SF_PRIVATE *psf, int *ptr, int len)
+{	int		total ;
+
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_int_array (ptr, len) ;
+	total = fwrite (ptr, 1, len * sizeof (int), psf->file) ;
+	if (CPU_IS_LITTLE_ENDIAN)
+		endswap_int_array (ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2bei */
+
+static int
+pcm_write_i2lei	(SF_PRIVATE *psf, int *ptr, int len)
+{	int		total ;
+
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_int_array (ptr, len) ;
+	total = fwrite (ptr, 1, len * sizeof (int), psf->file) ;
+	if (CPU_IS_BIG_ENDIAN)
+		endswap_int_array (ptr, len) ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_i2lei */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_write_f2sc	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2sc */
+
+static int
+pcm_write_f2uc	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2uc */
+
+static int
+pcm_write_f2bes	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2bes */
+
+static int
+pcm_write_f2les	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2les */
+
+static int
+pcm_write_f2let	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x800000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2les */
+
+static int
+pcm_write_f2bet	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int	bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x800000) : 1.0 ;
+
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2bes */
+
+static int
+pcm_write_f2bei	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80000000) : 1.0 ;
+
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2bei */
+
+static int
+pcm_write_f2lei	(SF_PRIVATE *psf, float *ptr, int len)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	float	normfact ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x80000000) : 1.0 ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_f2lei */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static int
+pcm_write_d2sc	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x80) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2sc_array (ptr, index, (signed char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2sc */
+
+static int
+pcm_write_d2uc	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x80) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2uc_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2uc */
+
+static int
+pcm_write_d2bes	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2bes_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2bes */
+
+static int
+pcm_write_d2les	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2les_array (ptr, index, (short*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2les */
+
+static int
+pcm_write_d2let	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x800000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2let_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2les */
+
+static int
+pcm_write_d2bet	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x800000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2bet_array (ptr, index, (tribyte*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2bes */
+
+static int
+pcm_write_d2bei	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2bei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2bei */
+
+static int
+pcm_write_d2lei	(SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	unsigned int	writecount, thiswrite ;
+	int		bytecount, bufferlen ;
+	int		index = 0, total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x80000000) : 1.0) ;
+
+	bufferlen = SF_BUFFER_LEN - (SF_BUFFER_LEN % psf->blockwidth) ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2lei_array (ptr, index, (int*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_WRITE ;
+	
+	return total ;
+} /* pcm_write_d2lei */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+sc2s_array	(signed char *buffer, unsigned int count, short *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((short) buffer [k]) ;
+		index ++ ;
+		} ;
+} /* sc2s_array */
+
+static	void	
+uc2s_array	(unsigned char *buffer, unsigned int count, short *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((((short) buffer [k]) - 128) % 256) ;
+		index ++ ;
+		} ;
+} /* uc2s_array */
+
+static void	
+bet2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+		value = BE2H_INT (value) ;
+		ptr [index] = (short) (value >> 16) ;
+		index ++ ;
+		cptr += 3 ;	
+		} ;
+} /* bet2s_array */
+
+static void	
+let2s_array (tribyte *buffer, unsigned int count, short *ptr, int index)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+		value = LE2H_INT (value) ;
+		ptr [index] = (short) (value >> 16) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* let2s_array */
+
+static void	
+bei2s_array (int *buffer, unsigned int count, short *ptr, int index)
+{	int	k ;
+	int		value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = BE2H_INT (buffer [k]) ;
+		ptr [index] = (short) (value >> 16) ;
+		index ++ ;
+		} ;
+} /* bei2s_array */
+
+static void	
+lei2s_array (int *buffer, unsigned int count, short *ptr, int index)
+{	int	k ;
+	int		value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = LE2H_INT (buffer [k]) ;
+		ptr [index] = (short) (value >> 16) ;
+		index ++ ;
+		} ;
+} /* lei2s_array */
+
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+sc2i_array	(signed char *buffer, unsigned int count, int *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((int) buffer [k]) ;
+		index ++ ;
+		} ;
+} /* sc2i_array */
+
+static	void	
+uc2i_array	(unsigned char *buffer, unsigned int count, int *ptr, int index)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((((int) buffer [k]) - 128) % 256) ;
+		index ++ ;
+		} ;
+} /* uc2i_array */
+
+static void	
+bes2i_array (short *buffer, unsigned int count, int *ptr, int index)
+{	int	k ;
+	short	value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = BE2H_SHORT (buffer [k]) ;
+		ptr [index] = ((int) value) ;
+		index ++ ;
+		} ;
+} /* bes2i_array */
+
+static void	
+les2i_array (short *buffer, unsigned int count, int *ptr, int index)
+{	int	k ;
+	short	value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = LE2H_SHORT (buffer [k]) ;
+		ptr [index] = ((int) value) ;
+		index ++ ;
+		} ;
+} /* les2i_array */
+
+static void	
+bet2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+		ptr [index] = value / 256 ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* bet2i_array */
+
+static void	
+let2i_array (tribyte *buffer, unsigned int count, int *ptr, int index)
+{	unsigned char	*cptr ;
+	int	k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+		ptr [index] = value / 256 ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* let2i_array */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+
+static	void	
+sc2f_array	(signed char *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((float) buffer [k]) * normfact ;
+		index ++ ;
+		} ;
+} /* sc2f_array */
+
+static	void	
+uc2f_array	(unsigned char *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
+		index ++ ;
+		} ;
+} /* uc2f_array */
+
+static void	
+bes2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	int	k ;
+	short	value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = BE2H_SHORT (buffer [k]) ;
+		ptr [index] = ((float) value) * normfact ;
+		index ++ ;
+		} ;
+} /* bes2f_array */
+
+static void	
+les2f_array (short *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	int	k ;
+	short	value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = LE2H_SHORT (buffer [k]) ;
+		ptr [index] = ((float) value) * normfact ;
+		index ++ ;
+		} ;
+} /* les2f_array */
+
+static void	
+bet2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+		ptr [index] = ((float) (value / 256)) * normfact ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* bet2f_array */
+
+static void	
+let2f_array (tribyte *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+		ptr [index] = ((float) (value / 256)) * normfact ;
+		index ++ ;
+		cptr += 3 ; 
+		} ;
+} /* let2f_array */
+
+static void	
+lei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	int	k ;
+	int		value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = LE2H_INT (buffer [k]) ;
+		ptr [index] = ((float) value) * normfact ;
+		index ++ ;
+		} ;
+} /* lei2f_array */
+
+static void	
+bei2f_array (int *buffer, unsigned int count, float *ptr, int index, float normfact)
+{	int	k ;
+	int		value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = BE2H_INT (buffer [k]) ;
+		ptr [index] = ((float) value) * normfact ;
+		index ++ ;
+		} ;
+} /* bei2f_array */
+
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+sc2d_array	(signed char *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((double) buffer [k]) * normfact ;
+		index ++ ;
+		} ;
+} /* sc2d_array */
+
+static	void	
+uc2d_array	(unsigned char *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	ptr [index] = ((((int) buffer [k]) - 128) % 256) * normfact ;
+		index ++ ;
+		} ;
+} /* uc2d_array */
+
+static void	
+bes2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	int	k ;
+	short	value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = BE2H_SHORT (buffer [k]) ;
+		ptr [index] = ((double) value) * normfact ;
+		index ++ ;
+		} ;
+} /* bes2d_array */
+
+static void	
+les2d_array (short *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	int	k ;
+	short	value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = LE2H_SHORT (buffer [k]) ;
+		ptr [index] = ((double) value) * normfact ;
+		index ++ ;
+		} ;
+} /* les2d_array */
+
+static void	
+bet2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 24) + (cptr [1] << 16) + (cptr [2] << 8) ;
+		ptr [index] = ((double) (value / 256)) * normfact ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* bet2d_array */
+
+static void	
+let2d_array (tribyte *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	unsigned char	*cptr ;
+	int		k ;
+	int 	value;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = (cptr [0] << 8) + (cptr [1] << 16) + (cptr [2] << 24) ;
+		ptr [index] = ((double) (value / 256)) * normfact ;
+		index ++ ;
+		cptr += 3 ; 
+		} ;
+} /* let2d_array */
+
+static void	
+bei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	int	k ;
+	int		value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = BE2H_INT (buffer [k]) ;
+		ptr [index] = ((double) value) * normfact ;
+		index ++ ;
+		} ;
+} /* bei2d_array */
+
+static void	
+lei2d_array (int *buffer, unsigned int count, double *ptr, int index, double normfact)
+{	int	k ;
+	int		value ;
+	for (k = 0 ; k < count ; k++)
+	{	value = LE2H_INT (buffer [k]) ;
+		ptr [index] = ((double) value) * normfact ;
+		index ++ ;
+		} ;
+} /* lei2d_array */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+s2sc_array	(short *ptr, int index, signed char *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (signed char) (ptr [index]) ;
+		index ++ ;
+		} ;
+} /* s2sc_array */
+
+static	void	
+s2uc_array	(short *ptr, int index, unsigned char *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (unsigned char) (ptr [index] + 128) ;
+		index ++ ;
+		} ;
+} /* s2uc_array */
+
+static void	
+s2bet_array (short *ptr, int index, tribyte *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = ptr [index] << 8 ;
+		cptr [2] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* s2bet_array */
+
+static void	
+s2let_array (short *ptr, int index, tribyte *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = ptr [index] << 8 ;
+		cptr [0] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* s2let_array */
+
+static void	
+s2bei_array (short *ptr, int index, int *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2BE_INT (ptr [index] << 16) ;
+		index ++ ;
+		} ;
+} /* s2lei_array */
+
+static void	
+s2lei_array (short *ptr, int index, int *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2LE_INT (ptr [index] << 16) ;
+		index ++ ;
+		} ;
+} /* s2lei_array */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+i2sc_array	(int *ptr, int index, signed char *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (signed char) (ptr [index]) ;
+		index ++ ;
+		} ;
+} /* i2sc_array */
+
+static	void	
+i2uc_array	(int *ptr, int index, unsigned char *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = (unsigned char) (ptr [index] + 128) ;
+		index ++ ;
+		} ;
+} /* i2uc_array */
+
+static void	
+i2bes_array (int *ptr, int index, short *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2BE_SHORT (ptr [index]) ;
+		index ++ ;
+		} ;
+} /* i2bes_array */
+
+static void	
+i2les_array (int *ptr, int index, short *buffer, unsigned int count)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2LE_SHORT (ptr [index]) ;
+		index ++ ;
+		} ;
+} /* i2les_array */
+
+static void	
+i2bet_array (int *ptr, int index, tribyte *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = ptr [index] ;
+		cptr [0] = (unsigned char) ((value & 0xFF0000) >> 16) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [2] = (unsigned char) (value & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* i2bet_array */
+
+static void	
+i2let_array (int *ptr, int index, tribyte *buffer, unsigned int count)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = ptr [index] ;
+		cptr [0] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* i2let_array */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+f2sc_array	(float *ptr, int index, signed char *buffer, unsigned int count, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = FLOAT_TO_SHORT (ptr [index] * normfact) ;
+		index ++ ;
+		} ;
+} /* f2sc_array */
+
+static	void	
+f2uc_array	(float *ptr, int index, unsigned char *buffer, unsigned int count, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = FLOAT_TO_SHORT (ptr [index] * normfact) + 128 ;
+		index ++ ;
+		} ;
+} /* f2uc_array */
+
+static void	
+f2bes_array (float *ptr, int index, short *buffer, unsigned int count, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2BE_SHORT (FLOAT_TO_SHORT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* f2bes_array */
+
+static void	
+f2les_array (float *ptr, int index, short *buffer, unsigned int count, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2LE_SHORT (FLOAT_TO_SHORT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* f2les_array */
+
+static void	
+f2bet_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = FLOAT_TO_INT (ptr [index] * normfact) ;
+		cptr [2] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* f2bet_array */
+
+static void	
+f2let_array (float *ptr, int index, tribyte *buffer, unsigned int count, float normfact)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;	
+	for (k = 0 ; k < count ; k++)
+	{	value = FLOAT_TO_INT (ptr [index] * normfact) ;
+		cptr [0] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* f2let_array */
+
+static void	
+f2bei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2BE_INT (FLOAT_TO_INT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* f2bei_array */
+
+static 
+void	f2lei_array (float *ptr, int index, int *buffer, unsigned int count, float normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2LE_INT (FLOAT_TO_INT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* f2lei_array */
+
+/*-----------------------------------------------------------------------------------------------
+*/
+
+static	void	
+d2sc_array	(double *ptr, int index, signed char *buffer, unsigned int count, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = DOUBLE_TO_SHORT (ptr [index] * normfact) ;
+		index ++ ;
+		} ;
+} /* d2sc_array */
+
+static	void	
+d2uc_array	(double *ptr, int index, unsigned char *buffer, unsigned int count, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = DOUBLE_TO_SHORT (ptr [index] * normfact) + 128 ;
+		index ++ ;
+		} ;
+} /* d2uc_array */
+
+static void	
+d2bes_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2BE_SHORT (DOUBLE_TO_SHORT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* d2bes_array */
+
+static void	
+d2les_array (double *ptr, int index, short *buffer, unsigned int count, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2LE_SHORT (DOUBLE_TO_SHORT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* d2les_array */
+
+static void	
+d2bet_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;
+	for (k = 0 ; k < count ; k++)
+	{	value = DOUBLE_TO_INT (ptr [index] * normfact) ;
+		cptr [2] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [0] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* d2bet_array */
+
+static void	
+d2let_array (double *ptr, int index, tribyte *buffer, unsigned int count, double normfact)
+{	unsigned char	*cptr ;
+	int		k, value ;
+	cptr = (unsigned char*) buffer ;	
+	for (k = 0 ; k < count ; k++)
+	{	value = DOUBLE_TO_INT (ptr [index] * normfact) ;
+		cptr [0] = (unsigned char) (value & 0xFF) ;
+		cptr [1] = (unsigned char) ((value >> 8) & 0xFF) ;
+		cptr [2] = (unsigned char) ((value >> 16) & 0xFF) ;
+		index ++ ;
+		cptr += 3 ;
+		} ;
+} /* d2let_array */
+
+static void	
+d2bei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2BE_INT (DOUBLE_TO_INT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* d2bei_array */
+
+static 
+void	d2lei_array (double *ptr, int index, int *buffer, unsigned int count, double normfact)
+{	int	k ;
+	for (k = 0 ; k < count ; k++)
+	{	buffer [k] = H2LE_INT (DOUBLE_TO_INT (ptr [index] * normfact)) ;
+		index ++ ;
+		} ;
+} /* d2lei_array */
+
--- /dev/null
+++ b/common/libsndfile/src/raw.c
@@ -1,0 +1,176 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+static long	raw_seek   (SF_PRIVATE *psf, long offset, int whence) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int 	raw_open_read	(SF_PRIVATE *psf)
+{	unsigned int subformat ;
+	int			error ;
+	
+	if(! psf->sf.channels || ! psf->sf.pcmbitwidth)
+		return SFE_RAW_READ_BAD_SPEC ;
+		
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	psf->endian = 0 ;
+
+	if (subformat == SF_FORMAT_PCM_BE)
+		psf->endian = SF_ENDIAN_BIG ;
+	else if (subformat == SF_FORMAT_PCM_LE)
+		psf->endian = SF_ENDIAN_LITTLE ;
+	else if (subformat == SF_FORMAT_PCM_S8)
+		psf->chars = SF_CHARS_SIGNED ;
+	else if (subformat == SF_FORMAT_PCM_U8)
+		psf->chars = SF_CHARS_UNSIGNED ;
+	else
+		return SFE_RAW_READ_BAD_SPEC ;
+		
+	psf->seek_func = (func_seek) raw_seek ;
+
+	psf->sf.seekable = SF_TRUE ;
+	psf->sf.sections = 1 ;
+
+	psf->dataoffset = 0 ;
+	psf->bytewidth  = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+	psf->blockwidth = psf->sf.channels * psf->bytewidth ;
+
+	if ((error = pcm_read_init (psf)))
+		return error ;
+		
+	if (psf->blockwidth)
+		psf->sf.samples = psf->filelength / psf->blockwidth ;
+
+ 	psf->datalength = psf->filelength - psf->dataoffset ;
+
+ 	psf->current  = 0 ;
+	
+	return 0 ;
+} /* raw_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+int 	raw_open_write	(SF_PRIVATE *psf)
+{	unsigned int	subformat, big_endian_file ;
+	int error ;
+		
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	if (subformat == SF_FORMAT_PCM_BE)
+		big_endian_file = 1 ;
+	else if (subformat == SF_FORMAT_PCM_LE)
+		big_endian_file = 0 ;
+	else if (subformat == SF_FORMAT_PCM_S8 || subformat == SF_FORMAT_PCM_U8)
+		big_endian_file = 0 ;
+	else
+		return	SFE_BAD_OPEN_FORMAT ;
+		
+	psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+		
+	psf->endian      = big_endian_file ? SF_ENDIAN_BIG : SF_ENDIAN_LITTLE ;
+	psf->sf.seekable = SF_TRUE ;
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+ 	psf->dataoffset  = 0 ;
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = psf->datalength ;
+	psf->error       = 0 ;
+
+	if (subformat == SF_FORMAT_PCM_S8)
+		psf->chars = SF_CHARS_SIGNED ;
+	else if (subformat == SF_FORMAT_PCM_U8)
+		psf->chars = SF_CHARS_UNSIGNED ;
+	
+	if ((error = pcm_write_init (psf)))
+		return error ;
+		
+	return 0 ;
+} /* raw_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static long
+raw_seek   (SF_PRIVATE *psf, long offset, int whence)
+{	long position ;
+
+	if (! (psf->blockwidth && psf->datalength))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	position = ftell (psf->file) ;
+	offset = offset * psf->blockwidth ;
+		
+	switch (whence)
+	{	case SEEK_SET :
+				if (offset < 0 || offset > psf->datalength)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				break ;
+				
+		case SEEK_CUR :
+				if (psf->current + offset < 0 || psf->current + offset > psf->datalength)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				offset = position + offset ;
+				break ;
+				
+		case SEEK_END :
+				if (offset > 0 || psf->datalength + offset < 0)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				offset = psf->datalength + offset ;
+				break ;
+				
+		default : 
+				psf->error = SFE_BAD_SEEK ;
+				return	((long) -1) ;
+		} ;
+		
+	if (psf->mode == SF_MODE_READ)
+		fseek (psf->file, offset, SEEK_SET) ;
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	psf->current = offset / psf->blockwidth ;
+
+	return psf->current ;
+} /* raw_seek */
+
--- /dev/null
+++ b/common/libsndfile/src/samplitude.c
@@ -1,0 +1,125 @@
+/*
+** Copyright (C) 2000-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<stdarg.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
+#define SEKD_MARKER	(MAKE_MARKER ('S', 'E', 'K', 'D'))
+#define SAMR_MARKER	(MAKE_MARKER ('S', 'A', 'M', 'R'))
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+typedef struct
+{	unsigned int	sekd, samr ;
+	int				unknown0 ;
+	int				bitspersample ;
+	int				unknown1, unknown2 ;
+	int				poss_len ;
+	int				samplerate ;
+	int				channels ;
+} RAP_CHUNK ;
+
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static	int		smpltd_close	(SF_PRIVATE  *psf) ;
+
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int 	smpltd_open_read	(SF_PRIVATE *psf)
+{	RAP_CHUNK rap ;
+	
+	psf_binheader_readf (psf, "mm", &(rap.sekd), &(rap.samr)) ;
+	if (rap.sekd != SEKD_MARKER)
+		return SFE_SMTD_NO_SEKD ;
+	if (rap.samr != SAMR_MARKER)
+		return SFE_SMTD_NO_SAMR ;
+	
+/*-
+	printf ("Here we are!\n") ;	
+
+	printf ("unknown0        : %d\n", rap.unknown0) ;
+	printf ("bits per sample : %d\n", rap.bitspersample) ;
+	printf ("unknown1        : %d\n", rap.unknown1) ;
+	printf ("unknown2        : %d\n", rap.unknown2) ;
+	printf ("poss_len        : %d\n", rap.poss_len) ;
+	printf ("sample rate     : %d\n", rap.samplerate) ;
+	printf ("channels        : %d\n", rap.channels) ;
+		
+-*/
+	psf->close = (func_close) smpltd_close ;
+
+	return 0 ;
+} /* smpltd_open_read */
+
+int 	
+smpltd_open_write	(SF_PRIVATE *psf)
+{	
+
+	return 0 ;
+} /* smpltd_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int	
+smpltd_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can re-write 
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+                
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* smpltd_close */
+
--- /dev/null
+++ b/common/libsndfile/src/sfendian.h
@@ -1,0 +1,86 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	"config.h"
+
+#if HAVE_ENDIAN_H
+	/* This is the best way to do it. Unfortunately Sparc Solaris (and
+	** possibly others) don't have <endian.h>
+	*/
+	#include	<endian.h>
+	#if (__BYTE_ORDER == __LITTLE_ENDIAN)
+		#define	CPU_IS_LITTLE_ENDIAN		1
+		#define	CPU_IS_BIG_ENDIAN			0
+	#elif (__BYTE_ORDER == __BIG_ENDIAN)
+		#define	CPU_IS_LITTLE_ENDIAN		0
+		#define	CPU_IS_BIG_ENDIAN			1
+	#else
+		#error "A bit confused about endian-ness! Have <endian.h> but not __BYTEORDER."
+	#endif
+#else
+	/* If we don't have <endian.h> use the guess based on target processor
+	** from the autoconf process.
+	*/
+	#if GUESS_LITTLE_ENDIAN
+		#define	CPU_IS_LITTLE_ENDIAN		1
+		#define	CPU_IS_BIG_ENDIAN			0
+	#elif GUESS_BIG_ENDIAN
+		#define	CPU_IS_LITTLE_ENDIAN		0
+		#define	CPU_IS_BIG_ENDIAN			1
+	#else
+		#error "Endian guess seems incorrect."
+	#endif
+#endif	
+
+#define		ENDSWAP_SHORT(x)			((((x)>>8)&0xFF)|(((x)&0xFF)<<8))
+#define		ENDSWAP_INT(x)				((((x)>>24)&0xFF)|(((x)>>8)&0xFF00)|(((x)&0xFF00)<<8)|(((x)&0xFF)<<24))
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+	#define	H2LE_SHORT(x)				(x)
+	#define	H2LE_INT(x)					(x)
+	#define	LE2H_SHORT(x)				(x)
+	#define	LE2H_INT(x)					(x)
+
+	#define	BE2H_INT(x)					ENDSWAP_INT(x)
+	#define	BE2H_SHORT(x)				ENDSWAP_SHORT(x)
+	#define	H2BE_INT(x)					ENDSWAP_INT(x)
+	#define	H2BE_SHORT(x)				ENDSWAP_SHORT(x)
+
+#elif (CPU_IS_BIG_ENDIAN == 1)
+	#define	H2LE_SHORT(x)				ENDSWAP_SHORT(x)
+	#define	H2LE_INT(x)					ENDSWAP_INT(x)
+	#define	LE2H_SHORT(x)				ENDSWAP_SHORT(x)
+	#define	LE2H_INT(x)					ENDSWAP_INT(x)
+
+	#define	BE2H_INT(x)					(x)
+	#define	BE2H_SHORT(x)				(x)
+	#define	H2BE_INT(x)					(x)
+	#define	H2BE_SHORT(x)				(x)
+
+#else
+	#error "Cannot determine endian-ness of processor."
+#endif
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
--- /dev/null
+++ b/common/libsndfile/src/sndfile.c
@@ -1,0 +1,1635 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<math.h>
+
+/* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
+
+#if	(defined (__MWERKS__))
+#include	<stat.h>
+#else
+#include	<sys/stat.h>
+#endif
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+#define		SNDFILE_MAGICK	0x1234C0DE
+
+typedef struct
+{	int 	error ;
+	char	*str ;
+} ErrorStruct ;
+
+static
+ErrorStruct SndfileErrors [] = 
+{ 
+	{	SFE_NO_ERROR			, "No Error." },
+	{	SFE_BAD_FILE			, "File does not exist or is not a regular file (possibly a pipe?)." },
+	{	SFE_OPEN_FAILED			, "Could not open file." },
+	{	SFE_BAD_OPEN_FORMAT		, "Bad format specified for file open." },
+	{	SFE_BAD_SNDFILE_PTR		, "Not a valid SNDFILE* pointer." },
+	{	SFE_BAD_SF_INFO_PTR		, "NULL SF_INFO pointer passed to libsndfile." },
+	{	SFE_BAD_INT_FD			, "Bad file descriptor." },
+	{	SFE_BAD_INT_PTR			, "Internal error, Bad pointer." },
+	{	SFE_MALLOC_FAILED		, "Internal malloc () failed." },
+	{	SFE_BAD_SEEK			, "Internal fseek() failed." },
+	{	SFE_NOT_SEEKABLE		, "Seek attempted on unseekable file type." },
+	{	SFE_UNIMPLEMENTED		, "File contains data in an unimplemented format." },
+	{	SFE_BAD_READ_ALIGN  	, "Attempt to read a non-integer number of channels." },
+	{	SFE_BAD_WRITE_ALIGN 	, "Attempt to write a non-integer number of channels." },
+	{	SFE_UNKNOWN_FORMAT		, "File contains data in an unknown format." },
+	{	SFE_NOT_READMODE		, "Read attempted on file currently open for write." },
+	{	SFE_NOT_WRITEMODE		, "Write attempted on file currently open for read." },
+	{	SFE_BAD_MODE_RW			, "This file format does not support read/write mode." },
+	{	SFE_BAD_SF_INFO			, "Internal error : SF_INFO struct incomplete." },
+
+	{	SFE_SHORT_READ			, "Short read error." },
+	{	SFE_SHORT_WRITE			, "Short write error." },
+	{	SFE_INTERNAL			, "Unspecified internal error." },
+	{	SFE_BAD_CONTROL_CMD		, "Bad command passed to function sf_command()." },
+	
+	{	SFE_WAV_NO_RIFF			, "Error in WAV file. No 'RIFF' chunk marker." },
+	{	SFE_WAV_NO_WAVE			, "Error in WAV file. No 'WAVE' chunk marker." },
+	{	SFE_WAV_NO_FMT			, "Error in WAV file. No 'fmt ' chunk marker." },
+	{	SFE_WAV_FMT_SHORT		, "Error in WAV file. Short 'fmt ' chunk." },
+
+	{	SFE_WAV_FMT_TOO_BIG		, "Error in WAV file. 'fmt ' chunk too large." },
+	{	SFE_WAV_BAD_FACT		, "Error in WAV file. 'fact' chunk out of place." },
+	{	SFE_WAV_BAD_PEAK		, "Error in WAV file. Bad 'PEAK' chunk." },
+	{	SFE_WAV_PEAK_B4_FMT		, "Error in WAV file. 'PEAK' chunk found before 'fmt ' chunk." },
+
+	{	SFE_WAV_BAD_FORMAT		, "Error in WAV file. Errors in 'fmt ' chunk." },
+	{	SFE_WAV_BAD_BLOCKALIGN	, "Error in WAV file. Block alignment in 'fmt ' chunk is incorrect." },
+	{	SFE_WAV_NO_DATA			, "Error in WAV file. No 'data' chunk marker." },
+	{	SFE_WAV_UNKNOWN_CHUNK	, "Error in WAV file. File contains an unknown chunk marker." },
+	
+	{	SFE_WAV_ADPCM_NOT4BIT	, "Error in ADPCM WAV file. Invalid bit width." },
+	{	SFE_WAV_ADPCM_CHANNELS	, "Error in ADPCM WAV file. Invalid number of channels." },
+	{	SFE_WAV_GSM610_FORMAT	, "Error in GSM610 WAV file. Invalid format chunk." },
+  
+	{	SFE_AIFF_NO_FORM		, "Error in AIFF file, bad 'FORM' marker." },
+	{	SFE_AIFF_AIFF_NO_FORM	, "Error in AIFF file, 'AIFF' marker without 'FORM'." },
+	{	SFE_AIFF_COMM_NO_FORM	, "Error in AIFF file, 'COMM' marker without 'FORM'." },
+	{	SFE_AIFF_SSND_NO_COMM	, "Error in AIFF file, 'SSND' marker without 'COMM'." },
+	{	SFE_AIFF_UNKNOWN_CHUNK	, "Error in AIFF file, unknown chunk." },
+	{	SFE_AIFF_COMM_CHUNK_SIZE, "Error in AIFF file, bad 'COMM' chunk size." },
+	{	SFE_AIFF_BAD_COMM_CHUNK , "Error in AIFF file, bad 'COMM' chunk." },
+	{	SFE_AIFF_PEAK_B4_COMM	, "Error in AIFF file. 'PEAK' chunk found before 'COMM' chunk." },
+	{	SFE_AIFF_BAD_PEAK		, "Error in AIFF file. Bad 'PEAK' chunk." },
+	{	SFE_AIFF_NO_SSND		, "Error in AIFF file, bad 'SSND' chunk." },
+	{	SFE_AIFF_NO_DATA		, "Error in AIFF file, no sound data." },
+	
+	{	SFE_AU_UNKNOWN_FORMAT	, "Error in AU file, unknown format." },
+	{	SFE_AU_NO_DOTSND		, "Error in AU file, missing '.snd' or 'dns.' marker." },
+
+	{	SFE_RAW_READ_BAD_SPEC	, "Error while opening RAW file for read. Must specify format, pcmbitwidth and channels." },
+	{	SFE_RAW_BAD_BITWIDTH	, "Error. RAW file bitwidth must be a multiple of 8." },
+
+	{	SFE_PAF_NO_MARKER		, "Error in PAF file, no marker." },
+	{	SFE_PAF_VERSION			, "Error in PAF file, bad version." }, 
+	{	SFE_PAF_UNKNOWN_FORMAT	, "Error in PAF file, unknown format." }, 
+	{	SFE_PAF_SHORT_HEADER	, "Error in PAF file. File shorter than minimal header." },
+	
+	{	SFE_SVX_NO_FORM			, "Error in 8SVX / 16SV file, no 'FORM' marker." }, 
+	{	SFE_SVX_NO_BODY			, "Error in 8SVX / 16SV file, no 'BODY' marker." }, 
+	{	SFE_SVX_NO_DATA			, "Error in 8SVX / 16SV file, no sound data." },
+	{	SFE_SVX_BAD_COMP		, "Error in 8SVX / 16SV file, unsupported compression format." },
+	
+	{	SFE_NIST_BAD_HEADER		, "Error in NIST file, bad header." },
+	{	SFE_NIST_BAD_ENCODING	, "Error in NIST file, unsupported compression format." },
+
+	{	SFE_SMTD_NO_SEKD		, "Error in Samplitude file, no 'SEKD' marker." },  
+	{	SFE_SMTD_NO_SAMR		, "Error in Samplitude file, no 'SAMR' marker." }, 
+
+	{	SFE_VOC_NO_CREATIVE		, "Error in VOC file, no 'Creative Voice File' marker." }, 
+	{	SFE_VOC_BAD_VERSION		, "Error in VOC file, bad version number." }, 
+	{	SFE_VOC_BAD_MARKER		, "Error in VOC file, bad marker in file." }, 
+
+	{	SFE_IRCAM_NO_MARKER		, "Error in IRCAM file, bad IRCAM marker." }, 
+	{	SFE_IRCAM_BAD_CHANNELS	, "Error in IRCAM file, bad channel count." }, 
+	{	SFE_IRCAM_UNKNOWN_FORMAT, "Error in IRCAM file, unknow encoding format." }, 
+
+	{	SFE_MAX_ERROR			, "Maximum error number." }
+} ;
+
+/*------------------------------------------------------------------------------
+*/
+
+static int 	does_extension_match (const char *ext, const char *test) ;
+static int 	is_au_snd_file (const char *filename) ;
+static int	guess_file_type (SF_PRIVATE *psf, const char *filename) ;
+static int	validate_sfinfo (SF_INFO *sfinfo) ;
+static int	validate_psf (SF_PRIVATE *psf) ;
+static void save_header_info (SF_PRIVATE *psf) ;
+static void	copy_filename (SF_PRIVATE *psf, const char *path) ;
+
+static int	hash_command (const char *cmd) ;
+
+/*------------------------------------------------------------------------------
+** Private (static) variables.
+*/
+
+static	int		sf_errno = 0 ;
+static	char	sf_logbuffer [SF_BUFFER_LEN] = { 0 } ;
+
+/*------------------------------------------------------------------------------
+*/
+
+#define	VALIDATE_SNDFILE_AND_ASSIGN_PSF(a,b)		\
+		{	if (! (a))								\
+				return SFE_BAD_SNDFILE_PTR ;		\
+			(b) = (SF_PRIVATE*) (a) ;				\
+			if (!((b)->file))						\
+				return SFE_BAD_INT_FD ;				\
+			if ((b)->Magick != SNDFILE_MAGICK)		\
+				return	SFE_BAD_SNDFILE_PTR ;		\
+			(b)->error = 0 ;						\
+			} 
+
+/*------------------------------------------------------------------------------
+**	Public functions.
+*/
+
+SNDFILE*
+sf_open_read	(const char *path, SF_INFO *sfinfo)
+{	SF_PRIVATE 	*psf ;
+	int			filetype ;
+	
+	if (! sfinfo)
+	{	sf_errno = SFE_BAD_SF_INFO_PTR ;
+		return	NULL ;
+		} ;
+		
+	sf_errno = 0 ;
+	sf_logbuffer [0] = 0 ;
+	
+	psf = malloc (sizeof (SF_PRIVATE)) ; 
+	if (! psf)
+	{	sf_errno = SFE_MALLOC_FAILED ;
+		return	NULL ;
+		} ;
+
+	memset (psf, 0, sizeof (SF_PRIVATE)) ;
+	psf->Magick = SNDFILE_MAGICK ;
+
+	if (! strcmp (path, "-"))
+	{	psf->file = stdin ;
+		psf->sf.seekable = SF_FALSE ;
+		}
+	else
+	{	/* fopen with 'b' means binary file mode for Win32 systems. */
+		if (! (psf->file = fopen (path, "rb")))
+		{	sf_errno = SFE_OPEN_FAILED ;
+			return NULL ;
+			} ;
+		psf->sf.seekable = SF_TRUE ;
+		} ;
+		 
+	if (! psf->file) 
+	{	sf_errno = SFE_OPEN_FAILED ;
+		sf_close (psf) ;
+		return NULL ;
+		} ;
+	
+	psf->mode = SF_MODE_READ ;
+	
+	psf_log_printf (psf, "%s\n", path) ;
+	if (psf->sf.seekable)
+	{	fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+		fseek (psf->file, 0, SEEK_SET) ;
+		psf_log_printf (psf, "size : %d\n", psf->filelength) ;
+		}
+	else
+		psf->filelength = 0x7FFF0000 ;  /* Stupidly big number. */
+	
+	copy_filename (psf, path) ;
+	
+	if ((sfinfo->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_RAW && sfinfo->channels && sfinfo->pcmbitwidth)
+		filetype = SF_FORMAT_RAW ;
+	else
+	{	memset (sfinfo, 0, sizeof (SF_INFO)) ;
+		filetype = guess_file_type (psf, psf->filename) ;
+		} ;
+		
+	switch (filetype)
+	{	case	SF_FORMAT_WAV :
+				sf_errno = wav_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_AIFF :
+				sf_errno = aiff_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_AU :
+				sf_errno = au_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_RAW :
+				/* For RAW files, need the sfinfo struct data to
+				** figure out the bitwidth, endian-ness etc.
+				*/
+				memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
+				sf_errno = raw_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_PAF :
+				sf_errno = paf_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_SVX :
+				sf_errno = svx_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_NIST :
+				sf_errno = nist_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_SMPLTD :
+				sf_errno = smpltd_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_VOC :
+				sf_errno = voc_open_read (psf) ;
+				break ;
+
+		case	SF_FORMAT_IRCAM :
+				sf_errno = ircam_open_read (psf) ;
+				break ;
+
+		default :	
+				sf_errno = SFE_UNKNOWN_FORMAT ;
+		} ;
+	
+	/* Both the file format and the file must be seekable to enable sf_seek(). */
+	/*-psf->sf.seekable = (psf->sf.seekable && seekable) ? SF_TRUE : SF_FALSE ;-*/
+		
+	if (sf_errno)
+	{	save_header_info (psf) ;
+		sf_close (psf) ;
+		return NULL ;
+		} ;
+
+	if (! validate_sfinfo (&(psf->sf)))
+	{	psf_log_SF_INFO (psf) ;
+		save_header_info (psf) ;
+		sf_errno = SFE_BAD_SF_INFO ;
+		sf_close (psf) ;
+		return NULL ;
+		} ;
+		
+	if (! validate_psf (psf))
+	{	printf ("validate_psf\n") ;
+		save_header_info (psf) ;
+		sf_errno = SFE_INTERNAL ;
+		sf_close (psf) ;
+		return NULL ;
+		} ;
+		
+	memcpy (sfinfo, &(psf->sf), sizeof (SF_INFO)) ;
+
+	return (SNDFILE*) psf ;
+} /* sf_open_read */
+
+/*------------------------------------------------------------------------------
+*/
+
+SNDFILE*
+sf_open_write	(const char *path, const SF_INFO *sfinfo)
+{	SF_PRIVATE 	*psf ;
+	
+	if (! sfinfo)
+	{	sf_errno = SFE_BAD_SF_INFO_PTR ;
+		return	NULL ;
+		} ;
+		
+	if (! sf_format_check (sfinfo))
+	{	sf_errno = SFE_BAD_OPEN_FORMAT ;
+		return	NULL ;
+		} ;
+
+	sf_errno = 0 ;
+	sf_logbuffer [0] = 0 ;
+	
+	psf = malloc (sizeof (SF_PRIVATE)) ; 
+	if (! psf)
+	{	sf_errno = SFE_MALLOC_FAILED ;
+		return	NULL ;
+		} ;
+	
+	memset (psf, 0, sizeof (SF_PRIVATE)) ;
+	memcpy (&(psf->sf), sfinfo, sizeof (SF_INFO)) ;
+
+	psf->Magick = SNDFILE_MAGICK ;
+
+	if (! strcmp (path, "-"))
+	{	psf->file = stdout ;
+		psf->sf.seekable = SF_FALSE ;
+		}
+	else
+	{	/* fopen with 'b' means binary file mode for Win32 systems. */
+		if (! (psf->file = fopen (path, "wb")))		
+		{	sf_errno = SFE_OPEN_FAILED ;
+			sf_close (psf) ;
+			return NULL ;
+			} ;
+		} ;
+		
+	psf->mode = SF_MODE_WRITE ;
+	
+	psf->filelength = ftell (psf->file) ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	copy_filename (psf, path) ;
+	
+	switch (sfinfo->format & SF_FORMAT_TYPEMASK)
+	{	case	SF_FORMAT_WAV :
+				if ((sf_errno = wav_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		case	SF_FORMAT_AIFF :
+				if ((sf_errno = aiff_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		case	SF_FORMAT_AU :
+		case	SF_FORMAT_AULE :
+				if ((sf_errno = au_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+				
+		case    SF_FORMAT_RAW :
+				if ((sf_errno = raw_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		case    SF_FORMAT_PAF :
+				if ((sf_errno = paf_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		case    SF_FORMAT_SVX :
+				if ((sf_errno = svx_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		case	SF_FORMAT_NIST :
+				if ((sf_errno = nist_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		case	SF_FORMAT_IRCAM :
+				if ((sf_errno = ircam_open_write (psf)))
+				{	sf_close (psf) ;
+					return NULL ;
+					} ;
+				break ;
+
+		default :	
+				sf_errno = SFE_UNKNOWN_FORMAT ;
+				sf_close (psf) ;
+				return NULL ;
+		} ;				
+
+	return (SNDFILE*) psf ;
+} /* sf_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+int	
+sf_perror	(SNDFILE *sndfile)
+{	SF_PRIVATE 	*psf ;
+	int 		k, errnum ;
+
+	if (! sndfile)
+	{	errnum = sf_errno ;
+		}
+	else
+	{	VALIDATE_SNDFILE_AND_ASSIGN_PSF(sndfile,psf) ;
+		errnum = psf->error ;
+		} ;
+		
+	errnum = abs (errnum) ;
+	errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ;
+
+	for (k = 0 ; SndfileErrors[k].str ; k++)
+		if (errnum == SndfileErrors[k].error)
+		{	fprintf (stderr, "%s\n", SndfileErrors[k].str) ;
+			return SFE_NO_ERROR ;
+			} ;
+	
+	fprintf (stderr, "No error string for error number %d.\n", errnum) ;
+	return SFE_NO_ERROR ;
+} /* sf_perror */
+
+
+/*------------------------------------------------------------------------------
+*/
+
+int	
+sf_error_str	(SNDFILE *sndfile, char *str, size_t maxlen)
+{	SF_PRIVATE 	*psf ;
+	int 		errnum, k ;
+
+	if (! sndfile)
+	{	errnum = sf_errno ;
+		}
+	else
+	{	VALIDATE_SNDFILE_AND_ASSIGN_PSF(sndfile,psf) ;
+		errnum = psf->error ;
+		} ;
+		
+	errnum = abs (errnum) ;
+	errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ;
+
+	for (k = 0 ; SndfileErrors[k].str ; k++)
+		if (errnum == SndfileErrors[k].error)
+		{	if (str)
+			{	strncpy (str, SndfileErrors [errnum].str, maxlen) ;
+				str [maxlen-1] = 0 ;
+				} ;
+			return SFE_NO_ERROR ;
+			} ;
+			
+	if (str)
+	{	strncpy (str, "No error defined for this error number. This is a bug in libsndfile.", maxlen) ;		
+		str [maxlen-1] = 0 ;
+		} ;
+			
+	return SFE_NO_ERROR ;
+} /* sf_error_str */
+
+/*------------------------------------------------------------------------------
+*/
+
+int	
+sf_error_number	(int errnum, char *str, size_t maxlen)
+{	int 		k ;
+
+	errnum = abs (errnum) ;
+	errnum = (errnum >= SFE_MAX_ERROR || errnum < 0) ? 0 : errnum ;
+
+	for (k = 0 ; SndfileErrors[k].str ; k++)
+		if (errnum == SndfileErrors[k].error)
+		{	strncpy (str, SndfileErrors [errnum].str, maxlen) ;
+			str [maxlen-1] = 0 ;
+			return SFE_NO_ERROR ;
+			} ;
+			
+	strncpy (str, "No error defined for this error number. This is a bug in libsndfile.", maxlen) ;		
+	str [maxlen-1] = 0 ;
+			
+	return SFE_NO_ERROR ;
+} /* sf_error_number */
+
+/*------------------------------------------------------------------------------
+*/
+
+int
+sf_format_check	(const SF_INFO *info)
+{	int	subformat = info->format & SF_FORMAT_SUBMASK ;
+
+	/* This is the place where each file format can check if the suppiled
+	** SF_INFO struct is valid.
+	** Return 0 on failure, 1 ons success. 
+	*/
+	
+	if (info->channels < 1 || info->channels > 256)
+		return 0 ;
+
+	switch (info->format & SF_FORMAT_TYPEMASK)
+	{	case SF_FORMAT_WAV :
+				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+					return 1 ;
+				if (subformat == SF_FORMAT_IMA_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)
+					return 1 ;
+				if (subformat == SF_FORMAT_MS_ADPCM && info->pcmbitwidth == 16 && info->channels <= 2)
+					return 1 ;
+				if (subformat == SF_FORMAT_GSM610 && info->pcmbitwidth == 16 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT && info->pcmbitwidth == 32)
+					return 1 ;
+				break ;
+				
+		case SF_FORMAT_AIFF :
+				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_LE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_BE && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))
+					return 1 ;
+				break ;
+				
+		case SF_FORMAT_AU :
+		case SF_FORMAT_AULE :
+				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth >= 8 && info->pcmbitwidth <= 32))
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				if (subformat == SF_FORMAT_G721_32 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_G723_24 && info->channels == 1)
+					return 1 ;
+				if (subformat == SF_FORMAT_FLOAT && (info->pcmbitwidth == 32))
+					return 1 ;
+				break ;
+				
+		case SF_FORMAT_RAW :
+				if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)
+					return 1 ;
+				if (subformat == SF_FORMAT_PCM_U8 && info->pcmbitwidth == 8)
+					return 1 ;
+				if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE)
+					break ;
+				if (! (info->pcmbitwidth % 8) && info->pcmbitwidth <= 32)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_PAF :
+				if (subformat == SF_FORMAT_PCM_S8 && info->pcmbitwidth == 8)
+					return 1 ;
+				if (subformat != SF_FORMAT_PCM_BE && subformat != SF_FORMAT_PCM_LE && subformat != SF_FORMAT_PCM)
+					break ;
+				if ((info->pcmbitwidth % 8) == 0 && info->pcmbitwidth <= 24)
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_SVX :
+				if (subformat == SF_FORMAT_PCM && (info->pcmbitwidth == 8 || info->pcmbitwidth == 16))
+					return 1 ;
+				break ;
+
+		case SF_FORMAT_NIST :
+				if ((subformat == SF_FORMAT_PCM_BE || subformat == SF_FORMAT_PCM_LE || subformat == SF_FORMAT_PCM)
+						&& info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)
+					return 1 ;
+				break ;
+				
+		case SF_FORMAT_IRCAM :
+				if ((subformat == SF_FORMAT_PCM_BE || subformat == SF_FORMAT_PCM_LE || subformat == SF_FORMAT_PCM)
+						&& info->pcmbitwidth >= 16 && info->pcmbitwidth <= 32)
+					return 1 ;
+				if ((subformat == SF_FORMAT_FLOAT_BE || subformat == SF_FORMAT_FLOAT_LE || subformat == SF_FORMAT_FLOAT)
+						&& info->pcmbitwidth == 32)
+					return 1 ;
+				if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+					return 1 ;
+				break ;
+				
+		default : break ;
+		} ;
+
+	return 0 ;
+} /* sf_format_check */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t
+sf_get_header_info	(SNDFILE *sndfile, char *buffer, size_t bufferlen, size_t offset)
+{	SF_PRIVATE	*psf ;
+	int			len ;
+	
+	if (! sndfile)
+	{	strncpy (buffer, sf_logbuffer, bufferlen - 1) ;
+		buffer [bufferlen - 1] = 0 ;
+		return strlen (sf_logbuffer) ;
+		} ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	len = strlen (psf->logbuffer) ;
+	if (offset < 0 || offset >= len)
+		return 0 ;
+	
+	strncpy (buffer, psf->logbuffer, bufferlen - 1) ;
+	buffer [bufferlen - 1] = 0 ;
+	
+	return strlen (psf->logbuffer) ;
+} /* sf_get_header_info */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_get_lib_version	(char *buffer, size_t bufferlen)
+{	if (! buffer || ! bufferlen)
+		return 0 ;
+
+	strncpy (buffer, PACKAGE "-" VERSION, bufferlen - 1) ;
+	buffer [bufferlen - 1] = 0 ;
+	
+	return strlen (buffer) ;
+} /* sf_get_lib_version */
+
+/*------------------------------------------------------------------------------
+*/
+
+int	
+sf_command	(SNDFILE *sndfile, const char *cmd, void *data, int datasize)
+{	SF_PRIVATE 		*psf ;
+	int command ;
+	
+	command = hash_command (cmd) ;
+	
+	if (command == SFC_LIB_VERSION) 
+	{	strncpy (data, PACKAGE "-" VERSION, datasize - 1) ;
+		((char*) data) [datasize - 1] = 0 ;
+		return strlen ((char*) data) ;
+		} ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	switch (command)
+	{	case 0 :
+			return (psf->error = SFE_BAD_CONTROL_CMD) ;
+			
+		case SFC_NORM_FLOAT :
+			if (! data)
+				return (psf->error = SFE_BAD_CONTROL_CMD) ;
+			if (! strcmp ("on", data))
+				psf->norm_float = SF_TRUE ;
+			else if (! strcmp ("off", data))
+				psf->norm_float = SF_FALSE ;
+			else
+				return (psf->error = SFE_BAD_CONTROL_CMD) ;
+			break ;		
+			
+		case SFC_NORM_DOUBLE :
+			if (! data)
+				return (psf->error = SFE_BAD_CONTROL_CMD) ;
+			if (! strcmp ("on", data))
+				psf->norm_double = SF_TRUE ;
+			else if (! strcmp ("off", data))
+				psf->norm_double = SF_FALSE ;
+			else
+				return (psf->error = SFE_BAD_CONTROL_CMD) ;
+			break ;		
+			
+		default :
+			/* Must be a file specific command. Pass it on. */
+			if (psf->command)
+				return psf->command (psf, command, data, datasize) ;
+
+			psf_log_printf (psf, "*** sf_command : cmd = %08X\n", command) ;
+			break ;
+		} ;
+
+	return 0 ;
+} /* sf_command */
+
+/*------------------------------------------------------------------------------
+*/
+
+double  
+sf_signal_max   (SNDFILE *sndfile)
+{	SF_PRIVATE 		*psf ;
+	long			position ;
+	unsigned int	k, len, readcount ;
+	double 			max = 0.0, *data, temp ;
+	
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	/* If the file has a PEAK chunk use that information. */
+	if (psf->has_peak)
+	{	for (k = 0 ; k < psf->sf.channels ; k++)
+			if (max < fabs (psf->peak.peak [k].value))
+				max = fabs (psf->peak.peak [k].value);
+		return max ;
+		} ;
+	
+	/* If the file is not seekable, there is nothing we can do. */
+	if (! psf->sf.seekable)
+	{	psf->error = SFE_NOT_SEEKABLE ;
+		return	0.0 ;
+		} ;
+		
+	if (! psf->read_double)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0.0 ;
+		} ;
+		
+	/* Brute force. Read the whole file and find the biggest sample. */
+	position = sf_seek (sndfile, 0, SEEK_CUR) ; /* Get current position in file */
+	sf_seek (sndfile, 0, SEEK_SET) ;			/* Go to start of file. */
+	
+	len = psf->sf.channels * 1024 ;
+	
+	data = malloc (len * sizeof (double)) ;
+	readcount = len ;
+	while (readcount == len)
+	{	readcount = sf_read_double (sndfile, data, len, 0) ;
+		for (k = 0 ; k < len ; k++)
+		{	temp = data [k] ;
+			temp = temp < 0.0 ? -temp : temp ;
+			max  = temp > max ? temp : max ;
+			} ;
+		} ;
+	free (data) ;
+	
+	sf_seek (sndfile, position, SEEK_SET) ;		/* Return to original position. */
+	
+	return	max ;
+} /* sf_signal_max */
+
+/*------------------------------------------------------------------------------
+*/
+
+long	
+sf_seek	(SNDFILE *sndfile, long offset, int whence)
+{	SF_PRIVATE 	*psf ;
+	long		realseek, position ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	if (! psf->sf.seekable)
+	{	psf->error = SFE_NOT_SEEKABLE ;
+		return	((long) -1) ;
+		} ;
+	
+	if (psf->seek_func)
+	{	psf->seek_func (psf, offset, whence) ;
+		return psf->current ;
+		} ;
+		
+	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	switch (whence)
+	{	case SEEK_SET :
+				if (offset < 0 || offset * psf->blockwidth > psf->datalength)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				realseek = psf->dataoffset + offset * psf->blockwidth ;
+				fseek (psf->file, realseek, SEEK_SET) ;
+				position = ftell (psf->file) ;
+				break ;
+
+		case SEEK_CUR :
+				position = (ftell (psf->file) - psf->dataoffset) / psf->blockwidth ;
+				if (psf->current + offset > psf->sf.samples)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				realseek = psf->dataoffset + (position + offset) * psf->blockwidth ;
+				fseek (psf->file, realseek, SEEK_SET) ;
+				position = ftell (psf->file) ;
+				break ;
+
+		case SEEK_END :
+				if (offset > 0 || psf->sf.samples + offset < 0)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				realseek = (psf->sf.samples + offset) * psf->blockwidth + psf->dataoffset ;
+
+				fseek (psf->file, realseek, SEEK_SET) ;
+				position = ftell (psf->file) ;
+				break ;
+				
+		default : 
+				psf->error = SFE_BAD_SEEK ;
+				return	((long) -1) ;
+		} ;
+
+	psf->current = (position - psf->dataoffset) / psf->blockwidth ;
+	return psf->current ;
+} /* sf_seek */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t
+sf_read_raw		(SNDFILE *sndfile, void *ptr, size_t bytes)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return	0 ;
+		} ;
+	
+	if (psf->current >= psf->datalength)
+	{	memset (ptr, 0, bytes) ;
+		return 0 ;
+		} ;
+	
+	if (bytes % (psf->sf.channels * psf->bytewidth))
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+	
+	count = fread (ptr, 1, bytes, psf->file) ;
+		
+	if (count < bytes)
+		memset (((char*)ptr) + count, 0, bytes - count) ;
+
+	psf->current += count / psf->blockwidth ;
+	
+	return count ;
+} /* sf_read_raw */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t
+sf_read_short		(SNDFILE *sndfile, short *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, len * sizeof (short)) ;
+		return 0 ; /* End of file. */
+		} ;
+
+	if (! psf->read_short)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+		
+	count = psf->read_short (psf, ptr, len) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = len - count ;
+		memset (ptr + count, 0, extra * sizeof (short)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_read_short */
+
+size_t
+sf_readf_short		(SNDFILE *sndfile, short *ptr, size_t frames)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (short)) ;
+		return 0 ; /* End of file. */
+		} ;
+
+	if (! psf->read_short)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->read_short (psf, ptr, frames * psf->sf.channels) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra =  frames * psf->sf.channels - count ;
+		memset (ptr + count, 0, extra * sizeof (short)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_readf_short */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_read_int		(SNDFILE *sndfile, int *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
+
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, len * sizeof (int)) ;
+		return 0 ;
+		} ;
+
+	if (! psf->read_int)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->read_int (psf, ptr, len) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = len - count ;
+		memset (ptr + count, 0, extra * sizeof (int)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_read_int */
+
+size_t	
+sf_readf_int		(SNDFILE *sndfile, int *ptr, size_t frames)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
+
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (int)) ;
+		return 0 ;
+		} ;
+
+	if (! psf->read_int)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+		
+	count = psf->read_int (psf, ptr, frames * psf->sf.channels) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		memset (ptr + count, 0, extra * sizeof (int)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_readf_int */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_read_float		(SNDFILE *sndfile, float *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
+
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, len * sizeof (float)) ;
+		return 0 ;
+		} ;
+
+	if (! psf->read_float)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+		
+	count = psf->read_float (psf, ptr, len) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = len - count ;
+		memset (ptr + count, 0, extra * sizeof (float)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_read_float */
+
+size_t	
+sf_readf_float		(SNDFILE *sndfile, float *ptr, size_t frames)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF   (sndfile,psf) ;
+
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (float)) ;
+		return 0 ;
+		} ;
+
+	if (! psf->read_float)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+		
+	count = psf->read_float (psf, ptr, frames * psf->sf.channels) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		memset (ptr + count, 0, extra * sizeof (float)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_readf_float */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_read_double	(SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_READ_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, len * sizeof (double)) ;
+		return 0 ;
+		} ;
+		
+	if (! psf->read_double)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+		
+	count = psf->read_double (psf, ptr, len, normalize) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = len - count ;
+		memset (ptr + count, 0, extra * sizeof (double)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_read_double */
+
+size_t	
+sf_readf_double	(SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
+{	SF_PRIVATE 	*psf ;
+	size_t		count, extra ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+	
+	if (psf->mode != SF_MODE_READ)
+	{	psf->error = SFE_NOT_READMODE ;
+		return 0 ;
+		} ;
+	
+	if (psf->current >= psf->sf.samples)
+	{	memset (ptr, 0, frames * psf->sf.channels * sizeof (double)) ;
+		return 0 ;
+		} ;
+		
+	if (! psf->read_double)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return	0 ;
+		} ;
+		
+	count = psf->read_double (psf, ptr, frames * psf->sf.channels, normalize) ;
+	
+	if (psf->current + count / psf->sf.channels > psf->sf.samples)
+	{	count = (psf->sf.samples - psf->current) * psf->sf.channels ;
+		extra = frames * psf->sf.channels - count ;
+		memset (ptr + count, 0, extra * sizeof (double)) ;
+		psf->current = psf->sf.samples ;
+		} ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_readf_double */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_write_raw	(SNDFILE *sndfile, void *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % (psf->sf.channels * psf->bytewidth))
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+	
+	count = fwrite (ptr, 1, len, psf->file) ;
+	
+	psf->current += count / psf->blockwidth ;
+	
+	return count ;
+} /* sf_write_raw */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_write_short		(SNDFILE *sndfile, short *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_short)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_short (sndfile, ptr, len) ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_write_short */
+
+size_t	
+sf_writef_short		(SNDFILE *sndfile, short *ptr, size_t frames)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_short)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_short (sndfile, ptr, frames * psf->sf.channels) ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_writef_short */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_write_int		(SNDFILE *sndfile, int *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_int)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_int (sndfile, ptr, len) ;
+
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_write_int */
+
+size_t	
+sf_writef_int		(SNDFILE *sndfile, int *ptr, size_t frames)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_int)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_int (sndfile, ptr, frames * psf->sf.channels) ;
+
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_writef_int */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_write_float		(SNDFILE *sndfile, float *ptr, size_t len)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_float)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_float (sndfile, ptr, len) ;
+
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_write_float */
+
+size_t	
+sf_writef_float		(SNDFILE *sndfile, float *ptr, size_t frames)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_float)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_float (sndfile, ptr, frames * psf->sf.channels) ;
+
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_writef_float */
+
+/*------------------------------------------------------------------------------
+*/
+
+size_t	
+sf_write_double		(SNDFILE *sndfile, double *ptr, size_t len, int normalize)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (len % psf->sf.channels)
+	{	psf->error = SFE_BAD_WRITE_ALIGN ;
+		return	0 ;
+		} ;
+		
+	if (! psf->write_double)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_double (sndfile, ptr, len, normalize) ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count ;
+} /* sf_write_double */
+
+size_t	
+sf_writef_double		(SNDFILE *sndfile, double *ptr, size_t frames, int normalize)
+{	SF_PRIVATE 	*psf ;
+	size_t		count ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->mode != SF_MODE_WRITE)
+	{	psf->error = SFE_NOT_WRITEMODE ;
+		return 0 ;
+		} ;
+	
+	if (! psf->write_double)
+	{	psf->error = SFE_UNIMPLEMENTED ;
+		return 0 ;
+		} ;
+		
+	count = psf->write_double (sndfile, ptr, frames * psf->sf.channels, normalize) ;
+	
+	psf->current += count / psf->sf.channels ;
+	
+	return count / psf->sf.channels ;
+} /* sf_writef_double */
+
+/*------------------------------------------------------------------------------
+*/
+
+int	
+sf_close	(SNDFILE *sndfile)
+{	SF_PRIVATE  *psf ;
+	int			error ;
+
+	VALIDATE_SNDFILE_AND_ASSIGN_PSF (sndfile, psf) ;
+
+	if (psf->close)
+		error = psf->close (psf) ;
+	
+	fclose (psf->file) ;
+	memset (psf, 0, sizeof (SF_PRIVATE)) ;
+		
+	free (psf) ;
+
+	return 0 ;
+} /* sf_close */
+
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int 
+does_extension_match (const char *ext, const char *test)
+{	char c1, c2 ;
+
+	if ((! ext) || (! test))
+		return 0 ;
+
+	if (strlen (ext) != strlen (test))
+		return 0 ;
+
+	while (*ext && *test)
+	{	c1 = tolower (*ext) ;
+		c2 = tolower (*test) ;
+		if (c1 > c2)
+			return 0 ;
+		if (c1 < c2)
+			return 0 ;
+		ext ++ ;
+		test ++ ;
+		} 
+
+	return 1 ;
+} /* does_extension_match */
+
+static int 
+is_au_snd_file (const char *filename)
+{	const char *cptr ;
+
+	if (! (cptr = strrchr (filename, '.')))
+		return 0 ;
+	cptr ++ ;
+	
+	if (does_extension_match (cptr, "au"))
+		return 1 ;
+		
+	if (does_extension_match (cptr, "snd"))
+		return 1 ;
+		
+	return 0 ;
+} /* is_au_snd_file */
+
+static int 
+guess_file_type (SF_PRIVATE *psf, const char *filename)
+{	unsigned int buffer [3] ;
+
+	psf_binheader_readf (psf, "B", &buffer, sizeof (buffer)) ;
+
+	if (buffer [0] == MAKE_MARKER ('R','I','F','F') && buffer [2] == MAKE_MARKER ('W','A','V','E'))
+		return SF_FORMAT_WAV ;
+		
+	if (buffer [0] == MAKE_MARKER ('F','O','R','M'))
+	{	if (buffer [2] == MAKE_MARKER ('A','I','F','F') || buffer [2] == MAKE_MARKER ('A','I','F','C'))
+			return SF_FORMAT_AIFF ;
+		if (buffer [2] == MAKE_MARKER ('8','S','V','X') || buffer [2] == MAKE_MARKER ('1','6','S','V'))
+			return SF_FORMAT_SVX ;
+		return 0 ;
+		} ;
+		
+	if ((buffer [0] == MAKE_MARKER ('.','s','n','d') || buffer [0] == MAKE_MARKER ('d','n','s','.')))
+		return SF_FORMAT_AU ;
+		
+	if ((buffer [0] == MAKE_MARKER ('f','a','p',' ') || buffer [0] == MAKE_MARKER (' ','p','a','f')))
+		return SF_FORMAT_PAF ;
+	
+	if (buffer [0] == MAKE_MARKER ('N','I','S','T'))
+		return SF_FORMAT_NIST ;
+		
+	if (buffer [0] == MAKE_MARKER ('S','E','K','D') && buffer [1] == MAKE_MARKER ('S','A','M','R'))
+		return SF_FORMAT_SMPLTD ;
+		
+	if (buffer [0] == MAKE_MARKER ('C','r','e','a') && buffer [1] == MAKE_MARKER ('t','i','v','e'))
+		return SF_FORMAT_VOC ;
+		
+	if ((buffer [0] & MAKE_MARKER (0xFF, 0xFF, 0xF8, 0xFF)) == MAKE_MARKER (0x64, 0xA3, 0x00, 0x00) || 
+		(buffer [0] & MAKE_MARKER (0xFF, 0xF8, 0xFF, 0xFF)) == MAKE_MARKER (0x00, 0x00, 0xA3, 0x64))
+		return SF_FORMAT_IRCAM ;
+		
+	if (buffer [0] == MAKE_MARKER ('C', 'A', 'T', ' ') && buffer [2] == MAKE_MARKER ('R', 'E', 'X', '2'))
+		return SF_FORMAT_REX2 ;
+
+	if (buffer [0] == MAKE_MARKER (0x30, 0x26, 0xB2, 0x75) && buffer [1] == MAKE_MARKER (0x8E, 0x66, 0xCF, 0x11))
+		return SF_FORMAT_WMA ;
+
+	/* This must be the last one. */		
+	if (filename && is_au_snd_file (filename))
+		return SF_FORMAT_AU | SF_FORMAT_ULAW ;
+
+	/* Default to header-less RAW PCM file type. */
+	return SF_FORMAT_RAW ;
+} /* guess_file_type */
+
+
+static int 
+validate_sfinfo (SF_INFO *sfinfo)
+{	if (! sfinfo->samplerate)
+		return 0 ;	
+	if (! sfinfo->samples)
+		return 0 ;	
+	if (! sfinfo->channels)
+		return 0 ;	
+	if (! sfinfo->pcmbitwidth)
+		return 0 ;	
+	if (! sfinfo->format & SF_FORMAT_TYPEMASK)
+		return 0 ;	
+	if (! sfinfo->format & SF_FORMAT_SUBMASK)
+		return 0 ;	
+	if (! sfinfo->sections)
+		return 0 ;	
+	return 1 ;
+} /* validate_sfinfo */
+
+static int
+validate_psf (SF_PRIVATE *psf)
+{	if (! psf->blockwidth)
+		return 0 ;	
+	if (! psf->bytewidth)
+		return 0 ;	
+	if (! psf->datalength)
+		return 0 ;
+	if (psf->blockwidth != psf->sf.channels * psf->bytewidth)
+		return 0 ;	
+	return 1 ;
+} /* validate_psf */
+
+static void 
+save_header_info (SF_PRIVATE *psf)
+{	memset (sf_logbuffer, 0, sizeof (sf_logbuffer)) ;
+	strncpy (sf_logbuffer, psf->logbuffer, sizeof (sf_logbuffer)) ;
+} /* save_header_info */
+
+static void 
+copy_filename (SF_PRIVATE *psf, const char *path)
+{	const char *cptr ;
+
+	if ((cptr = strrchr (path, '/')) || (cptr = strrchr (path, '\\')))
+		cptr ++ ;
+	else
+		cptr = path ;
+		
+	memset (psf->filename, 0, SF_FILENAME_LEN) ;
+	strncpy (psf->filename, cptr, SF_FILENAME_LEN - 1) ;
+	psf->filename [SF_FILENAME_LEN - 1] = 0 ;
+} /* copy_filename */
+
+static int	
+hash_command (const char *cmd)
+{	int	hash = 0 ;
+
+	if (! cmd)
+		return 0 ;
+
+	while (*cmd)
+	{	hash = (hash<<1) ^ *cmd ;
+		cmd ++ ;
+		} ;
+		
+	return hash ;
+} /* hash_command */
+
--- /dev/null
+++ b/common/libsndfile/src/sndfile.h
@@ -1,0 +1,238 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/* sndfile.h -- system-wide definitions */
+
+#ifndef SNDFILE_H
+#define SNDFILE_H
+
+#include	<stdio.h>
+#include	<stdlib.h>
+
+/* For the Metrowerks CodeWarrior Pro Compiler (mainly MacOS) */
+
+#if	(defined (__MWERKS__))
+#include	<unix.h>
+#else
+#include	<sys/types.h>
+#endif
+
+#if defined (_WIN32)
+	#pragma pack(push,1)
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif	/* __cplusplus */
+
+/* The following file types can be read and written.
+** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise
+** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and
+** SF_FORMAT_SUBMASK can be used to separate the major and minor file
+** types.
+*/
+
+enum
+{	SF_FORMAT_WAV		= 0x10000,		/* Microsoft WAV format (little endian). */
+	SF_FORMAT_AIFF		= 0x20000,		/* Apple/SGI AIFF format (big endian). */
+	SF_FORMAT_AU		= 0x30000,		/* Sun/NeXT AU format (big endian). */
+	SF_FORMAT_AULE		= 0x40000,		/* DEC AU format (little endian). */
+	SF_FORMAT_RAW		= 0x50000,		/* RAW PCM data. */
+	SF_FORMAT_PAF		= 0x60000,		/* Ensoniq PARIS file format. */
+	SF_FORMAT_SVX		= 0x70000,		/* Amiga IFF / SVX8 / SV16 format. */
+	SF_FORMAT_NIST		= 0x80000,		/* Sphere NIST format. */
+	SF_FORMAT_WMA		= 0x90000,		/* Windows Media Audio. */
+	SF_FORMAT_SMPLTD	= 0xA0000,		/* Sekd Samplitude. */
+	SF_FORMAT_VOC		= 0xB0000,		/* VOC files. */
+	SF_FORMAT_SD2		= 0xC0000,		/* Sound Designer 2 */
+	SF_FORMAT_REX2		= 0xD0000,		/* Propellorheads Rex2 */
+	SF_FORMAT_IRCAM		= 0xE0000,		/* Berkeley/IRCAM/CARL */
+	
+	/* Subtypes from here on. */
+	
+	SF_FORMAT_PCM		= 0x0001,		/* PCM data in 8, 16, 24 or 32 bits. */
+	SF_FORMAT_FLOAT		= 0x0002,		/* 32 bit floats. */
+	SF_FORMAT_ULAW		= 0x0003,		/* U-Law encoded. */
+	SF_FORMAT_ALAW		= 0x0004,		/* A-Law encoded. */
+	SF_FORMAT_IMA_ADPCM = 0x0005,		/* IMA ADPCM. */
+	SF_FORMAT_MS_ADPCM  = 0x0006,		/* Microsoft ADPCM. */
+
+	SF_FORMAT_PCM_BE	= 0x0007,		/* Big endian PCM data. */
+	SF_FORMAT_PCM_LE  	= 0x0008,		/* Little endian PCM data. */
+	SF_FORMAT_PCM_S8	= 0x0009,		/* Signed 8 bit PCM. */
+	SF_FORMAT_PCM_U8  	= 0x000A,		/* Unsigned 8 bit PCM. */
+	
+	SF_FORMAT_SVX_FIB	= 0x000B, 		/* SVX Fibonacci Delta encoding. */
+	SF_FORMAT_SVX_EXP	= 0x000C, 		/* SVX Exponential Delta encoding. */
+
+	SF_FORMAT_GSM610	= 0x000D, 		/* GSM 6.10 encoding. */
+
+	SF_FORMAT_G721_32	= 0x000E, 		/* 32kbs G721 ADPCM encoding. */
+	SF_FORMAT_G723_24	= 0x000F, 		/* 24kbs G723 ADPCM encoding. */
+
+	SF_FORMAT_FLOAT_BE	= 0x0010,		/* Big endian FLOAT data. */
+	SF_FORMAT_FLOAT_LE  = 0x0011,		/* Little endian FLOAT data. */
+
+	SF_FORMAT_SUBMASK	= 0xFFFF,		
+	SF_FORMAT_TYPEMASK	= 0x7FFF0000
+} ;
+
+/* The following SF_FORMAT_RAW_* identifiers are deprecated. Use the
+** SF_FORMAT_PCM_* identifiers instead.
+*/
+#define	SF_FORMAT_RAW_BE	SF_FORMAT_PCM_BE
+#define	SF_FORMAT_RAW_LE	SF_FORMAT_PCM_LE
+#define	SF_FORMAT_RAW_S8	SF_FORMAT_PCM_S8
+#define	SF_FORMAT_RAW_U8	SF_FORMAT_PCM_U8
+
+/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
+
+typedef	void	SNDFILE ;
+
+/* A pointer to a SF_INFO structure is passed to sf_open_read () and filled in. 
+** On write, the SF_INFO structure is filled in by the user and passed into  
+** sf_open_write ().
+*/
+
+typedef	struct
+{	unsigned int	samplerate ;
+	unsigned int	samples ;
+	unsigned int	channels ;
+	unsigned int	pcmbitwidth ;  /* pcmbitwidth is deprecated. */
+	unsigned int	format ;
+	unsigned int	sections ;
+	unsigned int	seekable ;
+} SF_INFO ;
+
+/* Open the specified file for read or write. On error, this will return 
+** a NULL pointer. To find the error number, pass a NULL SNDFILE to
+** sf_perror () or sf_error_str ().
+*/
+
+SNDFILE* 	sf_open_read	(const char *path, SF_INFO *sfinfo) ;
+SNDFILE* 	sf_open_write	(const char *path, const SF_INFO *sfinfo) ;
+
+/* sf_perror () prints out the current error state.
+** sf_error_str () returns the current error message to the caller in the 
+** string buffer provided. 
+*/
+
+int		sf_perror		(SNDFILE *sndfile) ;
+int		sf_error_str	(SNDFILE *sndfile, char* str, size_t len) ;
+
+int		sf_error_number	(int errnum, char *str, size_t maxlen) ;
+
+
+size_t	sf_get_header_info	(SNDFILE *sndfile, char* buffer, size_t bufferlen, size_t offset) ;
+
+/* Get the library version string. */
+
+size_t	sf_get_lib_version	(char* buffer, size_t bufferlen) ;
+
+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
+
+int		sf_command	(SNDFILE *sndfile, const char *cmd, void *data, int datasize) ;
+
+/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
+
+int		sf_format_check	(const SF_INFO *info) ;
+
+/* Return the maximum absolute sample value in the SNDFILE. */
+
+double	sf_signal_max	(SNDFILE *sndfile) ;
+
+/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses 
+** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as
+** stdio.h functions lseek () and fseek ().
+** An offset of zero with whence set to SEEK_SET will position the 
+** read / write pointer to the first data sample.
+** On success sf_seek returns the current position in (multi-channel) 
+** samples from the start of the file.
+** On error sf_seek returns -1.
+*/
+
+long	sf_seek 		(SNDFILE *sndfile, long frames, int whence) ;
+
+/* Functions for reading/writing the waveform data of a sound file.
+*/
+
+size_t	sf_read_raw		(SNDFILE *sndfile, void *ptr, size_t bytes) ;
+size_t	sf_write_raw 	(SNDFILE *sndfile, void *ptr, size_t bytes) ;
+
+/* Functions for reading and writing the data chunk in terms of frames. 
+** The number of items actually read/written = frames * number of channels.
+**     sf_xxxx_raw		read/writes the raw data bytes from/to the file
+**     sf_xxxx_uchar	passes data in the unsigned char format
+**     sf_xxxx_char		passes data in the signed char format
+**     sf_xxxx_short	passes data in the native short format
+**     sf_xxxx_int		passes data in the native int format
+**     sf_xxxx_float	passes data in the native float format
+**     sf_xxxx_double	passes data in the native double format
+** For the double format, if the normalize flag is TRUE, the read/write 
+** operations will use floats/doubles in the rangs [-1.0 .. 1.0] to 
+** represent the minimum and maximum values of the waveform irrespective
+** of the bitwidth of the input/output file.
+** All of these read/write function return number of frames read/written.
+*/
+
+size_t	sf_readf_short	(SNDFILE *sndfile, short *ptr, size_t frames) ;
+size_t	sf_writef_short	(SNDFILE *sndfile, short *ptr, size_t frames) ;
+
+size_t	sf_readf_int	(SNDFILE *sndfile, int *ptr, size_t frames) ;
+size_t	sf_writef_int 	(SNDFILE *sndfile, int *ptr, size_t frames) ;
+
+size_t	sf_readf_float	(SNDFILE *sndfile, float *ptr, size_t frames) ;
+size_t	sf_writef_float	(SNDFILE *sndfile, float *ptr, size_t frames) ;
+
+size_t	sf_readf_double	(SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
+size_t	sf_writef_double(SNDFILE *sndfile, double *ptr, size_t frames, int normalize) ;
+
+/* Functions for reading and writing the data chunk in terms of items. 
+** Otherwise similar to above.
+** All of these read/write function return number of items read/written.
+*/
+
+size_t	sf_read_short	(SNDFILE *sndfile, short *ptr, size_t items) ;
+size_t	sf_write_short	(SNDFILE *sndfile, short *ptr, size_t items) ;
+
+size_t	sf_read_int		(SNDFILE *sndfile, int *ptr, size_t items) ;
+size_t	sf_write_int 	(SNDFILE *sndfile, int *ptr, size_t items) ;
+
+size_t	sf_read_float	(SNDFILE *sndfile, float *ptr, size_t items) ;
+size_t	sf_write_float	(SNDFILE *sndfile, float *ptr, size_t items) ;
+
+size_t	sf_read_double	(SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
+size_t	sf_write_double	(SNDFILE *sndfile, double *ptr, size_t items, int normalize) ;
+
+/* Close the SNDFILE. Returns 0 on success, or an error number. */
+
+int		sf_close		(SNDFILE *sndfile) ;
+
+#ifdef __cplusplus
+}		/* extern "C" */
+#endif	/* __cplusplus */
+
+#ifdef _WIN32
+	#pragma pack(pop,1)
+#endif
+
+#endif	/* SNDFILE_H */
+
+
+
+
--- /dev/null
+++ b/common/libsndfile/src/stamp-h.in
@@ -1,0 +1,1 @@
+timestamp
--- /dev/null
+++ b/common/libsndfile/src/svx.c
@@ -1,0 +1,395 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<stdarg.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#define FORM_MARKER	(MAKE_MARKER ('F', 'O', 'R', 'M'))
+#define SVX8_MARKER	(MAKE_MARKER ('8', 'S', 'V', 'X'))
+#define SV16_MARKER	(MAKE_MARKER ('1', '6', 'S', 'V'))
+#define VHDR_MARKER	(MAKE_MARKER ('V', 'H', 'D', 'R'))
+#define BODY_MARKER	(MAKE_MARKER ('B', 'O', 'D', 'Y')) 
+ 
+#define ATAK_MARKER	(MAKE_MARKER ('A','T','A','K'))
+#define RLSE_MARKER	(MAKE_MARKER ('R','L','S','E'))
+
+#define c_MARKER	(MAKE_MARKER ('(', 'c', ')', ' ')) 
+#define NAME_MARKER	(MAKE_MARKER ('N', 'A', 'M', 'E')) 
+#define AUTH_MARKER	(MAKE_MARKER ('A', 'U', 'T', 'H')) 
+#define ANNO_MARKER	(MAKE_MARKER ('A', 'N', 'N', 'O')) 
+#define CHAN_MARKER	(MAKE_MARKER ('C', 'H', 'A', 'N')) 
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+typedef struct
+{	unsigned int	oneShotHiSamples, repeatHiSamples, samplesPerHiCycle ;
+	unsigned short	samplesPerSec ;
+	unsigned char	octave, compression ;
+	unsigned int	volume ;
+} VHDR_CHUNK ;
+
+enum {
+	HAVE_FORM	= 0x01,
+	
+	HAVE_SVX	= 0x02,
+	HAVE_VHDR	= 0x04,
+	HAVE_BODY	= 0x08
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static int		svx_close	(SF_PRIVATE  *psf) ;
+static int		svx_write_header (SF_PRIVATE *psf) ;
+
+/*
+static void 	endswap_vhdr_chunk (VHDR_CHUNK *vhdr) ;
+*/
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int 	
+svx_open_read	(SF_PRIVATE *psf)
+{	VHDR_CHUNK		vhdr ;
+	unsigned int	FORMsize, vhdrsize, dword, marker ;
+	int				filetype = 0, parsestage = 0, done = 0, error ;
+	int 			bytecount = 0, channels ;
+
+	psf_binheader_readf (psf, "p", 0) ;
+	
+	/* Set default number of channels. */
+	psf->sf.channels = 1 ;
+
+	while (! done)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+		switch (marker)
+		{	case FORM_MARKER :
+					if (parsestage)
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "L", &FORMsize) ;
+
+					if (FORMsize != psf->filelength - 2 * sizeof (dword))
+					{	dword = psf->filelength - 2 * sizeof (dword);
+						psf_log_printf (psf, "FORM : %d (should be %d)\n", FORMsize, dword) ;
+						FORMsize = dword ;
+						}
+					else
+						psf_log_printf (psf, "FORM : %d\n", FORMsize) ;
+					parsestage |= HAVE_FORM ;
+					break ;
+
+			case SVX8_MARKER :
+			case SV16_MARKER :
+					if (! (parsestage & HAVE_FORM))
+						return SFE_SVX_NO_FORM ;
+					filetype = marker ;
+					psf_log_printf (psf, " %D\n", marker) ;
+					parsestage |= HAVE_SVX ;
+					break ;
+
+			case VHDR_MARKER :
+					if (! (parsestage & (HAVE_FORM | HAVE_SVX)))
+						return SFE_SVX_NO_FORM ;
+					
+					psf_binheader_readf (psf, "L", &vhdrsize) ;
+
+					psf_log_printf (psf, " VHDR : %d\n", vhdrsize) ;
+
+					psf_binheader_readf (psf, "LLLWbbL", &(vhdr.oneShotHiSamples), &(vhdr.repeatHiSamples), 
+						&(vhdr.samplesPerHiCycle), &(vhdr.samplesPerSec), &(vhdr.octave), &(vhdr.compression),
+						&(vhdr.volume)) ;
+
+					psf_log_printf (psf, "  OneShotHiSamples  : %d\n", vhdr.oneShotHiSamples) ;
+					psf_log_printf (psf, "  RepeatHiSamples   : %d\n", vhdr.repeatHiSamples) ;
+					psf_log_printf (psf, "  samplesPerHiCycle : %d\n", vhdr.samplesPerHiCycle) ;
+					psf_log_printf (psf, "  Sample Rate       : %d\n", vhdr.samplesPerSec) ;
+					psf_log_printf (psf, "  Octave            : %d\n", vhdr.octave) ;
+
+					psf_log_printf (psf, "  Compression       : %d => ", vhdr.compression) ;
+					
+					switch (vhdr.compression)
+					{	case 0 : psf_log_printf (psf, "None.\n") ;
+								break ;
+						case 1 : psf_log_printf (psf, "Fibonacci delta\n") ;
+								break ;
+						case 2 : psf_log_printf (psf, "Exponential delta\n") ;
+								break ;
+						} ;
+
+					psf_log_printf (psf, "  Volume            : %d\n", vhdr.volume) ;
+
+					psf->sf.samplerate 	= vhdr.samplesPerSec ;
+
+					if (filetype == SVX8_MARKER)
+						psf->sf.pcmbitwidth = 8 ;
+					else if (filetype == SV16_MARKER)
+						psf->sf.pcmbitwidth = 16 ;
+						
+					parsestage |= HAVE_VHDR ;
+					break ;
+
+			case BODY_MARKER :
+					if (! (parsestage & HAVE_VHDR))
+						return SFE_SVX_NO_BODY ;
+					
+					psf_binheader_readf (psf, "L", &(psf->datalength)) ;
+					psf->dataoffset = ftell (psf->file) ;
+					
+					if (psf->datalength > psf->filelength - psf->dataoffset)
+					{	psf_log_printf (psf, " BODY : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
+						psf->datalength = psf->filelength - psf->dataoffset ;
+						} 
+					else
+						psf_log_printf (psf, " BODY : %d\n", psf->datalength) ;
+						
+					parsestage |= HAVE_BODY ;
+
+					if (! psf->sf.seekable)
+						break ;
+
+					fseek (psf->file, psf->datalength, SEEK_CUR) ;
+					break ;
+
+			case NAME_MARKER :
+			case ANNO_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "L", &dword) ;
+					
+					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case CHAN_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "L", &dword) ;
+					
+					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+					
+					bytecount += psf_binheader_readf (psf, "L", &channels) ;
+
+					psf_log_printf (psf, "  Channels : %d => %d\n", channels) ;
+					
+					psf_binheader_readf (psf, "j", dword - bytecount) ;
+					break ;
+
+
+			case AUTH_MARKER :
+			case c_MARKER :
+					if (! (parsestage & HAVE_SVX))
+						return SFE_SVX_NO_FORM ;
+
+					psf_binheader_readf (psf, "L", &dword) ;
+					
+					psf_log_printf (psf, " %D : %d\n", marker, dword) ;
+
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			default : 
+					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
+						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
+					{	psf_binheader_readf (psf, "L", &dword) ;
+					
+						psf_log_printf (psf, "%D : %d (unknown marker)\n", marker, dword) ;
+
+						psf_binheader_readf (psf, "j", dword) ;
+						break ;
+						} ;
+					if ((dword = ftell (psf->file)) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					done = 1 ;
+			} ;	/* switch (marker) */
+
+		if (ferror (psf->file))
+		{	psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
+			clearerr (psf->file) ;
+			break ;
+			} ;
+			
+		if (! psf->sf.seekable && (parsestage & HAVE_BODY))
+			break ;
+
+		if (ftell (psf->file) >= (long) (psf->filelength - (2 * sizeof (dword))))
+			break ;
+		} ; /* while (1) */
+		
+	if (vhdr.compression)
+		return SFE_SVX_BAD_COMP ;
+		
+	if (! psf->dataoffset)
+		return SFE_SVX_NO_DATA ;
+
+	psf->sf.format   = (SF_FORMAT_SVX | SF_FORMAT_PCM);
+	psf->sf.sections = 1 ;
+					
+	psf->current     = 0 ;
+	psf->endian      = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
+	psf->sf.seekable = SF_TRUE ;
+	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+	psf->blockwidth  = psf->sf.channels * psf->bytewidth ;
+	
+	if (psf->blockwidth)
+		psf->sf.samples  = psf->datalength / psf->blockwidth ;
+
+	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+
+	psf->close = (func_close) svx_close ;
+
+	psf->chars = SF_CHARS_SIGNED ;
+	if ((error = pcm_read_init (psf)))
+		return error ;
+
+	return 0 ;
+} /* svx_open_read */
+
+int 	
+svx_open_write	(SF_PRIVATE *psf)
+{	int error ;
+
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_SVX)
+		return	SFE_BAD_OPEN_FORMAT ;
+	if ((psf->sf.format & SF_FORMAT_SUBMASK) != SF_FORMAT_PCM)
+		return	SFE_BAD_OPEN_FORMAT ;
+	if (psf->sf.pcmbitwidth != 8 && psf->sf.pcmbitwidth != 16)
+		return	SFE_BAD_OPEN_FORMAT ;
+	
+	psf->endian      = SF_ENDIAN_BIG ;			/* All SVX files are big endian. */
+	psf->sf.seekable = SF_TRUE ;
+	psf->bytewidth   = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+	psf->datalength  = psf->blockwidth * psf->sf.samples ;
+	psf->filelength  = psf->datalength + psf->dataoffset ;
+	psf->error       = 0 ;
+
+	error = svx_write_header (psf) ;
+	if (error)
+		return error ;
+		
+	psf->close        = (func_close)  svx_close ;
+	psf->write_header = (func_wr_hdr) svx_write_header ;
+
+	psf->chars = SF_CHARS_SIGNED ;
+	if ((error = pcm_write_init (psf)))
+		return error ;
+
+	return 0 ;
+} /* svx_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int	
+svx_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can re-write 
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+                
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+		fseek (psf->file, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		svx_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* svx_close */
+
+static int
+svx_write_header (SF_PRIVATE *psf)
+{	static	char 	annotation	[] = "libsndfile by Erik de Castro Lopo\0\0\0" ;
+	
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	/* FORM marker and FORM size. */	
+	psf_binheader_writef (psf, "mL", FORM_MARKER, psf->filelength - 8) ;
+	psf_binheader_writef (psf, "m", (psf->bytewidth == 1) ? SVX8_MARKER : SV16_MARKER) ;
+
+	/* VHDR chunk. */
+	psf_binheader_writef (psf, "mL", VHDR_MARKER, sizeof (VHDR_CHUNK)) ;
+	/* VHDR : oneShotHiSamples, repeatHiSamples, samplesPerHiCycle */
+	psf_binheader_writef (psf, "LLL", psf->sf.samples, 0, 0) ;
+	/* VHDR : samplesPerSec, octave, compression */
+	psf_binheader_writef (psf, "Wbb", psf->sf.samplerate, 1, 0) ;
+	/* VHDR : volume */
+	psf_binheader_writef (psf, "L", (psf->bytewidth == 1) ? 255 : 0xFFFF) ;
+
+	/* Filename and annotation strings. */
+	psf_binheader_writef (psf, "mSmS", NAME_MARKER, psf->filename, ANNO_MARKER, annotation) ;
+	
+	/* BODY marker and size. */
+	psf_binheader_writef (psf, "mL", BODY_MARKER, psf->datalength) ;
+
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+	
+	return 0 ;
+} /* svx_write_header */
+
+/*-
+static void 
+endswap_vhdr_chunk (VHDR_CHUNK *vhdr)
+{	vhdr->oneShotHiSamples  = ENDSWAP_INT (vhdr->oneShotHiSamples) ;
+	vhdr->repeatHiSamples   = ENDSWAP_INT (vhdr->repeatHiSamples) ;
+	vhdr->samplesPerHiCycle = ENDSWAP_INT (vhdr->samplesPerHiCycle) ;
+	vhdr->samplesPerSec     = ENDSWAP_SHORT (vhdr->samplesPerSec) ;
+	vhdr->volume            = ENDSWAP_INT (vhdr->volume) ;
+} /+* endswap_vhdr_chunk *+/
+-*/
+
--- /dev/null
+++ b/common/libsndfile/src/ulaw.c
@@ -1,0 +1,1100 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<unistd.h>
+
+#include	"sndfile.h"
+#include	"floatcast.h"
+#include	"common.h"
+
+static int		ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int		ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int		ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int		ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
+static int		ulaw_write_s2ulaw (SF_PRIVATE *psf, short *ptr, unsigned int len) ;
+static int		ulaw_write_i2ulaw (SF_PRIVATE *psf, int *ptr, unsigned int len) ;
+static int		ulaw_write_f2ulaw (SF_PRIVATE *psf, float *ptr, unsigned int len) ;
+static int		ulaw_write_d2ulaw (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize) ;
+
+static  void    ulaw2s_array      (unsigned char *buffer, unsigned int count, short *ptr, unsigned int index) ;
+static  void    ulaw2i_array      (unsigned char *buffer, unsigned int count, int *ptr, unsigned int index) ;
+static  void    ulaw2f_array      (unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact) ;
+static  void    ulaw2d_array      (unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact) ;
+
+static  void    s2ulaw_array      (short *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
+static  void    i2ulaw_array      (int *buffer, unsigned int count, unsigned char *ptr, unsigned int index) ;
+static  void    f2ulaw_array      (float *buffer, unsigned int count, unsigned char *ptr, unsigned int index, float normfact) ;
+static  void    d2ulaw_array      (double *buffer, unsigned int count, unsigned char *ptr, unsigned int index, double normfact) ;
+
+
+int 
+ulaw_read_init (SF_PRIVATE *psf)
+{
+	psf->read_short  = (func_short)  ulaw_read_ulaw2s ;
+	psf->read_int    = (func_int)    ulaw_read_ulaw2i ;
+	psf->read_float  = (func_float)  ulaw_read_ulaw2f ;
+	psf->read_double = (func_double) ulaw_read_ulaw2d ;
+
+	return 0 ;
+} /* ulaw_read_int */
+
+int 
+ulaw_write_init (SF_PRIVATE *psf)
+{
+	psf->write_short  = (func_short)  ulaw_write_s2ulaw ;
+	psf->write_int    = (func_int)    ulaw_write_i2ulaw ;
+	psf->write_float  = (func_float)  ulaw_write_f2ulaw ;
+	psf->write_double = (func_double) ulaw_write_d2ulaw ;
+
+	return 0 ;
+} /* ulaw_write_int */
+
+static int
+ulaw_read_ulaw2s (SF_PRIVATE *psf, short *ptr, unsigned int len)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		ulaw2s_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_read_ulaw2s */
+
+static int
+ulaw_read_ulaw2i (SF_PRIVATE *psf, int *ptr, unsigned int len)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		ulaw2i_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_read_ulaw2i */
+
+static int
+ulaw_read_ulaw2f (SF_PRIVATE *psf, float *ptr, unsigned int len)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		ulaw2f_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_read_ulaw2f */
+
+static int
+ulaw_read_ulaw2d (SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{	unsigned int readcount, thisread, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	readcount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		thisread = fread (psf->buffer, 1, readcount, psf->file) ;
+		ulaw2d_array ((unsigned char*) (psf->buffer), thisread / psf->bytewidth, ptr, index, normfact) ;
+		total += thisread ;
+		if (thisread < readcount)
+			break ;
+		index += thisread / psf->bytewidth ;
+		bytecount -= thisread ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_read_ulaw2d */
+
+/*=============================================================================================
+*/
+
+static int
+ulaw_write_s2ulaw	(SF_PRIVATE *psf, short *ptr, unsigned int len)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		s2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_write_s2ulaw */
+
+static int
+ulaw_write_i2ulaw	(SF_PRIVATE *psf, int *ptr, unsigned int len)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		i2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_write_i2ulaw */
+
+static int
+ulaw_write_f2ulaw	(SF_PRIVATE *psf, float *ptr, unsigned int len)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	float	normfact ;
+
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		f2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_write_f2ulaw */
+
+static int
+ulaw_write_d2ulaw	(SF_PRIVATE *psf, double *ptr, unsigned int len, int normalize)
+{	unsigned int	writecount, thiswrite, index = 0 ;
+	int		bytecount, bufferlen ;
+	int		total = 0 ;
+	double	normfact ;
+	
+	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+
+	bufferlen = (SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth ;
+	bytecount = len * psf->bytewidth ;
+	while (bytecount > 0)
+	{	writecount = (bytecount >= bufferlen) ? bufferlen : bytecount ;
+		d2ulaw_array (ptr, index, (unsigned char*) (psf->buffer), writecount / psf->bytewidth, normfact) ;
+		thiswrite = fwrite (psf->buffer, 1, writecount, psf->file) ;
+		total += thiswrite ;
+		if (thiswrite < writecount)
+			break ;
+		index += thiswrite / psf->bytewidth ;
+		bytecount -= thiswrite ;
+		} ;
+
+	total /= psf->bytewidth ;
+	if (total < len)
+		psf->error = SFE_SHORT_READ ;
+	
+	return total ;
+} /* ulaw_write_d2ulaw */
+
+/*=============================================================================================
+ *	Private static functions and data.
+ */
+
+static	short	ulaw_decode [128] =
+{	-32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956, 
+	-23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764, 
+	-15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412, 
+	-11900, -11388, -10876, -10364,  -9852,  -9340,  -8828,  -8316, 
+	 -7932,  -7676,  -7420,  -7164,  -6908,  -6652,  -6396,  -6140, 
+	 -5884,  -5628,  -5372,  -5116,  -4860,  -4604,  -4348,  -4092, 
+	 -3900,  -3772,  -3644,  -3516,  -3388,  -3260,  -3132,  -3004, 
+	 -2876,  -2748,  -2620,  -2492,  -2364,  -2236,  -2108,  -1980, 
+	 -1884,  -1820,  -1756,  -1692,  -1628,  -1564,  -1500,  -1436, 
+	 -1372,  -1308,  -1244,  -1180,  -1116,  -1052,   -988,   -924, 
+	  -876,   -844,   -812,   -780,   -748,   -716,   -684,   -652, 
+	  -620,   -588,   -556,   -524,   -492,   -460,   -428,   -396, 
+	  -372,   -356,   -340,   -324,   -308,   -292,   -276,   -260, 
+	  -244,   -228,   -212,   -196,   -180,   -164,   -148,   -132, 
+	  -120,   -112,   -104,    -96,    -88,    -80,    -72,    -64, 
+	   -56,    -48,    -40,    -32,    -24,    -16,     -8,      0, 
+} ;
+
+static	
+unsigned char	ulaw_encode [8193] =
+{	0xFF, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFC, 0xFB, 0xFB, 0xFA, 0xFA, 0xF9, 
+	0xF9, 0xF8, 0xF8, 0xF7, 0xF7, 0xF6, 0xF6, 0xF5, 0xF5, 0xF4, 0xF4, 0xF3, 
+	0xF3, 0xF2, 0xF2, 0xF1, 0xF1, 0xF0, 0xF0, 0xEF, 0xEF, 0xEF, 0xEF, 0xEE, 
+	0xEE, 0xEE, 0xEE, 0xED, 0xED, 0xED, 0xED, 0xEC, 0xEC, 0xEC, 0xEC, 0xEB, 
+	0xEB, 0xEB, 0xEB, 0xEA, 0xEA, 0xEA, 0xEA, 0xE9, 0xE9, 0xE9, 0xE9, 0xE8, 
+	0xE8, 0xE8, 0xE8, 0xE7, 0xE7, 0xE7, 0xE7, 0xE6, 0xE6, 0xE6, 0xE6, 0xE5, 
+	0xE5, 0xE5, 0xE5, 0xE4, 0xE4, 0xE4, 0xE4, 0xE3, 0xE3, 0xE3, 0xE3, 0xE2, 
+	0xE2, 0xE2, 0xE2, 0xE1, 0xE1, 0xE1, 0xE1, 0xE0, 0xE0, 0xE0, 0xE0, 0xDF, 
+	0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDF, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 
+	0xDE, 0xDE, 0xDE, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 
+	0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 
+	0xDB, 0xDB, 0xDB, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0xD9, 
+	0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD9, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 
+	0xD8, 0xD8, 0xD8, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD7, 0xD6, 
+	0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD5, 0xD5, 0xD5, 0xD5, 0xD5, 
+	0xD5, 0xD5, 0xD5, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 
+	0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD3, 0xD2, 0xD2, 0xD2, 0xD2, 0xD2, 
+	0xD2, 0xD2, 0xD2, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD1, 0xD0, 
+	0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 
+	0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCE, 
+	0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 
+	0xCE, 0xCE, 0xCE, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 
+	0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 
+	0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCB, 
+	0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 
+	0xCB, 0xCB, 0xCB, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 
+	0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 
+	0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC9, 0xC8, 
+	0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 
+	0xC8, 0xC8, 0xC8, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 
+	0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 
+	0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC5, 
+	0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 0xC5, 
+	0xC5, 0xC5, 0xC5, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 
+	0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 
+	0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC2, 
+	0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 0xC2, 
+	0xC2, 0xC2, 0xC2, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 
+	0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 
+	0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xBF, 
+	0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 
+	0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 
+	0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 
+	0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 
+	0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 
+	0xBE, 0xBE, 0xBE, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 
+	0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 
+	0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBC, 
+	0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 
+	0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 
+	0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 
+	0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 
+	0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 
+	0xBB, 0xBB, 0xBB, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 
+	0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 
+	0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xB9, 
+	0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 
+	0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 
+	0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 
+	0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 
+	0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 
+	0xB8, 0xB8, 0xB8, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 
+	0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 
+	0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, 
+	0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 
+	0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 
+	0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 
+	0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 
+	0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 
+	0xB5, 0xB5, 0xB5, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 
+	0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 
+	0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB3, 
+	0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 
+	0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 
+	0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 
+	0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 
+	0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 
+	0xB2, 0xB2, 0xB2, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 
+	0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 
+	0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB0, 
+	0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 
+	0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 
+	0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 
+	0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 
+	0xAE, 0xAE, 0xAE, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 
+	0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 
+	0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 
+	0xAB, 0xAB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 
+	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 
+	0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 
+	0xA8, 0xA8, 0xA8, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 
+	0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 
+	0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 
+	0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 
+	0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 
+	0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 
+	0xA2, 0xA2, 0xA2, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 
+	0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 
+	0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 
+	0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 
+	0x9E, 0x9E, 0x9E, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 
+	0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 
+	0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 
+	0x9B, 0x9B, 0x9B, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 
+	0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
+	0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 
+	0x98, 0x98, 0x98, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 
+	0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 
+	0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 
+	0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 
+	0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 
+	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 
+	0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 
+	0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
+	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 
+	0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 
+	0x8E, 0x8E, 0x8E, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 
+	0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 
+	0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 
+	0x8B, 0x8B, 0x8B, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 
+	0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 
+	0x88, 0x88, 0x88, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 
+	0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 
+	0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 
+	0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 
+	0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 
+	0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 
+	0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 
+	0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00
+} ;
+
+static void	
+ulaw2s_array	(unsigned char *buffer, unsigned int count, short *ptr, unsigned int index)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -1 * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* ulaw2s_array */
+
+static void	
+ulaw2i_array	(unsigned char *buffer, unsigned int count, int *ptr, unsigned int index)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -1 * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* ulaw2i_array */
+
+static void	
+ulaw2f_array	(unsigned char *buffer, unsigned int count, float *ptr, unsigned int index, float normfact)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* ulaw2f_array */
+
+static void	
+ulaw2d_array	(unsigned char *buffer, unsigned int count, double *ptr, unsigned int index, double normfact)
+{	int 	k ;
+	for (k = 0 ; k < count ; k++)
+	{	if (buffer [k] & 0x80)
+			ptr [index] = -normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		else
+			ptr [index] = normfact * ulaw_decode [((int) buffer [k]) & 0x7F] ;
+		index ++ ;
+		} ;
+} /* ulaw2d_array */
+
+static void    
+s2ulaw_array      (short *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = ulaw_encode [ptr [index] / 4] ;
+		else
+			buffer [k] = 0x7F & ulaw_encode [ptr [index] / -4] ;
+		index ++ ;
+		} ;
+} /* s2ulaw_array */
+
+static void    
+i2ulaw_array      (int *ptr, unsigned int index, unsigned char *buffer, unsigned int count)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = ulaw_encode [ptr [index] / 4] ;
+		else
+			buffer [k] = 0x7F & ulaw_encode [ptr [index] / -4] ;
+		index ++ ;
+		} ;
+} /* i2ulaw_array */
+
+static void
+f2ulaw_array      (float *ptr, unsigned int index, unsigned char *buffer, unsigned int count, float normfact)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = ulaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / 4] ;
+		else
+			buffer [k] = 0x7F & ulaw_encode [(FLOAT_TO_INT (normfact * ptr [index])) / -4] ;
+		index ++ ;
+		} ;
+} /* f2ulaw_array */
+
+static void
+d2ulaw_array      (double *ptr, unsigned int index, unsigned char *buffer, unsigned int count, double normfact)
+{	unsigned int	k ;
+
+	for (k = 0 ; k < count ; k++)
+	{	if (ptr [index] >= 0) 
+			buffer [k] = ulaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / 4] ;
+		else
+			buffer [k] = 0x7F & ulaw_encode [(DOUBLE_TO_INT (normfact * ptr [index])) / -4] ;
+		index ++ ;
+		} ;
+} /* d2ulaw_array */
+
--- /dev/null
+++ b/common/libsndfile/src/voc.c
@@ -1,0 +1,376 @@
+/*
+** Copyright (C) 2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<stdarg.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+*/
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
+/*------------------------------------------------------------------------------
+ * Typedefs for file chunks.
+*/
+
+enum
+{	VOC_TYPE_TERMINATOR		= 0,
+	VOC_TYPE_SOUND_DATA		= 1,
+	VOC_TYPE_SOUND_CONTINUE = 2,
+	VOC_TYPE_SILENCE		= 3,
+	VOC_TYPE_MARKER			= 4,
+	VOC_TYPE_ASCII			= 5,
+	VOC_TYPE_REPEAT			= 6,
+	VOC_TYPE_END_REPEAT		= 7,
+	VOC_TYPE_EXTENDED		= 8,
+	VOC_TYPE_9				= 9
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+*/
+
+static	int		voc_close	(SF_PRIVATE  *psf) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+voc_open_read	(SF_PRIVATE *psf)
+{	char	creative [20], type ;
+	short	version ;
+
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "pB", 0, creative, sizeof (creative)) ;
+		
+	if (creative [sizeof (creative) - 1] != 0x1A)
+		return SFE_VOC_NO_CREATIVE ;
+		
+	/* Terminate the string. */
+	creative [sizeof (creative) - 1] = 0 ;
+	
+	if (strcmp ("Creative Voice File", creative))
+		return SFE_VOC_NO_CREATIVE ;
+
+	psf_log_printf (psf, "%s\n", creative) ;
+
+	psf_binheader_readf (psf, "ww", &(psf->dataoffset), &version) ;
+
+	psf_log_printf (psf, "dataoffset : %d\n", psf->dataoffset) ;
+	psf_log_printf (psf, "version    : %X\n", version) ;
+
+	if (version != 0x010A && version != 0x0114)
+		return SFE_VOC_BAD_VERSION ;
+
+	psf_binheader_readf (psf, "w", &version) ;
+	psf_log_printf (psf, "version 2  : %X\n", version) ;
+	
+	while (1)
+	{	psf_binheader_readf (psf, "b", &type) ;
+	
+		switch (type)
+		{	case VOC_TYPE_TERMINATOR :
+					psf_log_printf (psf, " Terminator\n") ;
+					break ;
+
+			case VOC_TYPE_SOUND_DATA :
+					{	unsigned char rate_byte, compression ;
+						int		size ;
+
+						psf_binheader_readf (psf, "tbb", &size, &rate_byte, &compression) ;
+
+						psf_log_printf (psf, " Sound Data : %d\n", size) ;
+						psf_log_printf (psf, "  sr   : %d => %dHz\n", (rate_byte & 0xFF), 1000000 / (256 - rate_byte)) ;
+						psf_log_printf (psf, "  comp : %d\n", compression) ;
+	
+						psf_binheader_readf (psf, "j", size) ;
+						} ;
+					break ;
+
+			case VOC_TYPE_SOUND_CONTINUE :
+					{	int		size ;
+
+						psf_binheader_readf (psf, "t", &size) ;
+
+						psf_log_printf (psf, " Sound Continue : %d\n", size) ;
+	
+						psf_binheader_readf (psf, "j", size) ;
+						} ;
+					break ;
+
+			case VOC_TYPE_SILENCE :
+					{	unsigned char rate_byte ;
+						short length ;
+						
+						psf_log_printf (psf, " Silence\n") ;
+						psf_binheader_readf (psf, "wb", &length, &rate_byte) ;
+						psf_log_printf (psf, "  length : %d\n", length) ;
+						psf_log_printf (psf, "  sr     : %d => %dHz\n", (rate_byte & 0xFF), 1000000 / (256 - rate_byte)) ;
+		  				} ;
+					break ;
+
+			case VOC_TYPE_MARKER :
+					{	int		size ;
+						short	value ;
+
+						psf_log_printf (psf, " Marker\n") ;
+
+						psf_binheader_readf (psf, "tw", &size, &value) ;
+						
+						psf_log_printf (psf, "  size  : %d\n", size) ;
+						psf_log_printf (psf, "  value : %d\n", value) ;
+						} ;
+					break ;
+
+			case VOC_TYPE_ASCII :
+					{	int		size ;
+
+						psf_binheader_readf (psf, "t", &size) ;
+
+						psf_log_printf (psf, " ASCII : %d\n", size) ;
+	
+						psf_binheader_readf (psf, "B", psf->header, size) ;
+						psf->header [size] = 0 ;
+						psf_log_printf (psf, "  text : %s\n", psf->header) ;
+						} ;
+					break ;
+
+			case VOC_TYPE_REPEAT :
+					{	int		size ;
+						short	count ;
+
+						psf_binheader_readf (psf, "tw", &size, &count) ;
+
+						psf_log_printf (psf, " Marker : %d\n", size) ;
+						psf_log_printf (psf, "  value : %d\n", count) ;
+						} ;
+					break ;
+
+			case VOC_TYPE_END_REPEAT :
+					psf_log_printf (psf, " End Repeat\n") ;
+					break ;
+						
+			case VOC_TYPE_EXTENDED :
+					{	unsigned char pack, mode ;
+						short 	rate_short ;
+						int		size, sample_rate ;
+
+						psf_binheader_readf (psf, "t", &size) ;
+						psf_log_printf (psf, " Extended : %d\n", size) ;
+						
+						psf_binheader_readf (psf, "wbb", &rate_short, &pack, &mode) ;
+						psf_log_printf (psf, "  size : %d\n", size) ;
+						psf_log_printf (psf, "  pack : %d\n", pack) ;
+						psf_log_printf (psf, "  mode : %d\n", mode) ;
+						
+						if (mode)
+							sample_rate = 128000000 / (65536 - rate_short) ;
+						else
+							sample_rate = 256000000 / (65536 - rate_short) ;
+
+						psf_log_printf (psf, "  sr   : %d => %dHz\n", (rate_short & 0xFFFF), sample_rate) ;
+						psf_binheader_readf (psf, "j", size) ;
+						} ;
+					break ;
+
+			case VOC_TYPE_9 :
+					{	unsigned char bitwidth, channels, byte6 ;
+						int sample_rate, size, bytecount = 0 ;
+						
+						psf_binheader_readf (psf, "t", &size) ;
+						psf_log_printf (psf, " Type 9 : %d\n", size) ;
+
+						bytecount = psf_binheader_readf (psf, "lbbb", &sample_rate, &bitwidth, &channels, &byte6) ;
+
+						psf_log_printf (psf, "  sample rate : %d\n", sample_rate) ;
+						psf_log_printf (psf, "  bit width   : %d\n", bitwidth) ;
+						psf_log_printf (psf, "  channels    : %d\n", channels) ;
+
+						psf_binheader_readf (psf, "j", size - bytecount) ;
+						} ;
+					break ;
+
+			default :
+				psf_log_printf (psf, "Unknown type : %d\n", type & 0xFF) ;
+				return SFE_VOC_BAD_MARKER ;
+			} ;
+
+		if (ftell (psf->file) >= psf->filelength)
+			break ;
+		} ;
+
+
+
+	psf->sf.seekable = SF_TRUE ;
+
+	psf->close = (func_close) voc_close ;
+
+	return 0 ;
+} /* voc_open_read */
+
+int 	
+voc_open_write	(SF_PRIVATE *psf)
+{	
+
+	return 0 ;
+} /* voc_open_write */
+
+/*------------------------------------------------------------------------------
+*/
+
+static int	
+voc_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can re-write 
+		**	correct values for the FORM, 8SVX and BODY chunks.
+		*/
+                
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+	
+	return 0 ;
+} /* voc_close */
+
+
+/*------------------------------------------------------------------------------------
+
+Creative Voice (VOC) file format
+--------------------------------
+
+~From: galt@dsd.es.com
+
+(byte numbers are hex!)
+
+    HEADER (bytes 00-19)
+    Series of DATA BLOCKS (bytes 1A+) [Must end w/ Terminator Block]
+
+- ---------------------------------------------------------------
+
+HEADER:
+=======
+     byte #     Description
+     ------     ------------------------------------------
+     00-12      "Creative Voice File"
+     13         1A (eof to abort printing of file)
+     14-15      Offset of first datablock in .voc file (std 1A 00
+                in Intel Notation)
+     16-17      Version number (minor,major) (VOC-HDR puts 0A 01)
+     18-19      1's Comp of Ver. # + 1234h (VOC-HDR puts 29 11)
+
+- ---------------------------------------------------------------
+
+DATA BLOCK:
+===========
+
+   Data Block:  TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes)
+   NOTE: Terminator Block is an exception -- it has only the TYPE byte.
+
+      TYPE   Description     Size (3-byte int)   Info
+      ----   -----------     -----------------   -----------------------
+      00     Terminator      (NONE)              (NONE)
+      01     Sound data      2+length of data    *
+      02     Sound continue  length of data      Voice Data
+      03     Silence         3                   **
+      04     Marker          2                   Marker# (2 bytes)
+      05     ASCII           length of string    null terminated string
+      06     Repeat          2                   Count# (2 bytes)
+      07     End repeat      0                   (NONE)
+      08     Extended        4                   ***
+
+      *Sound Info Format:    
+       --------------------- 
+       00   Sample Rate      
+       01   Compression Type 
+       02+  Voice Data
+
+      **Silence Info Format:
+      ----------------------------
+      00-01  Length of silence - 1
+      02     Sample Rate
+      
+
+    ***Extended Info Format:
+       ---------------------
+       00-01  Time Constant: Mono: 65536 - (256000000/sample_rate)
+                             Stereo: 65536 - (25600000/(2*sample_rate))
+       02     Pack
+       03     Mode: 0 = mono
+                    1 = stereo
+
+
+  Marker#           -- Driver keeps the most recent marker in a status byte
+  Count#            -- Number of repetitions + 1
+                         Count# may be 1 to FFFE for 0 - FFFD repetitions
+                         or FFFF for endless repetitions
+  Sample Rate       -- SR byte = 256-(1000000/sample_rate)
+  Length of silence -- in units of sampling cycle
+  Compression Type  -- of voice data
+                         8-bits    = 0
+                         4-bits    = 1
+                         2.6-bits  = 2
+                         2-bits    = 3
+                         Multi DAC = 3+(# of channels) [interesting--
+                                       this isn't in the developer's manual]
+
+
+---------------------------------------------------------------------------------
+Addendum submitted by Votis Kokavessis:
+
+After some experimenting with .VOC files I found out that there is a Data Block 
+Type 9, which is not covered in the VOC.TXT file. Here is what I was able to discover 
+about this block type:
+  
+  
+TYPE: 09
+SIZE: 12 + length of data
+INFO: 12 (twelve) bytes
+  
+INFO STRUCTURE:
+  
+Bytes 0-1: (Word) Sample Rate (e.g. 44100)
+Bytes 2-3: zero (could be that bytes 0-3 are a DWord for Sample Rate)
+Byte 4: Sample Size in bits (e.g. 16)
+Byte 5: Number of channels (e.g. 1 for mono, 2 for stereo)
+Byte 6: Unknown (equal to 4 in all files I examined)
+Bytes 7-11: zero
+
+
+-------------------------------------------------------------------------------------*/
+
--- /dev/null
+++ b/common/libsndfile/src/wav.c
@@ -1,0 +1,832 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<ctype.h>
+#include	<time.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"common.h"
+#include	"wav.h"
+
+/*------------------------------------------------------------------------------
+** List of known WAV format tags
+*/
+
+enum
+{	
+	WAVE_FORMAT_UNKNOWN				= 0x0000,		/* Microsoft Corporation */
+	WAVE_FORMAT_PCM     		    = 0x0001, 		/* Microsoft PCM format */
+
+	WAVE_FORMAT_MS_ADPCM			= 0x0002,		/* Microsoft ADPCM */
+	WAVE_FORMAT_IEEE_FLOAT			= 0x0003,		/* Micrososft 32 bit float format */
+	
+	WAVE_FORMAT_IBM_CVSD			= 0x0005,		/* IBM Corporation */
+	WAVE_FORMAT_ALAW				= 0x0006,		/* Microsoft Corporation */
+	WAVE_FORMAT_MULAW				= 0x0007,		/* Microsoft Corporation */
+	WAVE_FORMAT_OKI_ADPCM			= 0x0010,		/* OKI */
+	WAVE_FORMAT_IMA_ADPCM			= 0x0011,		/* Intel Corporation */
+	WAVE_FORMAT_MEDIASPACE_ADPCM	= 0x0012,		/* Videologic */
+	WAVE_FORMAT_SIERRA_ADPCM		= 0x0013,		/* Sierra Semiconductor Corp */
+	WAVE_FORMAT_G723_ADPCM			= 0x0014,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_DIGISTD				= 0x0015,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIGIFIX				= 0x0016,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIALOGIC_OKI_ADPCM	= 0x0017,		/*  Dialogic Corporation  */
+	WAVE_FORMAT_MEDIAVISION_ADPCM	= 0x0018,		/*  Media Vision, Inc. */
+
+	WAVE_FORMAT_YAMAHA_ADPCM		= 0x0020,		/* Yamaha Corporation of America */
+	WAVE_FORMAT_SONARC				= 0x0021,		/* Speech Compression */
+	WAVE_FORMAT_DSPGROUP_TRUESPEECH = 0x0022,		/* DSP Group, Inc */
+	WAVE_FORMAT_ECHOSC1				= 0x0023,		/* Echo Speech Corporation */
+	WAVE_FORMAT_AUDIOFILE_AF18  	= 0x0024,		/* Audiofile, Inc. */
+	WAVE_FORMAT_APTX				= 0x0025,		/* Audio Processing Technology */
+	WAVE_FORMAT_AUDIOFILE_AF10  	= 0x0026,		/* Audiofile, Inc. */
+
+	WAVE_FORMAT_DOLBY_AC2			= 0x0030,		/* Dolby Laboratories */
+	WAVE_FORMAT_GSM610				= 0x0031,		/* Microsoft Corporation */
+	WAVE_FORMAT_MSNAUDIO			= 0x0032,		/* Microsoft Corporation */
+	WAVE_FORMAT_ANTEX_ADPCME		= 0x0033, 		/* Antex Electronics Corporation */
+	WAVE_FORMAT_CONTROL_RES_VQLPC	= 0x0034,		/* Control Resources Limited */
+	WAVE_FORMAT_DIGIREAL			= 0x0035,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_DIGIADPCM			= 0x0036,		/* DSP Solutions, Inc. */
+	WAVE_FORMAT_CONTROL_RES_CR10	= 0x0037,		/* Control Resources Limited */
+	WAVE_FORMAT_NMS_VBXADPCM		= 0x0038,		/* Natural MicroSystems */
+	WAVE_FORMAT_ROCKWELL_ADPCM		= 0x003B,		/* Rockwell International */
+	WAVE_FORMAT_ROCKWELL_DIGITALK	= 0x003C, 		/* Rockwell International */
+
+	WAVE_FORMAT_G721_ADPCM			= 0x0040,		/* Antex Electronics Corporation */
+	WAVE_FORMAT_MPEG				= 0x0050,		/* Microsoft Corporation */
+
+	WAVE_FORMAT_MPEGLAYER3			= 0x0055,		/* MPEG 3 Layer 1 */
+
+	IBM_FORMAT_MULAW				= 0x0101,		/* IBM mu-law format */
+	IBM_FORMAT_ALAW					= 0x0102,		/* IBM a-law format */
+	IBM_FORMAT_ADPCM				= 0x0103,		/* IBM AVC Adaptive Differential PCM format */
+
+	WAVE_FORMAT_CREATIVE_ADPCM		= 0x0200,		/* Creative Labs, Inc */
+
+	WAVE_FORMAT_FM_TOWNS_SND		= 0x0300,		/* Fujitsu Corp. */
+	WAVE_FORMAT_OLIGSM				= 0x1000,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLIADPCM			= 0x1001,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLICELP				= 0x1002,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLISBC				= 0x1003,		/* Ing C. Olivetti & C., S.p.A. */
+	WAVE_FORMAT_OLIOPR				= 0x1004,		/* Ing C. Olivetti & C., S.p.A. */
+
+	WAVE_FORMAT_EXTENSIBLE			= 0xFFFE
+} ;
+
+#define	FACT_CHUNK_SIZE	sizeof (int)
+
+/*------------------------------------------------------------------------------
+ * Macros to handle big/little endian issues.
+ */
+
+#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
+#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
+#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
+#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
+#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
+#define PEAK_MARKER	(MAKE_MARKER ('P', 'E', 'A', 'K')) 
+
+#define cue_MARKER	(MAKE_MARKER ('c', 'u', 'e', ' ')) 
+#define LIST_MARKER	(MAKE_MARKER ('L', 'I', 'S', 'T')) 
+#define slnt_MARKER	(MAKE_MARKER ('s', 'l', 'n', 't')) 
+#define wavl_MARKER	(MAKE_MARKER ('w', 'a', 'v', 'l')) 
+#define INFO_MARKER	(MAKE_MARKER ('I', 'N', 'F', 'O')) 
+#define plst_MARKER	(MAKE_MARKER ('p', 'l', 's', 't')) 
+#define adtl_MARKER	(MAKE_MARKER ('a', 'd', 't', 'l')) 
+#define labl_MARKER	(MAKE_MARKER ('l', 'a', 'b', 'l')) 
+#define note_MARKER	(MAKE_MARKER ('n', 'o', 't', 'e')) 
+#define smpl_MARKER	(MAKE_MARKER ('s', 'm', 'p', 'l')) 
+#define bext_MARKER	(MAKE_MARKER ('b', 'e', 'x', 't')) 
+#define MEXT_MARKER	(MAKE_MARKER ('M', 'E', 'X', 'T')) 
+#define DISP_MARKER	(MAKE_MARKER ('D', 'I', 'S', 'P')) 
+#define acid_MARKER	(MAKE_MARKER ('a', 'c', 'i', 'd')) 
+#define PAD_MARKER	(MAKE_MARKER ('P', 'A', 'D', ' ')) 
+#define adtl_MARKER	(MAKE_MARKER ('a', 'd', 't', 'l')) 
+
+#define ISFT_MARKER	(MAKE_MARKER ('I', 'S', 'F', 'T')) 
+#define ICRD_MARKER	(MAKE_MARKER ('I', 'C', 'R', 'D')) 
+#define ICOP_MARKER	(MAKE_MARKER ('I', 'C', 'O', 'P')) 
+#define IART_MARKER	(MAKE_MARKER ('I', 'A', 'R', 'T')) 
+#define INAM_MARKER	(MAKE_MARKER ('I', 'N', 'A', 'M')) 
+#define IENG_MARKER	(MAKE_MARKER ('I', 'E', 'N', 'G')) 
+#define IART_MARKER	(MAKE_MARKER ('I', 'A', 'R', 'T')) 
+#define ICOP_MARKER	(MAKE_MARKER ('I', 'C', 'O', 'P')) 
+#define IPRD_MARKER	(MAKE_MARKER ('I', 'P', 'R', 'D')) 
+#define ISRC_MARKER	(MAKE_MARKER ('I', 'S', 'R', 'C')) 
+#define ISBJ_MARKER	(MAKE_MARKER ('I', 'S', 'B', 'J')) 
+#define ICMT_MARKER	(MAKE_MARKER ('I', 'C', 'M', 'T')) 
+
+
+
+enum {
+	HAVE_RIFF	= 0x01,
+	HAVE_WAVE	= 0x02,
+	HAVE_fmt	= 0x04,
+	HAVE_fact	= 0x08,
+	HAVE_PEAK	= 0x10,
+	HAVE_data	= 0x20
+} ;
+
+/*------------------------------------------------------------------------------
+ * Private static functions.
+ */
+
+static int		wav_close	(SF_PRIVATE  *psf) ;
+
+static int		read_fmt_chunk	(SF_PRIVATE *psf, WAV_FMT *wav_fmt) ;
+static int		wav_write_header (SF_PRIVATE *psf) ;
+static int		wav_write_tailer (SF_PRIVATE *psf) ;
+
+static int 		wav_subchunk_parse	(SF_PRIVATE *psf, int chunk) ;
+
+static const 	char* wav_format_str (int k) ;
+
+/*------------------------------------------------------------------------------
+** Public functions.
+*/
+
+int
+wav_open_read	(SF_PRIVATE *psf)
+{	WAV_FMT			wav_fmt ;
+	FACT_CHUNK		fact_chunk ;
+	unsigned int	dword, marker, RIFFsize ;
+	int				parsestage = 0, error, format = 0 ;
+	char			*cptr ;	
+	
+	/* Set position to start of file to begin reading header. */
+	psf_binheader_readf (psf, "p", 0) ;	
+		
+	while (1)
+	{	psf_binheader_readf (psf, "m", &marker) ;
+		switch (marker)
+		{	case RIFF_MARKER :
+					if (parsestage)
+						return SFE_WAV_NO_RIFF ;
+
+					psf_binheader_readf (psf, "l", &RIFFsize) ;
+					
+					if (psf->filelength  < RIFFsize + 2 * sizeof (dword))
+					{	dword = psf->filelength - 2 * sizeof (dword);
+						psf_log_printf (psf, "RIFF : %d (should be %d)\n", RIFFsize, dword) ;
+						RIFFsize = dword ;
+						}
+					else
+						psf_log_printf (psf, "RIFF : %d\n", RIFFsize) ;
+					parsestage |= HAVE_RIFF ;
+					break ;
+					
+			case WAVE_MARKER :
+					if ((parsestage & HAVE_RIFF) != HAVE_RIFF)
+						return SFE_WAV_NO_WAVE ;
+					psf_log_printf (psf, "WAVE\n") ;
+					parsestage |= HAVE_WAVE ;
+					break ;
+			
+			case fmt_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE)) != (HAVE_RIFF | HAVE_WAVE))
+						return SFE_WAV_NO_FMT ;
+					if ((error = read_fmt_chunk (psf, &wav_fmt)))
+						return error ;
+						
+					format     = wav_fmt.format ;
+					parsestage |= HAVE_fmt ;
+					break ;
+					
+			case data_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+						return SFE_WAV_NO_DATA ;
+					
+					psf_binheader_readf (psf, "l", &(psf->datalength)) ;
+
+					psf->dataoffset = ftell (psf->file) ;
+					
+					if (psf->filelength < psf->dataoffset + psf->datalength)
+					{	psf_log_printf (psf, "data : %d (should be %d)\n", psf->datalength, psf->filelength - psf->dataoffset) ;
+						psf->datalength = psf->filelength - psf->dataoffset ;
+						}
+					else
+						psf_log_printf (psf, "data : %d\n", psf->datalength) ;
+
+					if (format == WAVE_FORMAT_MS_ADPCM && psf->datalength % 2)
+					{	psf->datalength ++ ;
+						psf_log_printf (psf, "*** Data length odd. Increasing it by 1.\n") ;
+						} ;
+		
+					parsestage |= HAVE_data ;
+
+					if (! psf->sf.seekable)
+						break ;
+					
+					/* Seek past data and continue reading header. */
+					fseek (psf->file, psf->datalength, SEEK_CUR) ;
+
+					dword = ftell (psf->file) ;
+					if (dword != (long) (psf->dataoffset + psf->datalength))
+						psf_log_printf (psf, "*** fseek past end error ***\n", dword, psf->dataoffset + psf->datalength) ;
+					break ;
+
+			case fact_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+						return SFE_WAV_BAD_FACT ;
+
+					psf_binheader_readf (psf, "ll", &dword, &(fact_chunk.samples)) ;
+					
+					if (dword > sizeof (fact_chunk))
+						psf_binheader_readf (psf, "j", (int) (dword - sizeof (fact_chunk))) ;
+
+					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+					psf_log_printf (psf, "  samples : %d\n", fact_chunk.samples) ;
+					parsestage |= HAVE_fact ;
+					break ;
+
+			case PEAK_MARKER :
+					if ((parsestage & (HAVE_RIFF | HAVE_WAVE | HAVE_fmt)) != (HAVE_RIFF | HAVE_WAVE | HAVE_fmt))
+						return SFE_WAV_PEAK_B4_FMT ;
+
+					psf_binheader_readf (psf, "l", &dword) ;
+					
+					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+					if (dword > sizeof (psf->peak))
+					{	psf_binheader_readf (psf, "j", dword) ;
+						psf_log_printf (psf, "*** File PEAK chunk bigger than sizeof (PEAK_CHUNK).\n") ;
+						return SFE_WAV_BAD_PEAK ;
+						} ;
+					if (dword != sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS))
+					{	psf_binheader_readf (psf, "j", dword) ;
+						psf_log_printf (psf, "*** File PEAK chunk size doesn't fit with number of channels.\n") ;
+						return SFE_WAV_BAD_PEAK ;
+						} ;
+					
+					psf_binheader_readf (psf, "ll", &(psf->peak.version), &(psf->peak.timestamp)) ;
+
+					if (psf->peak.version != 1)
+						psf_log_printf (psf, "  version    : %d *** (should be version 1)\n", psf->peak.version) ;
+					else
+						psf_log_printf (psf, "  version    : %d\n", psf->peak.version) ;
+						
+					psf_log_printf (psf, "  time stamp : %d\n", psf->peak.timestamp) ;
+					psf_log_printf (psf, "    Ch   Position       Value\n") ;
+
+					cptr = (char *) psf->buffer ;
+					for (dword = 0 ; dword < psf->sf.channels ; dword++)
+					{	psf_binheader_readf (psf, "fl", &(psf->peak.peak[dword].value), 
+														&(psf->peak.peak[dword].position)) ;
+					
+						snprintf (cptr, sizeof (psf->buffer), "    %2d   %-12d   %g\n", 
+								dword, psf->peak.peak[dword].position, psf->peak.peak[dword].value) ;
+						cptr [sizeof (psf->buffer) - 1] = 0 ;
+						psf_log_printf (psf, cptr) ;
+						};
+
+					psf->has_peak = SF_TRUE ;
+					break ;
+
+			case INFO_MARKER :
+			case LIST_MARKER :
+					psf_log_printf (psf, "%D\n", marker) ;
+					if ((error = wav_subchunk_parse (psf, marker)))
+						return error ;
+					break ;
+			
+			case bext_MARKER :
+			case cue_MARKER :
+			case DISP_MARKER :
+			case MEXT_MARKER :
+					psf_binheader_readf (psf, "l", &dword);
+					psf_log_printf (psf, "%D : %d\n", marker, dword) ;
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+			case smpl_MARKER :
+			case acid_MARKER :
+			case PAD_MARKER :
+					psf_binheader_readf (psf, "l", &dword);
+					psf_log_printf (psf, " *** %D : %d\n", marker, dword) ;
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					break ;
+
+
+			default : 
+					if (isprint ((marker >> 24) & 0xFF) && isprint ((marker >> 16) & 0xFF)
+						&& isprint ((marker >> 8) & 0xFF) && isprint (marker & 0xFF))
+					{	psf_binheader_readf (psf, "l", &dword);
+						psf_log_printf (psf, "*** %D : %d (unknown marker)\n", marker, dword) ;
+
+						psf_binheader_readf (psf, "j", dword);
+						break ;
+						} ;
+					if (ftell (psf->file) & 0x03)
+					{	psf_log_printf (psf, "  Unknown chunk marker at position %d. Resynching.\n", dword - 4) ;
+						psf_binheader_readf (psf, "j", -3) ;
+						break ;
+						} ;
+					psf_log_printf (psf, "*** Unknown chunk marker : %X. Exiting parser.\n", marker) ;
+					break ;
+			} ;	/* switch (dword) */
+
+		if (! psf->sf.seekable && (parsestage & HAVE_data))
+			break ;
+
+		if (ferror (psf->file))
+		{	psf_log_printf (psf, "*** Error on file handle. ***\n", marker) ;
+			clearerr (psf->file) ;
+			break ;
+			} ;
+
+		if (ftell (psf->file) >= (int) (psf->filelength - (2 * sizeof (dword))))
+			break ;
+		} ; /* while (1) */
+		
+	if (! psf->dataoffset)
+		return SFE_WAV_NO_DATA ;
+
+	psf->current     = 0 ;
+	psf->endian      = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */
+	psf->sf.sections = 1 ;
+	
+	fseek (psf->file, psf->dataoffset, SEEK_SET) ;
+	
+	psf->close = (func_close) wav_close ;
+
+	if (psf->blockwidth)
+	{	if (psf->filelength - psf->dataoffset < psf->datalength)
+			psf->sf.samples = (psf->filelength - psf->dataoffset) / psf->blockwidth ;
+		else
+			psf->sf.samples = psf->datalength / psf->blockwidth ;
+		} ;
+
+	switch (format)
+	{	case 	WAVE_FORMAT_PCM :
+		case	WAVE_FORMAT_EXTENSIBLE :
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
+					if (psf->bytewidth == 1)
+						psf->chars = SF_CHARS_UNSIGNED ;
+	
+					if ((error = pcm_read_init (psf)))
+						return error ;
+					return 0 ;
+					
+		case	WAVE_FORMAT_IEEE_FLOAT :
+					psf->sf.format   = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
+					float32_read_init (psf) ;
+					return 0 ;
+		
+		default :	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	return 0 ;
+} /* wav_open_read */
+
+/*------------------------------------------------------------------------------
+ */
+
+int
+wav_open_write	(SF_PRIVATE *psf)
+{	unsigned int	subformat ;
+	int				error ;
+	
+	if ((psf->sf.format & SF_FORMAT_TYPEMASK) != SF_FORMAT_WAV)
+		return	SFE_BAD_OPEN_FORMAT ;
+	
+	psf->endian      = SF_ENDIAN_LITTLE ;		/* All WAV files are little endian. */
+	psf->sf.seekable = SF_TRUE ;
+	psf->error       = 0 ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+	if (subformat == SF_FORMAT_ULAW || subformat == SF_FORMAT_ALAW)
+		psf->bytewidth = 1 ;
+	else
+		psf->bytewidth = BITWIDTH2BYTES (psf->sf.pcmbitwidth) ;
+
+	psf->blockwidth  = psf->bytewidth * psf->sf.channels ;
+
+	/* Set sample count artifically high and fix later. */ 
+	psf->sf.samples = 0x7FFFFFFF / psf->blockwidth ; 
+	psf->datalength = psf->blockwidth * psf->sf.samples ;
+	psf->filelength = 0x7FFFFFFF ;
+
+	/* Set standard wav_close and write_header now, may be overridden in wav_write_header. */
+	psf->close        = (func_close)  wav_close ;
+	psf->write_header = (func_wr_hdr) wav_write_header ;
+
+	if ((error = wav_write_header (psf)))
+		return error ;
+
+	return 0 ;
+} /* wav_open_write */
+
+/*------------------------------------------------------------------------------
+ */
+
+static int	
+wav_close	(SF_PRIVATE  *psf)
+{	
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know for certain the length of the file we can
+		 *  re-write correct values for the RIFF and data chunks.
+		 */
+
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->tailstart = ftell (psf->file) ;
+		wav_write_tailer (psf) ;
+
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+		fseek (psf->file, 0, SEEK_SET) ;
+		
+		psf->datalength = psf->filelength - psf->dataoffset - (psf->filelength - psf->tailstart) ;
+ 		psf->sf.samples = psf->datalength / (psf->bytewidth * psf->sf.channels) ;
+
+		wav_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* wav_close */
+
+/*=========================================================================
+** Private functions.
+*/
+
+static int
+read_fmt_chunk (SF_PRIVATE *psf, WAV_FMT *wav_fmt)
+{	unsigned int	bytesread, k, structsize, bytespersec = 0  ;
+	
+	memset (wav_fmt, 0, sizeof (WAV_FMT)) ;
+
+	psf_binheader_readf (psf, "l", &structsize) ;
+	
+	psf_log_printf (psf, "fmt  : %d\n", structsize) ;
+	
+	if (structsize < 16)
+		return SFE_WAV_FMT_SHORT ;
+	if (structsize > sizeof (WAV_FMT))
+		return SFE_WAV_FMT_TOO_BIG ;
+
+	/* Read the minimal WAV file header here. */	
+	bytesread =
+	psf_binheader_readf (psf, "wwllww", &(wav_fmt->format), &(wav_fmt->min.channels),
+			&(wav_fmt->min.samplerate), &(wav_fmt->min.bytespersec), 
+			&(wav_fmt->min.blockalign), &(wav_fmt->min.bitwidth))  ;
+
+	psf_log_printf (psf, "  Format        : 0x%X => %s\n", wav_fmt->format, wav_format_str (wav_fmt->format)) ;
+	psf_log_printf (psf, "  Channels      : %d\n", wav_fmt->min.channels) ;
+	psf_log_printf (psf, "  Sample Rate   : %d\n", wav_fmt->min.samplerate) ;
+	psf_log_printf (psf, "  Block Align   : %d\n", wav_fmt->min.blockalign) ;
+	
+	if (wav_fmt->format == WAVE_FORMAT_GSM610 && wav_fmt->min.bitwidth != 0)
+		psf_log_printf (psf, "  Bit Width     : %d (should be 0)\n", wav_fmt->min.bitwidth) ;
+	else
+		psf_log_printf (psf, "  Bit Width     : %d\n", wav_fmt->min.bitwidth) ;
+	
+	psf->sf.samplerate		= wav_fmt->min.samplerate ;
+	psf->sf.samples 		= 0 ;					/* Correct this when reading data chunk. */
+	psf->sf.channels		= wav_fmt->min.channels ;
+	
+	switch (wav_fmt->format)
+	{	case WAVE_FORMAT_PCM :
+		case WAVE_FORMAT_IEEE_FLOAT :
+				bytespersec = wav_fmt->min.samplerate * wav_fmt->min.blockalign ;
+				if (wav_fmt->min.bytespersec != bytespersec)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->min.bytespersec, bytespersec) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->min.bytespersec) ;
+		
+				psf->sf.pcmbitwidth	= wav_fmt->min.bitwidth ;
+				psf->bytewidth      = BITWIDTH2BYTES (wav_fmt->min.bitwidth) ;
+				break ;
+
+		case WAVE_FORMAT_EXTENSIBLE :
+				if (wav_fmt->ext.bytespersec / wav_fmt->ext.blockalign != wav_fmt->ext.samplerate)
+					psf_log_printf (psf, "  Bytes/sec     : %d (should be %d)\n", wav_fmt->ext.bytespersec, wav_fmt->ext.samplerate * wav_fmt->ext.blockalign) ;
+				else
+					psf_log_printf (psf, "  Bytes/sec     : %d\n", wav_fmt->ext.bytespersec) ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "wwl", &(wav_fmt->ext.extrabytes), &(wav_fmt->ext.validbits),
+						&(wav_fmt->ext.channelmask)) ;
+
+				psf_log_printf (psf, "  Valid Bits    : %d\n", wav_fmt->ext.validbits) ;
+				psf_log_printf (psf, "  Channel Mask  : 0x%X\n", wav_fmt->ext.channelmask) ;
+
+				bytesread += 
+				psf_binheader_readf (psf, "lww", &(wav_fmt->ext.esf.esf_field1), &(wav_fmt->ext.esf.esf_field2),
+						&(wav_fmt->ext.esf.esf_field3)) ;
+
+				psf_log_printf (psf, "  Subformat\n") ;
+				psf_log_printf (psf, "    esf_field1 : 0x%X\n", wav_fmt->ext.esf.esf_field1) ;
+				psf_log_printf (psf, "    esf_field2 : 0x%X\n", wav_fmt->ext.esf.esf_field2) ;
+				psf_log_printf (psf, "    esf_field3 : 0x%X\n", wav_fmt->ext.esf.esf_field3) ;
+				psf_log_printf (psf, "    esf_field4 : ") ;
+				for (k = 0 ; k < 8 ; k++)
+				{	bytesread += psf_binheader_readf (psf, "b", &(wav_fmt->ext.esf.esf_field4 [k])) ;
+					psf_log_printf (psf, "0x%X ", wav_fmt->ext.esf.esf_field4 [k] & 0xFF) ;
+					} ;
+				psf_log_printf (psf, "\n") ;
+				psf->sf.pcmbitwidth = wav_fmt->ext.bitwidth ;
+				psf->bytewidth      = BITWIDTH2BYTES (wav_fmt->ext.bitwidth) ;
+				break ;
+
+		default : break ;
+		} ;
+
+	if (bytesread > structsize)	
+	{	psf_log_printf (psf, "*** read_fmt_chunk (bytesread > structsize)\n") ;
+		return SFE_WAV_FMT_SHORT ;
+		}
+	else
+		fread (psf->buffer, 1, structsize - bytesread, psf->file) ;
+
+	psf->blockwidth = wav_fmt->min.channels * psf->bytewidth ;
+
+	return 0 ;
+} /* read_fmt_chunk */
+
+static int 
+wav_write_header (SF_PRIVATE *psf)
+{	unsigned int 	fmt_size ;
+	int 			k, error, subformat ;
+	
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
+	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+	subformat = psf->sf.format & SF_FORMAT_SUBMASK ;
+
+	switch (subformat)
+	{	case	SF_FORMAT_PCM : 
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_PCM) ;
+
+					if (psf->bytewidth == 1)
+						psf->chars = SF_CHARS_UNSIGNED ;
+	
+					if ((error = pcm_write_init (psf)))
+						return error ;
+		
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_PCM, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ;
+					break ;
+
+		case	SF_FORMAT_FLOAT : 
+					psf->sf.format = (SF_FORMAT_WAV | SF_FORMAT_FLOAT) ;
+
+					/* Add the peak chunk to floating point files. */					
+					psf->has_peak = SF_TRUE ;
+					psf->peak_loc = SF_PEAK_START ;
+					float32_write_init (psf) ;
+					
+					fmt_size = 2 + 2 + 4 + 4 + 2 + 2 ;
+
+					/* fmt : format, channels, samplerate */
+					psf_binheader_writef (psf, "lwwl", fmt_size, WAVE_FORMAT_IEEE_FLOAT, psf->sf.channels, psf->sf.samplerate) ;
+					/*  fmt : bytespersec */
+					psf_binheader_writef (psf, "l", psf->sf.samplerate * psf->bytewidth * psf->sf.channels) ;
+					/*  fmt : blockalign, bitwidth */
+					psf_binheader_writef (psf, "ww", psf->bytewidth * psf->sf.channels, psf->sf.pcmbitwidth) ;
+
+					/* Write 'fact' chunk. */
+					psf_binheader_writef (psf, "mll", fact_MARKER, FACT_CHUNK_SIZE, psf->sf.samples) ;
+					break ;
+
+		default : 	return SFE_UNIMPLEMENTED ;
+		} ;
+
+	if (psf->has_peak && psf->peak_loc == SF_PEAK_START)
+	{	psf_binheader_writef (psf, "ml", PEAK_MARKER, 
+			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+		psf_binheader_writef (psf, "ll", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ;
+		} ;
+
+	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+
+	return 0 ;
+} /* wav_write_header */
+
+static int 
+wav_write_tailer (SF_PRIVATE *psf)
+{	int		k ;
+
+	/* Reset the current header buffer length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_END) ;
+
+	if (psf->has_peak && psf->peak_loc == SF_PEAK_END)
+	{	psf_binheader_writef (psf, "ml", PEAK_MARKER, 
+			sizeof (psf->peak) - sizeof (psf->peak.peak) + psf->sf.channels * sizeof (PEAK_POS)) ;
+		psf_binheader_writef (psf, "ll", 1, time (NULL)) ;
+		for (k = 0 ; k < psf->sf.channels ; k++)
+			psf_binheader_writef (psf, "fl", psf->peak.peak[k].value, psf->peak.peak[k].position) ; /* XXXXX */
+		} ;
+
+	if (psf->headindex > 0)
+		fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	return 0 ;
+} /* wav_write_tailer */
+
+static int
+wav_subchunk_parse (SF_PRIVATE *psf, int chunk)
+{	unsigned int dword, bytesread, length ;
+
+	bytesread = psf_binheader_readf (psf, "l", &length);
+
+	while (bytesread < length)
+	{	bytesread += psf_binheader_readf (psf, "m", &chunk);
+
+		switch (chunk)
+		{	case adtl_MARKER :
+			case INFO_MARKER :
+					/* These markers don't contain anything. */
+					psf_log_printf (psf, "  %D\n", chunk) ;
+					break ;
+
+
+			case IART_MARKER :
+			case ICMT_MARKER : 
+			case ICOP_MARKER :
+			case ICRD_MARKER :
+			case IENG_MARKER :
+			
+			case INAM_MARKER :
+			case IPRD_MARKER :
+			case ISBJ_MARKER :
+			case ISFT_MARKER :
+			case ISRC_MARKER :
+					bytesread += psf_binheader_readf (psf, "l", &dword);
+					dword += (dword & 1) ;
+					if (dword > sizeof (psf->buffer))
+					{	psf_log_printf (psf, "  *** %D : %d (too big)\n", chunk, dword) ;
+						return SFE_INTERNAL ;
+						} ;
+					bytesread += psf_binheader_readf (psf, "B", psf->buffer, dword) ;
+					psf->buffer [dword - 1] = 0 ;
+					psf_log_printf (psf, "    %D : %s\n", chunk, psf->buffer) ;
+					break ;
+
+			case labl_MARKER :
+			case note_MARKER :
+					bytesread += psf_binheader_readf (psf, "l", &dword);
+					dword += (dword & 1) ;
+					psf_binheader_readf (psf, "j", dword) ;
+					bytesread += dword ;
+					psf_log_printf (psf, "    %D : %d\n", chunk, dword) ;
+					break ;
+
+			default : 
+					bytesread += psf_binheader_readf (psf, "l", &dword);
+					dword += (dword & 1) ;
+					bytesread += psf_binheader_readf (psf, "j", dword) ;
+					psf_log_printf (psf, "    *** %D : %d\n", chunk, dword) ;
+					break ;
+			} ;
+		} ;
+
+	return 0 ;
+} /* wav_subchunk_parse */
+
+static char const* 
+wav_format_str (int k)
+{	switch (k)
+	{	case WAVE_FORMAT_UNKNOWN :
+			return "WAVE_FORMAT_UNKNOWN" ;
+		case WAVE_FORMAT_PCM          :
+			return "WAVE_FORMAT_PCM         " ;
+		case WAVE_FORMAT_MS_ADPCM :
+			return "WAVE_FORMAT_MS_ADPCM" ;
+		case WAVE_FORMAT_IEEE_FLOAT :
+			return "WAVE_FORMAT_IEEE_FLOAT" ;
+		case WAVE_FORMAT_IBM_CVSD :
+			return "WAVE_FORMAT_IBM_CVSD" ;
+		case WAVE_FORMAT_ALAW :
+			return "WAVE_FORMAT_ALAW" ;
+		case WAVE_FORMAT_MULAW :
+			return "WAVE_FORMAT_MULAW" ;
+		case WAVE_FORMAT_OKI_ADPCM :
+			return "WAVE_FORMAT_OKI_ADPCM" ;
+		case WAVE_FORMAT_IMA_ADPCM :
+			return "WAVE_FORMAT_IMA_ADPCM" ;
+		case WAVE_FORMAT_MEDIASPACE_ADPCM :
+			return "WAVE_FORMAT_MEDIASPACE_ADPCM" ;
+		case WAVE_FORMAT_SIERRA_ADPCM :
+			return "WAVE_FORMAT_SIERRA_ADPCM" ;
+		case WAVE_FORMAT_G723_ADPCM :
+			return "WAVE_FORMAT_G723_ADPCM" ;
+		case WAVE_FORMAT_DIGISTD :
+			return "WAVE_FORMAT_DIGISTD" ;
+		case WAVE_FORMAT_DIGIFIX :
+			return "WAVE_FORMAT_DIGIFIX" ;
+		case WAVE_FORMAT_DIALOGIC_OKI_ADPCM :
+			return "WAVE_FORMAT_DIALOGIC_OKI_ADPCM" ;
+		case WAVE_FORMAT_MEDIAVISION_ADPCM :
+			return "WAVE_FORMAT_MEDIAVISION_ADPCM" ;
+		case WAVE_FORMAT_YAMAHA_ADPCM :
+			return "WAVE_FORMAT_YAMAHA_ADPCM" ;
+		case WAVE_FORMAT_SONARC :
+			return "WAVE_FORMAT_SONARC" ;
+		case WAVE_FORMAT_DSPGROUP_TRUESPEECH  :
+			return "WAVE_FORMAT_DSPGROUP_TRUESPEECH " ;
+		case WAVE_FORMAT_ECHOSC1 :
+			return "WAVE_FORMAT_ECHOSC1" ;
+		case WAVE_FORMAT_AUDIOFILE_AF18   :
+			return "WAVE_FORMAT_AUDIOFILE_AF18  " ;
+		case WAVE_FORMAT_APTX :
+			return "WAVE_FORMAT_APTX" ;
+		case WAVE_FORMAT_AUDIOFILE_AF10   :
+			return "WAVE_FORMAT_AUDIOFILE_AF10  " ;
+		case WAVE_FORMAT_DOLBY_AC2 :
+			return "WAVE_FORMAT_DOLBY_AC2" ;
+		case WAVE_FORMAT_GSM610 :
+			return "WAVE_FORMAT_GSM610" ;
+		case WAVE_FORMAT_MSNAUDIO :
+			return "WAVE_FORMAT_MSNAUDIO" ;
+		case WAVE_FORMAT_ANTEX_ADPCME :
+			return "WAVE_FORMAT_ANTEX_ADPCME" ;
+		case WAVE_FORMAT_CONTROL_RES_VQLPC :
+			return "WAVE_FORMAT_CONTROL_RES_VQLPC" ;
+		case WAVE_FORMAT_DIGIREAL :
+			return "WAVE_FORMAT_DIGIREAL" ;
+		case WAVE_FORMAT_DIGIADPCM :
+			return "WAVE_FORMAT_DIGIADPCM" ;
+		case WAVE_FORMAT_CONTROL_RES_CR10 :
+			return "WAVE_FORMAT_CONTROL_RES_CR10" ;
+		case WAVE_FORMAT_NMS_VBXADPCM :
+			return "WAVE_FORMAT_NMS_VBXADPCM" ;
+		case WAVE_FORMAT_ROCKWELL_ADPCM :
+			return "WAVE_FORMAT_ROCKWELL_ADPCM" ;
+		case WAVE_FORMAT_ROCKWELL_DIGITALK :
+			return "WAVE_FORMAT_ROCKWELL_DIGITALK" ;
+		case WAVE_FORMAT_G721_ADPCM :
+			return "WAVE_FORMAT_G721_ADPCM" ;
+		case WAVE_FORMAT_MPEG :
+			return "WAVE_FORMAT_MPEG" ;
+		case WAVE_FORMAT_MPEGLAYER3 :
+			return "WAVE_FORMAT_MPEGLAYER3" ;
+		case IBM_FORMAT_MULAW :
+			return "IBM_FORMAT_MULAW" ;
+		case IBM_FORMAT_ALAW :
+			return "IBM_FORMAT_ALAW" ;
+		case IBM_FORMAT_ADPCM :
+			return "IBM_FORMAT_ADPCM" ;
+		case WAVE_FORMAT_CREATIVE_ADPCM :
+			return "WAVE_FORMAT_CREATIVE_ADPCM" ;
+		case WAVE_FORMAT_FM_TOWNS_SND :
+			return "WAVE_FORMAT_FM_TOWNS_SND" ;
+		case WAVE_FORMAT_OLIGSM :
+			return "WAVE_FORMAT_OLIGSM" ;
+		case WAVE_FORMAT_OLIADPCM :
+			return "WAVE_FORMAT_OLIADPCM" ;
+		case WAVE_FORMAT_OLICELP :
+			return "WAVE_FORMAT_OLICELP" ;
+		case WAVE_FORMAT_OLISBC :
+			return "WAVE_FORMAT_OLISBC" ;
+		case WAVE_FORMAT_OLIOPR :
+			return "WAVE_FORMAT_OLIOPR" ;
+		case WAVE_FORMAT_EXTENSIBLE :
+			return "WAVE_FORMAT_EXTENSIBLE" ;
+		break ;
+		} ;
+	return "Unknown format" ;
+} /* wav_format_str */
--- /dev/null
+++ b/common/libsndfile/src/wav.h
@@ -1,0 +1,126 @@
+#ifndef WAV_H_INCLUDED
+#define WAV_H_INCLUDED
+
+#ifdef _WIN32
+	#pragma pack(push,1)
+#endif
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+} MIN_WAV_FMT ;
+
+typedef	struct 
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	dummy ;
+} WAV_FMT_SIZE20 ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	samplesperblock ;
+	unsigned short	numcoeffs ;
+	struct
+	{	short	coeff1 ;
+		short	coeff2 ;
+	}	coeffs [7] ;
+} MS_ADPCM_WAV_FMT ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	samplesperblock ;
+} IMA_ADPCM_WAV_FMT ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	samplesperblock ;
+} GSM610_WAV_FMT ;
+
+typedef struct
+{	unsigned int	esf_field1 ;
+	unsigned short	esf_field2 ;
+	unsigned short	esf_field3 ;
+	unsigned char	esf_field4 [8] ;
+} EXT_SUBFORMAT ;
+
+typedef	struct
+{	unsigned short	format ;
+	unsigned short	channels ;
+	unsigned int	samplerate ;
+	unsigned int	bytespersec ;
+	unsigned short	blockalign ;
+	unsigned short	bitwidth ;
+	unsigned short	extrabytes ;
+	unsigned short	validbits ;
+	unsigned int	channelmask ;
+	EXT_SUBFORMAT	esf ;
+} EXTENSIBLE_WAV_FMT ;
+
+typedef union
+{	unsigned short		format ;
+	MIN_WAV_FMT			min ;
+	IMA_ADPCM_WAV_FMT	ima ;
+	MS_ADPCM_WAV_FMT	msadpcm ;
+	EXTENSIBLE_WAV_FMT	ext ;
+	GSM610_WAV_FMT		gsm610 ;
+	WAV_FMT_SIZE20		size20 ;
+	char				padding [512] ;
+} WAV_FMT ;
+
+typedef struct
+{	unsigned int samples ;
+} FACT_CHUNK ;
+
+/*------------------------------------------------------------------------------------ 
+**	Functions defined in wav_ima_adpcm.c
+*/
+
+int		wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
+int		wav_ima_writer_init (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------------ 
+**	Functions defined in wav_ms_adpcm.c
+*/
+
+int		wav_msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
+int		wav_msadpcm_writer_init (SF_PRIVATE *psf) ;
+
+/*------------------------------------------------------------------------------------ 
+**	Functions defined in wav_gsm610.c
+*/
+
+int		wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt) ;
+int		wav_gsm610_writer_init (SF_PRIVATE *psf) ;
+
+#ifdef _WIN32
+	#pragma pack(pop,1)
+#endif
+
+#endif
--- /dev/null
+++ b/common/libsndfile/src/wav_gsm610.c
@@ -1,0 +1,624 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"floatcast.h"
+#include	"common.h"
+#include	"wav.h"
+#include	"GSM610/gsm.h"
+
+#if (CPU_IS_LITTLE_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		((a)|((b)<<8)|((c)<<16)|((d)<<24))
+#elif (CPU_IS_BIG_ENDIAN == 1)
+#	define	MAKE_MARKER(a,b,c,d)		(((a)<<24)|((b)<<16)|((c)<<8)|(d))
+#else
+#	error "Cannot determine endian-ness of processor."
+#endif
+
+#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
+#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
+#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
+#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
+#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
+
+#define 	WAVE_FORMAT_GSM610	0x0031
+
+#define		GSM610_BLOCKSIZE	65
+#define		GSM610_SAMPLES		320
+
+typedef struct
+{	unsigned int	blocks ; 
+	int				blockcount, samplecount ;
+	unsigned char	block [GSM610_BLOCKSIZE] ;
+	short			samples [GSM610_SAMPLES] ;
+	gsm				gsm_data ;
+} GSM610_PRIVATE ;
+
+
+static	int	wav_gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+static	int wav_gsm610_read (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ;
+
+static	int	wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610) ;
+static	int wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len) ;
+
+static long  wav_gsm610_seek   (SF_PRIVATE *psf, long offset, int whence) ;
+
+static int	wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	wav_gsm610_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	wav_gsm610_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	wav_gsm610_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int	wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	wav_gsm610_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	wav_gsm610_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	wav_gsm610_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int	wav_gsm610_close	(SF_PRIVATE  *psf) ;
+static int	wav_gsm610_write_header (SF_PRIVATE  *psf) ;
+
+/*============================================================================================
+** WAV GSM610 Reader initialisation function.
+*/
+
+int	
+wav_gsm610_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+{	GSM610_PRIVATE	*pgsm610 ;
+	int  true = 1 ;
+	
+	psf->sf.seekable = SF_FALSE ;
+	/*-psf->sf.seekable = SF_TRUE ;		-*/
+	psf->seek_func = (func_seek) wav_gsm610_seek ;
+
+	psf->read_short  = (func_short)  wav_gsm610_read_s ;
+	psf->read_int    = (func_int)    wav_gsm610_read_i ;
+	psf->read_float  = (func_float)  wav_gsm610_read_f ;
+	psf->read_double = (func_double) wav_gsm610_read_d ;
+
+	if (psf->mode != SF_MODE_READ)
+		return SFE_BAD_MODE_RW ;
+
+	if (! (pgsm610 = malloc (sizeof (GSM610_PRIVATE))))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pgsm610 ;
+
+	memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ;
+
+	if (! (pgsm610->gsm_data = gsm_create ()))
+		return SFE_MALLOC_FAILED ;
+	gsm_option (pgsm610->gsm_data,  GSM_OPT_WAV49, &true) ;
+
+	if (psf->datalength % GSM610_BLOCKSIZE)
+	{	psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
+		pgsm610->blocks = psf->datalength / GSM610_BLOCKSIZE + 1 ;
+		}
+	else
+		pgsm610->blocks = psf->datalength / GSM610_BLOCKSIZE ;
+	
+	psf->sf.samples = GSM610_SAMPLES * pgsm610->blocks ;
+	
+	wav_gsm610_read_block (psf, pgsm610) ;	/* Read first block. */
+	
+	return 0 ;	
+} /* wav_gsm610_reader_init */
+
+/*============================================================================================
+** WAV GSM610 writer initialisation function.
+*/
+
+int	
+wav_gsm610_writer_init (SF_PRIVATE *psf)
+{	GSM610_PRIVATE	*pgsm610 ;
+	int  true = 1, samplesperblock, bytespersec ;
+	
+	if (psf->mode != SF_MODE_WRITE)
+		return SFE_BAD_MODE_RW ;
+
+	if (! (pgsm610 = malloc (sizeof (GSM610_PRIVATE))))
+		return SFE_MALLOC_FAILED ;
+		
+	psf->fdata = (void*) pgsm610 ;
+
+	memset (pgsm610, 0, sizeof (GSM610_PRIVATE)) ;
+	
+	if (! (pgsm610->gsm_data = gsm_create ()))
+		return SFE_MALLOC_FAILED ;
+	gsm_option (pgsm610->gsm_data,  GSM_OPT_WAV49, &true) ;
+
+	pgsm610->blockcount  = 0 ;
+	pgsm610->samplecount = 0 ;
+	
+	samplesperblock = GSM610_SAMPLES ;
+	bytespersec     = psf->sf.samplerate * GSM610_BLOCKSIZE / GSM610_SAMPLES ;
+	
+	if (bytespersec * GSM610_SAMPLES / GSM610_BLOCKSIZE < psf->sf.samplerate) 
+		bytespersec ++ ;
+
+	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
+	if (psf->sf.samples % samplesperblock)
+		psf->datalength += samplesperblock ;
+
+	wav_gsm610_write_header (psf) ;
+
+	psf->write_short  = (func_short)   wav_gsm610_write_s ;
+	psf->write_int    = (func_int)     wav_gsm610_write_i ;
+	psf->write_float  = (func_float)   wav_gsm610_write_f ;
+	psf->write_double = (func_double)  wav_gsm610_write_d ;
+	
+	psf->seek_func    = NULL ; /* Not seekable */
+	psf->close        = (func_close)   wav_gsm610_close ;
+	psf->write_header = (func_wr_hdr)  wav_gsm610_write_header ;
+					
+	return 0 ;
+} /* wav_gsm610_writer_init */
+
+/*============================================================================================
+** GSM 6.10 Read Functions.
+*/
+
+static int		
+wav_gsm610_read_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int	k ;
+	
+	pgsm610->blockcount ++ ;
+	pgsm610->samplecount = 0 ;
+	
+	if (pgsm610->blockcount > pgsm610->blocks)
+	{	memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = fread (pgsm610->block, 1, GSM610_BLOCKSIZE, psf->file)) != GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
+
+	if (gsm_decode (pgsm610->gsm_data, pgsm610->block, pgsm610->samples) < 0)
+	{	psf_log_printf (psf, "Error from gsm_decode() on frame : %d\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+			
+	if (gsm_decode (pgsm610->gsm_data, pgsm610->block+(GSM610_BLOCKSIZE+1)/2, pgsm610->samples+GSM610_SAMPLES/2) < 0)
+	{	psf_log_printf (psf, "Error from gsm_decode() on frame : %d.5\n", pgsm610->blockcount) ;
+		return 0 ;
+		} ;
+
+	return 1 ;
+} /* wav_gsm610_read_block */
+
+static int 
+wav_gsm610_read (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+
+	while (index < len)
+	{	if (pgsm610->blockcount >= pgsm610->blocks && pgsm610->samplecount >= GSM610_SAMPLES)
+		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
+			return total ;
+			} ;
+		
+		if (pgsm610->samplecount >= GSM610_SAMPLES)
+			wav_gsm610_read_block (psf, pgsm610) ;
+		
+		count = GSM610_SAMPLES - pgsm610->samplecount ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pgsm610->samples [pgsm610->samplecount]), count * sizeof (short)) ;
+		index += count ;
+		pgsm610->samplecount += count ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* wav_gsm610_read */
+
+static int		
+wav_gsm610_read_s (SF_PRIVATE *psf, short *ptr, int len)
+{	GSM610_PRIVATE 	*pgsm610 ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	total = wav_gsm610_read (psf, pgsm610, ptr, len) ;
+
+	return total ;
+} /* wav_gsm610_read_s */
+
+static int		
+wav_gsm610_read_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (int) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* wav_gsm610_read_i */
+
+static int		
+wav_gsm610_read_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* wav_gsm610_read_d */
+
+static int		
+wav_gsm610_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double		normfact ;
+	
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = wav_gsm610_read (psf, pgsm610, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (double) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* wav_gsm610_read_d */
+
+static long    
+wav_gsm610_seek   (SF_PRIVATE *psf, long offset, int whence)
+{	GSM610_PRIVATE *pgsm610 ; 
+	int			newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+
+	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+		
+	switch (whence)
+	{	case SEEK_SET :
+				if (offset < 0 || offset > pgsm610->blocks * GSM610_SAMPLES)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = offset / GSM610_SAMPLES ;
+				newsample = offset % GSM610_SAMPLES ;
+				break ;
+				
+		case SEEK_CUR :
+				if (psf->current + offset < 0 || psf->current + offset > pgsm610->blocks * GSM610_SAMPLES)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (psf->current + offset) / GSM610_SAMPLES ;
+				newsample = (psf->current + offset) % GSM610_SAMPLES ;
+				break ;
+				
+		case SEEK_END :
+				if (offset > 0 || GSM610_SAMPLES * pgsm610->blocks + offset < 0)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (GSM610_SAMPLES * pgsm610->blocks + offset) / GSM610_SAMPLES ;
+				newsample = (GSM610_SAMPLES * pgsm610->blocks + offset) % GSM610_SAMPLES ;
+				break ;
+				
+		default : 
+				psf->error = SFE_BAD_SEEK ;
+				return	((long) -1) ;
+		} ;
+		
+	if (psf->mode == SF_MODE_READ)
+	{	fseek (psf->file, (int) (psf->dataoffset + newblock * GSM610_BLOCKSIZE), SEEK_SET) ;
+		pgsm610->blockcount  = newblock ;
+		wav_gsm610_read_block (psf, pgsm610) ;
+		pgsm610->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	psf->current = newblock * GSM610_SAMPLES + newsample ;
+	return psf->current ;
+} /* wav_gsm610_seek */
+
+/*==========================================================================================
+** GSM 6.10 Write Functions.
+*/
+
+
+
+/*==========================================================================================
+*/
+
+static int
+wav_gsm610_write_block (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610)
+{	int k ;
+
+	/* Encode the samples. */
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples, pgsm610->block) ;
+	gsm_encode (pgsm610->gsm_data, pgsm610->samples+GSM610_SAMPLES/2, pgsm610->block+GSM610_BLOCKSIZE/2) ;
+
+	/* Write the block to disk. */
+	if ((k = fwrite (pgsm610->block, 1, GSM610_BLOCKSIZE, psf->file)) != GSM610_BLOCKSIZE)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, GSM610_BLOCKSIZE) ;
+
+	pgsm610->samplecount = 0 ;
+	pgsm610->blockcount ++ ;
+
+	/* Set samples to zero for next block. */
+	memset (pgsm610->samples, 0, GSM610_SAMPLES * sizeof (short)) ;
+
+	return 1 ;
+} /* wav_gsm610_write_block */
+
+static int 
+wav_gsm610_write (SF_PRIVATE *psf, GSM610_PRIVATE *pgsm610, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = GSM610_SAMPLES - pgsm610->samplecount ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pgsm610->samples [pgsm610->samplecount]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pgsm610->samplecount += count ;
+		total = index ;
+
+		if (pgsm610->samplecount >= GSM610_SAMPLES)
+			wav_gsm610_write_block (psf, pgsm610) ;	
+		} ;
+
+	return total ;		
+} /* wav_gsm610_write */
+
+static int		
+wav_gsm610_write_s (SF_PRIVATE *psf, short *ptr, int len)
+{	GSM610_PRIVATE 	*pgsm610 ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	total = wav_gsm610_write (psf, pgsm610, ptr, len) ;
+
+	return total ;
+} /* wav_gsm610_write_s */
+
+static int		
+wav_gsm610_write_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = (short) ptr [index+k] ;
+		count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* wav_gsm610_write_i */
+
+static int		
+wav_gsm610_write_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k])  ;
+		count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* wav_gsm610_write_f */
+
+static int		
+wav_gsm610_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	GSM610_PRIVATE *pgsm610 ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double		normfact ;
+	
+	normfact = (normalize ? (double) 0x8000 : 1.0) ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k])  ;
+		count = wav_gsm610_write (psf, pgsm610, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* wav_gsm610_write_d */
+
+static int
+wav_gsm610_write_header (SF_PRIVATE  *psf)
+{	int  fmt_size, blockalign, samplesperblock, bytespersec ;
+
+	blockalign      = GSM610_BLOCKSIZE ;
+	samplesperblock = GSM610_SAMPLES ;
+	bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
+	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+	/* fmt chunk. */
+	fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+	
+	/* fmt : size, WAV format type, channels. */
+	psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_GSM610, psf->sf.channels) ;
+
+	/* fmt : samplerate, bytespersec. */
+	psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
+
+	/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+	psf_binheader_writef (psf, "wwww", blockalign, 0, 2, samplesperblock) ;
+
+	/* Fact chunk : marker, chunk size, samples */	
+	psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
+
+	/* DATA chunk : marker, datalength. */
+	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+
+	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
+	if (psf->sf.samples % samplesperblock)
+		psf->datalength += samplesperblock ;
+
+	return 0 ;
+} /* wav_gsm610_write_header */
+
+int	
+wav_gsm610_close	(SF_PRIVATE  *psf)
+{	GSM610_PRIVATE *pgsm610 ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pgsm610 = (GSM610_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+	
+		if (pgsm610->samplecount && pgsm610->samplecount < GSM610_SAMPLES)
+			wav_gsm610_write_block (psf, pgsm610) ;	
+
+		/*  Now we know for certain the length of the file we can
+		**  re-write correct values for the RIFF and data chunks.
+		*/
+		 
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+
+		psf->sf.samples = GSM610_SAMPLES * pgsm610->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		wav_gsm610_write_header (psf) ;
+		} ;
+
+	if (pgsm610->gsm_data)
+		gsm_destroy (pgsm610->gsm_data) ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* wav_gsm610_close */
+
--- /dev/null
+++ b/common/libsndfile/src/wav_ima_adpcm.c
@@ -1,0 +1,816 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"floatcast.h"
+#include	"common.h"
+#include	"wav.h"
+
+#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
+#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
+#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
+#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
+#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
+
+#define WAVE_FORMAT_IMA_ADPCM		0x0011		/* Intel Corporation */
+
+typedef struct
+{	unsigned int	channels ;
+	unsigned int	blocksize ;
+	unsigned int	samplesperblock ; 
+} IMA_ADPCM_PUBLIC ;
+
+typedef struct
+{	unsigned int	channels, blocksize, samplesperblock, blocks ; 
+	int				blockcount, samplecount ;
+	int				previous [2] ;
+	int				stepindex [2] ;
+	unsigned char	*block ;
+	short			*samples ;
+	unsigned char	data	[4] ; /* Dummy size */
+} IMA_ADPCM_PRIVATE ;
+
+/*============================================================================================
+** Predefined IMA ADPCM data.
+*/
+
+static int ima_index_adjust [16] = 
+{	-1, -1, -1, -1,		/* +0 - +3, decrease the step size */
+     2,  4,  6,  8,     /* +4 - +7, increase the step size */
+    -1, -1, -1, -1,		/* -0 - -3, decrease the step size */
+     2,  4,  6,  8,		/* -4 - -7, increase the step size */
+} ;
+
+static int ima_step_size [89] = 
+{	7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 
+	50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 
+	253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 
+	1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 
+	3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442,
+	11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 
+	32767
+} ;
+
+static int	ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public) ;
+static int	ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public) ;
+
+static int ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
+
+static int ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima) ;
+static int ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len) ;
+
+static int ima_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int ima_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int ima_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int ima_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int ima_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int ima_write_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static int ima_write_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static int ima_write_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static long	ima_seek   (SF_PRIVATE *psf, long offset, int whence) ;
+static int		wav_ima_close			(SF_PRIVATE  *psf) ;
+static int		wav_ima_write_header 	(SF_PRIVATE  *psf) ;
+
+static	unsigned int wav_srate2blocksize (unsigned int srate) ;
+
+/*============================================================================================
+** IMA ADPCM Reader initialisation function.
+*/
+
+int	
+wav_ima_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+{	IMA_ADPCM_PUBLIC public ;
+
+	public.blocksize       = fmt->ima.blockalign ;
+	public.channels        = fmt->ima.channels ;
+	public.samplesperblock = fmt->ima.samplesperblock ;
+	return ima_reader_init (psf, &public) ;
+} /* wav_ima_reader_init */
+
+int	
+wav_ima_writer_init (SF_PRIVATE *psf)
+{	IMA_ADPCM_PUBLIC 	public ;
+	int					error ;
+	
+	public.blocksize = wav_srate2blocksize (psf->sf.samplerate) ;	
+	public.channels  = psf->sf.channels ;
+	public.samplesperblock = 2 * (public.blocksize - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+	
+	if ((error = ima_writer_init (psf, &public)))
+		return error ;
+		
+	wav_ima_write_header (psf) ;
+
+	psf->write_short  = (func_short)  ima_write_s ;
+	psf->write_int    = (func_int)    ima_write_i ;
+	psf->write_float  = (func_float)  ima_write_f ;
+	psf->write_double = (func_double) ima_write_d ;
+	psf->seek_func    = (func_seek)   ima_seek ;
+	psf->close        = (func_close)  wav_ima_close ;
+	psf->write_header = (func_wr_hdr) wav_ima_write_header ;
+		
+	return 0 ;
+} /* wav_ima_writer_init */
+
+/*============================================================================================
+** IMA ADPCM Read Functions.
+*/
+
+static int
+ima_reader_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
+{	IMA_ADPCM_PRIVATE	*pima ;
+	unsigned int		pimasize, count ;
+	
+	if (psf->mode != SF_MODE_READ)
+		return SFE_BAD_MODE_RW ;
+
+	pimasize = sizeof (IMA_ADPCM_PRIVATE) + public->blocksize + 3 * public->channels * public->samplesperblock ;
+
+	if (! (pima = malloc (pimasize)))
+		return SFE_MALLOC_FAILED ;
+
+	psf->fdata = (void*) pima ;
+
+	memset (pima, 0, pimasize) ;
+
+	pima->block   = (unsigned char*) pima->data ;
+	pima->samples = (short*) (pima->data + public->blocksize) ;
+	
+	pima->channels        = public->channels ;
+	pima->blocksize       = public->blocksize ;
+	pima->samplesperblock = public->samplesperblock ;
+	
+	if (psf->datalength % pima->blocksize)
+	{	psf_log_printf (psf, "*** Warning : data chunk seems to be truncated.\n") ;
+		pima->blocks = psf->datalength / pima->blocksize  + 1 ;
+		}
+	else
+		pima->blocks = psf->datalength / pima->blocksize ;
+	
+	count = 2 * (pima->blocksize - 4 * pima->channels) / pima->channels + 1 ;
+	if (pima->samplesperblock != count)
+		psf_log_printf (psf, "*** Warning : samplesperblock should be %d.\n", count) ;
+
+	psf->sf.samples = pima->samplesperblock * pima->blocks ;
+
+	ima_read_block (psf, pima) ;	/* Read first block. */
+	
+	psf->read_short  = (func_short)  ima_read_s ;
+	psf->read_int    = (func_int)    ima_read_i ;
+	psf->read_float  = (func_float)  ima_read_f ;
+	psf->read_double = (func_double) ima_read_d ;
+
+	psf->seek_func = (func_seek) ima_seek ;
+
+	return 0 ;	
+} /* ima_reader_init */
+
+static int
+ima_read_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, current, blockindex, index, indexstart ;
+	short	step, diff, bytecode, stepindex [2] ;
+	
+	pima->blockcount ++ ;
+	pima->samplecount = 0 ;
+	
+	if (pima->blockcount > pima->blocks)
+	{	memset (pima->samples, 0, pima->samplesperblock * pima->channels * sizeof (short)) ;
+		return 1 ;
+		} ;
+
+	if ((k = fread (pima->block, 1, pima->blocksize, psf->file)) != pima->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pima->blocksize) ;
+
+	/* Read and check the block header. */
+	
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	current = pima->block [chan*4] | (pima->block [chan*4+1] << 8) ;
+		if (current & 0x8000)
+			current -= 0x10000 ;
+			
+		stepindex [chan] = pima->block [chan*4+2] ;
+		if (stepindex [chan] < 0)
+			stepindex [chan] = 0 ;
+		else if (stepindex [chan] > 88)
+			stepindex [chan] = 88 ;
+
+		if (pima->block [chan*4+3] != 0)
+			psf_log_printf (psf, "IMA ADPCM synchronisation error.\n") ;
+		
+		pima->samples [chan] = current ;
+
+		/* psf_log_printf (psf, "block %d : channel %d (current, index) : (%d, %d)\n", 
+		**	pima->blockcount, chan,  current, stepindex [chan]) ;
+		*/
+		} ;
+		
+	/* Pull apart the packed 4 bit samples and store them in their
+	** correct sample positions.
+	*/
+	
+	blockindex = 4 * pima->channels ;
+	
+	indexstart = pima->channels ;
+	while (blockindex <  pima->blocksize)
+	{	for (chan = 0 ; chan < pima->channels ; chan++)
+		{	index = indexstart + chan ;
+			for (k = 0 ; k < 4 ; k++)
+			{	bytecode = pima->block [blockindex++] ;
+				pima->samples [index] = bytecode & 0x0F ;
+				index += pima->channels ;
+				pima->samples [index] = (bytecode >> 4) & 0x0F ;
+				index += pima->channels ;
+				} ;
+			} ;
+		indexstart += 8 * pima->channels ;
+		} ;
+		
+	/* Decode the encoded 4 bit samples. */
+	
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+
+		bytecode = pima->samples [k] & 0xF ;
+		
+		step = ima_step_size [stepindex [chan]] ;
+		current = pima->samples [k - pima->channels] ;
+  
+		diff = step >> 3 ;
+		if (bytecode & 1) 
+			diff += step >> 2 ;
+		if (bytecode & 2) 
+			diff += step >> 1 ;
+		if (bytecode & 4) 
+			diff += step ;
+		if (bytecode & 8) 
+			diff = -diff ;
+
+		current += diff ;
+
+		if (current > 32767) 
+			current = 32767;
+		else if (current < -32768) 
+			current = -32768 ;
+
+		stepindex [chan] += ima_index_adjust [bytecode] ;
+	
+		if (stepindex [chan] < 0) 
+			stepindex [chan] = 0 ;
+		else if (stepindex [chan] > 88) 
+			stepindex [chan] = 88 ;
+
+		pima->samples [k] = current ;
+		} ;
+
+	return 1 ;
+} /* ima_read_block */
+
+static int 
+ima_read (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+
+	while (index < len)
+	{	if (pima->blockcount >= pima->blocks && pima->samplecount >= pima->samplesperblock)
+		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
+			return total ;
+			} ;
+		
+		if (pima->samplecount >= pima->samplesperblock)
+			ima_read_block (psf, pima) ;
+		
+		count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pima->samples [pima->samplecount * pima->channels]), count * sizeof (short)) ;
+		index += count ;
+		pima->samplecount += count / pima->channels ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* ima_read */
+
+static int		
+ima_read_s (SF_PRIVATE *psf, short *ptr, int len)
+{	IMA_ADPCM_PRIVATE 	*pima ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	total = ima_read (psf, pima, ptr, len) ;
+
+	return total ;
+} /* ima_read_s */
+
+static int		
+ima_read_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = ima_read (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (int) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* ima_read_i */
+
+static int
+ima_read_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = ima_read (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (float) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* ima_read_f */
+
+static int
+ima_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = ima_read (psf, pima, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (double) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* ima_read_d */
+
+static long    
+ima_seek   (SF_PRIVATE *psf, long offset, int whence)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	int			newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+		
+	switch (whence)
+	{	case SEEK_SET :
+				if (offset < 0 || offset > pima->blocks * pima->samplesperblock)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = offset / pima->samplesperblock ;
+				newsample = offset % pima->samplesperblock ;
+				break ;
+				
+		case SEEK_CUR :
+				if (psf->current + offset < 0 || psf->current + offset > pima->blocks * pima->samplesperblock)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (psf->current + offset) / pima->samplesperblock ;
+				newsample = (psf->current + offset) % pima->samplesperblock ;
+				break ;
+				
+		case SEEK_END :
+				if (offset > 0 || pima->samplesperblock * pima->blocks + offset < 0)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (pima->samplesperblock * pima->blocks + offset) / pima->samplesperblock ;
+				newsample = (pima->samplesperblock * pima->blocks + offset) % pima->samplesperblock ;
+				break ;
+				
+		default : 
+				psf->error = SFE_BAD_SEEK ;
+				return	((long) -1) ;
+		} ;
+		
+	if (psf->mode == SF_MODE_READ)
+	{	fseek (psf->file, (int) (psf->dataoffset + newblock * pima->blocksize), SEEK_SET) ;
+		pima->blockcount  = newblock ;
+		ima_read_block (psf, pima) ;
+		pima->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	psf->current = newblock * pima->samplesperblock + newsample ;
+	return psf->current ;
+} /* ima_seek */
+
+/*==========================================================================================
+** IMA ADPCM Write Functions.
+*/
+
+static int	
+ima_writer_init (SF_PRIVATE *psf, IMA_ADPCM_PUBLIC *public)
+{	IMA_ADPCM_PRIVATE	*pima ;
+	unsigned int 		pimasize ;
+	
+	if (psf->mode != SF_MODE_WRITE)
+		return SFE_BAD_MODE_RW ;
+
+	public->blocksize       = wav_srate2blocksize (psf->sf.samplerate) ;	
+	public->samplesperblock = 2 * (public->blocksize - 4 * public->channels) / public->channels + 1 ;
+
+	pimasize = sizeof (IMA_ADPCM_PRIVATE) + public->blocksize + 3 * public->channels * public->samplesperblock ;
+
+	if (! (pima = malloc (pimasize)))
+		return SFE_MALLOC_FAILED ;
+		
+	psf->fdata = (void*) pima ;
+
+	memset (pima, 0, pimasize) ;
+	
+	pima->channels        = public->channels ;
+	pima->blocksize       = public->blocksize ;
+	pima->samplesperblock = public->samplesperblock ;
+
+	pima->block   = (unsigned char*) pima->data ;
+	pima->samples = (short*) (pima->data + public->blocksize) ;
+	
+	pima->samplecount = 0 ;
+	
+	return 0 ;
+} /* ima_writer_init */
+
+
+
+/*==========================================================================================
+*/
+
+static int		
+ima_write_block (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima)
+{	int		chan, k, step, diff, vpdiff, blockindex, index, indexstart ;
+	short	bytecode, mask ;
+	
+	/* Write the block header. */
+
+	for (chan = 0 ; chan < pima->channels ; chan++)
+	{	pima->block [chan*4]   = pima->samples [chan] & 0xFF ;
+		pima->block [chan*4+1] = (pima->samples [chan] >> 8) & 0xFF ;
+		
+		pima->block [chan*4+2] = pima->stepindex [chan] ;
+		pima->block [chan*4+3] = 0 ;
+		} ;
+		
+	pima->previous  [0] = pima->samples [0] ;
+	pima->previous  [1] = pima->samples [1] ;
+
+	/* Encode the samples as 4 bit. */
+
+	for (k = pima->channels ; k < (pima->samplesperblock * pima->channels) ; k ++)
+	{	chan = (pima->channels > 1) ? (k % 2) : 0 ;
+	
+		diff = pima->samples [k] - pima->previous [chan] ;
+	
+		bytecode = 0 ;
+		step = ima_step_size [pima->stepindex [chan]] ;
+		vpdiff = step >> 3 ;
+		if (diff < 0) 
+		{	bytecode = 8 ; 
+			diff = -diff ;
+			} ;
+		mask = 4 ;
+		while (mask)
+		{	if (diff >= step)
+			{	bytecode |= mask ;
+				diff -= step ;
+				vpdiff += step ;
+				} ;
+			step >>= 1 ;
+			mask >>= 1 ;
+			} ;
+
+		if (bytecode & 8)
+			pima->previous [chan] -= vpdiff ;
+		else
+			pima->previous [chan] += vpdiff ;
+
+		if (pima->previous [chan] > 32767) 
+			pima->previous [chan] = 32767;
+		else if (pima->previous [chan] < -32768) 
+			pima->previous [chan] = -32768;
+
+		pima->stepindex [chan] += ima_index_adjust [bytecode] ;
+		if (pima->stepindex [chan] < 0)
+			pima->stepindex [chan] = 0 ;
+		else if (pima->stepindex [chan] > 88)
+			pima->stepindex [chan] = 88 ;
+		
+		pima->samples [k] = bytecode ;
+		} ;
+
+	/* Pack the 4 bit encoded samples. */
+
+	blockindex = 4 * pima->channels ;
+	
+	indexstart = pima->channels ;
+	while (blockindex <  pima->blocksize)
+	{	for (chan = 0 ; chan < pima->channels ; chan++)
+		{	index = indexstart + chan ;
+			for (k = 0 ; k < 4 ; k++)
+			{	pima->block [blockindex] = pima->samples [index] & 0x0F ;
+				index += pima->channels ;
+				pima->block [blockindex] |= (pima->samples [index] << 4) & 0xF0 ;
+				index += pima->channels ;
+				blockindex ++ ;
+				} ;
+			} ;
+		indexstart += 8 * pima->channels ;
+		} ;
+		
+	/* Write the block to disk. */
+
+	if ((k = fwrite (pima->block, 1, pima->blocksize, psf->file)) != pima->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pima->blocksize) ;
+		
+	memset (pima->samples, 0, pima->samplesperblock * sizeof (short)) ;
+	pima->samplecount = 0 ;
+			
+	return 1 ;
+} /* ima_write_block */
+
+static int 
+ima_write (SF_PRIVATE *psf, IMA_ADPCM_PRIVATE *pima, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = (pima->samplesperblock - pima->samplecount) * pima->channels ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pima->samples [pima->samplecount * pima->channels]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pima->samplecount += count / pima->channels ;
+		total = index ;
+
+		if (pima->samplecount >= pima->samplesperblock)
+			ima_write_block (psf, pima) ;	
+		} ;
+
+	return total ;		
+} /* ima_write */
+
+static int		
+ima_write_s (SF_PRIVATE *psf, short *ptr, int len)
+{	IMA_ADPCM_PRIVATE 	*pima ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	total = ima_write (psf, pima, ptr, len) ;
+
+	return total ;
+} /* ima_write_s */
+
+static int		
+ima_write_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = (short) ptr [index+k] ;
+		count = ima_write (psf, pima, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* ima_write_i */
+
+static int		
+ima_write_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k])  ;
+		count = ima_write (psf, pima, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* ima_write_f */
+
+static int		
+ima_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	IMA_ADPCM_PRIVATE *pima ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k])  ;
+		count = ima_write (psf, pima, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* ima_write_d */
+
+static int
+wav_ima_write_header (SF_PRIVATE  *psf)
+{	int  fmt_size, blockalign, samplesperblock, bytespersec ;
+
+	blockalign      = wav_srate2blocksize (psf->sf.samplerate) ;
+	samplesperblock = 2 * (blockalign - 4 * psf->sf.channels) / psf->sf.channels + 1 ;
+	bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
+	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+	/* fmt chunk. */
+	fmt_size = 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 ;
+	
+	/* fmt : size, WAV format type, channels. */
+	psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_IMA_ADPCM, psf->sf.channels) ;
+
+	/* fmt : samplerate, bytespersec. */
+	psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
+
+	/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+	psf_binheader_writef (psf, "wwww", blockalign, 4, 2, samplesperblock) ;
+
+	/* Fact chunk. */	
+	psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
+
+	/* DATA chunk. */
+	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+
+	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
+	if (psf->sf.samples % samplesperblock)
+		psf->datalength += samplesperblock ;
+
+	return 0 ;
+} /* wav_ima_write_header */
+
+static int	
+wav_ima_close	(SF_PRIVATE  *psf)
+{	IMA_ADPCM_PRIVATE *pima ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pima = (IMA_ADPCM_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*	If a block has been partially assembled, write it out
+		**	as the final block.
+		*/
+	
+		if (pima->samplecount && pima->samplecount < pima->samplesperblock)
+			ima_write_block (psf, pima) ;	
+
+		/*  Now we know for certain the length of the file we can
+		**  re-write the header.
+		*/
+		 
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+
+		psf->sf.samples = pima->samplesperblock * pima->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		wav_ima_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* wav_ima_close */
+
+static unsigned 
+int wav_srate2blocksize (unsigned int srate)
+{	if (srate < 12000)
+		return 256 ;
+	if (srate < 23000)
+		return 512 ;
+	return 1024 ;
+} /* wav_srate2blocksize */
--- /dev/null
+++ b/common/libsndfile/src/wav_ms_adpcm.c
@@ -1,0 +1,895 @@
+/*
+** Copyright (C) 1999-2001 Erik de Castro Lopo <erikd@zip.com.au>
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU Lesser General Public License as published by
+** the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include	<stdio.h>
+#include	<unistd.h>
+#include	<string.h>
+#include	<math.h>
+
+#include	"sndfile.h"
+#include	"config.h"
+#include	"sfendian.h"
+#include	"floatcast.h"
+#include	"common.h"
+#include	"wav.h"
+
+/* These required here because we write the header in this file. */
+
+#define RIFF_MARKER	(MAKE_MARKER ('R', 'I', 'F', 'F')) 
+#define WAVE_MARKER	(MAKE_MARKER ('W', 'A', 'V', 'E')) 
+#define fmt_MARKER	(MAKE_MARKER ('f', 'm', 't', ' ')) 
+#define fact_MARKER	(MAKE_MARKER ('f', 'a', 'c', 't')) 
+#define data_MARKER	(MAKE_MARKER ('d', 'a', 't', 'a')) 
+
+#define WAVE_FORMAT_MS_ADPCM	0x0002
+
+typedef struct
+{	unsigned int	channels, blocksize, samplesperblock, blocks, dataremaining ; 
+	int				blockcount, samplecount ;
+	unsigned char	*block ;
+	short			*samples ;
+	unsigned char	dummydata [4] ; /* Dummy size */
+} MSADPCM_PRIVATE ;
+
+/*============================================================================================
+** MS ADPCM static data and functions.
+*/
+
+static int AdaptationTable []    = 
+{	230, 230, 230, 230, 307, 409, 512, 614,
+	768, 614, 512, 409, 307, 230, 230, 230 
+} ;
+
+/* TODO : The first 7 coef's are are always hardcode and must
+   appear in the actual WAVE file.  They should be read in
+   in case a sound program added extras to the list. */
+
+static int AdaptCoeff1 [] = 
+{	256, 512, 0, 192, 240, 460, 392 
+} ;
+
+static int AdaptCoeff2 [] = 
+{	0, -256, 0, 64, 0, -208, -232
+} ;
+
+/*============================================================================================
+**	MS ADPCM Block Layout.
+**	======================
+**	Block is usually 256, 512 or 1024 bytes depending on sample rate.
+**	For a mono file, the block is laid out as follows:
+**		byte	purpose
+**		0		block predictor [0..6]
+**		1,2		initial idelta (positive)
+**		3,4		sample 1
+**		5,6		sample 0
+**		7..n	packed bytecodes
+**
+**	For a stereo file, the block is laid out as follows:
+**		byte	purpose
+**		0		block predictor [0..6] for left channel
+**		1		block predictor [0..6] for right channel
+**		2,3		initial idelta (positive) for left channel
+**		4,5		initial idelta (positive) for right channel
+**		6,7		sample 1 for left channel
+**		8,9		sample 1 for right channel
+**		10,11	sample 0 for left channel
+**		12,13	sample 0 for right channel
+**		14..n	packed bytecodes
+*/
+
+/*============================================================================================
+** Static functions.
+*/
+
+static	int	msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static	int msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
+
+static	int	msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms) ;
+static	int msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len) ;
+
+static	int	msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static	int	msadpcm_read_i (SF_PRIVATE *psf, int *ptr, int len) ;
+static	int	msadpcm_read_f (SF_PRIVATE *psf, float *ptr, int len) ;
+static	int	msadpcm_read_d (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static int	msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len) ;
+static int	msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, int len) ;
+static int	msadpcm_write_f  (SF_PRIVATE *psf, float *ptr, int len) ;
+static int	msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize) ;
+
+static long msadpcm_seek   (SF_PRIVATE *psf, long offset, int whence) ;
+static	int	msadpcm_close	(SF_PRIVATE  *psf) ;
+
+static int	msadpcm_write_header (SF_PRIVATE  *psf) ;
+
+static	unsigned int srate2blocksize (unsigned int srate_chan_product) ;
+static	void	choose_predictor (unsigned int channels, short *data, int *bpred, int *idelta) ;
+
+/*============================================================================================
+** MS ADPCM Read Functions.
+*/
+
+int	
+wav_msadpcm_reader_init (SF_PRIVATE *psf, WAV_FMT *fmt)
+{	MSADPCM_PRIVATE	*pms ;
+	unsigned int	pmssize ;
+	int				count ;
+	
+	pmssize = sizeof (MSADPCM_PRIVATE) + fmt->msadpcm.blockalign + 3 * fmt->msadpcm.channels * fmt->msadpcm.samplesperblock ;
+
+	if (! (psf->fdata = malloc (pmssize)))
+		return SFE_MALLOC_FAILED ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	memset (pms, 0, pmssize) ;
+	
+	pms->block   = (unsigned char*) pms->dummydata ;
+	pms->samples = (short*) (pms->dummydata + fmt->msadpcm.blockalign) ;
+	
+	pms->channels        = fmt->msadpcm.channels ;
+	pms->blocksize       = fmt->msadpcm.blockalign ;
+	pms->samplesperblock = fmt->msadpcm.samplesperblock ;
+
+	pms->dataremaining	 = psf->datalength ;
+
+	if (psf->datalength % pms->blocksize)
+		pms->blocks = psf->datalength / pms->blocksize  + 1 ;
+	else
+		pms->blocks = psf->datalength / pms->blocksize ;
+
+	count = 2 * (pms->blocksize - 6 * pms->channels) / pms->channels ;
+	if (pms->samplesperblock != count)
+		psf_log_printf (psf, "*** Warning : samplesperblock shoud be %d.\n", count) ;
+
+	psf->sf.samples = (psf->datalength / pms->blocksize) * pms->samplesperblock ;
+
+	psf_log_printf (psf, " bpred   idelta\n") ;
+
+	msadpcm_decode_block (psf, pms) ;
+	
+	psf->read_short  = (func_short)  msadpcm_read_s ;
+	psf->read_int    = (func_int)    msadpcm_read_i ;
+	psf->read_float  = (func_float)  msadpcm_read_f ;
+	psf->read_double = (func_double) msadpcm_read_d ;
+
+	psf->seek_func   = (func_seek)   msadpcm_seek ;
+
+	return 0 ;
+} /* wav_msadpcm_reader_init */
+
+static int		
+msadpcm_decode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+{	int		chan, k, blockindex, sampleindex ;
+	short	bytecode, bpred [2], chan_idelta [2] ;
+	
+    int predict ;
+    int current ;
+    int idelta ;
+
+	pms->blockcount ++ ;
+	pms->samplecount = 0 ;
+	
+	if (pms->blockcount > pms->blocks)
+	{	memset (pms->samples, 0, pms->samplesperblock * pms->channels) ;
+		return 1 ;
+		} ;
+
+	if ((k = fread (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
+		psf_log_printf (psf, "*** Warning : short read (%d != %d).\n", k, pms->blocksize) ;
+
+	/* Read and check the block header. */
+	
+	if (pms->channels == 1)
+	{	bpred [0] = pms->block [0] ;
+	
+		if (bpred [0] >= 7)
+			psf_log_printf (psf, "MS ADPCM synchronisation error (%d).\n", bpred [0]) ;
+	
+		chan_idelta [0] = pms->block [1] | (pms->block [2] << 8) ;
+		chan_idelta [1] = 0 ;
+
+		psf_log_printf (psf, "(%d) (%d)\n", bpred [0], chan_idelta [0]) ;
+
+		pms->samples [1] = pms->block [3] | (pms->block [4] << 8) ;
+		pms->samples [0] = pms->block [5] | (pms->block [6] << 8) ;
+		blockindex = 7 ;
+		}
+	else
+	{	bpred [0] = pms->block [0] ;
+		bpred [1] = pms->block [1] ;
+	
+		if (bpred [0] >= 7 || bpred [1] >= 7)
+			psf_log_printf (psf, "MS ADPCM synchronisation error (%d %d).\n", bpred [0], bpred [1]) ;
+	
+		chan_idelta [0] = pms->block [2] | (pms->block [3] << 8) ;
+		chan_idelta [1] = pms->block [4] | (pms->block [5] << 8) ;
+
+		psf_log_printf (psf, "(%d, %d) (%d, %d)\n", bpred [0], bpred [1], chan_idelta [0], chan_idelta [1]) ;
+
+		pms->samples [2] = pms->block [6] | (pms->block [7] << 8) ;
+		pms->samples [3] = pms->block [8] | (pms->block [9] << 8) ;
+
+		pms->samples [0] = pms->block [10] | (pms->block [11] << 8) ;
+		pms->samples [1] = pms->block [12] | (pms->block [13] << 8) ;
+
+		blockindex = 14 ;
+		} ;
+
+    if (chan_idelta [0] & 0x8000) 
+		chan_idelta [0] -= 0x10000 ;
+    if (chan_idelta [1] & 0x8000) 
+		chan_idelta [1] -= 0x10000 ;
+		
+	/* Pull apart the packed 4 bit samples and store them in their
+	** correct sample positions.
+	*/
+	
+	sampleindex = 2 * pms->channels ;
+	while (blockindex <  pms->blocksize)
+	{	bytecode = pms->block [blockindex++] ;
+  		pms->samples [sampleindex++] = (bytecode >> 4) & 0x0F ;
+		pms->samples [sampleindex++] = bytecode & 0x0F ;
+		} ;
+		
+	/* Decode the encoded 4 bit samples. */
+	
+	for (k = 2 * pms->channels ; k < (pms->samplesperblock * pms->channels) ; k ++)
+	{	chan = (pms->channels > 1) ? (k % 2) : 0 ;
+
+		bytecode = pms->samples [k] & 0xF ;
+
+	    /** Compute next Adaptive Scale Factor (ASF) **/
+	    idelta = chan_idelta [chan] ;
+	    chan_idelta [chan] = (AdaptationTable [bytecode] * idelta) >> 8 ; /* => / 256 => FIXED_POINT_ADAPTATION_BASE == 256 */
+	    if (chan_idelta [chan] < 16) 
+			chan_idelta [chan] = 16 ;
+	    if (bytecode & 0x8) 
+			bytecode -= 0x10 ;
+		
+    	predict = ((pms->samples [k - pms->channels] * AdaptCoeff1 [bpred [chan]]) 
+					+ (pms->samples [k - 2 * pms->channels] * AdaptCoeff2 [bpred [chan]])) >> 8 ; /* => / 256 => FIXED_POINT_COEFF_BASE == 256 */
+    	current = (bytecode * idelta) + predict;
+    
+	    if (current > 32767) 
+			current = 32767 ;
+	    else if (current < -32768) 
+			current = -32768 ;
+    
+		pms->samples [k] = current ;
+		} ;
+
+	return 1 ;
+} /* msadpcm_decode_block */
+
+static int 
+msadpcm_read (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	if (pms->blockcount >= pms->blocks && pms->samplecount >= pms->samplesperblock)
+		{	memset (&(ptr[index]), 0, (len - index) * sizeof (short)) ;
+			return total ;
+			} ;
+		
+		if (pms->samplecount >= pms->samplesperblock)
+			msadpcm_decode_block (psf, pms) ;
+		
+		count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
+		count = (len - index > count) ? count : len - index ;
+		
+		memcpy (&(ptr[index]), &(pms->samples [pms->samplecount * pms->channels]), count * sizeof (short)) ;
+		index += count ;
+		pms->samplecount += count / pms->channels ;
+		total = index ;
+		} ;
+
+	return total ;		
+} /* msadpcm_read */
+
+static int		
+msadpcm_read_s (SF_PRIVATE *psf, short *ptr, int len)
+{	MSADPCM_PRIVATE 	*pms ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	total = msadpcm_read (psf, pms, ptr, len) ;
+
+	return total ;
+} /* msadpcm_read_s */
+
+static int		
+msadpcm_read_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = (int) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* msadpcm_read_i */
+
+static int
+msadpcm_read_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? 1.0 / ((float) 0x8000) : 1.0 ;
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (float) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* msadpcm_read_f */
+
+static int		
+msadpcm_read_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, readcount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	normfact = (normalize ? 1.0 / ((double) 0x8000) : 1.0) ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	readcount = (len >= bufferlen) ? bufferlen : len ;
+		count = msadpcm_read (psf, pms, sptr, readcount) ;
+		for (k = 0 ; k < readcount ; k++)
+			ptr [index+k] = normfact * (double) (sptr [k]) ;
+		index += readcount ;
+		total += count ;
+		len -= readcount ;
+		} ;
+	return total ;
+} /* msadpcm_read_d */
+
+static long    
+msadpcm_seek   (SF_PRIVATE *psf, long offset, int whence)
+{	MSADPCM_PRIVATE *pms ; 
+	int			newblock, newsample ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+
+	if (! (psf->blockwidth && psf->datalength && psf->dataoffset))
+	{	psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+		
+	switch (whence)
+	{	case SEEK_SET :
+				if (offset < 0 || offset > pms->blocks * pms->samplesperblock)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = offset / pms->samplesperblock ;
+				newsample = offset % pms->samplesperblock ;
+				break ;
+				
+		case SEEK_CUR :
+				if (psf->current + offset < 0 || psf->current + offset > pms->blocks * pms->samplesperblock)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (psf->current + offset) / pms->samplesperblock ;
+				newsample = (psf->current + offset) % pms->samplesperblock ;
+				break ;
+				
+		case SEEK_END :
+				if (offset > 0 || pms->samplesperblock * pms->blocks + offset < 0)
+				{	psf->error = SFE_BAD_SEEK ;
+					return	((long) -1) ;
+					} ;
+				newblock  = (pms->samplesperblock * pms->blocks + offset) / pms->samplesperblock ;
+				newsample = (pms->samplesperblock * pms->blocks + offset) % pms->samplesperblock ;
+				break ;
+				
+		default : 
+				psf->error = SFE_BAD_SEEK ;
+				return	((long) -1) ;
+		} ;
+		
+	if (psf->mode == SF_MODE_READ)
+	{	fseek (psf->file, (int) (psf->dataoffset + newblock * pms->blocksize), SEEK_SET) ;
+		pms->blockcount  = newblock ;
+		msadpcm_decode_block (psf, pms) ;
+		pms->samplecount = newsample ;
+		}
+	else
+	{	/* What to do about write??? */ 
+		psf->error = SFE_BAD_SEEK ;
+		return	((long) -1) ;
+		} ;
+
+	psf->current = newblock * pms->samplesperblock + newsample ;
+	return psf->current ;
+} /* msadpcm_seek */
+
+/*==========================================================================================
+** MS ADPCM Write Functions.
+*/
+
+int	
+wav_msadpcm_writer_init (SF_PRIVATE *psf)
+{	MSADPCM_PRIVATE	*pms ;
+	unsigned int 	pmssize, blockalign, samplesperblock ;
+	
+	blockalign      = srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
+	samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+	
+	pmssize = sizeof (MSADPCM_PRIVATE) + blockalign + 3 * psf->sf.channels * samplesperblock ;
+
+	if (! (psf->fdata = malloc (pmssize)))
+		return SFE_MALLOC_FAILED ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	memset (pms, 0, pmssize) ;
+	
+	pms->channels        = psf->sf.channels ;
+	pms->blocksize       = blockalign ;
+	pms->samplesperblock = samplesperblock ;
+
+	pms->block   = (unsigned char*) pms->dummydata ;
+	pms->samples = (short*) (pms->dummydata + blockalign) ;
+	
+	pms->samplecount = 0 ;
+	
+	msadpcm_write_header (psf) ;
+	
+	psf->write_short  = (func_short)   msadpcm_write_s ;
+	psf->write_int    = (func_int)     msadpcm_write_i ;
+	psf->write_float  = (func_float)   msadpcm_write_f ;
+	psf->write_double = (func_double)  msadpcm_write_d ;
+	
+	psf->seek_func    = (func_seek)    msadpcm_seek ;
+	psf->close        = (func_close)   msadpcm_close ;
+	psf->write_header = (func_wr_hdr)  msadpcm_write_header ;
+
+	return 0 ;
+} /* wav_msadpcm_writer_init */
+
+/*==========================================================================================
+*/
+
+static int		
+msadpcm_encode_block (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms)
+{	unsigned int	blockindex ;
+	unsigned char	byte ;
+	int				chan, k, predict, bpred [2], idelta [2], errordelta, newsamp ;
+	
+	choose_predictor (pms->channels, pms->samples, bpred, idelta) ;
+
+	/* Write the block header. */
+
+	if (pms->channels == 1)
+	{	pms->block [0]	= bpred [0] ;	
+		pms->block [1]	= idelta [0] & 0xFF ;
+		pms->block [2]	= idelta [0] >> 8 ;
+		pms->block [3]	= pms->samples [1] & 0xFF ;
+		pms->block [4]	= pms->samples [1] >> 8 ;
+		pms->block [5]	= pms->samples [0] & 0xFF ;
+		pms->block [6]	= pms->samples [0] >> 8 ;
+
+		blockindex = 7 ;
+		byte = 0 ;
+
+		/* Encode the samples as 4 bit. */
+		
+		for (k = 2 ; k < pms->samplesperblock ; k++)
+		{	predict = (pms->samples [k-1] * AdaptCoeff1 [bpred [0]] + pms->samples [k-2] * AdaptCoeff2 [bpred [0]]) >> 8 ;
+			errordelta = (pms->samples [k] - predict) / idelta [0] ;
+			if (errordelta < -8)
+				errordelta = -8 ;
+			else if (errordelta > 7)
+				errordelta = 7 ;
+			newsamp = predict + (idelta [0] * errordelta) ;
+			if (newsamp > 32767)
+				newsamp = 32767 ;
+			else if (newsamp < -32768)
+				newsamp = -32768 ;
+			if (errordelta < 0)
+				errordelta += 0x10 ;
+				
+			byte = (byte << 4) | (errordelta & 0xF) ;
+			if (k % 2)
+			{	pms->block [blockindex++] = byte ;
+				byte = 0 ;
+				} ;
+
+			idelta [0] = (idelta [0] * AdaptationTable [errordelta]) >> 8 ;
+			if (idelta [0] < 16)
+				idelta [0] = 16 ;
+			pms->samples [k] = newsamp ;
+			} ;
+		}
+	else
+	{	/* Stereo file. */
+		pms->block [0]	= bpred [0] ;	
+		pms->block [1]	= bpred [1] ;	
+
+		pms->block [2]	= idelta [0] & 0xFF ;
+		pms->block [3]	= idelta [0] >> 8 ;
+		pms->block [4]	= idelta [1] & 0xFF ;
+		pms->block [5]	= idelta [1] >> 8 ;
+		
+		pms->block [6]	= pms->samples [2] & 0xFF ;
+		pms->block [7]	= pms->samples [2] >> 8 ;
+		pms->block [8]	= pms->samples [3] & 0xFF ;
+		pms->block [9]	= pms->samples [3] >> 8 ;
+
+		pms->block [10]	= pms->samples [0] & 0xFF ;
+		pms->block [11]	= pms->samples [0] >> 8 ;
+		pms->block [12]	= pms->samples [1] & 0xFF ;
+		pms->block [13]	= pms->samples [1] >> 8 ;
+	
+		blockindex = 14 ;
+		byte = 0 ;
+		chan = 1 ;
+		
+		for (k = 4 ; k < 2 * pms->samplesperblock ; k++)
+		{	chan = k & 1 ;
+
+			predict = (pms->samples [k-2] * AdaptCoeff1 [bpred [chan]] + pms->samples [k-4] * AdaptCoeff2 [bpred [chan]]) >> 8 ;
+			errordelta = (pms->samples [k] - predict) / idelta [chan] ;
+
+
+			if (errordelta < -8)
+				errordelta = -8 ;
+			else if (errordelta > 7)
+				errordelta = 7 ;
+			newsamp = predict + (idelta [chan] * errordelta) ;
+			if (newsamp > 32767)
+				newsamp = 32767 ;
+			else if (newsamp < -32768)
+				newsamp = -32768 ;
+			if (errordelta < 0)
+				errordelta += 0x10 ;
+				
+			byte = (byte << 4) | (errordelta & 0xF) ;
+
+			if (chan)
+			{	pms->block [blockindex++] = byte ;
+				byte = 0 ;
+				} ;
+
+			idelta [chan] = (idelta [chan] * AdaptationTable [errordelta]) >> 8 ;
+			if (idelta [chan] < 16)
+				idelta [chan] = 16 ;
+			pms->samples [k] = newsamp ;
+			} ;
+		} ;
+
+	/* Write the block to disk. */
+
+	if ((k = fwrite (pms->block, 1, pms->blocksize, psf->file)) != pms->blocksize)
+		psf_log_printf (psf, "*** Warning : short write (%d != %d).\n", k, pms->blocksize) ;
+		
+	memset (pms->samples, 0, pms->samplesperblock * sizeof (short)) ;
+
+	pms->blockcount ++ ;
+	pms->samplecount = 0 ;
+			
+	return 1 ;
+} /* msadpcm_encode_block */
+
+static int 
+msadpcm_write (SF_PRIVATE *psf, MSADPCM_PRIVATE *pms, short *ptr, int len)
+{	int		count, total = 0, index = 0 ;
+	
+	while (index < len)
+	{	count = (pms->samplesperblock - pms->samplecount) * pms->channels ;
+
+		if (count > len - index)
+			count = len - index ;
+
+		memcpy (&(pms->samples [pms->samplecount * pms->channels]), &(ptr [index]), count * sizeof (short)) ;
+		index += count ;
+		pms->samplecount += count / pms->channels ;
+		total = index ;
+
+		if (pms->samplecount >= pms->samplesperblock)
+			msadpcm_encode_block (psf, pms) ;	
+		} ;
+
+	return total ;		
+} /* msadpcm_write */
+
+static int		
+msadpcm_write_s (SF_PRIVATE *psf, short *ptr, int len)
+{	MSADPCM_PRIVATE *pms ; 
+	int				total ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	total = msadpcm_write (psf, pms, ptr, len) ;
+
+	return total ;
+} /* msadpcm_write_s */
+
+static int		
+msadpcm_write_i  (SF_PRIVATE *psf, int *ptr, int len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = (short) ptr [index+k] ;
+		count = msadpcm_write (psf, pms, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* msadpcm_write_i */
+
+static int
+msadpcm_write_f  (SF_PRIVATE *psf, float *ptr, int len)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	float		normfact ;
+	
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	normfact = (psf->norm_float == SF_TRUE) ? ((float) 0x8000) : 1.0 ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = FLOAT_TO_SHORT (normfact * ptr [index+k]) ;
+		count = msadpcm_write (psf, pms, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* msadpcm_write_f */
+
+static int		
+msadpcm_write_d  (SF_PRIVATE *psf, double *ptr, int len, int normalize)
+{	MSADPCM_PRIVATE *pms ; 
+	short		*sptr ;
+	int			k, bufferlen, writecount = 0, count ;
+	int			index = 0, total = 0 ;
+	double 		normfact ;
+	
+	normfact = (normalize ? ((double) 0x8000) : 1.0) ;
+
+	if (! psf->fdata)
+		return 0 ;
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+	
+	sptr = (short*) psf->buffer ;
+	bufferlen = ((SF_BUFFER_LEN / psf->blockwidth) * psf->blockwidth) / sizeof (short) ;
+	while (len > 0)
+	{	writecount = (len >= bufferlen) ? bufferlen : len ;
+		for (k = 0 ; k < writecount ; k++)
+			sptr [k] = DOUBLE_TO_SHORT (normfact * ptr [index+k]) ;
+		count = msadpcm_write (psf, pms, sptr, writecount) ;
+		index += writecount ;
+		total += count ;
+		len -= writecount ;
+		} ;
+	return total ;
+} /* msadpcm_write_d */
+
+/*========================================================================================
+*/
+
+static int
+msadpcm_write_header (SF_PRIVATE  *psf)
+{	int  k, fmt_size, blockalign, samplesperblock, bytespersec, extrabytes ;
+
+	blockalign      = srate2blocksize (psf->sf.samplerate * psf->sf.channels) ;	
+	samplesperblock = 2 + 2 * (blockalign - 7 * psf->sf.channels) / psf->sf.channels ;
+	bytespersec     = (psf->sf.samplerate * blockalign) / samplesperblock ;
+	
+	/* Reset the current header length to zero. */
+	psf->header [0] = 0 ;
+	psf->headindex = 0 ;
+	fseek (psf->file, 0, SEEK_SET) ;
+
+	/* RIFF marker, length, WAVE and 'fmt ' markers. */		
+	psf_binheader_writef (psf, "mlmm", RIFF_MARKER, psf->filelength - 8, WAVE_MARKER, fmt_MARKER) ;
+
+	/* fmt chunk. */
+	extrabytes = 2 + 2 + 7 * (2 + 2) ;
+	fmt_size   = 2 + 2 + 4 + 4 + 2 + 2 + 2 + extrabytes ;
+	
+	/* fmt : size, WAV format type, channels. */
+	psf_binheader_writef (psf, "lww", fmt_size, WAVE_FORMAT_MS_ADPCM, psf->sf.channels) ;
+
+	/* fmt : samplerate, bytespersec. */
+	psf_binheader_writef (psf, "ll", psf->sf.samplerate, bytespersec) ;
+
+	/* fmt : blockalign, bitwidth, extrabytes, samplesperblock. */
+	psf_binheader_writef (psf, "wwwww", blockalign, 4, extrabytes, samplesperblock, 7) ;
+	
+	for (k = 0 ; k < 7 ; k++)
+		psf_binheader_writef (psf, "ww", AdaptCoeff1 [k], AdaptCoeff2 [k]) ;
+
+	/* Fact chunk. */	
+	psf_binheader_writef (psf, "mll", fact_MARKER, sizeof (int), psf->sf.samples) ;
+
+	/* DATA chunk. */
+	psf_binheader_writef (psf, "ml", data_MARKER, psf->datalength) ;
+
+	fwrite (psf->header, psf->headindex, 1, psf->file) ;
+
+	psf->dataoffset = psf->headindex ;
+
+	psf->datalength  = (psf->sf.samples / samplesperblock) * samplesperblock ;
+	if (psf->sf.samples % samplesperblock)
+		psf->datalength += samplesperblock ;
+
+	return 0 ;
+} /* msadpcm_write_header */
+
+static int	
+msadpcm_close	(SF_PRIVATE  *psf)
+{	MSADPCM_PRIVATE *pms ; 
+
+	if (! psf->fdata)
+		return 0 ;
+
+	pms = (MSADPCM_PRIVATE*) psf->fdata ;
+
+	if (psf->mode == SF_MODE_WRITE)
+	{	/*  Now we know static int for certain the length of the file we can
+		**  re-write the header.
+		*/
+		 
+		if (pms->samplecount && pms->samplecount < pms->samplesperblock)
+			msadpcm_encode_block (psf, pms) ;	
+
+		fseek (psf->file, 0, SEEK_END) ;
+		psf->filelength = ftell (psf->file) ;
+
+		psf->sf.samples = pms->samplesperblock * pms->blockcount ;
+		psf->datalength = psf->filelength - psf->dataoffset ;
+
+		msadpcm_write_header (psf) ;
+		} ;
+
+	if (psf->fdata)
+		free (psf->fdata) ;
+	psf->fdata = NULL ;
+
+	return 0 ;
+} /* msadpcm_close */
+
+/*========================================================================================
+** Static functions.
+*/
+
+static	unsigned int 
+srate2blocksize (unsigned int srate_chan_product)
+{	if (srate_chan_product < 12000)
+		return 256 ;
+	if (srate_chan_product < 23000)
+		return 512 ;
+	if (srate_chan_product < 44000)
+		return 1024 ;
+	return 2048 ;
+} /* srate2blocksize */
+
+/*----------------------------------------------------------------------------------------
+**	Choosing the block predictor.
+**	Each block requires a predictor and an idelta for each channel. 
+**	The predictor is in the range [0..6] which is an index into the	two AdaptCoeff tables. 
+**	The predictor is chosen by trying all of the possible predictors on a small set of
+**	samples at the beginning of the block. The predictor with the smallest average
+**	abs (idelta) is chosen as the best predictor for this block. 
+**	The value of idelta is chosen to to give a 4 bit code value of +/- 4 (approx. half the 
+**	max. code value). If the average abs (idelta) is zero, the sixth predictor is chosen.
+**	If the value of idelta is less then 16 it is set to 16.
+**
+**	Microsoft uses an IDELTA_COUNT (number of sample pairs used to choose best predictor)
+**	value of 3. The best possible results would be obtained by using all the samples to
+**	choose the predictor.
+*/
+
+#define		IDELTA_COUNT	3
+
+static	void	
+choose_predictor (unsigned int channels, short *data, int *block_pred, int *idelta)
+{	unsigned int	chan, k, bpred, idelta_sum, best_bpred, best_idelta ;
+	
+	for (chan = 0 ; chan < channels; chan++)
+	{	best_bpred = best_idelta = 0 ;
+
+		for (bpred = 0 ; bpred < 7 ; bpred++)
+		{	idelta_sum = 0 ;
+			for (k = 2 ; k < 2 + IDELTA_COUNT ; k++)
+				idelta_sum += abs (data [k*channels] - ((data [(k-1)*channels] * AdaptCoeff1 [bpred] + data [(k-2)*channels] * AdaptCoeff2 [bpred]) >> 8)) ;
+			idelta_sum /= (4 * IDELTA_COUNT) ;
+			
+			if (bpred == 0 || idelta_sum < best_idelta)
+			{	best_bpred = bpred ;
+				best_idelta = idelta_sum ;
+				} ;
+				
+			if (! idelta_sum)
+			{	best_bpred = bpred ;
+				best_idelta = 16 ;
+				break ;
+				} ;
+		
+			} ; /* for bpred ... */
+		if (best_idelta < 16)
+			best_idelta = 16 ;
+	
+		block_pred [chan] = best_bpred ;
+		idelta [chan]     = best_idelta ;
+		} ;
+
+	return ;
+} /* choose_predictor */
--- /dev/null
+++ b/frontend/faad.dsp
@@ -1,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="faad" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=faad - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "faad.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "faad.mak" CFG="faad - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "faad - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "faad - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=xicl6.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "faad - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../include" /I "../common/faad" /I "../common/libsndfile/src" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x413 /d "NDEBUG"
+# ADD RSC /l 0x413 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=xilink6.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /profile /machine:I386
+
+!ELSEIF  "$(CFG)" == "faad - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../include" /I "../common/faad" /I "../common/libsndfile/src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x413 /d "_DEBUG"
+# ADD RSC /l 0x413 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=xilink6.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "faad - Win32 Release"
+# Name "faad - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\faad\getopt.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\main.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\include\faad.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\faad\getopt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libsndfile\src\sndfile.h
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null
+++ b/frontend/faad.dsw
@@ -1,0 +1,59 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "faad"=.\faad.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name libfaad
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name libsndfile
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libfaad"=..\libfaad\libfaad.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libsndfile"=..\common\libsndfile\Win32\libsndfile.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+++ b/frontend/main.c
@@ -1,0 +1,470 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: main.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifdef _WIN32
+    #define WIN32_LEAN_AND_MEAN
+    #include <windows.h>
+#else
+    #include <time.h>
+#endif
+
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include <faad.h>
+#include <sndfile.h>
+
+#ifndef min
+#define min(a,b) ( (a) < (b) ? (a) : (b) )
+#endif
+
+#define MAX_CHANNELS 6 /* make this higher to support files with
+                          more channels */
+
+/* FAAD file buffering routines */
+/* declare buffering variables */
+#define DEC_BUFF_VARS \
+    int fileread, tagsize, bytesconsumed, k; \
+    int buffercount = 0, buffer_index = 0; \
+    unsigned char *buffer;
+
+/* initialise buffering */
+#define INIT_BUFF(file) \
+    fseek(file, 0, SEEK_END); \
+    fileread = ftell(file); \
+    fseek(file, 0, SEEK_SET); \
+    buffer = (unsigned char*)malloc(FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \
+    memset(buffer, 0, FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \
+    fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, file);
+
+/* skip bytes in buffer */
+#define UPDATE_BUFF_SKIP(bytes) \
+    fseek(infile, bytes, SEEK_SET); \
+    buffer_index += bytes; \
+    buffercount = 0; \
+    fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, infile);
+
+/* update buffer */
+#define UPDATE_BUFF_READ \
+    if (bytesconsumed > 0) { \
+        for (k = 0; k < (FAAD_MIN_STREAMSIZE*MAX_CHANNELS - bytesconsumed); k++) \
+            buffer[k] = buffer[k + bytesconsumed]; \
+        fread(buffer + (FAAD_MIN_STREAMSIZE*MAX_CHANNELS) - bytesconsumed, 1, bytesconsumed, infile); \
+        bytesconsumed = 0; \
+    }
+
+/* update buffer indices after faacDecDecode */
+#define UPDATE_BUFF_IDX(frame) \
+    bytesconsumed += frame.bytesconsumed; \
+    buffer_index += frame.bytesconsumed;
+
+/* true if decoding has to stop because of EOF */
+#define IS_FILE_END buffer_index >= fileread
+
+/* end buffering */
+#define END_BUFF if (buffer) free(buffer);
+
+
+
+/* globals */
+char *progName;
+
+int id3v2_tag(unsigned char *buffer)
+{
+    if (strncmp(buffer, "ID3", 3) == 0) {
+        unsigned long tagsize;
+
+        /* high bit is not used */
+        tagsize = (buffer[6] << 21) | (buffer[7] << 14) |
+            (buffer[8] <<  7) | (buffer[9] <<  0);
+
+        tagsize += 10;
+
+        return tagsize;
+    } else {
+        return 0;
+    }
+}
+
+char *file_ext[] =
+{
+    NULL,
+    ".wav",
+    ".aif",
+    ".au",
+    ".au",
+    ".pcm",
+    NULL
+};
+
+void usage(void)
+{
+    fprintf(stderr, "\nUsage:\n");
+    fprintf(stderr, "%s [options] infile.aac\n", progName);
+    fprintf(stderr, "Options:\n");
+    fprintf(stderr, " -h    Shows this help screen.\n");
+    fprintf(stderr, " -o X  Set output filename.\n");
+    fprintf(stderr, " -f X  Set output format. Valid values for X are:\n");
+    fprintf(stderr, "        1:  Microsoft WAV format (default).\n");
+    fprintf(stderr, "        2:  Apple/SGI AIFF format.\n");
+    fprintf(stderr, "        3:  Sun/NeXT AU format.\n");
+    fprintf(stderr, "        4:  DEC AU format.\n");
+    fprintf(stderr, "        5:  RAW PCM data.\n");
+    fprintf(stderr, " -b X  Set output sample format. Valid values for X are:\n");
+    fprintf(stderr, "        1:  16 bit PCM data (default).\n");
+    fprintf(stderr, "        2:  24 bit PCM data.\n");
+    fprintf(stderr, "        3:  32 bit PCM data.\n");
+    fprintf(stderr, "        4:  32 bit floats.\n");
+    fprintf(stderr, " -s X  Force the samplerate to X (for RAW files).\n");
+    fprintf(stderr, " -l    Use Long Term Prediction (for RAW files).\n");
+    fprintf(stderr, " -w    Write output to stdio instead of a file.\n");
+    fprintf(stderr, "Example:\n");
+    fprintf(stderr, "       faad -o aac infile.aac\n");
+    return;
+}
+
+
+int main(int argc, char *argv[])
+{
+    void *sample_buffer;
+    int writeToStdio = 0;
+    int def_sr_set = 0;
+    int use_ltp = 0;
+    int def_srate;
+    unsigned long samplerate, channels;
+    int format = 1;
+    int outputFormat = FAAD_FMT_16BIT;
+    int outfile_set = 0;
+    int showHelp = 0;
+    char *fnp;
+    char aacFileName[255];
+    char audioFileName[255];
+
+    SNDFILE *sndfile = NULL;
+    SF_INFO sfinfo;
+
+    FILE *infile;
+
+    faacDecHandle hDecoder;
+    faacDecFrameInfo frameInfo;
+    faacDecConfigurationPtr config;
+
+    char percents[200];
+    int percent, old_percent = -1;
+
+    int first_time = 1;
+
+/* System dependant types */
+#ifdef _WIN32
+    long begin, end;
+#else
+    clock_t begin;
+#endif
+
+    /* declare variables for buffering */
+    DEC_BUFF_VARS
+
+    fprintf(stderr, "FAAD (Freeware AAC Decoder) Compiled on: " __DATE__ "\n");
+    fprintf(stderr, "Copyright:   M. Bakker\n");
+    fprintf(stderr, "             http://www.audiocoding.com\n\n");
+
+    /* begin process command line */
+    progName = argv[0];
+    while (1) {
+        int c = -1;
+        int option_index = 0;
+        static struct option long_options[] = {
+            { "outfile",    0, 0, 'o' },
+            { "format",     0, 0, 'f' },
+            { "bits",       0, 0, 'b' },
+            { "samplerate", 0, 0, 's' },
+            { "ltp",        0, 0, 'l' },
+            { "stdio",      0, 0, 'w' },
+            { "help",       0, 0, 'h' }
+        };
+
+        c = getopt_long(argc, argv, "o:s:f:b:lwh",
+            long_options, &option_index);
+
+        if (c == -1)
+            break;
+
+        switch (c) {
+        case 'o':
+            if (optarg) {
+                char dr[255];
+                if (sscanf(optarg, "%s", dr) < 1) {
+                    outfile_set = 0;
+                } else {
+                    outfile_set = 1;
+                    strcpy(audioFileName, dr);
+                }
+            }
+            break;
+        case 's':
+            if (optarg) {
+                char dr[10];
+                if (sscanf(optarg, "%s", dr) < 1) {
+                    def_sr_set = 0;
+                } else {
+                    def_sr_set = 1;
+                    def_srate = atoi(dr);
+                }
+            }
+            break;
+        case 'f':
+            if (optarg) {
+                char dr[10];
+                if (sscanf(optarg, "%s", dr) < 1) {
+                    format = 1;
+                } else {
+                    format = atoi(dr);
+                    if ((format < 1) || (format > 5))
+                        showHelp = 1;
+                }
+            }
+            break;
+        case 'b':
+            if (optarg) {
+                char dr[10];
+                if (sscanf(optarg, "%s", dr) < 1) {
+                    outputFormat = FAAD_FMT_16BIT; /* just use default */
+                } else {
+                    outputFormat = atoi(dr);
+                    if ((outputFormat < 1) || (outputFormat > 4))
+                        showHelp = 1;
+                }
+            }
+            break;
+        case 'l':
+            use_ltp = 1;
+            break;
+        case 'w':
+            writeToStdio = 1;
+            break;
+        case 'h':
+            showHelp = 1;
+            break;
+        default:
+            break;
+        }
+    }
+
+    /* check that we have at least two non-option arguments */
+    /* Print help if requested */
+    if (((argc - optind) < 1) || showHelp)
+    {
+        usage();
+        return 1;
+    }
+
+    /* point to the specified file name */
+    strcpy(aacFileName, argv[optind]);
+
+#ifdef _WIN32
+    begin = GetTickCount();
+#else
+    begin = clock();
+#endif
+
+    infile = fopen(aacFileName, "rb");
+    if (infile == NULL)
+    {
+        /* unable to open file */
+        fprintf(stderr, "Error opening file: %s\n", aacFileName);
+        return 1;
+    }
+    INIT_BUFF(infile)
+
+    tagsize = id3v2_tag(buffer);
+    if (tagsize) {
+        UPDATE_BUFF_SKIP(tagsize)
+    }
+
+    hDecoder = faacDecOpen();
+
+    /* Set the default object type and samplerate */
+    /* This is useful for RAW AAC files */
+    config = faacDecGetCurrentConfiguration(hDecoder);
+    if (def_sr_set)
+        config->defSampleRate = def_srate;
+    if (use_ltp)
+        config->defObjectType = LTP;
+    config->outputFormat = outputFormat;
+
+    faacDecSetConfiguration(hDecoder, config);
+
+    if((bytesconsumed = faacDecInit(hDecoder, buffer, &samplerate,
+        &channels)) < 0)
+    {
+        /* If some error initializing occured, skip the file */
+        fprintf(stderr, "Error initializing decoder library.\n");
+        END_BUFF
+        faacDecClose(hDecoder);
+        fclose(infile);
+        return 1;
+    }
+
+    /* update buffer */
+    UPDATE_BUFF_READ
+
+
+    /* Only calculate the path and open the file for writing if
+       we are not writing to stdout.
+     */
+    if(!writeToStdio && !outfile_set)
+    {
+        strcpy(audioFileName, aacFileName);
+
+        fnp = (char *)strrchr(audioFileName,'.');
+
+        if (fnp)
+            fnp[0] = '\0';
+
+        strcat(audioFileName, file_ext[format]);
+    }
+
+
+    do
+    {
+        /* update buffer */
+        UPDATE_BUFF_READ
+
+        sample_buffer = faacDecDecode(hDecoder, &frameInfo, buffer);
+
+        /* update buffer indices */
+        UPDATE_BUFF_IDX(frameInfo)
+
+        if (frameInfo.error > 0)
+        {
+            fprintf(stderr, "Error: %s\n",
+                faacDecGetErrorMessage(frameInfo.error));
+        }
+
+        percent = min((int)(buffer_index*100)/fileread, 100);
+        if (percent > old_percent)
+        {
+            old_percent = percent;
+            sprintf(percents, "%d%% decoding %s.", percent, aacFileName);
+            fprintf(stderr, "%s\r", percents);
+#ifdef _WIN32
+            SetConsoleTitle(percents);
+#endif
+        }
+
+        /* open the sound file now that the number of channels are known */
+        if (first_time && !frameInfo.error)
+        {
+            sfinfo.samplerate  = samplerate;
+            switch (outputFormat)
+            {
+            case FAAD_FMT_16BIT:
+                sfinfo.pcmbitwidth = 16;
+                sfinfo.format      = ((1<<(format+15)) | SF_FORMAT_PCM);
+                break;
+            case FAAD_FMT_24BIT:
+                sfinfo.pcmbitwidth = 24;
+                sfinfo.format      = ((1<<(format+15)) | SF_FORMAT_PCM);
+                break;
+            case FAAD_FMT_32BIT:
+                sfinfo.pcmbitwidth = 32;
+                sfinfo.format      = ((1<<(format+15)) | SF_FORMAT_PCM);
+                break;
+            case FAAD_FMT_FLOAT:
+                sfinfo.pcmbitwidth = 32;
+                sfinfo.format      = ((1<<(format+15)) | SF_FORMAT_FLOAT);
+                break;
+            }
+            sfinfo.channels = frameInfo.channels;
+            sfinfo.samples  = 0;
+            if(!writeToStdio)
+            {
+                sndfile = sf_open_write(audioFileName, &sfinfo);
+            } else {
+                setmode(fileno(stdout), O_BINARY);
+                sndfile = sf_open_write("-", &sfinfo);
+            }
+
+            if (sndfile == NULL)
+            {
+                sf_perror(NULL);
+                END_BUFF
+                faacDecClose(hDecoder);
+                fclose(infile);
+                return 1;
+            }
+
+            first_time = 0;
+        }
+
+        if ((frameInfo.error == 0) && (frameInfo.samples > 0))
+        {
+            switch (outputFormat)
+            {
+            case FAAD_FMT_16BIT:
+                sf_write_short(sndfile, (short*)sample_buffer, frameInfo.samples);
+                break;
+            case FAAD_FMT_24BIT:
+            case FAAD_FMT_32BIT:
+                sf_write_int(sndfile, (int*)sample_buffer, frameInfo.samples);
+                break;
+            case FAAD_FMT_FLOAT:
+                sf_write_float(sndfile, (float*)sample_buffer, frameInfo.samples);
+                break;
+            }
+        }
+
+        if (IS_FILE_END)
+            sample_buffer = NULL; /* to make sure it stops now */
+
+    } while (sample_buffer != NULL);
+
+
+    faacDecClose(hDecoder);
+
+    fclose(infile);
+
+    if (sndfile)
+        sf_close(sndfile);
+
+    if (!frameInfo.error)
+    {
+#ifdef _WIN32
+        end = GetTickCount();
+        fprintf(stderr, "Decoding %s took: %d sec.\n", aacFileName,
+            (end-begin)/1000);
+        SetConsoleTitle("FAAD");
+#else
+        /* clock() grabs time since the start of the app but when we decode
+           multiple files, each file has its own starttime (begin).
+         */
+        fprintf(stderr, "Decoding %s took: %5.2f sec.\n", aacFileName,
+            (float)(clock() - begin)/(float)CLOCKS_PER_SEC);
+#endif
+    }
+
+    END_BUFF
+
+    return 0;
+}
--- /dev/null
+++ b/include/faad.h
@@ -1,0 +1,102 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: faad.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __AACDEC_H__
+#define __AACDEC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#ifdef _WIN32
+  #pragma pack(push, 8)
+  #ifndef FAADAPI
+    #define FAADAPI __stdcall
+  #endif
+#else
+  #ifndef FAADAPI
+    #define FAADAPI
+  #endif
+#endif
+
+
+#define MAIN 0
+#define LC   1
+#define SSR  2
+#define LTP  3
+
+#define FAAD_FMT_16BIT 1
+#define FAAD_FMT_24BIT 2
+#define FAAD_FMT_32BIT 3
+#define FAAD_FMT_FLOAT 4
+
+/* A decode call can eat up to FAAD_MIN_STREAMSIZE octets per decoded channel,
+   so at least so much octets per channel should be available in this stream */
+#define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */
+
+
+typedef void *faacDecHandle;
+typedef void *faacProgConfig;
+
+typedef struct faacDecConfiguration
+{
+    short defObjectType;
+    unsigned long defSampleRate;
+    unsigned long outputFormat;
+} faacDecConfiguration, *faacDecConfigurationPtr;
+
+typedef struct faacDecFrameInfo
+{
+    int bytesconsumed;
+    int samples;
+    int channels;
+    int error;
+} faacDecFrameInfo;
+
+char* FAADAPI faacDecGetErrorMessage(int errcode);
+
+faacDecHandle FAADAPI faacDecOpen();
+
+faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder);
+
+int FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
+                                    faacDecConfigurationPtr config);
+
+int FAADAPI faacDecInit(faacDecHandle hDecoder,
+                        unsigned char *buffer,
+                        unsigned long *samplerate,
+                        unsigned long *channels);
+
+void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
+                            faacDecFrameInfo *hInfo,
+                            unsigned char *buffer);
+
+void FAADAPI faacDecClose(faacDecHandle hDecoder);
+
+#ifdef _WIN32
+  #pragma pack(pop)
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
--- /dev/null
+++ b/libfaad/bits.c
@@ -1,0 +1,49 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: bits.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#include "bits.h"
+
+/* initialize buffer, call once before first getbits or showbits */
+void faad_initbits(bitfile *ld, unsigned char *buffer)
+{
+    ld->incnt = 0;
+    ld->framebits = 0;
+    ld->bitcnt = 0;
+    ld->rdptr = buffer;
+}
+
+int faad_get_processed_bits(bitfile *ld)
+{
+    return (ld->framebits);
+}
+
+unsigned int faad_byte_align(bitfile *ld)
+{
+    int i = 0;
+
+    while (ld->framebits%8 != 0)
+    {
+        faad_get1bit(ld);
+        i++;
+    }
+
+    return(i);
+}
--- /dev/null
+++ b/libfaad/bits.h
@@ -1,0 +1,139 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: bits.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __BITS_H__
+#define __BITS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BYTE_NUMBIT 8
+#define bit2byte(a) ((a)/BYTE_NUMBIT)
+
+/* to mask the n least significant bits of an integer */
+static unsigned int msk[33] =
+{
+    0x00000000, 0x00000001, 0x00000003, 0x00000007,
+    0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
+    0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
+    0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
+    0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
+    0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
+    0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
+    0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+    0xffffffff
+};
+
+typedef struct _bitfile
+{
+    /* bit input */
+    unsigned char *rdptr;
+    int incnt;
+    int bitcnt;
+    int framebits;
+} bitfile;
+
+
+#if defined(LINUX) && defined(ARM__)
+#define bits_inline
+#define _SWAP(a,b) { register unsigned int temp; \
+	b = *(int*)(a); \
+	__asm__ ( " EOR %0, %1, %2, ROR #16" : "=r" (temp) : "r" (b), "r" (b)); \
+	__asm__ ( " BIC %0, %1, #0x00FF0000" : "=r" (temp) : "r" (temp)); \
+	__asm__ ( " MOV %0, %1, ROR #8"      : "=r" (b) : "r" (b)); \
+	__asm__ ( " EOR %0, %1, %2, LSR #8"  : "=r" (b) : "r" (b), "r" (temp)); \
+	}
+#elif defined(LINUX)
+#define bits_inline inline
+#define _SWAP(a,b)	\
+	b=*(int*)a; \
+	__asm__ ( "bswapl %0\n" : "=r" (b) : "0" (b) )
+#elif defined(WIN32)
+#define bits_inline __inline
+#define _SWAP(a,b) \
+	{	\
+	register unsigned int * c = &b;	\
+	b=*(int*)a; __asm mov ecx, c __asm mov eax, [ecx] __asm bswap eax __asm mov [ecx], eax	\
+	}
+#else
+#define bits_inline
+#define _SWAP(a,b) (b=((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]))
+#endif
+
+
+void faad_initbits(bitfile *ld, unsigned char *buffer);
+unsigned int faad_byte_align(bitfile *ld);
+int faad_get_processed_bits(bitfile *ld);
+
+
+static bits_inline unsigned int faad_showbits(bitfile *ld, int n)
+{
+    unsigned char *v = ld->rdptr;
+    int rbit = 32 - ld->bitcnt;
+    unsigned int b;
+
+    _SWAP(v, b);
+    return ((b & msk[rbit]) >> (rbit-n));
+}
+
+static bits_inline void faad_flushbits(bitfile *ld, int n)
+{
+    ld->bitcnt += n;
+
+    if (ld->bitcnt >= 8)
+    {
+        ld->rdptr += (ld->bitcnt>>3);
+        ld->bitcnt &= 7;
+    }
+
+    ld->framebits += n;
+}
+
+/* return next n bits (right adjusted) */
+static bits_inline unsigned int faad_getbits(bitfile *ld, int n)
+{
+    long l;
+
+    l = faad_showbits(ld, n);
+    faad_flushbits(ld, n);
+
+    return l;
+}
+
+static bits_inline unsigned int faad_get1bit(bitfile *ld)
+{
+    unsigned char l;
+
+    l = *ld->rdptr << ld->bitcnt;
+
+    ld->bitcnt++;
+    ld->framebits++;
+    ld->rdptr += (ld->bitcnt>>3);
+    ld->bitcnt &= 7;
+
+    return l>>7;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/data.c
@@ -1,0 +1,170 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: data.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#include "data.h"
+
+extern short num_swb_long_window[] =
+{
+    41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
+};
+
+extern short num_swb_short_window[] =
+{
+    12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
+};
+
+static short swb_offset_long_96[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
+    64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240,
+    276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024
+};
+
+static short swb_offset_short_96[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
+};
+
+static short swb_offset_long_64[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
+    64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
+    304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824,
+    864, 904, 944, 984, 1024
+};
+
+static short swb_offset_short_64[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
+};
+
+
+static short swb_offset_long_48[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
+    80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
+    320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736,
+    768, 800, 832, 864, 896, 928, 1024
+};
+
+static short swb_offset_short_48[] =
+{
+    0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
+};
+
+static short swb_offset_long_32[] =
+{
+    0, 4,  8,  12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
+    80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
+    320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736,
+    768, 800, 832, 864, 896, 928, 960, 992, 1024
+};
+
+static short swb_offset_long_24[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
+    76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220,
+    240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704,
+    768, 832, 896, 960, 1024
+};
+
+static short swb_offset_short_24[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
+};
+
+static short swb_offset_long_16[] =
+{
+    0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
+    136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
+    368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024
+};
+
+static short swb_offset_short_16[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
+};
+
+static short swb_offset_long_8[] =
+{
+    0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172,
+    188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
+    476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
+};
+
+static short swb_offset_short_8[] =
+{
+    0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
+};
+
+extern short *swb_offset_long_window[] =
+{
+    swb_offset_long_96,      /* 96000 */
+    swb_offset_long_96,      /* 88200 */
+    swb_offset_long_64,      /* 64000 */
+    swb_offset_long_48,      /* 48000 */
+    swb_offset_long_48,      /* 44100 */
+    swb_offset_long_32,      /* 32000 */
+    swb_offset_long_24,      /* 24000 */
+    swb_offset_long_24,      /* 22050 */
+    swb_offset_long_16,      /* 16000 */
+    swb_offset_long_16,      /* 12000 */
+    swb_offset_long_16,      /* 11025 */
+    swb_offset_long_8        /* 8000  */
+};
+
+extern short *swb_offset_short_window[] =
+{
+    swb_offset_short_96,      /* 96000 */
+    swb_offset_short_96,      /* 88200 */
+    swb_offset_short_64,      /* 64000 */
+    swb_offset_short_48,      /* 48000 */
+    swb_offset_short_48,      /* 44100 */
+    swb_offset_short_48,      /* 32000 */
+    swb_offset_short_24,      /* 24000 */
+    swb_offset_short_24,      /* 22050 */
+    swb_offset_short_16,      /* 16000 */
+    swb_offset_short_16,      /* 12000 */
+    swb_offset_short_16,      /* 11025 */
+    swb_offset_short_8        /* 8000  */
+};
+
+extern short pred_sfb_max[] =
+{
+    33,     /* 96000 */
+    33,     /* 88200 */
+    38,     /* 64000 */
+    40,     /* 48000 */
+    40,     /* 44100 */
+    40,     /* 32000 */
+    41,     /* 24000 */
+    41,     /* 22050 */
+    37,     /* 16000 */
+    37,     /* 12000 */
+    37,     /* 11025 */
+    34      /* 8000  */
+};
+
+extern unsigned long sample_rates[] =
+{
+    96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000,
+    12000, 11025, 8000
+};
\ No newline at end of file
--- /dev/null
+++ b/libfaad/data.h
@@ -1,0 +1,39 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: data.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __DATA_H__
+#define __DATA_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern short num_swb_long_window[];
+extern short num_swb_short_window[];
+extern short *swb_offset_long_window[];
+extern short *swb_offset_short_window[];
+extern short pred_sfb_max[];
+extern unsigned long sample_rates[];
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/decoder.c
@@ -1,0 +1,489 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: decoder.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#include <stdlib.h>
+#include <memory.h>
+#include "decoder.h"
+#include "syntax.h"
+#include "specrec.h"
+#include "data.h"
+#include "tns.h"
+#include "pns.h"
+#include "is.h"
+#include "ms.h"
+#include "ic_predict.h"
+#include "lt_predict.h"
+#include "drc.h"
+#include "error.h"
+#include "output.h"
+
+
+char* FAADAPI faacDecGetErrorMessage(int errcode)
+{
+    return err_msg[errcode];
+}
+
+faacDecHandle FAADAPI faacDecOpen()
+{
+    int i;
+    faacDecHandle hDecoder = NULL;
+
+    if ((hDecoder = (faacDecHandle)malloc(sizeof(faacDecStruct))) == NULL)
+        return NULL;
+
+    memset(hDecoder, 0, sizeof(faacDecStruct));
+
+    hDecoder->config.outputFormat  = FAAD_FMT_16BIT;
+    hDecoder->config.defObjectType = MAIN;
+    hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */
+    hDecoder->adts_header_present = 0;
+    hDecoder->adif_header_present = 0;
+
+    hDecoder->frame = 0;
+    hDecoder->sample_buffer = NULL;
+
+    for (i = 0; i < MAX_CHANNELS; i++)
+    {
+        hDecoder->window_shape_prev[i] = 0;
+        hDecoder->time_state[i] = NULL;
+        hDecoder->time_out[i] = NULL;
+        hDecoder->pred_stat[i] = NULL;
+        hDecoder->lt_pred_stat[i] = NULL;
+    }
+
+    init_drc(&hDecoder->drc, 1.0f, 1.0f);
+    filter_bank_init(&hDecoder->fb);
+#if IQ_TABLE_SIZE && POW_TABLE_SIZE
+    build_tables(hDecoder->iq_table, hDecoder->pow2_table);
+#elif !IQ_TABLE_SIZE && POW_TABLE_SIZE
+    build_tables(NULL, hDecoder->pow2_table);
+#elif IQ_TABLE_SIZE && !POW_TABLE_SIZE
+    build_tables(hDecoder->iq_table, NULL);
+#endif
+
+    return hDecoder;
+}
+
+faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder)
+{
+    faacDecConfigurationPtr config = &(hDecoder->config);
+
+    return config;
+}
+
+int FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
+                                    faacDecConfigurationPtr config)
+{
+    hDecoder->config.defObjectType = config->defObjectType;
+    hDecoder->config.defSampleRate = config->defSampleRate;
+    hDecoder->config.outputFormat  = config->outputFormat;
+
+    /* OK */
+    return 1;
+}
+
+/* Returns the sample rate index */
+static int get_sr_index(unsigned long samplerate)
+{
+    if (92017 <= samplerate) return 0;
+    if (75132 <= samplerate) return 1;
+    if (55426 <= samplerate) return 2;
+    if (46009 <= samplerate) return 3;
+    if (37566 <= samplerate) return 4;
+    if (27713 <= samplerate) return 5;
+    if (23004 <= samplerate) return 6;
+    if (18783 <= samplerate) return 7;
+    if (13856 <= samplerate) return 8;
+    if (11502 <= samplerate) return 9;
+    if (9391 <= samplerate) return 10;
+
+    return 11;
+}
+
+int FAADAPI faacDecInit(faacDecHandle hDecoder, unsigned char *buffer,
+                        unsigned long *samplerate, unsigned long *channels)
+{
+    bitfile ld;
+    adif_header adif;
+    adts_header adts;
+
+    hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate);
+    hDecoder->object_type = hDecoder->config.defObjectType;
+
+    faad_initbits(&ld, buffer);
+
+    /* Check if an ADIF header is present */
+    if ((buffer[0] == 'A') && (buffer[1] == 'D') &&
+        (buffer[2] == 'I') && (buffer[3] == 'F'))
+    {
+        hDecoder->adif_header_present = 1;
+
+        get_adif_header(&adif, &ld);
+
+        hDecoder->sf_index = adif.pce.sf_index;
+        hDecoder->object_type = adif.pce.object_type;
+
+        *samplerate = sample_rates[hDecoder->sf_index];
+        *channels = adif.pce.channels;
+
+        return bit2byte(faad_get_processed_bits(&ld));
+
+    /* Check if an ADTS header is present */
+    } else if (faad_showbits(&ld, 12) == 0xfff) {
+        hDecoder->adts_header_present = 1;
+
+        adts_frame(&adts, &ld);
+
+        hDecoder->sf_index = adts.sf_index;
+        hDecoder->object_type = adts.profile;
+
+        *samplerate = sample_rates[hDecoder->sf_index];
+        *channels = (adts.channel_configuration > 6) ?
+            2 : adts.channel_configuration;
+
+        return 0;
+    }
+
+    *samplerate = sample_rates[hDecoder->sf_index];
+    *channels = 2;
+
+    return 0;
+}
+
+void FAADAPI faacDecClose(faacDecHandle hDecoder)
+{
+    int i;
+
+    for (i = 0; i < MAX_CHANNELS; i++)
+    {
+        if (hDecoder->time_state[i]) free(hDecoder->time_state[i]);
+        if (hDecoder->time_out[i]) free(hDecoder->time_out[i]);
+        if (hDecoder->pred_stat[i]) free(hDecoder->pred_stat[i]);
+        if (hDecoder->lt_pred_stat[i]) free(hDecoder->lt_pred_stat[i]);
+    }
+
+    filter_bank_end(&hDecoder->fb);
+
+    if (hDecoder->sample_buffer) free(hDecoder->sample_buffer);
+
+    if (hDecoder) free(hDecoder);
+}
+
+void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
+                            faacDecFrameInfo *hInfo,
+                            unsigned char *buffer)
+{
+    int id_syn_ele, ele, ch, i;
+    adts_header adts;
+    int channels, ch_ele;
+    bitfile *ld = malloc(sizeof(bitfile));
+
+    /* local copys of globals */
+    int sf_index           =  hDecoder->sf_index;
+    int object_type        =  hDecoder->object_type;
+    pred_state **pred_stat =  hDecoder->pred_stat;
+    float **lt_pred_stat   =  hDecoder->lt_pred_stat;
+#if IQ_TABLE_SIZE
+    float *iq_table        =  hDecoder->iq_table;
+#else
+    float *iq_table        =  NULL;
+#endif
+#if POW_TABLE_SIZE
+    float *pow2_table      =  hDecoder->pow2_table;
+#else
+    float *pow2_table      =  NULL;
+#endif
+    int *window_shape_prev =  hDecoder->window_shape_prev;
+    float **time_state     =  hDecoder->time_state;
+    float **time_out       =  hDecoder->time_out;
+    fb_info *fb            = &hDecoder->fb;
+    drc_info *drc          = &hDecoder->drc;
+    int outputFormat       =  hDecoder->config.outputFormat;
+
+    program_config pce;
+    element *syntax_elements[MAX_SYNTAX_ELEMENTS];
+    short *spec_data[MAX_CHANNELS];
+    float *spec_coef[MAX_CHANNELS];
+
+    void *sample_buffer;
+
+    memset(hInfo, 0, sizeof(faacDecFrameInfo));
+
+    /* initialize the bitstream */
+    faad_initbits(ld, buffer);
+
+    if (hDecoder->adts_header_present)
+    {
+        if ((hInfo->error = adts_frame(&adts, ld)) > 0)
+            return NULL;
+
+        /* MPEG2 does byte_alignment() here,
+         * but ADTS header is always multiple of 8 bits in MPEG2
+         * so not needed to actually do it.
+         */
+    }
+
+    ele = 0;
+    channels = 0;
+    ch_ele = 0;
+
+    /* Table 4.4.3: raw_data_block() */
+    while ((id_syn_ele = faad_getbits(ld, LEN_SE_ID)) != ID_END)
+    {
+        switch (id_syn_ele) {
+        case ID_SCE:
+        case ID_LFE:
+            spec_data[channels]   = (short*)malloc(1024*sizeof(short));
+            spec_coef[channels]   = (float*)malloc(1024*sizeof(float));
+
+            syntax_elements[ch_ele] = (element*)malloc(sizeof(element));
+            memset(syntax_elements[ch_ele], 0, sizeof(element));
+            syntax_elements[ch_ele]->ele_id  = id_syn_ele;
+            syntax_elements[ch_ele]->channel = channels;
+
+            if ((hInfo->error = single_lfe_channel_element(syntax_elements[ch_ele],
+                ld, spec_data[channels], sf_index, object_type)) > 0)
+                return NULL;
+
+            channels++;
+            ch_ele++;
+            break;
+        case ID_CPE:
+            spec_data[channels]   = (short*)malloc(1024*sizeof(short));
+            spec_data[channels+1] = (short*)malloc(1024*sizeof(short));
+            spec_coef[channels]   = (float*)malloc(1024*sizeof(float));
+            spec_coef[channels+1] = (float*)malloc(1024*sizeof(float));
+
+            syntax_elements[ch_ele] = (element*)malloc(sizeof(element));
+            memset(syntax_elements[ch_ele], 0, sizeof(element));
+            syntax_elements[ch_ele]->ele_id         = id_syn_ele;
+            syntax_elements[ch_ele]->channel        = channels;
+            syntax_elements[ch_ele]->paired_channel = channels+1;
+
+            if ((hInfo->error = channel_pair_element(syntax_elements[ch_ele],
+                ld, spec_data[channels], spec_data[channels+1],
+                sf_index, object_type)) > 0)
+                return NULL;
+
+            channels += 2;
+            ch_ele++;
+            break;
+        case ID_CCE: /* not implemented yet */
+            hInfo->error = 6;
+            return NULL;
+            break;
+        case ID_DSE:
+            data_stream_element(ld);
+            break;
+        case ID_PCE:
+            if ((hInfo->error = program_config_element(&pce, ld)) > 0)
+                return NULL;
+            break;
+        case ID_FIL:
+            if ((hInfo->error = fill_element(ld, drc)) > 0)
+                return NULL;
+            break;
+        }
+        ele++;
+    }
+    /* no more bit reading after this */
+    faad_byte_align(ld);
+    hInfo->bytesconsumed = bit2byte(faad_get_processed_bits(ld));
+    if (ld) free(ld);
+
+    /* number of samples in this frame */
+    hInfo->samples = 1024*channels;
+    /* number of samples in this frame */
+    hInfo->channels = channels;
+
+    if (hDecoder->sample_buffer == NULL)
+        hDecoder->sample_buffer = malloc(1024*channels*sizeof(float));
+
+    sample_buffer = hDecoder->sample_buffer;
+
+    /* noiseless coding is done, the rest of the tools come now */
+    for (ch = 0; ch < channels; ch++)
+    {
+        ic_stream *ics;
+
+        /* find the syntax element to which this channel belongs */
+        for (i = 0; i < ch_ele; i++)
+        {
+            if (syntax_elements[i]->channel == ch)
+            {
+                ics = &syntax_elements[i]->ics1;
+                break;
+            } else if (syntax_elements[i]->paired_channel == ch) {
+                ics = &syntax_elements[i]->ics2;
+                break;
+            }
+        }
+
+        /* inverse quantization */
+        inverse_quantization(spec_coef[ch], spec_data[ch], iq_table);
+
+        /* apply scalefactors */
+        apply_scalefactors(ics, spec_coef[ch], pow2_table);
+
+        /* deinterleave short block grouping */
+        if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+            quant_to_spec(ics, spec_coef[ch]);
+    }
+
+    /* Because for ms and is both channels spectral coefficients are needed
+       we have to restart running through all channels here.
+    */
+    for (ch = 0; ch < channels; ch++)
+    {
+        int pch = 0;
+        int right_channel;
+        ic_stream *ics, *icsr;
+        ltp_info *ltp;
+
+        /* find the syntax element to which this channel belongs */
+        for (i = 0; i < ch_ele; i++)
+        {
+            if (syntax_elements[i]->channel == ch)
+            {
+                ics = &syntax_elements[i]->ics1;
+                icsr = &syntax_elements[i]->ics2;
+                ltp = &(ics->ltp);
+                pch = syntax_elements[i]->paired_channel;
+                right_channel = 0;
+                break;
+            } else if (syntax_elements[i]->paired_channel == ch) {
+                ics = &syntax_elements[i]->ics2;
+                ltp = &(ics->ltp2);
+                right_channel = 1;
+                break;
+            }
+        }
+
+        /* mid/side decoding */
+        if (!right_channel)
+            ms_decode(ics, icsr, spec_coef[ch], spec_coef[pch]);
+
+        /* pns decoding */
+        pns_decode(ics, spec_coef[ch]);
+
+        /* intensity stereo decoding */
+        if (!right_channel)
+            is_decode(ics, icsr, spec_coef[ch], spec_coef[pch]);
+
+        /* MAIN object type prediction */
+        if (object_type == MAIN)
+        {
+            /* allocate the state only when needed */
+            if ((pred_stat[ch] == NULL) && ics->predictor_data_present)
+            {
+                pred_stat[ch] = malloc(1024 * sizeof(pred_state));
+                reset_all_predictors(pred_stat[ch]);
+            }
+
+            /* intra channel prediction */
+            if (pred_stat[ch] != NULL)
+            {
+                ic_prediction(ics, spec_coef[ch], pred_stat[ch]);
+
+                /* In addition, for scalefactor bands coded by perceptual
+                   noise substitution the predictors belonging to the
+                   corresponding spectral coefficients are reset.
+                 */
+                pns_reset_pred_state(ics, pred_stat[ch]);
+            }
+        } else if (object_type == LTP) {
+            /* allocate the state only when needed */
+            if ((lt_pred_stat[ch] == NULL) && ics->predictor_data_present)
+            {
+                lt_pred_stat[ch] = malloc(1024*3 * sizeof(float));
+                memset(lt_pred_stat[ch], 0, 1024*3 * sizeof(float));
+            }
+
+            /* long term prediction */
+            if (lt_pred_stat[ch] != NULL)
+            {
+                lt_prediction(ics, ltp, spec_coef[ch], lt_pred_stat[ch], fb,
+                    ics->window_shape, window_shape_prev[ch],
+                    sf_index, object_type);
+            }
+        }
+
+        /* tns decoding */
+        tns_decode_frame(ics, &ics->tns, sf_index, object_type, spec_coef[ch]);
+
+        /* drc decoding */
+        if (drc->present)
+        {
+            if (!drc->exclude_mask[ch] || !drc->excluded_chns_present)
+                drc_decode(drc, spec_coef[ch]);
+        }
+
+        if (time_state[ch] == NULL)
+        {
+            float *tp;
+
+            time_state[ch] = malloc(1024*sizeof(float));
+            tp = time_state[ch];
+            for (i = 1024/16-1; i >= 0; --i)
+            {
+                *tp++ = 0; *tp++ = 0; *tp++ = 0; *tp++ = 0;
+                *tp++ = 0; *tp++ = 0; *tp++ = 0; *tp++ = 0;
+                *tp++ = 0; *tp++ = 0; *tp++ = 0; *tp++ = 0;
+                *tp++ = 0; *tp++ = 0; *tp++ = 0; *tp++ = 0;
+            }
+        }
+        if (time_out[ch] == NULL)
+        {
+            time_out[ch] = malloc(1024*2*sizeof(float));
+        }
+
+        /* filter bank */
+        ifilter_bank(fb, ics->window_sequence, ics->window_shape,
+            window_shape_prev[ch], spec_coef[ch], time_state[ch],
+            time_out[ch]);
+        /* save window shape for next frame */
+        window_shape_prev[ch] = ics->window_shape;
+
+        if ((object_type == LTP) && (lt_pred_stat[ch] != NULL))
+            lt_update_state(lt_pred_stat[ch], time_out[ch], time_state[ch]);
+    }
+
+    sample_buffer = output_to_PCM(time_out, sample_buffer, channels,
+        outputFormat);
+
+    hDecoder->frame++;
+    if (hDecoder->frame <= 1)
+        hInfo->samples = 0;
+
+    /* cleanup */
+    for (ch = 0; ch < channels; ch++)
+    {
+        free(spec_coef[ch]);
+        free(spec_data[ch]);
+    }
+
+    for (i = 0; i < ch_ele; i++)
+    {
+        free(syntax_elements[i]);
+    }
+
+    return sample_buffer;
+}
--- /dev/null
+++ b/libfaad/decoder.h
@@ -1,0 +1,128 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: decoder.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __DECODER_H__
+#define __DECODER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef WIN32
+  #pragma pack(push, 8)
+  #ifndef FAADAPI
+    #define FAADAPI __stdcall
+  #endif
+#else
+  #ifndef FAADAPI
+    #define FAADAPI
+  #endif
+#endif
+
+#include "bits.h"
+#include "syntax.h"
+#include "specrec.h"
+#include "filtbank.h"
+#include "ic_predict.h"
+
+
+#define FAAD_FMT_16BIT 1
+#define FAAD_FMT_24BIT 2
+#define FAAD_FMT_32BIT 3
+#define FAAD_FMT_FLOAT 4
+
+typedef struct faacDecConfiguration
+{
+    short defObjectType;
+    unsigned long defSampleRate;
+    unsigned long outputFormat;
+} faacDecConfiguration, *faacDecConfigurationPtr;
+
+typedef struct faacDecFrameInfo
+{
+    int bytesconsumed;
+    int samples;
+    int channels;
+    int error;
+} faacDecFrameInfo;
+
+typedef struct
+{
+    int adts_header_present;
+    int adif_header_present;
+    int sf_index;
+    int object_type;
+
+    int frame;
+
+    void *sample_buffer;
+
+    int window_shape_prev[MAX_CHANNELS];
+    fb_info fb;
+    drc_info drc;
+
+    float *time_state[MAX_CHANNELS];
+    float *time_out[MAX_CHANNELS];
+
+    pred_state *pred_stat[MAX_CHANNELS];
+    float *lt_pred_stat[MAX_CHANNELS];
+
+    float exp_table[256];
+    float mnt_table[128];
+
+#if IQ_TABLE_SIZE
+    float iq_table[IQ_TABLE_SIZE];
+#endif
+#if POW_TABLE_SIZE
+    float pow2_table[POW_TABLE_SIZE];
+#endif
+
+    /* Configuration data */
+    faacDecConfiguration config;
+} faacDecStruct, *faacDecHandle;
+
+
+char* FAADAPI faacDecGetErrorMessage(int errcode);
+
+faacDecHandle FAADAPI faacDecOpen();
+
+faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder);
+
+int FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder,
+                                    faacDecConfigurationPtr config);
+
+int FAADAPI faacDecInit(faacDecHandle hDecoder, unsigned char *buffer,
+                        unsigned long *samplerate, unsigned long *channels);
+
+void FAADAPI faacDecClose(faacDecHandle hDecoder);
+
+void* FAADAPI faacDecDecode(faacDecHandle hDecoder,
+                            faacDecFrameInfo *hInfo,
+                            unsigned char *buffer);
+
+#ifdef WIN32
+  #pragma pack(pop)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/drc.c
@@ -1,0 +1,91 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: drc.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include <memory.h>
+#include "syntax.h"
+#include "drc.h"
+
+void init_drc(drc_info *drc, float cut, float boost)
+{
+    memset(drc, 0, sizeof(drc_info));
+
+    drc->ctrl1 = cut;
+    drc->ctrl2 = boost;
+
+    drc->num_bands = 1;
+    drc->band_top[0] = 1024/4 - 1;
+    drc->dyn_rng_sgn[0] = 1;
+    drc->dyn_rng_ctl[0] = 0;
+}
+
+void drc_decode(drc_info *drc, float *spec)
+{
+    int i, bd, top;
+    float factor;
+    int bottom = 0;
+
+    if (drc->num_bands == 1)
+        drc->band_top[0] = 1024/4 - 1;
+
+    for (bd = 0; bd < drc->num_bands; bd++)
+    {
+        top = 4 * (drc->band_top[bd] + 1);
+
+        /* Decode DRC gain factor */
+        if (drc->dyn_rng_sgn[bd])  /* compress */
+#ifdef __ICL
+            factor = powf(2.0f, (-drc->ctrl1 * drc->dyn_rng_ctl[bd]/24.0f));
+#else
+            factor = (float)pow(2.0, (-drc->ctrl1 * drc->dyn_rng_ctl[bd]/24.0));
+#endif
+        else /* boost */
+#ifdef __ICL
+            factor = powf(2.0f, ( drc->ctrl2 * drc->dyn_rng_ctl[bd]/24.0f));
+#else
+            factor = (float)pow(2.0, ( drc->ctrl2 * drc->dyn_rng_ctl[bd]/24.0));
+#endif
+
+        /* Level alignment between different programs (if desired) */
+        /* If program reference normalization is done in the digital domain,
+           modify factor to perform normalization.
+           prog_ref_level can alternatively be passed to the system for
+           modification of the level in the analog domain. Analog level
+           modification avoids problems with reduced DAC SNR (if signal is
+           attenuated) or clipping (if signal is boosted)
+         */
+#ifdef __ICL
+        factor *= powf(0.5f, ((DRC_REF_LEVEL - drc->prog_ref_level)/24.0f));
+#else
+        factor *= (float)pow(0.5, ((DRC_REF_LEVEL - drc->prog_ref_level)/24.0));
+#endif
+
+        /* Apply gain factor */
+        for (i = bottom; i<top; i++)
+            spec[i] *= factor;
+
+        bottom = top;
+    }
+}
--- /dev/null
+++ b/libfaad/drc.h
@@ -1,0 +1,38 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: drc.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __DRC_H__
+#define __DRC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DRC_REF_LEVEL 20*4 /* -20 dB */
+
+void init_drc(drc_info *drc, float cut, float boost);
+void drc_decode(drc_info *drc, float *spec);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/error.c
@@ -1,0 +1,32 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: error.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#include "error.h"
+
+extern char *err_msg[] = {
+    "No error",
+    "Gain control not yet implemented",
+    "Pulse coding not allowed in short blocks",
+    "Invalid huffman codebook",
+    "Negative scalefactor found, should be impossible",
+    "Unable to find ADTS syncword",
+    "Channel coupling not yet implemented",
+};
\ No newline at end of file
--- /dev/null
+++ b/libfaad/error.h
@@ -1,0 +1,34 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: error.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __ERROR_H__
+#define __ERROR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *err_msg[];
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/filtbank.c
@@ -1,0 +1,388 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: filtbank.c,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#include <stdlib.h>
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include <assert.h>
+#include "filtbank.h"
+#include "syntax.h"
+#include "kbd_win.h"
+#include "mdct.h"
+
+#ifndef PI
+#define PI 3.14159265359f
+#endif
+
+#ifdef LINUX
+#define INLINE inline
+#else
+#ifdef WIN32
+#define INLINE __inline
+#else
+#define INLINE
+#endif
+#endif
+
+float *long_window[2];
+float *short_window[2];
+
+void filter_bank_init(fb_info *fb)
+{
+    int i;
+
+    make_fft_order(fb->unscrambled64, fb->unscrambled512);
+
+    fb->sin_long  = malloc(BLOCK_LEN_LONG*sizeof(float));
+    fb->sin_short = malloc(BLOCK_LEN_SHORT*sizeof(float));
+
+    long_window[0]  = fb->sin_long;
+    long_window[1]  = kbd_long;
+    short_window[0] = fb->sin_short;
+    short_window[1] = kbd_short;
+
+    /* calculate the sine windows */
+    for (i = 0; i < BLOCK_LEN_LONG; i++)
+#ifdef __ICL
+        fb->sin_long[i] = sinf(PI / (2.0f * BLOCK_LEN_LONG) * (i + 0.5));
+#else
+        fb->sin_long[i] = (float)sin(PI / (2.0 * BLOCK_LEN_LONG) * (i + 0.5));
+#endif
+    for (i = 0; i < BLOCK_LEN_SHORT; i++)
+#ifdef __ICL
+        fb->sin_short[i] = sinf(PI / (2.0f * BLOCK_LEN_SHORT) * (i + 0.5));
+#else
+        fb->sin_short[i] = (float)sin(PI / (2.0 * BLOCK_LEN_SHORT) * (i + 0.5));
+#endif
+}
+
+void filter_bank_end(fb_info *fb)
+{
+    if (fb->sin_long) free(fb->sin_long);
+    if (fb->sin_short) free(fb->sin_short);
+}
+
+static INLINE void vcopy(float *src, float *dest, int vlen)
+{
+    int i;
+
+    assert(vlen % 16 == 0);
+
+    for (i = vlen/16-1; i >= 0; --i)
+    {
+        *dest++ = *src++; *dest++ = *src++; *dest++ = *src++; *dest++ = *src++;
+        *dest++ = *src++; *dest++ = *src++; *dest++ = *src++; *dest++ = *src++;
+        *dest++ = *src++; *dest++ = *src++; *dest++ = *src++; *dest++ = *src++;
+        *dest++ = *src++; *dest++ = *src++; *dest++ = *src++; *dest++ = *src++;
+    }
+}
+
+static INLINE void vzero(float *dest, int vlen)
+{
+    int i;
+
+    assert(vlen % 16 == 0);
+
+    for (i = vlen/16-1; i >= 0; --i)
+    {
+        *dest-- = 0; *dest-- = 0; *dest-- = 0; *dest-- = 0;
+        *dest-- = 0; *dest-- = 0; *dest-- = 0; *dest-- = 0;
+        *dest-- = 0; *dest-- = 0; *dest-- = 0; *dest-- = 0;
+        *dest-- = 0; *dest-- = 0; *dest-- = 0; *dest-- = 0;
+    }
+}
+
+static INLINE void vmult1(float *src1, float *src2, float *dest, int vlen)
+{
+    int i;
+
+    assert(vlen % 16 == 0);
+
+    for (i = vlen/16-1; i >= 0 ; --i)
+    {
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+        *dest++ = *src1++ * *src2++; *dest++ = *src1++ * *src2++;
+    }
+}
+
+static INLINE void vmult2(float *src1, float *src2, float *dest, int vlen)
+{
+    int i;
+
+    assert(vlen % 16 == 0);
+
+    for (i = vlen/16-1; i >= 0 ; --i)
+    {
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+        *dest++ = *src1++ * *src2--; *dest++ = *src1++ * *src2--;
+    }
+}
+
+static INLINE void vadd(float *src1, float *src2, float *dest, int vlen)
+{
+    int i;
+
+    assert(vlen % 16 == 0);
+
+    for (i = vlen/16-1; i >= 0; --i)
+    {
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+        *dest++ = *src1++ + *src2++; *dest++ = *src1++ + *src2++;
+    }
+}
+
+static INLINE void imdct(fb_info *fb, float *in_data, float *out_data, int len)
+{
+    switch (len)
+    {
+    case 2048:
+        IMDCT_long(in_data, out_data, fb->unscrambled512);
+        return;
+    case 256:
+        IMDCT_short(in_data, out_data, fb->unscrambled64);
+        return;
+    }
+}
+
+static INLINE void mdct(fb_info *fb, float *in_data, float *out_data, int len)
+{
+    switch (len)
+    {
+    case 2048:
+        MDCT_long(in_data, out_data, fb->unscrambled512);
+        return;
+    case 256:
+        MDCT_short(in_data, out_data, fb->unscrambled64);
+        return;
+    }
+}
+
+void ifilter_bank(fb_info *fb, int window_sequence, int window_shape,
+                  int window_shape_prev, float *freq_in, float *time_buff,
+                  float *time_out)
+{
+    float *o_buf, transf_buf[2*BLOCK_LEN_LONG];
+
+    float *window_long;
+    float *window_long_prev;
+    float *window_short;
+    float *window_short_prev;
+    float *window_short_prev_ptr;
+
+    float *fp;
+    int win;
+    int nlong = 1024;
+    int nshort = 128;
+
+    int nflat_ls = (nlong-nshort)/2;
+
+    window_long       =  long_window[window_shape];
+    window_long_prev  =  long_window[window_shape_prev];
+    window_short      = short_window[window_shape];
+    window_short_prev = short_window[window_shape_prev];
+
+    /* pointer to previous window function */
+    window_short_prev_ptr = window_short_prev;
+
+    vcopy(time_buff, time_out, nlong);
+    o_buf = time_out;
+
+    switch (window_sequence)
+    {
+    case ONLY_LONG_SEQUENCE:
+        /* inverse transform */
+        imdct(fb, freq_in, transf_buf, 2*nlong);
+
+        /* window function (previous) on first half of the new data */
+        vmult1(transf_buf, window_long_prev, transf_buf, nlong);
+
+        /* overlap and add second half of the old data with first half
+           of the new data */
+        vadd(transf_buf, o_buf, o_buf, nlong);
+
+        /* reversed window function on second half of the new data */
+        vmult2(transf_buf+nlong, window_long+nlong-1, o_buf+nlong, nlong);
+        break;
+
+    case LONG_START_SEQUENCE:
+        /* inverse transform */
+        imdct(fb, freq_in, transf_buf, 2*nlong);
+
+        /* window function (previous) on first half of the new data */
+        vmult1(transf_buf, window_long_prev, transf_buf, nlong);
+
+        /* overlap and add second half of the old data with first half
+           of the new data */
+        vadd(transf_buf, o_buf, o_buf, nlong);
+
+        /* copy data from nlong upto (3*nlong-nshort)/4; (window function = 1.0) */
+        vcopy(transf_buf+nlong, o_buf+nlong, nflat_ls);
+
+        /* reversed window function on part of second half of the new data */
+        vmult2(transf_buf+nlong+nflat_ls, window_short+nshort-1,
+            o_buf+nlong+nflat_ls, nshort);
+
+        /* zero rest of the data; (window function = 0.0) */
+        vzero(o_buf+2*nlong-1, nflat_ls);
+        break;
+
+    case EIGHT_SHORT_SEQUENCE:
+        fp = o_buf + nflat_ls;
+        for (win = 8-1; win >= 0; --win)
+        {
+            /* inverse transform */
+            imdct(fb, freq_in, transf_buf, 2*nshort);
+
+            /* window function (previous) on first half of the new data */
+            vmult1(transf_buf, window_short_prev_ptr, transf_buf, nshort);
+
+            /* overlap and add second half of the old data with first half
+               of the new data */
+            vadd(transf_buf, fp, fp, nshort);
+
+            /* reversed window function on second half of the new data */
+            vmult2(transf_buf+nshort, window_short+nshort-1, fp+nshort, nshort);
+
+            /* shift to next short block */
+            freq_in += nshort;
+            fp      += nshort;
+            window_short_prev_ptr = window_short;
+        }
+        vzero(o_buf+2*nlong-1, nflat_ls);
+        break;
+
+    case LONG_STOP_SEQUENCE:
+        /* inverse transform */
+        imdct(fb, freq_in, transf_buf, 2*nlong);
+
+        /* zero first part of first half of the data (window function = 0.0) */
+        vzero(transf_buf+nflat_ls-1, nflat_ls);
+
+        /* window function (previous) on part of the first half of
+           the new data */
+        vmult1(transf_buf+nflat_ls, window_short_prev_ptr,
+            transf_buf+nflat_ls, nshort);
+
+        /* third part of the stop sequence window is window function = 1,
+           so no need to actually apply that */
+
+        /* overlap and add second half of the old data with first half
+           of the new data */
+        vadd(transf_buf+nflat_ls, o_buf+nflat_ls, o_buf+nflat_ls, nshort);
+
+        /* copy last part of first half of the data (window function = 1.0) */
+        vcopy(transf_buf+nflat_ls+nshort, o_buf+nflat_ls+nshort, nflat_ls);
+
+        /* reversed window function on second half of the new data */
+        vmult2(transf_buf+nlong, window_long+nlong-1, o_buf+nlong, nlong);
+        break;
+    }
+
+    /* save second half of data */
+    vcopy(o_buf+nlong, time_buff, nlong);
+}
+
+/* only works for LTP -> no overlapping */
+void filter_bank_ltp(fb_info *fb, int window_sequence, int window_shape,
+                     int window_shape_prev, float *in_data, float *out_mdct)
+{
+    int win;
+    float windowed_buf[2*1024];
+    float *p_o_buf;
+
+    float *window_long;
+    float *window_long_prev;
+    float *window_short;
+    float *window_short_prev;
+    float *window_short_prev_ptr;
+
+    int nlong = 1024;
+    int nshort = 128;
+    int nflat_ls = (nlong-nshort)/2;
+
+
+    window_long       =  long_window[window_shape];
+    window_long_prev  =  long_window[window_shape_prev];
+    window_short      = short_window[window_shape];
+    window_short_prev = short_window[window_shape_prev];
+    window_short_prev_ptr = window_short_prev;
+  
+    p_o_buf = in_data;
+
+    switch(window_sequence)
+    {
+    case ONLY_LONG_SEQUENCE:
+        vmult1(p_o_buf, window_long_prev, windowed_buf, nlong);
+        vmult2(p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, nlong);
+        mdct(fb, windowed_buf, out_mdct, 2*nlong);
+        break;
+
+    case LONG_START_SEQUENCE:
+        vmult1(p_o_buf, window_long_prev, windowed_buf, nlong);
+        vcopy(p_o_buf+nlong, windowed_buf+nlong, nflat_ls);
+        vmult2(p_o_buf+nlong+nflat_ls, window_short+nshort-1, windowed_buf+nlong+nflat_ls, nshort);
+        vzero(windowed_buf+2*nlong-1, nflat_ls);
+        mdct(fb, windowed_buf, out_mdct, 2*nlong);
+        break;
+
+    case EIGHT_SHORT_SEQUENCE:
+        for (win = 8-1; win >= 0; --win)
+        {
+            vmult1(p_o_buf, window_short_prev_ptr, windowed_buf, nshort);
+            vmult2(p_o_buf+nshort, window_short+nshort-1, windowed_buf+nshort, nshort);
+            mdct(fb, windowed_buf, out_mdct, 2*nshort);
+
+            out_mdct += nshort;
+            p_o_buf  += 2*nshort;
+            window_short_prev_ptr = window_short; 
+        }
+        break;
+
+    case LONG_STOP_SEQUENCE:
+        vzero(windowed_buf+nflat_ls-1, nflat_ls);
+        vmult1(p_o_buf+nflat_ls, window_short_prev_ptr, windowed_buf+nflat_ls, nshort);
+        vcopy(p_o_buf+nflat_ls+nshort, windowed_buf+nflat_ls+nshort, nflat_ls);
+        vmult2(p_o_buf+nlong, window_long+nlong-1, windowed_buf+nlong, nlong);
+        mdct(fb, windowed_buf, out_mdct, 2*nlong);
+        break;
+    }
+}
--- /dev/null
+++ b/libfaad/filtbank.h
@@ -1,0 +1,55 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: filtbank.h,v 1.1 2002/01/14 19:15:55 menno Exp $
+**/
+
+#ifndef __FILTBANK_H__
+#define __FILTBANK_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define BLOCK_LEN_LONG  1024
+#define BLOCK_LEN_SHORT  128
+
+
+typedef struct
+{
+    short unscrambled64[64];
+    short unscrambled512[512];
+
+    float *sin_long;
+    float *sin_short;
+} fb_info;
+
+void filter_bank_init(fb_info *fb);
+void filter_bank_end(fb_info *fb);
+
+void filter_bank_ltp(fb_info *fb, int window_sequence, int window_shape,
+                     int window_shape_prev, float *in_data, float *out_mdct);
+void ifilter_bank(fb_info *fb, int window_sequence, int window_shape, 
+                  int window_shape_prev, float *freq_in, float *time_buff,
+                  float *time_out);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/huffman.c
@@ -1,0 +1,1432 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: huffman.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#include "huffman.h"
+
+extern codebook book1[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:              1 0000 */  5,    16,  1,  0,  0,  0 },
+    { /*   2:              1 0001 */  5,    17, -1,  0,  0,  0 },
+    { /*   3:              1 0010 */  5,    18,  0,  0,  0, -1 },
+    { /*   4:              1 0011 */  5,    19,  0,  1,  0,  0 },
+    { /*   5:              1 0100 */  5,    20,  0,  0,  0,  1 },
+    { /*   6:              1 0101 */  5,    21,  0,  0, -1,  0 },
+    { /*   7:              1 0110 */  5,    22,  0,  0,  1,  0 },
+    { /*   8:              1 0111 */  5,    23,  0, -1,  0,  0 },
+    { /*   9:            110 0000 */  7,    96,  1, -1,  0,  0 },
+    { /*  10:            110 0001 */  7,    97, -1,  1,  0,  0 },
+    { /*  11:            110 0010 */  7,    98,  0,  0, -1,  1 },
+    { /*  12:            110 0011 */  7,    99,  0,  1, -1,  0 },
+    { /*  13:            110 0100 */  7,   100,  0, -1,  1,  0 },
+    { /*  14:            110 0101 */  7,   101,  0,  0,  1, -1 },
+    { /*  15:            110 0110 */  7,   102,  1,  1,  0,  0 },
+    { /*  16:            110 0111 */  7,   103,  0,  0, -1, -1 },
+    { /*  17:            110 1000 */  7,   104, -1, -1,  0,  0 },
+    { /*  18:            110 1001 */  7,   105,  0, -1, -1,  0 },
+    { /*  19:            110 1010 */  7,   106,  1,  0, -1,  0 },
+    { /*  20:            110 1011 */  7,   107,  0,  1,  0, -1 },
+    { /*  21:            110 1100 */  7,   108, -1,  0,  1,  0 },
+    { /*  22:            110 1101 */  7,   109,  0,  0,  1,  1 },
+    { /*  23:            110 1110 */  7,   110,  1,  0,  1,  0 },
+    { /*  24:            110 1111 */  7,   111,  0, -1,  0,  1 },
+    { /*  25:            111 0000 */  7,   112,  0,  1,  1,  0 },
+    { /*  26:            111 0001 */  7,   113,  0,  1,  0,  1 },
+    { /*  27:            111 0010 */  7,   114, -1,  0, -1,  0 },
+    { /*  28:            111 0011 */  7,   115,  1,  0,  0,  1 },
+    { /*  29:            111 0100 */  7,   116, -1,  0,  0, -1 },
+    { /*  30:            111 0101 */  7,   117,  1,  0,  0, -1 },
+    { /*  31:            111 0110 */  7,   118, -1,  0,  0,  1 },
+    { /*  32:            111 0111 */  7,   119,  0, -1,  0, -1 },
+    { /*  33:         1 1110 0000 */  9,   480,  1,  1, -1,  0 },
+    { /*  34:         1 1110 0001 */  9,   481, -1,  1, -1,  0 },
+    { /*  35:         1 1110 0010 */  9,   482,  1, -1,  1,  0 },
+    { /*  36:         1 1110 0011 */  9,   483,  0,  1,  1, -1 },
+    { /*  37:         1 1110 0100 */  9,   484,  0,  1, -1,  1 },
+    { /*  38:         1 1110 0101 */  9,   485,  0, -1,  1,  1 },
+    { /*  39:         1 1110 0110 */  9,   486,  0, -1,  1, -1 },
+    { /*  40:         1 1110 0111 */  9,   487,  1, -1, -1,  0 },
+    { /*  41:         1 1110 1000 */  9,   488,  1,  0, -1,  1 },
+    { /*  42:         1 1110 1001 */  9,   489,  0,  1, -1, -1 },
+    { /*  43:         1 1110 1010 */  9,   490, -1,  1,  1,  0 },
+    { /*  44:         1 1110 1011 */  9,   491, -1,  0,  1, -1 },
+    { /*  45:         1 1110 1100 */  9,   492, -1, -1,  1,  0 },
+    { /*  46:         1 1110 1101 */  9,   493,  0, -1, -1,  1 },
+    { /*  47:         1 1110 1110 */  9,   494,  1, -1,  0,  1 },
+    { /*  48:         1 1110 1111 */  9,   495,  1, -1,  0, -1 },
+    { /*  49:         1 1111 0000 */  9,   496, -1,  1,  0, -1 },
+    { /*  50:         1 1111 0001 */  9,   497, -1, -1, -1,  0 },
+    { /*  51:         1 1111 0010 */  9,   498,  0, -1, -1, -1 },
+    { /*  52:         1 1111 0011 */  9,   499,  0,  1,  1,  1 },
+    { /*  53:         1 1111 0100 */  9,   500,  1,  0,  1, -1 },
+    { /*  54:         1 1111 0101 */  9,   501,  1,  1,  0,  1 },
+    { /*  55:         1 1111 0110 */  9,   502, -1,  1,  0,  1 },
+    { /*  56:         1 1111 0111 */  9,   503,  1,  1,  1,  0 },
+    { /*  57:        11 1111 0000 */ 10,  1008, -1, -1,  0,  1 },
+    { /*  58:        11 1111 0001 */ 10,  1009, -1,  0, -1, -1 },
+    { /*  59:        11 1111 0010 */ 10,  1010,  1,  1,  0, -1 },
+    { /*  60:        11 1111 0011 */ 10,  1011,  1,  0, -1, -1 },
+    { /*  61:        11 1111 0100 */ 10,  1012, -1,  0, -1,  1 },
+    { /*  62:        11 1111 0101 */ 10,  1013, -1, -1,  0, -1 },
+    { /*  63:        11 1111 0110 */ 10,  1014, -1,  0,  1,  1 },
+    { /*  64:        11 1111 0111 */ 10,  1015,  1,  0,  1,  1 },
+    { /*  65:       111 1111 0000 */ 11,  2032,  1, -1,  1, -1 },
+    { /*  66:       111 1111 0001 */ 11,  2033, -1,  1, -1,  1 },
+    { /*  67:       111 1111 0010 */ 11,  2034, -1,  1,  1, -1 },
+    { /*  68:       111 1111 0011 */ 11,  2035,  1, -1, -1,  1 },
+    { /*  69:       111 1111 0100 */ 11,  2036,  1,  1,  1,  1 },
+    { /*  70:       111 1111 0101 */ 11,  2037, -1, -1,  1,  1 },
+    { /*  71:       111 1111 0110 */ 11,  2038,  1,  1, -1, -1 },
+    { /*  72:       111 1111 0111 */ 11,  2039, -1, -1,  1, -1 },
+    { /*  73:       111 1111 1000 */ 11,  2040, -1, -1, -1, -1 },
+    { /*  74:       111 1111 1001 */ 11,  2041,  1,  1, -1,  1 },
+    { /*  75:       111 1111 1010 */ 11,  2042,  1, -1,  1,  1 },
+    { /*  76:       111 1111 1011 */ 11,  2043, -1,  1,  1,  1 },
+    { /*  77:       111 1111 1100 */ 11,  2044, -1,  1, -1, -1 },
+    { /*  78:       111 1111 1101 */ 11,  2045, -1, -1, -1,  1 },
+    { /*  79:       111 1111 1110 */ 11,  2046,  1, -1, -1, -1 },
+    { /*  80:       111 1111 1111 */ 11,  2047,  1,  1,  1, -1 }
+};
+
+extern codebook book2[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                 000 */  3,     0,  0,  0,  0,  0 },
+    { /*   1:                0010 */  4,     2,  1,  0,  0,  0 },
+    { /*   2:              0 0110 */  5,     6, -1,  0,  0,  0 },
+    { /*   3:              0 0111 */  5,     7,  0,  0,  0,  1 },
+    { /*   4:              0 1000 */  5,     8,  0,  0, -1,  0 },
+    { /*   5:              0 1001 */  5,     9,  0,  0,  0, -1 },
+    { /*   6:              0 1010 */  5,    10,  0, -1,  0,  0 },
+    { /*   7:              0 1011 */  5,    11,  0,  0,  1,  0 },
+    { /*   8:              0 1100 */  5,    12,  0,  1,  0,  0 },
+    { /*   9:             01 1010 */  6,    26,  0, -1,  1,  0 },
+    { /*  10:             01 1011 */  6,    27, -1,  1,  0,  0 },
+    { /*  11:             01 1100 */  6,    28,  0,  1, -1,  0 },
+    { /*  12:             01 1101 */  6,    29,  0,  0,  1, -1 },
+    { /*  13:             01 1110 */  6,    30,  0,  1,  0, -1 },
+    { /*  14:             01 1111 */  6,    31,  0,  0, -1,  1 },
+    { /*  15:             10 0000 */  6,    32, -1,  0,  0, -1 },
+    { /*  16:             10 0001 */  6,    33,  1, -1,  0,  0 },
+    { /*  17:             10 0010 */  6,    34,  1,  0, -1,  0 },
+    { /*  18:             10 0011 */  6,    35, -1, -1,  0,  0 },
+    { /*  19:             10 0100 */  6,    36,  0,  0, -1, -1 },
+    { /*  20:             10 0101 */  6,    37,  1,  0,  1,  0 },
+    { /*  21:             10 0110 */  6,    38,  1,  0,  0,  1 },
+    { /*  22:             10 0111 */  6,    39,  0, -1,  0,  1 },
+    { /*  23:             10 1000 */  6,    40, -1,  0,  1,  0 },
+    { /*  24:             10 1001 */  6,    41,  0,  1,  0,  1 },
+    { /*  25:             10 1010 */  6,    42,  0, -1, -1,  0 },
+    { /*  26:             10 1011 */  6,    43, -1,  0,  0,  1 },
+    { /*  27:             10 1100 */  6,    44,  0, -1,  0, -1 },
+    { /*  28:             10 1101 */  6,    45, -1,  0, -1,  0 },
+    { /*  29:             10 1110 */  6,    46,  1,  1,  0,  0 },
+    { /*  30:             10 1111 */  6,    47,  0,  1,  1,  0 },
+    { /*  31:             11 0000 */  6,    48,  0,  0,  1,  1 },
+    { /*  32:             11 0001 */  6,    49,  1,  0,  0, -1 },
+    { /*  33:            110 0100 */  7,   100,  0,  1, -1,  1 },
+    { /*  34:            110 0101 */  7,   101,  1,  0, -1,  1 },
+    { /*  35:            110 0110 */  7,   102, -1,  1, -1,  0 },
+    { /*  36:            110 0111 */  7,   103,  0, -1,  1, -1 },
+    { /*  37:            110 1000 */  7,   104,  1, -1,  1,  0 },
+    { /*  38:            110 1001 */  7,   105,  1,  1,  0, -1 },
+    { /*  39:            110 1010 */  7,   106,  1,  0,  1,  1 },
+    { /*  40:            110 1011 */  7,   107, -1,  1,  1,  0 },
+    { /*  41:            110 1100 */  7,   108,  0, -1, -1,  1 },
+    { /*  42:            110 1101 */  7,   109,  1,  1,  1,  0 },
+    { /*  43:            110 1110 */  7,   110, -1,  0,  1, -1 },
+    { /*  44:            110 1111 */  7,   111, -1, -1, -1,  0 },
+    { /*  45:            111 0000 */  7,   112, -1,  0, -1,  1 },
+    { /*  46:            111 0001 */  7,   113,  1, -1, -1,  0 },
+    { /*  47:            111 0010 */  7,   114,  1,  1, -1,  0 },
+    { /*  48:           1110 0110 */  8,   230,  1, -1,  0,  1 },
+    { /*  49:           1110 0111 */  8,   231, -1,  1,  0, -1 },
+    { /*  50:           1110 1000 */  8,   232, -1, -1,  1,  0 },
+    { /*  51:           1110 1001 */  8,   233, -1,  0,  1,  1 },
+    { /*  52:           1110 1010 */  8,   234, -1, -1,  0,  1 },
+    { /*  53:           1110 1011 */  8,   235, -1, -1,  0, -1 },
+    { /*  54:           1110 1100 */  8,   236,  0, -1, -1, -1 },
+    { /*  55:           1110 1101 */  8,   237,  1,  0,  1, -1 },
+    { /*  56:           1110 1110 */  8,   238,  1,  0, -1, -1 },
+    { /*  57:           1110 1111 */  8,   239,  0,  1, -1, -1 },
+    { /*  58:           1111 0000 */  8,   240,  0,  1,  1,  1 },
+    { /*  59:           1111 0001 */  8,   241, -1,  1,  0,  1 },
+    { /*  60:           1111 0010 */  8,   242, -1,  0, -1, -1 },
+    { /*  61:           1111 0011 */  8,   243,  0,  1,  1, -1 },
+    { /*  62:           1111 0100 */  8,   244,  1, -1,  0, -1 },
+    { /*  63:           1111 0101 */  8,   245,  0, -1,  1,  1 },
+    { /*  64:           1111 0110 */  8,   246,  1,  1,  0,  1 },
+    { /*  65:           1111 0111 */  8,   247,  1, -1,  1, -1 },
+    { /*  66:           1111 1000 */  8,   248, -1,  1, -1,  1 },
+    { /*  67:         1 1111 0010 */  9,   498,  1, -1, -1,  1 },
+    { /*  68:         1 1111 0011 */  9,   499, -1, -1, -1, -1 },
+    { /*  69:         1 1111 0100 */  9,   500, -1,  1,  1, -1 },
+    { /*  70:         1 1111 0101 */  9,   501, -1,  1,  1,  1 },
+    { /*  71:         1 1111 0110 */  9,   502,  1,  1,  1,  1 },
+    { /*  72:         1 1111 0111 */  9,   503, -1, -1,  1, -1 },
+    { /*  73:         1 1111 1000 */  9,   504,  1, -1,  1,  1 },
+    { /*  74:         1 1111 1001 */  9,   505, -1,  1, -1, -1 },
+    { /*  75:         1 1111 1010 */  9,   506, -1, -1,  1,  1 },
+    { /*  76:         1 1111 1011 */  9,   507,  1,  1, -1, -1 },
+    { /*  77:         1 1111 1100 */  9,   508,  1, -1, -1, -1 },
+    { /*  78:         1 1111 1101 */  9,   509, -1, -1, -1,  1 },
+    { /*  79:         1 1111 1110 */  9,   510,  1,  1, -1,  1 },
+    { /*  80:         1 1111 1111 */  9,   511,  1,  1,  1, -1 }
+};
+
+extern codebook book3[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                1000 */  4,     8,  1,  0,  0,  0 },
+    { /*   2:                1001 */  4,     9,  0,  0,  0,  1 },
+    { /*   3:                1010 */  4,    10,  0,  1,  0,  0 },
+    { /*   4:                1011 */  4,    11,  0,  0,  1,  0 },
+    { /*   5:              1 1000 */  5,    24,  1,  1,  0,  0 },
+    { /*   6:              1 1001 */  5,    25,  0,  0,  1,  1 },
+    { /*   7:             11 0100 */  6,    52,  0,  1,  1,  0 },
+    { /*   8:             11 0101 */  6,    53,  0,  1,  0,  1 },
+    { /*   9:             11 0110 */  6,    54,  1,  0,  1,  0 },
+    { /*  10:             11 0111 */  6,    55,  0,  1,  1,  1 },
+    { /*  11:             11 1000 */  6,    56,  1,  0,  0,  1 },
+    { /*  12:             11 1001 */  6,    57,  1,  1,  1,  0 },
+    { /*  13:            111 0100 */  7,   116,  1,  1,  1,  1 },
+    { /*  14:            111 0101 */  7,   117,  1,  0,  1,  1 },
+    { /*  15:            111 0110 */  7,   118,  1,  1,  0,  1 },
+    { /*  16:           1110 1110 */  8,   238,  2,  0,  0,  0 },
+    { /*  17:           1110 1111 */  8,   239,  0,  0,  0,  2 },
+    { /*  18:           1111 0000 */  8,   240,  0,  0,  1,  2 },
+    { /*  19:           1111 0001 */  8,   241,  2,  1,  0,  0 },
+    { /*  20:           1111 0010 */  8,   242,  1,  2,  1,  0 },
+    { /*  21:         1 1110 0110 */  9,   486,  0,  0,  2,  1 },
+    { /*  22:         1 1110 0111 */  9,   487,  0,  1,  2,  1 },
+    { /*  23:         1 1110 1000 */  9,   488,  1,  2,  0,  0 },
+    { /*  24:         1 1110 1001 */  9,   489,  0,  1,  1,  2 },
+    { /*  25:         1 1110 1010 */  9,   490,  2,  1,  1,  0 },
+    { /*  26:         1 1110 1011 */  9,   491,  0,  0,  2,  0 },
+    { /*  27:         1 1110 1100 */  9,   492,  0,  2,  1,  0 },
+    { /*  28:         1 1110 1101 */  9,   493,  0,  1,  2,  0 },
+    { /*  29:         1 1110 1110 */  9,   494,  0,  2,  0,  0 },
+    { /*  30:         1 1110 1111 */  9,   495,  0,  1,  0,  2 },
+    { /*  31:         1 1111 0000 */  9,   496,  2,  0,  1,  0 },
+    { /*  32:         1 1111 0001 */  9,   497,  1,  2,  1,  1 },
+    { /*  33:         1 1111 0010 */  9,   498,  0,  2,  1,  1 },
+    { /*  34:         1 1111 0011 */  9,   499,  1,  1,  2,  0 },
+    { /*  35:         1 1111 0100 */  9,   500,  1,  1,  2,  1 },
+    { /*  36:        11 1110 1010 */ 10,  1002,  1,  2,  0,  1 },
+    { /*  37:        11 1110 1011 */ 10,  1003,  1,  0,  2,  0 },
+    { /*  38:        11 1110 1100 */ 10,  1004,  1,  0,  2,  1 },
+    { /*  39:        11 1110 1101 */ 10,  1005,  0,  2,  0,  1 },
+    { /*  40:        11 1110 1110 */ 10,  1006,  2,  1,  1,  1 },
+    { /*  41:        11 1110 1111 */ 10,  1007,  1,  1,  1,  2 },
+    { /*  42:        11 1111 0000 */ 10,  1008,  2,  1,  0,  1 },
+    { /*  43:        11 1111 0001 */ 10,  1009,  1,  0,  1,  2 },
+    { /*  44:        11 1111 0010 */ 10,  1010,  0,  0,  2,  2 },
+    { /*  45:        11 1111 0011 */ 10,  1011,  0,  1,  2,  2 },
+    { /*  46:        11 1111 0100 */ 10,  1012,  2,  2,  1,  0 },
+    { /*  47:        11 1111 0101 */ 10,  1013,  1,  2,  2,  0 },
+    { /*  48:        11 1111 0110 */ 10,  1014,  1,  0,  0,  2 },
+    { /*  49:        11 1111 0111 */ 10,  1015,  2,  0,  0,  1 },
+    { /*  50:        11 1111 1000 */ 10,  1016,  0,  2,  2,  1 },
+    { /*  51:       111 1111 0010 */ 11,  2034,  2,  2,  0,  0 },
+    { /*  52:       111 1111 0011 */ 11,  2035,  1,  2,  2,  1 },
+    { /*  53:       111 1111 0100 */ 11,  2036,  1,  1,  0,  2 },
+    { /*  54:       111 1111 0101 */ 11,  2037,  2,  0,  1,  1 },
+    { /*  55:       111 1111 0110 */ 11,  2038,  1,  1,  2,  2 },
+    { /*  56:       111 1111 0111 */ 11,  2039,  2,  2,  1,  1 },
+    { /*  57:       111 1111 1000 */ 11,  2040,  0,  2,  2,  0 },
+    { /*  58:       111 1111 1001 */ 11,  2041,  0,  2,  1,  2 },
+    { /*  59:      1111 1111 0100 */ 12,  4084,  1,  0,  2,  2 },
+    { /*  60:      1111 1111 0101 */ 12,  4085,  2,  2,  0,  1 },
+    { /*  61:      1111 1111 0110 */ 12,  4086,  2,  1,  2,  0 },
+    { /*  62:      1111 1111 0111 */ 12,  4087,  2,  2,  2,  0 },
+    { /*  63:      1111 1111 1000 */ 12,  4088,  0,  2,  2,  2 },
+    { /*  64:      1111 1111 1001 */ 12,  4089,  2,  2,  2,  1 },
+    { /*  65:      1111 1111 1010 */ 12,  4090,  2,  1,  2,  1 },
+    { /*  66:      1111 1111 1011 */ 12,  4091,  1,  2,  1,  2 },
+    { /*  67:      1111 1111 1100 */ 12,  4092,  1,  2,  2,  2 },
+    { /*  68:    1 1111 1111 1010 */ 13,  8186,  0,  2,  0,  2 },
+    { /*  69:    1 1111 1111 1011 */ 13,  8187,  2,  0,  2,  0 },
+    { /*  70:    1 1111 1111 1100 */ 13,  8188,  1,  2,  0,  2 },
+    { /*  71:   11 1111 1111 1010 */ 14, 16378,  2,  0,  2,  1 },
+    { /*  72:   11 1111 1111 1011 */ 14, 16379,  2,  1,  1,  2 },
+    { /*  73:   11 1111 1111 1100 */ 14, 16380,  2,  1,  0,  2 },
+    { /*  74:  111 1111 1111 1010 */ 15, 32762,  2,  2,  2,  2 },
+    { /*  75:  111 1111 1111 1011 */ 15, 32763,  2,  2,  1,  2 },
+    { /*  76:  111 1111 1111 1100 */ 15, 32764,  2,  1,  2,  2 },
+    { /*  77:  111 1111 1111 1101 */ 15, 32765,  2,  0,  1,  2 },
+    { /*  78:  111 1111 1111 1110 */ 15, 32766,  2,  0,  0,  2 },
+    { /*  79: 1111 1111 1111 1110 */ 16, 65534,  2,  2,  0,  2 },
+    { /*  80: 1111 1111 1111 1111 */ 16, 65535,  2,  0,  2,  2 }
+};
+
+extern codebook book4[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  1,  1,  1,  1 },
+    { /*   1:                0001 */  4,     1,  0,  1,  1,  1 },
+    { /*   2:                0010 */  4,     2,  1,  1,  0,  1 },
+    { /*   3:                0011 */  4,     3,  1,  1,  1,  0 },
+    { /*   4:                0100 */  4,     4,  1,  0,  1,  1 },
+    { /*   5:                0101 */  4,     5,  1,  0,  0,  0 },
+    { /*   6:                0110 */  4,     6,  1,  1,  0,  0 },
+    { /*   7:                0111 */  4,     7,  0,  0,  0,  0 },
+    { /*   8:                1000 */  4,     8,  0,  0,  1,  1 },
+    { /*   9:                1001 */  4,     9,  1,  0,  1,  0 },
+    { /*  10:              1 0100 */  5,    20,  1,  0,  0,  1 },
+    { /*  11:              1 0101 */  5,    21,  0,  1,  1,  0 },
+    { /*  12:              1 0110 */  5,    22,  0,  0,  0,  1 },
+    { /*  13:              1 0111 */  5,    23,  0,  1,  0,  1 },
+    { /*  14:              1 1000 */  5,    24,  0,  0,  1,  0 },
+    { /*  15:              1 1001 */  5,    25,  0,  1,  0,  0 },
+    { /*  16:            110 1000 */  7,   104,  2,  1,  1,  1 },
+    { /*  17:            110 1001 */  7,   105,  1,  1,  2,  1 },
+    { /*  18:            110 1010 */  7,   106,  1,  2,  1,  1 },
+    { /*  19:            110 1011 */  7,   107,  1,  1,  1,  2 },
+    { /*  20:            110 1100 */  7,   108,  2,  1,  1,  0 },
+    { /*  21:            110 1101 */  7,   109,  2,  1,  0,  1 },
+    { /*  22:            110 1110 */  7,   110,  1,  2,  1,  0 },
+    { /*  23:            110 1111 */  7,   111,  2,  0,  1,  1 },
+    { /*  24:            111 0000 */  7,   112,  0,  1,  2,  1 },
+    { /*  25:           1110 0010 */  8,   226,  0,  1,  1,  2 },
+    { /*  26:           1110 0011 */  8,   227,  1,  1,  2,  0 },
+    { /*  27:           1110 0100 */  8,   228,  0,  2,  1,  1 },
+    { /*  28:           1110 0101 */  8,   229,  1,  0,  1,  2 },
+    { /*  29:           1110 0110 */  8,   230,  1,  2,  0,  1 },
+    { /*  30:           1110 0111 */  8,   231,  1,  1,  0,  2 },
+    { /*  31:           1110 1000 */  8,   232,  1,  0,  2,  1 },
+    { /*  32:           1110 1001 */  8,   233,  2,  1,  0,  0 },
+    { /*  33:           1110 1010 */  8,   234,  2,  0,  1,  0 },
+    { /*  34:           1110 1011 */  8,   235,  1,  2,  0,  0 },
+    { /*  35:           1110 1100 */  8,   236,  2,  0,  0,  1 },
+    { /*  36:           1110 1101 */  8,   237,  0,  1,  0,  2 },
+    { /*  37:           1110 1110 */  8,   238,  0,  2,  1,  0 },
+    { /*  38:           1110 1111 */  8,   239,  0,  0,  1,  2 },
+    { /*  39:           1111 0000 */  8,   240,  0,  1,  2,  0 },
+    { /*  40:           1111 0001 */  8,   241,  0,  2,  0,  1 },
+    { /*  41:           1111 0010 */  8,   242,  1,  0,  0,  2 },
+    { /*  42:           1111 0011 */  8,   243,  0,  0,  2,  1 },
+    { /*  43:           1111 0100 */  8,   244,  1,  0,  2,  0 },
+    { /*  44:           1111 0101 */  8,   245,  2,  0,  0,  0 },
+    { /*  45:           1111 0110 */  8,   246,  0,  0,  0,  2 },
+    { /*  46:         1 1110 1110 */  9,   494,  0,  2,  0,  0 },
+    { /*  47:         1 1110 1111 */  9,   495,  0,  0,  2,  0 },
+    { /*  48:         1 1111 0000 */  9,   496,  1,  2,  2,  1 },
+    { /*  49:         1 1111 0001 */  9,   497,  2,  2,  1,  1 },
+    { /*  50:         1 1111 0010 */  9,   498,  2,  1,  2,  1 },
+    { /*  51:         1 1111 0011 */  9,   499,  1,  1,  2,  2 },
+    { /*  52:         1 1111 0100 */  9,   500,  1,  2,  1,  2 },
+    { /*  53:         1 1111 0101 */  9,   501,  2,  1,  1,  2 },
+    { /*  54:        11 1110 1100 */ 10,  1004,  1,  2,  2,  0 },
+    { /*  55:        11 1110 1101 */ 10,  1005,  2,  2,  1,  0 },
+    { /*  56:        11 1110 1110 */ 10,  1006,  2,  1,  2,  0 },
+    { /*  57:        11 1110 1111 */ 10,  1007,  0,  2,  2,  1 },
+    { /*  58:        11 1111 0000 */ 10,  1008,  0,  1,  2,  2 },
+    { /*  59:        11 1111 0001 */ 10,  1009,  2,  2,  0,  1 },
+    { /*  60:        11 1111 0010 */ 10,  1010,  0,  2,  1,  2 },
+    { /*  61:        11 1111 0011 */ 10,  1011,  2,  0,  2,  1 },
+    { /*  62:        11 1111 0100 */ 10,  1012,  1,  0,  2,  2 },
+    { /*  63:        11 1111 0101 */ 10,  1013,  2,  2,  2,  1 },
+    { /*  64:        11 1111 0110 */ 10,  1014,  1,  2,  0,  2 },
+    { /*  65:        11 1111 0111 */ 10,  1015,  2,  0,  1,  2 },
+    { /*  66:        11 1111 1000 */ 10,  1016,  2,  1,  0,  2 },
+    { /*  67:        11 1111 1001 */ 10,  1017,  1,  2,  2,  2 },
+    { /*  68:       111 1111 0100 */ 11,  2036,  2,  1,  2,  2 },
+    { /*  69:       111 1111 0101 */ 11,  2037,  2,  2,  1,  2 },
+    { /*  70:       111 1111 0110 */ 11,  2038,  0,  2,  2,  0 },
+    { /*  71:       111 1111 0111 */ 11,  2039,  2,  2,  0,  0 },
+    { /*  72:       111 1111 1000 */ 11,  2040,  0,  0,  2,  2 },
+    { /*  73:       111 1111 1001 */ 11,  2041,  2,  0,  2,  0 },
+    { /*  74:       111 1111 1010 */ 11,  2042,  0,  2,  0,  2 },
+    { /*  75:       111 1111 1011 */ 11,  2043,  2,  0,  0,  2 },
+    { /*  76:       111 1111 1100 */ 11,  2044,  2,  2,  2,  2 },
+    { /*  77:       111 1111 1101 */ 11,  2045,  0,  2,  2,  2 },
+    { /*  78:       111 1111 1110 */ 11,  2046,  2,  2,  2,  0 },
+    { /*  79:      1111 1111 1110 */ 12,  4094,  2,  2,  0,  2 },
+    { /*  80:      1111 1111 1111 */ 12,  4095,  2,  0,  2,  2 }
+};
+
+extern codebook book5[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                1000 */  4,     8, -1,  0,  0,  0 },
+    { /*   2:                1001 */  4,     9,  1,  0,  0,  0 },
+    { /*   3:                1010 */  4,    10,  0,  1,  0,  0 },
+    { /*   4:                1011 */  4,    11,  0, -1,  0,  0 },
+    { /*   5:              1 1000 */  5,    24,  1, -1,  0,  0 },
+    { /*   6:              1 1001 */  5,    25, -1,  1,  0,  0 },
+    { /*   7:              1 1010 */  5,    26, -1, -1,  0,  0 },
+    { /*   8:              1 1011 */  5,    27,  1,  1,  0,  0 },
+    { /*   9:            111 0000 */  7,   112, -2,  0,  0,  0 },
+    { /*  10:            111 0001 */  7,   113,  0,  2,  0,  0 },
+    { /*  11:            111 0010 */  7,   114,  2,  0,  0,  0 },
+    { /*  12:            111 0011 */  7,   115,  0, -2,  0,  0 },
+    { /*  13:           1110 1000 */  8,   232, -2, -1,  0,  0 },
+    { /*  14:           1110 1001 */  8,   233,  2,  1,  0,  0 },
+    { /*  15:           1110 1010 */  8,   234, -1, -2,  0,  0 },
+    { /*  16:           1110 1011 */  8,   235,  1,  2,  0,  0 },
+    { /*  17:           1110 1100 */  8,   236, -2,  1,  0,  0 },
+    { /*  18:           1110 1101 */  8,   237,  2, -1,  0,  0 },
+    { /*  19:           1110 1110 */  8,   238, -1,  2,  0,  0 },
+    { /*  20:           1110 1111 */  8,   239,  1, -2,  0,  0 },
+    { /*  21:           1111 0000 */  8,   240, -3,  0,  0,  0 },
+    { /*  22:           1111 0001 */  8,   241,  3,  0,  0,  0 },
+    { /*  23:           1111 0010 */  8,   242,  0, -3,  0,  0 },
+    { /*  24:           1111 0011 */  8,   243,  0,  3,  0,  0 },
+    { /*  25:         1 1110 1000 */  9,   488, -3, -1,  0,  0 },
+    { /*  26:         1 1110 1001 */  9,   489,  1,  3,  0,  0 },
+    { /*  27:         1 1110 1010 */  9,   490,  3,  1,  0,  0 },
+    { /*  28:         1 1110 1011 */  9,   491, -1, -3,  0,  0 },
+    { /*  29:         1 1110 1100 */  9,   492, -3,  1,  0,  0 },
+    { /*  30:         1 1110 1101 */  9,   493,  3, -1,  0,  0 },
+    { /*  31:         1 1110 1110 */  9,   494,  1, -3,  0,  0 },
+    { /*  32:         1 1110 1111 */  9,   495, -1,  3,  0,  0 },
+    { /*  33:         1 1111 0000 */  9,   496, -2,  2,  0,  0 },
+    { /*  34:         1 1111 0001 */  9,   497,  2,  2,  0,  0 },
+    { /*  35:         1 1111 0010 */  9,   498, -2, -2,  0,  0 },
+    { /*  36:         1 1111 0011 */  9,   499,  2, -2,  0,  0 },
+    { /*  37:        11 1110 1000 */ 10,  1000, -3, -2,  0,  0 },
+    { /*  38:        11 1110 1001 */ 10,  1001,  3, -2,  0,  0 },
+    { /*  39:        11 1110 1010 */ 10,  1002, -2,  3,  0,  0 },
+    { /*  40:        11 1110 1011 */ 10,  1003,  2, -3,  0,  0 },
+    { /*  41:        11 1110 1100 */ 10,  1004,  3,  2,  0,  0 },
+    { /*  42:        11 1110 1101 */ 10,  1005,  2,  3,  0,  0 },
+    { /*  43:        11 1110 1110 */ 10,  1006, -3,  2,  0,  0 },
+    { /*  44:        11 1110 1111 */ 10,  1007, -2, -3,  0,  0 },
+    { /*  45:        11 1111 0000 */ 10,  1008,  0, -4,  0,  0 },
+    { /*  46:        11 1111 0001 */ 10,  1009, -4,  0,  0,  0 },
+    { /*  47:        11 1111 0010 */ 10,  1010,  4,  1,  0,  0 },
+    { /*  48:        11 1111 0011 */ 10,  1011,  4,  0,  0,  0 },
+    { /*  49:       111 1110 1000 */ 11,  2024, -4, -1,  0,  0 },
+    { /*  50:       111 1110 1001 */ 11,  2025,  0,  4,  0,  0 },
+    { /*  51:       111 1110 1010 */ 11,  2026,  4, -1,  0,  0 },
+    { /*  52:       111 1110 1011 */ 11,  2027, -1, -4,  0,  0 },
+    { /*  53:       111 1110 1100 */ 11,  2028,  1,  4,  0,  0 },
+    { /*  54:       111 1110 1101 */ 11,  2029, -1,  4,  0,  0 },
+    { /*  55:       111 1110 1110 */ 11,  2030, -4,  1,  0,  0 },
+    { /*  56:       111 1110 1111 */ 11,  2031,  1, -4,  0,  0 },
+    { /*  57:       111 1111 0000 */ 11,  2032,  3, -3,  0,  0 },
+    { /*  58:       111 1111 0001 */ 11,  2033, -3, -3,  0,  0 },
+    { /*  59:       111 1111 0010 */ 11,  2034, -3,  3,  0,  0 },
+    { /*  60:       111 1111 0011 */ 11,  2035, -2,  4,  0,  0 },
+    { /*  61:       111 1111 0100 */ 11,  2036, -4, -2,  0,  0 },
+    { /*  62:       111 1111 0101 */ 11,  2037,  4,  2,  0,  0 },
+    { /*  63:       111 1111 0110 */ 11,  2038,  2, -4,  0,  0 },
+    { /*  64:       111 1111 0111 */ 11,  2039,  2,  4,  0,  0 },
+    { /*  65:       111 1111 1000 */ 11,  2040,  3,  3,  0,  0 },
+    { /*  66:       111 1111 1001 */ 11,  2041, -4,  2,  0,  0 },
+    { /*  67:      1111 1111 0100 */ 12,  4084, -2, -4,  0,  0 },
+    { /*  68:      1111 1111 0101 */ 12,  4085,  4, -2,  0,  0 },
+    { /*  69:      1111 1111 0110 */ 12,  4086,  3, -4,  0,  0 },
+    { /*  70:      1111 1111 0111 */ 12,  4087, -4, -3,  0,  0 },
+    { /*  71:      1111 1111 1000 */ 12,  4088, -4,  3,  0,  0 },
+    { /*  72:      1111 1111 1001 */ 12,  4089,  3,  4,  0,  0 },
+    { /*  73:      1111 1111 1010 */ 12,  4090, -3,  4,  0,  0 },
+    { /*  74:      1111 1111 1011 */ 12,  4091,  4,  3,  0,  0 },
+    { /*  75:      1111 1111 1100 */ 12,  4092,  4, -3,  0,  0 },
+    { /*  76:      1111 1111 1101 */ 12,  4093, -3, -4,  0,  0 },
+    { /*  77:    1 1111 1111 1100 */ 13,  8188,  4, -4,  0,  0 },
+    { /*  78:    1 1111 1111 1101 */ 13,  8189, -4,  4,  0,  0 },
+    { /*  79:    1 1111 1111 1110 */ 13,  8190,  4,  4,  0,  0 },
+    { /*  80:    1 1111 1111 1111 */ 13,  8191, -4, -4,  0,  0 }
+};
+
+extern codebook book6[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  0,  0,  0,  0 },
+    { /*   1:                0001 */  4,     1,  1,  0,  0,  0 },
+    { /*   2:                0010 */  4,     2,  0, -1,  0,  0 },
+    { /*   3:                0011 */  4,     3,  0,  1,  0,  0 },
+    { /*   4:                0100 */  4,     4, -1,  0,  0,  0 },
+    { /*   5:                0101 */  4,     5,  1,  1,  0,  0 },
+    { /*   6:                0110 */  4,     6, -1,  1,  0,  0 },
+    { /*   7:                0111 */  4,     7,  1, -1,  0,  0 },
+    { /*   8:                1000 */  4,     8, -1, -1,  0,  0 },
+    { /*   9:             10 0100 */  6,    36,  2, -1,  0,  0 },
+    { /*  10:             10 0101 */  6,    37,  2,  1,  0,  0 },
+    { /*  11:             10 0110 */  6,    38, -2,  1,  0,  0 },
+    { /*  12:             10 0111 */  6,    39, -2, -1,  0,  0 },
+    { /*  13:             10 1000 */  6,    40, -2,  0,  0,  0 },
+    { /*  14:             10 1001 */  6,    41, -1,  2,  0,  0 },
+    { /*  15:             10 1010 */  6,    42,  2,  0,  0,  0 },
+    { /*  16:             10 1011 */  6,    43,  1, -2,  0,  0 },
+    { /*  17:             10 1100 */  6,    44,  1,  2,  0,  0 },
+    { /*  18:             10 1101 */  6,    45,  0, -2,  0,  0 },
+    { /*  19:             10 1110 */  6,    46, -1, -2,  0,  0 },
+    { /*  20:             10 1111 */  6,    47,  0,  2,  0,  0 },
+    { /*  21:             11 0000 */  6,    48,  2, -2,  0,  0 },
+    { /*  22:             11 0001 */  6,    49, -2,  2,  0,  0 },
+    { /*  23:             11 0010 */  6,    50, -2, -2,  0,  0 },
+    { /*  24:             11 0011 */  6,    51,  2,  2,  0,  0 },
+    { /*  25:            110 1000 */  7,   104, -3,  1,  0,  0 },
+    { /*  26:            110 1001 */  7,   105,  3,  1,  0,  0 },
+    { /*  27:            110 1010 */  7,   106,  3, -1,  0,  0 },
+    { /*  28:            110 1011 */  7,   107, -1,  3,  0,  0 },
+    { /*  29:            110 1100 */  7,   108, -3, -1,  0,  0 },
+    { /*  30:            110 1101 */  7,   109,  1,  3,  0,  0 },
+    { /*  31:            110 1110 */  7,   110,  1, -3,  0,  0 },
+    { /*  32:            110 1111 */  7,   111, -1, -3,  0,  0 },
+    { /*  33:            111 0000 */  7,   112,  3,  0,  0,  0 },
+    { /*  34:            111 0001 */  7,   113, -3,  0,  0,  0 },
+    { /*  35:            111 0010 */  7,   114,  0, -3,  0,  0 },
+    { /*  36:            111 0011 */  7,   115,  0,  3,  0,  0 },
+    { /*  37:            111 0100 */  7,   116,  3,  2,  0,  0 },
+    { /*  38:           1110 1010 */  8,   234, -3, -2,  0,  0 },
+    { /*  39:           1110 1011 */  8,   235, -2,  3,  0,  0 },
+    { /*  40:           1110 1100 */  8,   236,  2,  3,  0,  0 },
+    { /*  41:           1110 1101 */  8,   237,  3, -2,  0,  0 },
+    { /*  42:           1110 1110 */  8,   238,  2, -3,  0,  0 },
+    { /*  43:           1110 1111 */  8,   239, -2, -3,  0,  0 },
+    { /*  44:           1111 0000 */  8,   240, -3,  2,  0,  0 },
+    { /*  45:           1111 0001 */  8,   241,  3,  3,  0,  0 },
+    { /*  46:         1 1110 0100 */  9,   484,  3, -3,  0,  0 },
+    { /*  47:         1 1110 0101 */  9,   485, -3, -3,  0,  0 },
+    { /*  48:         1 1110 0110 */  9,   486, -3,  3,  0,  0 },
+    { /*  49:         1 1110 0111 */  9,   487,  1, -4,  0,  0 },
+    { /*  50:         1 1110 1000 */  9,   488, -1, -4,  0,  0 },
+    { /*  51:         1 1110 1001 */  9,   489,  4,  1,  0,  0 },
+    { /*  52:         1 1110 1010 */  9,   490, -4,  1,  0,  0 },
+    { /*  53:         1 1110 1011 */  9,   491, -4, -1,  0,  0 },
+    { /*  54:         1 1110 1100 */  9,   492,  1,  4,  0,  0 },
+    { /*  55:         1 1110 1101 */  9,   493,  4, -1,  0,  0 },
+    { /*  56:         1 1110 1110 */  9,   494, -1,  4,  0,  0 },
+    { /*  57:         1 1110 1111 */  9,   495,  0, -4,  0,  0 },
+    { /*  58:         1 1111 0000 */  9,   496, -4,  2,  0,  0 },
+    { /*  59:         1 1111 0001 */  9,   497, -4, -2,  0,  0 },
+    { /*  60:         1 1111 0010 */  9,   498,  2,  4,  0,  0 },
+    { /*  61:         1 1111 0011 */  9,   499, -2, -4,  0,  0 },
+    { /*  62:         1 1111 0100 */  9,   500, -4,  0,  0,  0 },
+    { /*  63:         1 1111 0101 */  9,   501,  4,  2,  0,  0 },
+    { /*  64:         1 1111 0110 */  9,   502,  4, -2,  0,  0 },
+    { /*  65:         1 1111 0111 */  9,   503, -2,  4,  0,  0 },
+    { /*  66:         1 1111 1000 */  9,   504,  4,  0,  0,  0 },
+    { /*  67:         1 1111 1001 */  9,   505,  2, -4,  0,  0 },
+    { /*  68:         1 1111 1010 */  9,   506,  0,  4,  0,  0 },
+    { /*  69:        11 1111 0110 */ 10,  1014, -3, -4,  0,  0 },
+    { /*  70:        11 1111 0111 */ 10,  1015, -3,  4,  0,  0 },
+    { /*  71:        11 1111 1000 */ 10,  1016,  3, -4,  0,  0 },
+    { /*  72:        11 1111 1001 */ 10,  1017,  4, -3,  0,  0 },
+    { /*  73:        11 1111 1010 */ 10,  1018,  3,  4,  0,  0 },
+    { /*  74:        11 1111 1011 */ 10,  1019,  4,  3,  0,  0 },
+    { /*  75:        11 1111 1100 */ 10,  1020, -4,  3,  0,  0 },
+    { /*  76:        11 1111 1101 */ 10,  1021, -4, -3,  0,  0 },
+    { /*  77:       111 1111 1100 */ 11,  2044,  4,  4,  0,  0 },
+    { /*  78:       111 1111 1101 */ 11,  2045, -4,  4,  0,  0 },
+    { /*  79:       111 1111 1110 */ 11,  2046, -4, -4,  0,  0 },
+    { /*  80:       111 1111 1111 */ 11,  2047,  4, -4,  0,  0 }
+};
+
+extern codebook book7[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                 100 */  3,     4,  1,  0,  0,  0 },
+    { /*   2:                 101 */  3,     5,  0,  1,  0,  0 },
+    { /*   3:                1100 */  4,    12,  1,  1,  0,  0 },
+    { /*   4:             11 0100 */  6,    52,  2,  1,  0,  0 },
+    { /*   5:             11 0101 */  6,    53,  1,  2,  0,  0 },
+    { /*   6:             11 0110 */  6,    54,  2,  0,  0,  0 },
+    { /*   7:             11 0111 */  6,    55,  0,  2,  0,  0 },
+    { /*   8:            111 0000 */  7,   112,  3,  1,  0,  0 },
+    { /*   9:            111 0001 */  7,   113,  1,  3,  0,  0 },
+    { /*  10:            111 0010 */  7,   114,  2,  2,  0,  0 },
+    { /*  11:            111 0011 */  7,   115,  3,  0,  0,  0 },
+    { /*  12:            111 0100 */  7,   116,  0,  3,  0,  0 },
+    { /*  13:           1110 1010 */  8,   234,  2,  3,  0,  0 },
+    { /*  14:           1110 1011 */  8,   235,  3,  2,  0,  0 },
+    { /*  15:           1110 1100 */  8,   236,  1,  4,  0,  0 },
+    { /*  16:           1110 1101 */  8,   237,  4,  1,  0,  0 },
+    { /*  17:           1110 1110 */  8,   238,  1,  5,  0,  0 },
+    { /*  18:           1110 1111 */  8,   239,  5,  1,  0,  0 },
+    { /*  19:           1111 0000 */  8,   240,  3,  3,  0,  0 },
+    { /*  20:           1111 0001 */  8,   241,  2,  4,  0,  0 },
+    { /*  21:           1111 0010 */  8,   242,  0,  4,  0,  0 },
+    { /*  22:           1111 0011 */  8,   243,  4,  0,  0,  0 },
+    { /*  23:         1 1110 1000 */  9,   488,  4,  2,  0,  0 },
+    { /*  24:         1 1110 1001 */  9,   489,  2,  5,  0,  0 },
+    { /*  25:         1 1110 1010 */  9,   490,  5,  2,  0,  0 },
+    { /*  26:         1 1110 1011 */  9,   491,  0,  5,  0,  0 },
+    { /*  27:         1 1110 1100 */  9,   492,  6,  1,  0,  0 },
+    { /*  28:         1 1110 1101 */  9,   493,  5,  0,  0,  0 },
+    { /*  29:         1 1110 1110 */  9,   494,  1,  6,  0,  0 },
+    { /*  30:         1 1110 1111 */  9,   495,  4,  3,  0,  0 },
+    { /*  31:         1 1111 0000 */  9,   496,  3,  5,  0,  0 },
+    { /*  32:         1 1111 0001 */  9,   497,  3,  4,  0,  0 },
+    { /*  33:         1 1111 0010 */  9,   498,  5,  3,  0,  0 },
+    { /*  34:         1 1111 0011 */  9,   499,  2,  6,  0,  0 },
+    { /*  35:         1 1111 0100 */  9,   500,  6,  2,  0,  0 },
+    { /*  36:         1 1111 0101 */  9,   501,  1,  7,  0,  0 },
+    { /*  37:        11 1110 1100 */ 10,  1004,  3,  6,  0,  0 },
+    { /*  38:        11 1110 1101 */ 10,  1005,  0,  6,  0,  0 },
+    { /*  39:        11 1110 1110 */ 10,  1006,  6,  0,  0,  0 },
+    { /*  40:        11 1110 1111 */ 10,  1007,  4,  4,  0,  0 },
+    { /*  41:        11 1111 0000 */ 10,  1008,  7,  1,  0,  0 },
+    { /*  42:        11 1111 0001 */ 10,  1009,  4,  5,  0,  0 },
+    { /*  43:        11 1111 0010 */ 10,  1010,  7,  2,  0,  0 },
+    { /*  44:        11 1111 0011 */ 10,  1011,  5,  4,  0,  0 },
+    { /*  45:        11 1111 0100 */ 10,  1012,  6,  3,  0,  0 },
+    { /*  46:        11 1111 0101 */ 10,  1013,  2,  7,  0,  0 },
+    { /*  47:        11 1111 0110 */ 10,  1014,  7,  3,  0,  0 },
+    { /*  48:        11 1111 0111 */ 10,  1015,  6,  4,  0,  0 },
+    { /*  49:        11 1111 1000 */ 10,  1016,  5,  5,  0,  0 },
+    { /*  50:        11 1111 1001 */ 10,  1017,  4,  6,  0,  0 },
+    { /*  51:        11 1111 1010 */ 10,  1018,  3,  7,  0,  0 },
+    { /*  52:       111 1111 0110 */ 11,  2038,  7,  0,  0,  0 },
+    { /*  53:       111 1111 0111 */ 11,  2039,  0,  7,  0,  0 },
+    { /*  54:       111 1111 1000 */ 11,  2040,  6,  5,  0,  0 },
+    { /*  55:       111 1111 1001 */ 11,  2041,  5,  6,  0,  0 },
+    { /*  56:       111 1111 1010 */ 11,  2042,  7,  4,  0,  0 },
+    { /*  57:       111 1111 1011 */ 11,  2043,  4,  7,  0,  0 },
+    { /*  58:       111 1111 1100 */ 11,  2044,  5,  7,  0,  0 },
+    { /*  59:       111 1111 1101 */ 11,  2045,  7,  5,  0,  0 },
+    { /*  60:      1111 1111 1100 */ 12,  4092,  7,  6,  0,  0 },
+    { /*  61:      1111 1111 1101 */ 12,  4093,  6,  6,  0,  0 },
+    { /*  62:      1111 1111 1110 */ 12,  4094,  6,  7,  0,  0 },
+    { /*  63:      1111 1111 1111 */ 12,  4095,  7,  7,  0,  0 }
+};
+
+extern codebook book8[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                 000 */  3,     0,  1,  1,  0,  0 },
+    { /*   1:                0010 */  4,     2,  2,  1,  0,  0 },
+    { /*   2:                0011 */  4,     3,  1,  0,  0,  0 },
+    { /*   3:                0100 */  4,     4,  1,  2,  0,  0 },
+    { /*   4:                0101 */  4,     5,  0,  1,  0,  0 },
+    { /*   5:                0110 */  4,     6,  2,  2,  0,  0 },
+    { /*   6:              0 1110 */  5,    14,  0,  0,  0,  0 },
+    { /*   7:              0 1111 */  5,    15,  2,  0,  0,  0 },
+    { /*   8:              1 0000 */  5,    16,  0,  2,  0,  0 },
+    { /*   9:              1 0001 */  5,    17,  3,  1,  0,  0 },
+    { /*  10:              1 0010 */  5,    18,  1,  3,  0,  0 },
+    { /*  11:              1 0011 */  5,    19,  3,  2,  0,  0 },
+    { /*  12:              1 0100 */  5,    20,  2,  3,  0,  0 },
+    { /*  13:             10 1010 */  6,    42,  3,  3,  0,  0 },
+    { /*  14:             10 1011 */  6,    43,  4,  1,  0,  0 },
+    { /*  15:             10 1100 */  6,    44,  1,  4,  0,  0 },
+    { /*  16:             10 1101 */  6,    45,  4,  2,  0,  0 },
+    { /*  17:             10 1110 */  6,    46,  2,  4,  0,  0 },
+    { /*  18:             10 1111 */  6,    47,  3,  0,  0,  0 },
+    { /*  19:             11 0000 */  6,    48,  0,  3,  0,  0 },
+    { /*  20:             11 0001 */  6,    49,  4,  3,  0,  0 },
+    { /*  21:             11 0010 */  6,    50,  3,  4,  0,  0 },
+    { /*  22:             11 0011 */  6,    51,  5,  2,  0,  0 },
+    { /*  23:            110 1000 */  7,   104,  5,  1,  0,  0 },
+    { /*  24:            110 1001 */  7,   105,  2,  5,  0,  0 },
+    { /*  25:            110 1010 */  7,   106,  1,  5,  0,  0 },
+    { /*  26:            110 1011 */  7,   107,  5,  3,  0,  0 },
+    { /*  27:            110 1100 */  7,   108,  3,  5,  0,  0 },
+    { /*  28:            110 1101 */  7,   109,  4,  4,  0,  0 },
+    { /*  29:            110 1110 */  7,   110,  5,  4,  0,  0 },
+    { /*  30:            110 1111 */  7,   111,  0,  4,  0,  0 },
+    { /*  31:            111 0000 */  7,   112,  4,  5,  0,  0 },
+    { /*  32:            111 0001 */  7,   113,  4,  0,  0,  0 },
+    { /*  33:            111 0010 */  7,   114,  2,  6,  0,  0 },
+    { /*  34:            111 0011 */  7,   115,  6,  2,  0,  0 },
+    { /*  35:            111 0100 */  7,   116,  6,  1,  0,  0 },
+    { /*  36:            111 0101 */  7,   117,  1,  6,  0,  0 },
+    { /*  37:           1110 1100 */  8,   236,  3,  6,  0,  0 },
+    { /*  38:           1110 1101 */  8,   237,  6,  3,  0,  0 },
+    { /*  39:           1110 1110 */  8,   238,  5,  5,  0,  0 },
+    { /*  40:           1110 1111 */  8,   239,  5,  0,  0,  0 },
+    { /*  41:           1111 0000 */  8,   240,  6,  4,  0,  0 },
+    { /*  42:           1111 0001 */  8,   241,  0,  5,  0,  0 },
+    { /*  43:           1111 0010 */  8,   242,  4,  6,  0,  0 },
+    { /*  44:           1111 0011 */  8,   243,  7,  1,  0,  0 },
+    { /*  45:           1111 0100 */  8,   244,  7,  2,  0,  0 },
+    { /*  46:           1111 0101 */  8,   245,  2,  7,  0,  0 },
+    { /*  47:           1111 0110 */  8,   246,  6,  5,  0,  0 },
+    { /*  48:           1111 0111 */  8,   247,  7,  3,  0,  0 },
+    { /*  49:           1111 1000 */  8,   248,  1,  7,  0,  0 },
+    { /*  50:           1111 1001 */  8,   249,  5,  6,  0,  0 },
+    { /*  51:           1111 1010 */  8,   250,  3,  7,  0,  0 },
+    { /*  52:         1 1111 0110 */  9,   502,  6,  6,  0,  0 },
+    { /*  53:         1 1111 0111 */  9,   503,  7,  4,  0,  0 },
+    { /*  54:         1 1111 1000 */  9,   504,  6,  0,  0,  0 },
+    { /*  55:         1 1111 1001 */  9,   505,  4,  7,  0,  0 },
+    { /*  56:         1 1111 1010 */  9,   506,  0,  6,  0,  0 },
+    { /*  57:         1 1111 1011 */  9,   507,  7,  5,  0,  0 },
+    { /*  58:         1 1111 1100 */  9,   508,  7,  6,  0,  0 },
+    { /*  59:         1 1111 1101 */  9,   509,  6,  7,  0,  0 },
+    { /*  60:        11 1111 1100 */ 10,  1020,  5,  7,  0,  0 },
+    { /*  61:        11 1111 1101 */ 10,  1021,  7,  0,  0,  0 },
+    { /*  62:        11 1111 1110 */ 10,  1022,  0,  7,  0,  0 },
+    { /*  63:        11 1111 1111 */ 10,  1023,  7,  7,  0,  0 }
+};
+
+extern codebook book9[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                   0 */  1,     0,  0,  0,  0,  0 },
+    { /*   1:                 100 */  3,     4,  1,  0,  0,  0 },
+    { /*   2:                 101 */  3,     5,  0,  1,  0,  0 },
+    { /*   3:                1100 */  4,    12,  1,  1,  0,  0 },
+    { /*   4:             11 0100 */  6,    52,  2,  1,  0,  0 },
+    { /*   5:             11 0101 */  6,    53,  1,  2,  0,  0 },
+    { /*   6:             11 0110 */  6,    54,  2,  0,  0,  0 },
+    { /*   7:             11 0111 */  6,    55,  0,  2,  0,  0 },
+    { /*   8:            111 0000 */  7,   112,  3,  1,  0,  0 },
+    { /*   9:            111 0001 */  7,   113,  2,  2,  0,  0 },
+    { /*  10:            111 0010 */  7,   114,  1,  3,  0,  0 },
+    { /*  11:           1110 0110 */  8,   230,  3,  0,  0,  0 },
+    { /*  12:           1110 0111 */  8,   231,  0,  3,  0,  0 },
+    { /*  13:           1110 1000 */  8,   232,  2,  3,  0,  0 },
+    { /*  14:           1110 1001 */  8,   233,  3,  2,  0,  0 },
+    { /*  15:           1110 1010 */  8,   234,  1,  4,  0,  0 },
+    { /*  16:           1110 1011 */  8,   235,  4,  1,  0,  0 },
+    { /*  17:           1110 1100 */  8,   236,  2,  4,  0,  0 },
+    { /*  18:           1110 1101 */  8,   237,  1,  5,  0,  0 },
+    { /*  19:         1 1101 1100 */  9,   476,  4,  2,  0,  0 },
+    { /*  20:         1 1101 1101 */  9,   477,  3,  3,  0,  0 },
+    { /*  21:         1 1101 1110 */  9,   478,  0,  4,  0,  0 },
+    { /*  22:         1 1101 1111 */  9,   479,  4,  0,  0,  0 },
+    { /*  23:         1 1110 0000 */  9,   480,  5,  1,  0,  0 },
+    { /*  24:         1 1110 0001 */  9,   481,  2,  5,  0,  0 },
+    { /*  25:         1 1110 0010 */  9,   482,  1,  6,  0,  0 },
+    { /*  26:         1 1110 0011 */  9,   483,  3,  4,  0,  0 },
+    { /*  27:         1 1110 0100 */  9,   484,  5,  2,  0,  0 },
+    { /*  28:         1 1110 0101 */  9,   485,  6,  1,  0,  0 },
+    { /*  29:         1 1110 0110 */  9,   486,  4,  3,  0,  0 },
+    { /*  30:        11 1100 1110 */ 10,   974,  0,  5,  0,  0 },
+    { /*  31:        11 1100 1111 */ 10,   975,  2,  6,  0,  0 },
+    { /*  32:        11 1101 0000 */ 10,   976,  5,  0,  0,  0 },
+    { /*  33:        11 1101 0001 */ 10,   977,  1,  7,  0,  0 },
+    { /*  34:        11 1101 0010 */ 10,   978,  3,  5,  0,  0 },
+    { /*  35:        11 1101 0011 */ 10,   979,  1,  8,  0,  0 },
+    { /*  36:        11 1101 0100 */ 10,   980,  8,  1,  0,  0 },
+    { /*  37:        11 1101 0101 */ 10,   981,  4,  4,  0,  0 },
+    { /*  38:        11 1101 0110 */ 10,   982,  5,  3,  0,  0 },
+    { /*  39:        11 1101 0111 */ 10,   983,  6,  2,  0,  0 },
+    { /*  40:        11 1101 1000 */ 10,   984,  7,  1,  0,  0 },
+    { /*  41:        11 1101 1001 */ 10,   985,  0,  6,  0,  0 },
+    { /*  42:        11 1101 1010 */ 10,   986,  8,  2,  0,  0 },
+    { /*  43:        11 1101 1011 */ 10,   987,  2,  8,  0,  0 },
+    { /*  44:        11 1101 1100 */ 10,   988,  3,  6,  0,  0 },
+    { /*  45:        11 1101 1101 */ 10,   989,  2,  7,  0,  0 },
+    { /*  46:        11 1101 1110 */ 10,   990,  4,  5,  0,  0 },
+    { /*  47:        11 1101 1111 */ 10,   991,  9,  1,  0,  0 },
+    { /*  48:        11 1110 0000 */ 10,   992,  1,  9,  0,  0 },
+    { /*  49:        11 1110 0001 */ 10,   993,  7,  2,  0,  0 },
+    { /*  50:       111 1100 0100 */ 11,  1988,  6,  0,  0,  0 },
+    { /*  51:       111 1100 0101 */ 11,  1989,  5,  4,  0,  0 },
+    { /*  52:       111 1100 0110 */ 11,  1990,  6,  3,  0,  0 },
+    { /*  53:       111 1100 0111 */ 11,  1991,  8,  3,  0,  0 },
+    { /*  54:       111 1100 1000 */ 11,  1992,  0,  7,  0,  0 },
+    { /*  55:       111 1100 1001 */ 11,  1993,  9,  2,  0,  0 },
+    { /*  56:       111 1100 1010 */ 11,  1994,  3,  8,  0,  0 },
+    { /*  57:       111 1100 1011 */ 11,  1995,  4,  6,  0,  0 },
+    { /*  58:       111 1100 1100 */ 11,  1996,  3,  7,  0,  0 },
+    { /*  59:       111 1100 1101 */ 11,  1997,  0,  8,  0,  0 },
+    { /*  60:       111 1100 1110 */ 11,  1998, 10,  1,  0,  0 },
+    { /*  61:       111 1100 1111 */ 11,  1999,  6,  4,  0,  0 },
+    { /*  62:       111 1101 0000 */ 11,  2000,  2,  9,  0,  0 },
+    { /*  63:       111 1101 0001 */ 11,  2001,  5,  5,  0,  0 },
+    { /*  64:       111 1101 0010 */ 11,  2002,  8,  0,  0,  0 },
+    { /*  65:       111 1101 0011 */ 11,  2003,  7,  0,  0,  0 },
+    { /*  66:       111 1101 0100 */ 11,  2004,  7,  3,  0,  0 },
+    { /*  67:       111 1101 0101 */ 11,  2005, 10,  2,  0,  0 },
+    { /*  68:       111 1101 0110 */ 11,  2006,  9,  3,  0,  0 },
+    { /*  69:       111 1101 0111 */ 11,  2007,  8,  4,  0,  0 },
+    { /*  70:       111 1101 1000 */ 11,  2008,  1, 10,  0,  0 },
+    { /*  71:       111 1101 1001 */ 11,  2009,  7,  4,  0,  0 },
+    { /*  72:       111 1101 1010 */ 11,  2010,  6,  5,  0,  0 },
+    { /*  73:       111 1101 1011 */ 11,  2011,  5,  6,  0,  0 },
+    { /*  74:       111 1101 1100 */ 11,  2012,  4,  8,  0,  0 },
+    { /*  75:       111 1101 1101 */ 11,  2013,  4,  7,  0,  0 },
+    { /*  76:       111 1101 1110 */ 11,  2014,  3,  9,  0,  0 },
+    { /*  77:       111 1101 1111 */ 11,  2015, 11,  1,  0,  0 },
+    { /*  78:       111 1110 0000 */ 11,  2016,  5,  8,  0,  0 },
+    { /*  79:       111 1110 0001 */ 11,  2017,  9,  0,  0,  0 },
+    { /*  80:       111 1110 0010 */ 11,  2018,  8,  5,  0,  0 },
+    { /*  81:      1111 1100 0110 */ 12,  4038, 10,  3,  0,  0 },
+    { /*  82:      1111 1100 0111 */ 12,  4039,  2, 10,  0,  0 },
+    { /*  83:      1111 1100 1000 */ 12,  4040,  0,  9,  0,  0 },
+    { /*  84:      1111 1100 1001 */ 12,  4041, 11,  2,  0,  0 },
+    { /*  85:      1111 1100 1010 */ 12,  4042,  9,  4,  0,  0 },
+    { /*  86:      1111 1100 1011 */ 12,  4043,  6,  6,  0,  0 },
+    { /*  87:      1111 1100 1100 */ 12,  4044, 12,  1,  0,  0 },
+    { /*  88:      1111 1100 1101 */ 12,  4045,  4,  9,  0,  0 },
+    { /*  89:      1111 1100 1110 */ 12,  4046,  8,  6,  0,  0 },
+    { /*  90:      1111 1100 1111 */ 12,  4047,  1, 11,  0,  0 },
+    { /*  91:      1111 1101 0000 */ 12,  4048,  9,  5,  0,  0 },
+    { /*  92:      1111 1101 0001 */ 12,  4049, 10,  4,  0,  0 },
+    { /*  93:      1111 1101 0010 */ 12,  4050,  5,  7,  0,  0 },
+    { /*  94:      1111 1101 0011 */ 12,  4051,  7,  5,  0,  0 },
+    { /*  95:      1111 1101 0100 */ 12,  4052,  2, 11,  0,  0 },
+    { /*  96:      1111 1101 0101 */ 12,  4053,  1, 12,  0,  0 },
+    { /*  97:      1111 1101 0110 */ 12,  4054, 12,  2,  0,  0 },
+    { /*  98:      1111 1101 0111 */ 12,  4055, 11,  3,  0,  0 },
+    { /*  99:      1111 1101 1000 */ 12,  4056,  3, 10,  0,  0 },
+    { /* 100:      1111 1101 1001 */ 12,  4057,  5,  9,  0,  0 },
+    { /* 101:      1111 1101 1010 */ 12,  4058,  6,  7,  0,  0 },
+    { /* 102:      1111 1101 1011 */ 12,  4059,  8,  7,  0,  0 },
+    { /* 103:      1111 1101 1100 */ 12,  4060, 11,  4,  0,  0 },
+    { /* 104:      1111 1101 1101 */ 12,  4061,  0, 10,  0,  0 },
+    { /* 105:      1111 1101 1110 */ 12,  4062,  7,  6,  0,  0 },
+    { /* 106:      1111 1101 1111 */ 12,  4063, 12,  3,  0,  0 },
+    { /* 107:      1111 1110 0000 */ 12,  4064, 10,  0,  0,  0 },
+    { /* 108:      1111 1110 0001 */ 12,  4065, 10,  5,  0,  0 },
+    { /* 109:      1111 1110 0010 */ 12,  4066,  4, 10,  0,  0 },
+    { /* 110:      1111 1110 0011 */ 12,  4067,  6,  8,  0,  0 },
+    { /* 111:      1111 1110 0100 */ 12,  4068,  2, 12,  0,  0 },
+    { /* 112:      1111 1110 0101 */ 12,  4069,  9,  6,  0,  0 },
+    { /* 113:      1111 1110 0110 */ 12,  4070,  9,  7,  0,  0 },
+    { /* 114:      1111 1110 0111 */ 12,  4071,  4, 11,  0,  0 },
+    { /* 115:      1111 1110 1000 */ 12,  4072, 11,  0,  0,  0 },
+    { /* 116:      1111 1110 1001 */ 12,  4073,  6,  9,  0,  0 },
+    { /* 117:      1111 1110 1010 */ 12,  4074,  3, 11,  0,  0 },
+    { /* 118:      1111 1110 1011 */ 12,  4075,  5, 10,  0,  0 },
+    { /* 119:    1 1111 1101 1000 */ 13,  8152,  8,  8,  0,  0 },
+    { /* 120:    1 1111 1101 1001 */ 13,  8153,  7,  8,  0,  0 },
+    { /* 121:    1 1111 1101 1010 */ 13,  8154, 12,  5,  0,  0 },
+    { /* 122:    1 1111 1101 1011 */ 13,  8155,  3, 12,  0,  0 },
+    { /* 123:    1 1111 1101 1100 */ 13,  8156, 11,  5,  0,  0 },
+    { /* 124:    1 1111 1101 1101 */ 13,  8157,  7,  7,  0,  0 },
+    { /* 125:    1 1111 1101 1110 */ 13,  8158, 12,  4,  0,  0 },
+    { /* 126:    1 1111 1101 1111 */ 13,  8159, 11,  6,  0,  0 },
+    { /* 127:    1 1111 1110 0000 */ 13,  8160, 10,  6,  0,  0 },
+    { /* 128:    1 1111 1110 0001 */ 13,  8161,  4, 12,  0,  0 },
+    { /* 129:    1 1111 1110 0010 */ 13,  8162,  7,  9,  0,  0 },
+    { /* 130:    1 1111 1110 0011 */ 13,  8163,  5, 11,  0,  0 },
+    { /* 131:    1 1111 1110 0100 */ 13,  8164,  0, 11,  0,  0 },
+    { /* 132:    1 1111 1110 0101 */ 13,  8165, 12,  6,  0,  0 },
+    { /* 133:    1 1111 1110 0110 */ 13,  8166,  6, 10,  0,  0 },
+    { /* 134:    1 1111 1110 0111 */ 13,  8167, 12,  0,  0,  0 },
+    { /* 135:    1 1111 1110 1000 */ 13,  8168, 10,  7,  0,  0 },
+    { /* 136:    1 1111 1110 1001 */ 13,  8169,  5, 12,  0,  0 },
+    { /* 137:    1 1111 1110 1010 */ 13,  8170,  7, 10,  0,  0 },
+    { /* 138:    1 1111 1110 1011 */ 13,  8171,  9,  8,  0,  0 },
+    { /* 139:    1 1111 1110 1100 */ 13,  8172,  0, 12,  0,  0 },
+    { /* 140:    1 1111 1110 1101 */ 13,  8173, 11,  7,  0,  0 },
+    { /* 141:    1 1111 1110 1110 */ 13,  8174,  8,  9,  0,  0 },
+    { /* 142:    1 1111 1110 1111 */ 13,  8175,  9,  9,  0,  0 },
+    { /* 143:    1 1111 1111 0000 */ 13,  8176, 10,  8,  0,  0 },
+    { /* 144:    1 1111 1111 0001 */ 13,  8177,  7, 11,  0,  0 },
+    { /* 145:    1 1111 1111 0010 */ 13,  8178, 12,  7,  0,  0 },
+    { /* 146:    1 1111 1111 0011 */ 13,  8179,  6, 11,  0,  0 },
+    { /* 147:    1 1111 1111 0100 */ 13,  8180,  8, 11,  0,  0 },
+    { /* 148:    1 1111 1111 0101 */ 13,  8181, 11,  8,  0,  0 },
+    { /* 149:    1 1111 1111 0110 */ 13,  8182,  7, 12,  0,  0 },
+    { /* 150:    1 1111 1111 0111 */ 13,  8183,  6, 12,  0,  0 },
+    { /* 151:   11 1111 1111 0000 */ 14, 16368,  8, 10,  0,  0 },
+    { /* 152:   11 1111 1111 0001 */ 14, 16369, 10,  9,  0,  0 },
+    { /* 153:   11 1111 1111 0010 */ 14, 16370,  8, 12,  0,  0 },
+    { /* 154:   11 1111 1111 0011 */ 14, 16371,  9, 10,  0,  0 },
+    { /* 155:   11 1111 1111 0100 */ 14, 16372,  9, 11,  0,  0 },
+    { /* 156:   11 1111 1111 0101 */ 14, 16373,  9, 12,  0,  0 },
+    { /* 157:   11 1111 1111 0110 */ 14, 16374, 10, 11,  0,  0 },
+    { /* 158:   11 1111 1111 0111 */ 14, 16375, 12,  9,  0,  0 },
+    { /* 159:   11 1111 1111 1000 */ 14, 16376, 10, 10,  0,  0 },
+    { /* 160:   11 1111 1111 1001 */ 14, 16377, 11,  9,  0,  0 },
+    { /* 161:   11 1111 1111 1010 */ 14, 16378, 12,  8,  0,  0 },
+    { /* 162:   11 1111 1111 1011 */ 14, 16379, 11, 10,  0,  0 },
+    { /* 163:   11 1111 1111 1100 */ 14, 16380, 12, 10,  0,  0 },
+    { /* 164:   11 1111 1111 1101 */ 14, 16381, 12, 11,  0,  0 },
+    { /* 165:  111 1111 1111 1100 */ 15, 32764, 10, 12,  0,  0 },
+    { /* 166:  111 1111 1111 1101 */ 15, 32765, 11, 11,  0,  0 },
+    { /* 167:  111 1111 1111 1110 */ 15, 32766, 11, 12,  0,  0 },
+    { /* 168:  111 1111 1111 1111 */ 15, 32767, 12, 12,  0,  0 }
+};
+
+extern codebook book10[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  1,  1,  0,  0 },
+    { /*   1:                0001 */  4,     1,  1,  2,  0,  0 },
+    { /*   2:                0010 */  4,     2,  2,  1,  0,  0 },
+    { /*   3:              0 0110 */  5,     6,  2,  2,  0,  0 },
+    { /*   4:              0 0111 */  5,     7,  1,  0,  0,  0 },
+    { /*   5:              0 1000 */  5,     8,  0,  1,  0,  0 },
+    { /*   6:              0 1001 */  5,     9,  1,  3,  0,  0 },
+    { /*   7:              0 1010 */  5,    10,  3,  2,  0,  0 },
+    { /*   8:              0 1011 */  5,    11,  3,  1,  0,  0 },
+    { /*   9:              0 1100 */  5,    12,  2,  3,  0,  0 },
+    { /*  10:              0 1101 */  5,    13,  3,  3,  0,  0 },
+    { /*  11:             01 1100 */  6,    28,  2,  0,  0,  0 },
+    { /*  12:             01 1101 */  6,    29,  0,  2,  0,  0 },
+    { /*  13:             01 1110 */  6,    30,  2,  4,  0,  0 },
+    { /*  14:             01 1111 */  6,    31,  4,  2,  0,  0 },
+    { /*  15:             10 0000 */  6,    32,  1,  4,  0,  0 },
+    { /*  16:             10 0001 */  6,    33,  4,  1,  0,  0 },
+    { /*  17:             10 0010 */  6,    34,  0,  0,  0,  0 },
+    { /*  18:             10 0011 */  6,    35,  4,  3,  0,  0 },
+    { /*  19:             10 0100 */  6,    36,  3,  4,  0,  0 },
+    { /*  20:             10 0101 */  6,    37,  3,  0,  0,  0 },
+    { /*  21:             10 0110 */  6,    38,  0,  3,  0,  0 },
+    { /*  22:             10 0111 */  6,    39,  4,  4,  0,  0 },
+    { /*  23:             10 1000 */  6,    40,  2,  5,  0,  0 },
+    { /*  24:             10 1001 */  6,    41,  5,  2,  0,  0 },
+    { /*  25:            101 0100 */  7,    84,  1,  5,  0,  0 },
+    { /*  26:            101 0101 */  7,    85,  5,  1,  0,  0 },
+    { /*  27:            101 0110 */  7,    86,  5,  3,  0,  0 },
+    { /*  28:            101 0111 */  7,    87,  3,  5,  0,  0 },
+    { /*  29:            101 1000 */  7,    88,  5,  4,  0,  0 },
+    { /*  30:            101 1001 */  7,    89,  4,  5,  0,  0 },
+    { /*  31:            101 1010 */  7,    90,  6,  2,  0,  0 },
+    { /*  32:            101 1011 */  7,    91,  2,  6,  0,  0 },
+    { /*  33:            101 1100 */  7,    92,  6,  3,  0,  0 },
+    { /*  34:            101 1101 */  7,    93,  4,  0,  0,  0 },
+    { /*  35:            101 1110 */  7,    94,  6,  1,  0,  0 },
+    { /*  36:            101 1111 */  7,    95,  0,  4,  0,  0 },
+    { /*  37:            110 0000 */  7,    96,  1,  6,  0,  0 },
+    { /*  38:            110 0001 */  7,    97,  3,  6,  0,  0 },
+    { /*  39:            110 0010 */  7,    98,  5,  5,  0,  0 },
+    { /*  40:            110 0011 */  7,    99,  6,  4,  0,  0 },
+    { /*  41:            110 0100 */  7,   100,  4,  6,  0,  0 },
+    { /*  42:           1100 1010 */  8,   202,  6,  5,  0,  0 },
+    { /*  43:           1100 1011 */  8,   203,  7,  2,  0,  0 },
+    { /*  44:           1100 1100 */  8,   204,  3,  7,  0,  0 },
+    { /*  45:           1100 1101 */  8,   205,  2,  7,  0,  0 },
+    { /*  46:           1100 1110 */  8,   206,  5,  6,  0,  0 },
+    { /*  47:           1100 1111 */  8,   207,  8,  2,  0,  0 },
+    { /*  48:           1101 0000 */  8,   208,  7,  3,  0,  0 },
+    { /*  49:           1101 0001 */  8,   209,  5,  0,  0,  0 },
+    { /*  50:           1101 0010 */  8,   210,  7,  1,  0,  0 },
+    { /*  51:           1101 0011 */  8,   211,  0,  5,  0,  0 },
+    { /*  52:           1101 0100 */  8,   212,  8,  1,  0,  0 },
+    { /*  53:           1101 0101 */  8,   213,  1,  7,  0,  0 },
+    { /*  54:           1101 0110 */  8,   214,  8,  3,  0,  0 },
+    { /*  55:           1101 0111 */  8,   215,  7,  4,  0,  0 },
+    { /*  56:           1101 1000 */  8,   216,  4,  7,  0,  0 },
+    { /*  57:           1101 1001 */  8,   217,  2,  8,  0,  0 },
+    { /*  58:           1101 1010 */  8,   218,  6,  6,  0,  0 },
+    { /*  59:           1101 1011 */  8,   219,  7,  5,  0,  0 },
+    { /*  60:           1101 1100 */  8,   220,  1,  8,  0,  0 },
+    { /*  61:           1101 1101 */  8,   221,  3,  8,  0,  0 },
+    { /*  62:           1101 1110 */  8,   222,  8,  4,  0,  0 },
+    { /*  63:           1101 1111 */  8,   223,  4,  8,  0,  0 },
+    { /*  64:           1110 0000 */  8,   224,  5,  7,  0,  0 },
+    { /*  65:           1110 0001 */  8,   225,  8,  5,  0,  0 },
+    { /*  66:           1110 0010 */  8,   226,  5,  8,  0,  0 },
+    { /*  67:         1 1100 0110 */  9,   454,  7,  6,  0,  0 },
+    { /*  68:         1 1100 0111 */  9,   455,  6,  7,  0,  0 },
+    { /*  69:         1 1100 1000 */  9,   456,  9,  2,  0,  0 },
+    { /*  70:         1 1100 1001 */  9,   457,  6,  0,  0,  0 },
+    { /*  71:         1 1100 1010 */  9,   458,  6,  8,  0,  0 },
+    { /*  72:         1 1100 1011 */  9,   459,  9,  3,  0,  0 },
+    { /*  73:         1 1100 1100 */  9,   460,  3,  9,  0,  0 },
+    { /*  74:         1 1100 1101 */  9,   461,  9,  1,  0,  0 },
+    { /*  75:         1 1100 1110 */  9,   462,  2,  9,  0,  0 },
+    { /*  76:         1 1100 1111 */  9,   463,  0,  6,  0,  0 },
+    { /*  77:         1 1101 0000 */  9,   464,  8,  6,  0,  0 },
+    { /*  78:         1 1101 0001 */  9,   465,  9,  4,  0,  0 },
+    { /*  79:         1 1101 0010 */  9,   466,  4,  9,  0,  0 },
+    { /*  80:         1 1101 0011 */  9,   467, 10,  2,  0,  0 },
+    { /*  81:         1 1101 0100 */  9,   468,  1,  9,  0,  0 },
+    { /*  82:         1 1101 0101 */  9,   469,  7,  7,  0,  0 },
+    { /*  83:         1 1101 0110 */  9,   470,  8,  7,  0,  0 },
+    { /*  84:         1 1101 0111 */  9,   471,  9,  5,  0,  0 },
+    { /*  85:         1 1101 1000 */  9,   472,  7,  8,  0,  0 },
+    { /*  86:         1 1101 1001 */  9,   473, 10,  3,  0,  0 },
+    { /*  87:         1 1101 1010 */  9,   474,  5,  9,  0,  0 },
+    { /*  88:         1 1101 1011 */  9,   475, 10,  4,  0,  0 },
+    { /*  89:         1 1101 1100 */  9,   476,  2, 10,  0,  0 },
+    { /*  90:         1 1101 1101 */  9,   477, 10,  1,  0,  0 },
+    { /*  91:         1 1101 1110 */  9,   478,  3, 10,  0,  0 },
+    { /*  92:         1 1101 1111 */  9,   479,  9,  6,  0,  0 },
+    { /*  93:         1 1110 0000 */  9,   480,  6,  9,  0,  0 },
+    { /*  94:         1 1110 0001 */  9,   481,  8,  0,  0,  0 },
+    { /*  95:         1 1110 0010 */  9,   482,  4, 10,  0,  0 },
+    { /*  96:         1 1110 0011 */  9,   483,  7,  0,  0,  0 },
+    { /*  97:         1 1110 0100 */  9,   484, 11,  2,  0,  0 },
+    { /*  98:        11 1100 1010 */ 10,   970,  7,  9,  0,  0 },
+    { /*  99:        11 1100 1011 */ 10,   971, 11,  3,  0,  0 },
+    { /* 100:        11 1100 1100 */ 10,   972, 10,  6,  0,  0 },
+    { /* 101:        11 1100 1101 */ 10,   973,  1, 10,  0,  0 },
+    { /* 102:        11 1100 1110 */ 10,   974, 11,  1,  0,  0 },
+    { /* 103:        11 1100 1111 */ 10,   975,  9,  7,  0,  0 },
+    { /* 104:        11 1101 0000 */ 10,   976,  0,  7,  0,  0 },
+    { /* 105:        11 1101 0001 */ 10,   977,  8,  8,  0,  0 },
+    { /* 106:        11 1101 0010 */ 10,   978, 10,  5,  0,  0 },
+    { /* 107:        11 1101 0011 */ 10,   979,  3, 11,  0,  0 },
+    { /* 108:        11 1101 0100 */ 10,   980,  5, 10,  0,  0 },
+    { /* 109:        11 1101 0101 */ 10,   981,  8,  9,  0,  0 },
+    { /* 110:        11 1101 0110 */ 10,   982, 11,  5,  0,  0 },
+    { /* 111:        11 1101 0111 */ 10,   983,  0,  8,  0,  0 },
+    { /* 112:        11 1101 1000 */ 10,   984, 11,  4,  0,  0 },
+    { /* 113:        11 1101 1001 */ 10,   985,  2, 11,  0,  0 },
+    { /* 114:        11 1101 1010 */ 10,   986,  7, 10,  0,  0 },
+    { /* 115:        11 1101 1011 */ 10,   987,  6, 10,  0,  0 },
+    { /* 116:        11 1101 1100 */ 10,   988, 10,  7,  0,  0 },
+    { /* 117:        11 1101 1101 */ 10,   989,  4, 11,  0,  0 },
+    { /* 118:        11 1101 1110 */ 10,   990,  1, 11,  0,  0 },
+    { /* 119:        11 1101 1111 */ 10,   991, 12,  2,  0,  0 },
+    { /* 120:        11 1110 0000 */ 10,   992,  9,  8,  0,  0 },
+    { /* 121:        11 1110 0001 */ 10,   993, 12,  3,  0,  0 },
+    { /* 122:        11 1110 0010 */ 10,   994, 11,  6,  0,  0 },
+    { /* 123:        11 1110 0011 */ 10,   995,  5, 11,  0,  0 },
+    { /* 124:        11 1110 0100 */ 10,   996, 12,  4,  0,  0 },
+    { /* 125:        11 1110 0101 */ 10,   997, 11,  7,  0,  0 },
+    { /* 126:        11 1110 0110 */ 10,   998, 12,  5,  0,  0 },
+    { /* 127:        11 1110 0111 */ 10,   999,  3, 12,  0,  0 },
+    { /* 128:        11 1110 1000 */ 10,  1000,  6, 11,  0,  0 },
+    { /* 129:        11 1110 1001 */ 10,  1001,  9,  0,  0,  0 },
+    { /* 130:        11 1110 1010 */ 10,  1002, 10,  8,  0,  0 },
+    { /* 131:        11 1110 1011 */ 10,  1003, 10,  0,  0,  0 },
+    { /* 132:        11 1110 1100 */ 10,  1004, 12,  1,  0,  0 },
+    { /* 133:        11 1110 1101 */ 10,  1005,  0,  9,  0,  0 },
+    { /* 134:        11 1110 1110 */ 10,  1006,  4, 12,  0,  0 },
+    { /* 135:        11 1110 1111 */ 10,  1007,  9,  9,  0,  0 },
+    { /* 136:        11 1111 0000 */ 10,  1008, 12,  6,  0,  0 },
+    { /* 137:        11 1111 0001 */ 10,  1009,  2, 12,  0,  0 },
+    { /* 138:        11 1111 0010 */ 10,  1010,  8, 10,  0,  0 },
+    { /* 139:       111 1110 0110 */ 11,  2022,  9, 10,  0,  0 },
+    { /* 140:       111 1110 0111 */ 11,  2023,  1, 12,  0,  0 },
+    { /* 141:       111 1110 1000 */ 11,  2024, 11,  8,  0,  0 },
+    { /* 142:       111 1110 1001 */ 11,  2025, 12,  7,  0,  0 },
+    { /* 143:       111 1110 1010 */ 11,  2026,  7, 11,  0,  0 },
+    { /* 144:       111 1110 1011 */ 11,  2027,  5, 12,  0,  0 },
+    { /* 145:       111 1110 1100 */ 11,  2028,  6, 12,  0,  0 },
+    { /* 146:       111 1110 1101 */ 11,  2029, 10,  9,  0,  0 },
+    { /* 147:       111 1110 1110 */ 11,  2030,  8, 11,  0,  0 },
+    { /* 148:       111 1110 1111 */ 11,  2031, 12,  8,  0,  0 },
+    { /* 149:       111 1111 0000 */ 11,  2032,  0, 10,  0,  0 },
+    { /* 150:       111 1111 0001 */ 11,  2033,  7, 12,  0,  0 },
+    { /* 151:       111 1111 0010 */ 11,  2034, 11,  0,  0,  0 },
+    { /* 152:       111 1111 0011 */ 11,  2035, 10, 10,  0,  0 },
+    { /* 153:       111 1111 0100 */ 11,  2036, 11,  9,  0,  0 },
+    { /* 154:       111 1111 0101 */ 11,  2037, 11, 10,  0,  0 },
+    { /* 155:       111 1111 0110 */ 11,  2038,  0, 11,  0,  0 },
+    { /* 156:       111 1111 0111 */ 11,  2039, 11, 11,  0,  0 },
+    { /* 157:       111 1111 1000 */ 11,  2040,  9, 11,  0,  0 },
+    { /* 158:       111 1111 1001 */ 11,  2041, 10, 11,  0,  0 },
+    { /* 159:       111 1111 1010 */ 11,  2042, 12,  0,  0,  0 },
+    { /* 160:       111 1111 1011 */ 11,  2043,  8, 12,  0,  0 },
+    { /* 161:      1111 1111 1000 */ 12,  4088, 12,  9,  0,  0 },
+    { /* 162:      1111 1111 1001 */ 12,  4089, 10, 12,  0,  0 },
+    { /* 163:      1111 1111 1010 */ 12,  4090,  9, 12,  0,  0 },
+    { /* 164:      1111 1111 1011 */ 12,  4091, 11, 12,  0,  0 },
+    { /* 165:      1111 1111 1100 */ 12,  4092, 12, 11,  0,  0 },
+    { /* 166:      1111 1111 1101 */ 12,  4093,  0, 12,  0,  0 },
+    { /* 167:      1111 1111 1110 */ 12,  4094, 12, 10,  0,  0 },
+    { /* 168:      1111 1111 1111 */ 12,  4095, 12, 12,  0,  0 }
+};
+
+extern codebook book11[] = {
+      /* idx             codeword   len  codew   x   y   v   w */
+    { /*   0:                0000 */  4,     0,  0,  0,  0,  0 },
+    { /*   1:                0001 */  4,     1,  1,  1,  0,  0 },
+    { /*   2:              0 0100 */  5,     4, 16, 16,  0,  0 },
+    { /*   3:              0 0101 */  5,     5,  1,  0,  0,  0 },
+    { /*   4:              0 0110 */  5,     6,  0,  1,  0,  0 },
+    { /*   5:              0 0111 */  5,     7,  2,  1,  0,  0 },
+    { /*   6:              0 1000 */  5,     8,  1,  2,  0,  0 },
+    { /*   7:              0 1001 */  5,     9,  2,  2,  0,  0 },
+    { /*   8:             01 0100 */  6,    20,  1,  3,  0,  0 },
+    { /*   9:             01 0101 */  6,    21,  3,  1,  0,  0 },
+    { /*  10:             01 0110 */  6,    22,  3,  2,  0,  0 },
+    { /*  11:             01 0111 */  6,    23,  2,  0,  0,  0 },
+    { /*  12:             01 1000 */  6,    24,  2,  3,  0,  0 },
+    { /*  13:             01 1001 */  6,    25,  0,  2,  0,  0 },
+    { /*  14:             01 1010 */  6,    26,  3,  3,  0,  0 },
+    { /*  15:            011 0110 */  7,    54,  4,  1,  0,  0 },
+    { /*  16:            011 0111 */  7,    55,  1,  4,  0,  0 },
+    { /*  17:            011 1000 */  7,    56,  4,  2,  0,  0 },
+    { /*  18:            011 1001 */  7,    57,  2,  4,  0,  0 },
+    { /*  19:            011 1010 */  7,    58,  4,  3,  0,  0 },
+    { /*  20:            011 1011 */  7,    59,  3,  4,  0,  0 },
+    { /*  21:            011 1100 */  7,    60,  3,  0,  0,  0 },
+    { /*  22:            011 1101 */  7,    61,  0,  3,  0,  0 },
+    { /*  23:            011 1110 */  7,    62,  5,  1,  0,  0 },
+    { /*  24:            011 1111 */  7,    63,  5,  2,  0,  0 },
+    { /*  25:            100 0000 */  7,    64,  2,  5,  0,  0 },
+    { /*  26:            100 0001 */  7,    65,  4,  4,  0,  0 },
+    { /*  27:            100 0010 */  7,    66,  1,  5,  0,  0 },
+    { /*  28:            100 0011 */  7,    67,  5,  3,  0,  0 },
+    { /*  29:            100 0100 */  7,    68,  3,  5,  0,  0 },
+    { /*  30:            100 0101 */  7,    69,  5,  4,  0,  0 },
+    { /*  31:           1000 1100 */  8,   140,  4,  5,  0,  0 },
+    { /*  32:           1000 1101 */  8,   141,  6,  2,  0,  0 },
+    { /*  33:           1000 1110 */  8,   142,  2,  6,  0,  0 },
+    { /*  34:           1000 1111 */  8,   143,  6,  1,  0,  0 },
+    { /*  35:           1001 0000 */  8,   144,  6,  3,  0,  0 },
+    { /*  36:           1001 0001 */  8,   145,  3,  6,  0,  0 },
+    { /*  37:           1001 0010 */  8,   146,  1,  6,  0,  0 },
+    { /*  38:           1001 0011 */  8,   147,  4, 16,  0,  0 },
+    { /*  39:           1001 0100 */  8,   148,  3, 16,  0,  0 },
+    { /*  40:           1001 0101 */  8,   149, 16,  5,  0,  0 },
+    { /*  41:           1001 0110 */  8,   150, 16,  3,  0,  0 },
+    { /*  42:           1001 0111 */  8,   151, 16,  4,  0,  0 },
+    { /*  43:           1001 1000 */  8,   152,  6,  4,  0,  0 },
+    { /*  44:           1001 1001 */  8,   153, 16,  6,  0,  0 },
+    { /*  45:           1001 1010 */  8,   154,  4,  0,  0,  0 },
+    { /*  46:           1001 1011 */  8,   155,  4,  6,  0,  0 },
+    { /*  47:           1001 1100 */  8,   156,  0,  4,  0,  0 },
+    { /*  48:           1001 1101 */  8,   157,  2, 16,  0,  0 },
+    { /*  49:           1001 1110 */  8,   158,  5,  5,  0,  0 },
+    { /*  50:           1001 1111 */  8,   159,  5, 16,  0,  0 },
+    { /*  51:           1010 0000 */  8,   160, 16,  7,  0,  0 },
+    { /*  52:           1010 0001 */  8,   161, 16,  2,  0,  0 },
+    { /*  53:           1010 0010 */  8,   162, 16,  8,  0,  0 },
+    { /*  54:           1010 0011 */  8,   163,  2,  7,  0,  0 },
+    { /*  55:           1010 0100 */  8,   164,  7,  2,  0,  0 },
+    { /*  56:           1010 0101 */  8,   165,  3,  7,  0,  0 },
+    { /*  57:           1010 0110 */  8,   166,  6,  5,  0,  0 },
+    { /*  58:           1010 0111 */  8,   167,  5,  6,  0,  0 },
+    { /*  59:           1010 1000 */  8,   168,  6, 16,  0,  0 },
+    { /*  60:           1010 1001 */  8,   169, 16, 10,  0,  0 },
+    { /*  61:           1010 1010 */  8,   170,  7,  3,  0,  0 },
+    { /*  62:           1010 1011 */  8,   171,  7,  1,  0,  0 },
+    { /*  63:           1010 1100 */  8,   172, 16,  9,  0,  0 },
+    { /*  64:           1010 1101 */  8,   173,  7, 16,  0,  0 },
+    { /*  65:           1010 1110 */  8,   174,  1, 16,  0,  0 },
+    { /*  66:           1010 1111 */  8,   175,  1,  7,  0,  0 },
+    { /*  67:           1011 0000 */  8,   176,  4,  7,  0,  0 },
+    { /*  68:           1011 0001 */  8,   177, 16, 11,  0,  0 },
+    { /*  69:           1011 0010 */  8,   178,  7,  4,  0,  0 },
+    { /*  70:           1011 0011 */  8,   179, 16, 12,  0,  0 },
+    { /*  71:           1011 0100 */  8,   180,  8, 16,  0,  0 },
+    { /*  72:           1011 0101 */  8,   181, 16,  1,  0,  0 },
+    { /*  73:           1011 0110 */  8,   182,  6,  6,  0,  0 },
+    { /*  74:           1011 0111 */  8,   183,  9, 16,  0,  0 },
+    { /*  75:           1011 1000 */  8,   184,  2,  8,  0,  0 },
+    { /*  76:           1011 1001 */  8,   185,  5,  7,  0,  0 },
+    { /*  77:           1011 1010 */  8,   186, 10, 16,  0,  0 },
+    { /*  78:           1011 1011 */  8,   187, 16, 13,  0,  0 },
+    { /*  79:           1011 1100 */  8,   188,  8,  3,  0,  0 },
+    { /*  80:           1011 1101 */  8,   189,  8,  2,  0,  0 },
+    { /*  81:           1011 1110 */  8,   190,  3,  8,  0,  0 },
+    { /*  82:           1011 1111 */  8,   191,  5,  0,  0,  0 },
+    { /*  83:           1100 0000 */  8,   192, 16, 14,  0,  0 },
+    { /*  84:           1100 0001 */  8,   193, 11, 16,  0,  0 },
+    { /*  85:           1100 0010 */  8,   194,  7,  5,  0,  0 },
+    { /*  86:           1100 0011 */  8,   195,  4,  8,  0,  0 },
+    { /*  87:           1100 0100 */  8,   196,  6,  7,  0,  0 },
+    { /*  88:           1100 0101 */  8,   197,  7,  6,  0,  0 },
+    { /*  89:           1100 0110 */  8,   198,  0,  5,  0,  0 },
+    { /*  90:         1 1000 1110 */  9,   398,  8,  4,  0,  0 },
+    { /*  91:         1 1000 1111 */  9,   399, 16, 15,  0,  0 },
+    { /*  92:         1 1001 0000 */  9,   400, 12, 16,  0,  0 },
+    { /*  93:         1 1001 0001 */  9,   401,  1,  8,  0,  0 },
+    { /*  94:         1 1001 0010 */  9,   402,  8,  1,  0,  0 },
+    { /*  95:         1 1001 0011 */  9,   403, 14, 16,  0,  0 },
+    { /*  96:         1 1001 0100 */  9,   404,  5,  8,  0,  0 },
+    { /*  97:         1 1001 0101 */  9,   405, 13, 16,  0,  0 },
+    { /*  98:         1 1001 0110 */  9,   406,  3,  9,  0,  0 },
+    { /*  99:         1 1001 0111 */  9,   407,  8,  5,  0,  0 },
+    { /* 100:         1 1001 1000 */  9,   408,  7,  7,  0,  0 },
+    { /* 101:         1 1001 1001 */  9,   409,  2,  9,  0,  0 },
+    { /* 102:         1 1001 1010 */  9,   410,  8,  6,  0,  0 },
+    { /* 103:         1 1001 1011 */  9,   411,  9,  2,  0,  0 },
+    { /* 104:         1 1001 1100 */  9,   412,  9,  3,  0,  0 },
+    { /* 105:         1 1001 1101 */  9,   413, 15, 16,  0,  0 },
+    { /* 106:         1 1001 1110 */  9,   414,  4,  9,  0,  0 },
+    { /* 107:         1 1001 1111 */  9,   415,  6,  8,  0,  0 },
+    { /* 108:         1 1010 0000 */  9,   416,  6,  0,  0,  0 },
+    { /* 109:         1 1010 0001 */  9,   417,  9,  4,  0,  0 },
+    { /* 110:         1 1010 0010 */  9,   418,  5,  9,  0,  0 },
+    { /* 111:         1 1010 0011 */  9,   419,  8,  7,  0,  0 },
+    { /* 112:         1 1010 0100 */  9,   420,  7,  8,  0,  0 },
+    { /* 113:         1 1010 0101 */  9,   421,  1,  9,  0,  0 },
+    { /* 114:         1 1010 0110 */  9,   422, 10,  3,  0,  0 },
+    { /* 115:         1 1010 0111 */  9,   423,  0,  6,  0,  0 },
+    { /* 116:         1 1010 1000 */  9,   424, 10,  2,  0,  0 },
+    { /* 117:         1 1010 1001 */  9,   425,  9,  1,  0,  0 },
+    { /* 118:         1 1010 1010 */  9,   426,  9,  5,  0,  0 },
+    { /* 119:         1 1010 1011 */  9,   427,  4, 10,  0,  0 },
+    { /* 120:         1 1010 1100 */  9,   428,  2, 10,  0,  0 },
+    { /* 121:         1 1010 1101 */  9,   429,  9,  6,  0,  0 },
+    { /* 122:         1 1010 1110 */  9,   430,  3, 10,  0,  0 },
+    { /* 123:         1 1010 1111 */  9,   431,  6,  9,  0,  0 },
+    { /* 124:         1 1011 0000 */  9,   432, 10,  4,  0,  0 },
+    { /* 125:         1 1011 0001 */  9,   433,  8,  8,  0,  0 },
+    { /* 126:         1 1011 0010 */  9,   434, 10,  5,  0,  0 },
+    { /* 127:         1 1011 0011 */  9,   435,  9,  7,  0,  0 },
+    { /* 128:         1 1011 0100 */  9,   436, 11,  3,  0,  0 },
+    { /* 129:         1 1011 0101 */  9,   437,  1, 10,  0,  0 },
+    { /* 130:         1 1011 0110 */  9,   438,  7,  0,  0,  0 },
+    { /* 131:         1 1011 0111 */  9,   439, 10,  6,  0,  0 },
+    { /* 132:         1 1011 1000 */  9,   440,  7,  9,  0,  0 },
+    { /* 133:         1 1011 1001 */  9,   441,  3, 11,  0,  0 },
+    { /* 134:         1 1011 1010 */  9,   442,  5, 10,  0,  0 },
+    { /* 135:         1 1011 1011 */  9,   443, 10,  1,  0,  0 },
+    { /* 136:         1 1011 1100 */  9,   444,  4, 11,  0,  0 },
+    { /* 137:         1 1011 1101 */  9,   445, 11,  2,  0,  0 },
+    { /* 138:         1 1011 1110 */  9,   446, 13,  2,  0,  0 },
+    { /* 139:         1 1011 1111 */  9,   447,  6, 10,  0,  0 },
+    { /* 140:         1 1100 0000 */  9,   448, 13,  3,  0,  0 },
+    { /* 141:         1 1100 0001 */  9,   449,  2, 11,  0,  0 },
+    { /* 142:         1 1100 0010 */  9,   450, 16,  0,  0,  0 },
+    { /* 143:         1 1100 0011 */  9,   451,  5, 11,  0,  0 },
+    { /* 144:         1 1100 0100 */  9,   452, 11,  5,  0,  0 },
+    { /* 145:        11 1000 1010 */ 10,   906, 11,  4,  0,  0 },
+    { /* 146:        11 1000 1011 */ 10,   907,  9,  8,  0,  0 },
+    { /* 147:        11 1000 1100 */ 10,   908,  7, 10,  0,  0 },
+    { /* 148:        11 1000 1101 */ 10,   909,  8,  9,  0,  0 },
+    { /* 149:        11 1000 1110 */ 10,   910,  0, 16,  0,  0 },
+    { /* 150:        11 1000 1111 */ 10,   911,  4, 13,  0,  0 },
+    { /* 151:        11 1001 0000 */ 10,   912,  0,  7,  0,  0 },
+    { /* 152:        11 1001 0001 */ 10,   913,  3, 13,  0,  0 },
+    { /* 153:        11 1001 0010 */ 10,   914, 11,  6,  0,  0 },
+    { /* 154:        11 1001 0011 */ 10,   915, 13,  1,  0,  0 },
+    { /* 155:        11 1001 0100 */ 10,   916, 13,  4,  0,  0 },
+    { /* 156:        11 1001 0101 */ 10,   917, 12,  3,  0,  0 },
+    { /* 157:        11 1001 0110 */ 10,   918,  2, 13,  0,  0 },
+    { /* 158:        11 1001 0111 */ 10,   919, 13,  5,  0,  0 },
+    { /* 159:        11 1001 1000 */ 10,   920,  8, 10,  0,  0 },
+    { /* 160:        11 1001 1001 */ 10,   921,  6, 11,  0,  0 },
+    { /* 161:        11 1001 1010 */ 10,   922, 10,  8,  0,  0 },
+    { /* 162:        11 1001 1011 */ 10,   923, 10,  7,  0,  0 },
+    { /* 163:        11 1001 1100 */ 10,   924, 14,  2,  0,  0 },
+    { /* 164:        11 1001 1101 */ 10,   925, 12,  4,  0,  0 },
+    { /* 165:        11 1001 1110 */ 10,   926,  1, 11,  0,  0 },
+    { /* 166:        11 1001 1111 */ 10,   927,  4, 12,  0,  0 },
+    { /* 167:        11 1010 0000 */ 10,   928, 11,  1,  0,  0 },
+    { /* 168:        11 1010 0001 */ 10,   929,  3, 12,  0,  0 },
+    { /* 169:        11 1010 0010 */ 10,   930,  1, 13,  0,  0 },
+    { /* 170:        11 1010 0011 */ 10,   931, 12,  2,  0,  0 },
+    { /* 171:        11 1010 0100 */ 10,   932,  7, 11,  0,  0 },
+    { /* 172:        11 1010 0101 */ 10,   933,  3, 14,  0,  0 },
+    { /* 173:        11 1010 0110 */ 10,   934,  5, 12,  0,  0 },
+    { /* 174:        11 1010 0111 */ 10,   935,  5, 13,  0,  0 },
+    { /* 175:        11 1010 1000 */ 10,   936, 14,  4,  0,  0 },
+    { /* 176:        11 1010 1001 */ 10,   937,  4, 14,  0,  0 },
+    { /* 177:        11 1010 1010 */ 10,   938, 11,  7,  0,  0 },
+    { /* 178:        11 1010 1011 */ 10,   939, 14,  3,  0,  0 },
+    { /* 179:        11 1010 1100 */ 10,   940, 12,  5,  0,  0 },
+    { /* 180:        11 1010 1101 */ 10,   941, 13,  6,  0,  0 },
+    { /* 181:        11 1010 1110 */ 10,   942, 12,  6,  0,  0 },
+    { /* 182:        11 1010 1111 */ 10,   943,  8,  0,  0,  0 },
+    { /* 183:        11 1011 0000 */ 10,   944, 11,  8,  0,  0 },
+    { /* 184:        11 1011 0001 */ 10,   945,  2, 12,  0,  0 },
+    { /* 185:        11 1011 0010 */ 10,   946,  9,  9,  0,  0 },
+    { /* 186:        11 1011 0011 */ 10,   947, 14,  5,  0,  0 },
+    { /* 187:        11 1011 0100 */ 10,   948,  6, 13,  0,  0 },
+    { /* 188:        11 1011 0101 */ 10,   949, 10, 10,  0,  0 },
+    { /* 189:        11 1011 0110 */ 10,   950, 15,  2,  0,  0 },
+    { /* 190:        11 1011 0111 */ 10,   951,  8, 11,  0,  0 },
+    { /* 191:        11 1011 1000 */ 10,   952,  9, 10,  0,  0 },
+    { /* 192:        11 1011 1001 */ 10,   953, 14,  6,  0,  0 },
+    { /* 193:        11 1011 1010 */ 10,   954, 10,  9,  0,  0 },
+    { /* 194:        11 1011 1011 */ 10,   955,  5, 14,  0,  0 },
+    { /* 195:        11 1011 1100 */ 10,   956, 11,  9,  0,  0 },
+    { /* 196:        11 1011 1101 */ 10,   957, 14,  1,  0,  0 },
+    { /* 197:        11 1011 1110 */ 10,   958,  2, 14,  0,  0 },
+    { /* 198:        11 1011 1111 */ 10,   959,  6, 12,  0,  0 },
+    { /* 199:        11 1100 0000 */ 10,   960,  1, 12,  0,  0 },
+    { /* 200:        11 1100 0001 */ 10,   961, 13,  8,  0,  0 },
+    { /* 201:        11 1100 0010 */ 10,   962,  0,  8,  0,  0 },
+    { /* 202:        11 1100 0011 */ 10,   963, 13,  7,  0,  0 },
+    { /* 203:        11 1100 0100 */ 10,   964,  7, 12,  0,  0 },
+    { /* 204:        11 1100 0101 */ 10,   965, 12,  7,  0,  0 },
+    { /* 205:        11 1100 0110 */ 10,   966,  7, 13,  0,  0 },
+    { /* 206:        11 1100 0111 */ 10,   967, 15,  3,  0,  0 },
+    { /* 207:        11 1100 1000 */ 10,   968, 12,  1,  0,  0 },
+    { /* 208:        11 1100 1001 */ 10,   969,  6, 14,  0,  0 },
+    { /* 209:        11 1100 1010 */ 10,   970,  2, 15,  0,  0 },
+    { /* 210:        11 1100 1011 */ 10,   971, 15,  5,  0,  0 },
+    { /* 211:        11 1100 1100 */ 10,   972, 15,  4,  0,  0 },
+    { /* 212:        11 1100 1101 */ 10,   973,  1, 14,  0,  0 },
+    { /* 213:        11 1100 1110 */ 10,   974,  9, 11,  0,  0 },
+    { /* 214:        11 1100 1111 */ 10,   975,  4, 15,  0,  0 },
+    { /* 215:        11 1101 0000 */ 10,   976, 14,  7,  0,  0 },
+    { /* 216:        11 1101 0001 */ 10,   977,  8, 13,  0,  0 },
+    { /* 217:        11 1101 0010 */ 10,   978, 13,  9,  0,  0 },
+    { /* 218:        11 1101 0011 */ 10,   979,  8, 12,  0,  0 },
+    { /* 219:        11 1101 0100 */ 10,   980,  5, 15,  0,  0 },
+    { /* 220:        11 1101 0101 */ 10,   981,  3, 15,  0,  0 },
+    { /* 221:        11 1101 0110 */ 10,   982, 10, 11,  0,  0 },
+    { /* 222:        11 1101 0111 */ 10,   983, 11, 10,  0,  0 },
+    { /* 223:        11 1101 1000 */ 10,   984, 12,  8,  0,  0 },
+    { /* 224:        11 1101 1001 */ 10,   985, 15,  6,  0,  0 },
+    { /* 225:        11 1101 1010 */ 10,   986, 15,  7,  0,  0 },
+    { /* 226:        11 1101 1011 */ 10,   987,  8, 14,  0,  0 },
+    { /* 227:        11 1101 1100 */ 10,   988, 15,  1,  0,  0 },
+    { /* 228:        11 1101 1101 */ 10,   989,  7, 14,  0,  0 },
+    { /* 229:        11 1101 1110 */ 10,   990,  9,  0,  0,  0 },
+    { /* 230:        11 1101 1111 */ 10,   991,  0,  9,  0,  0 },
+    { /* 231:        11 1110 0000 */ 10,   992,  9, 13,  0,  0 },
+    { /* 232:        11 1110 0001 */ 10,   993,  9, 12,  0,  0 },
+    { /* 233:        11 1110 0010 */ 10,   994, 12,  9,  0,  0 },
+    { /* 234:        11 1110 0011 */ 10,   995, 14,  8,  0,  0 },
+    { /* 235:        11 1110 0100 */ 10,   996, 10, 13,  0,  0 },
+    { /* 236:        11 1110 0101 */ 10,   997, 14,  9,  0,  0 },
+    { /* 237:        11 1110 0110 */ 10,   998, 12, 10,  0,  0 },
+    { /* 238:        11 1110 0111 */ 10,   999,  6, 15,  0,  0 },
+    { /* 239:        11 1110 1000 */ 10,  1000,  7, 15,  0,  0 },
+    { /* 240:       111 1101 0010 */ 11,  2002,  9, 14,  0,  0 },
+    { /* 241:       111 1101 0011 */ 11,  2003, 15,  8,  0,  0 },
+    { /* 242:       111 1101 0100 */ 11,  2004, 11, 11,  0,  0 },
+    { /* 243:       111 1101 0101 */ 11,  2005, 11, 14,  0,  0 },
+    { /* 244:       111 1101 0110 */ 11,  2006,  1, 15,  0,  0 },
+    { /* 245:       111 1101 0111 */ 11,  2007, 10, 12,  0,  0 },
+    { /* 246:       111 1101 1000 */ 11,  2008, 10, 14,  0,  0 },
+    { /* 247:       111 1101 1001 */ 11,  2009, 13, 11,  0,  0 },
+    { /* 248:       111 1101 1010 */ 11,  2010, 13, 10,  0,  0 },
+    { /* 249:       111 1101 1011 */ 11,  2011, 11, 13,  0,  0 },
+    { /* 250:       111 1101 1100 */ 11,  2012, 11, 12,  0,  0 },
+    { /* 251:       111 1101 1101 */ 11,  2013,  8, 15,  0,  0 },
+    { /* 252:       111 1101 1110 */ 11,  2014, 14, 11,  0,  0 },
+    { /* 253:       111 1101 1111 */ 11,  2015, 13, 12,  0,  0 },
+    { /* 254:       111 1110 0000 */ 11,  2016, 12, 13,  0,  0 },
+    { /* 255:       111 1110 0001 */ 11,  2017, 15,  9,  0,  0 },
+    { /* 256:       111 1110 0010 */ 11,  2018, 14, 10,  0,  0 },
+    { /* 257:       111 1110 0011 */ 11,  2019, 10,  0,  0,  0 },
+    { /* 258:       111 1110 0100 */ 11,  2020, 12, 11,  0,  0 },
+    { /* 259:       111 1110 0101 */ 11,  2021,  9, 15,  0,  0 },
+    { /* 260:       111 1110 0110 */ 11,  2022,  0, 10,  0,  0 },
+    { /* 261:       111 1110 0111 */ 11,  2023, 12, 12,  0,  0 },
+    { /* 262:       111 1110 1000 */ 11,  2024, 11,  0,  0,  0 },
+    { /* 263:       111 1110 1001 */ 11,  2025, 12, 14,  0,  0 },
+    { /* 264:       111 1110 1010 */ 11,  2026, 10, 15,  0,  0 },
+    { /* 265:       111 1110 1011 */ 11,  2027, 13, 13,  0,  0 },
+    { /* 266:       111 1110 1100 */ 11,  2028,  0, 13,  0,  0 },
+    { /* 267:       111 1110 1101 */ 11,  2029, 14, 12,  0,  0 },
+    { /* 268:       111 1110 1110 */ 11,  2030, 15, 10,  0,  0 },
+    { /* 269:       111 1110 1111 */ 11,  2031, 15, 11,  0,  0 },
+    { /* 270:       111 1111 0000 */ 11,  2032, 11, 15,  0,  0 },
+    { /* 271:       111 1111 0001 */ 11,  2033, 14, 13,  0,  0 },
+    { /* 272:       111 1111 0010 */ 11,  2034, 13,  0,  0,  0 },
+    { /* 273:       111 1111 0011 */ 11,  2035,  0, 11,  0,  0 },
+    { /* 274:       111 1111 0100 */ 11,  2036, 13, 14,  0,  0 },
+    { /* 275:       111 1111 0101 */ 11,  2037, 15, 12,  0,  0 },
+    { /* 276:       111 1111 0110 */ 11,  2038, 15, 13,  0,  0 },
+    { /* 277:       111 1111 0111 */ 11,  2039, 12, 15,  0,  0 },
+    { /* 278:       111 1111 1000 */ 11,  2040, 14,  0,  0,  0 },
+    { /* 279:       111 1111 1001 */ 11,  2041, 14, 14,  0,  0 },
+    { /* 280:       111 1111 1010 */ 11,  2042, 13, 15,  0,  0 },
+    { /* 281:       111 1111 1011 */ 11,  2043, 12,  0,  0,  0 },
+    { /* 282:       111 1111 1100 */ 11,  2044, 14, 15,  0,  0 },
+    { /* 283:      1111 1111 1010 */ 12,  4090,  0, 14,  0,  0 },
+    { /* 284:      1111 1111 1011 */ 12,  4091,  0, 12,  0,  0 },
+    { /* 285:      1111 1111 1100 */ 12,  4092, 15, 14,  0,  0 },
+    { /* 286:      1111 1111 1101 */ 12,  4093, 15,  0,  0,  0 },
+    { /* 287:      1111 1111 1110 */ 12,  4094,  0, 15,  0,  0 },
+    { /* 288:      1111 1111 1111 */ 12,  4095, 15, 15,  0,  0 }
+};
+
+extern codebook_scl bookscl[] = {
+      /* idx                 codeword   len   codew  idx */
+    { /*   0:                       0 */  1,      0,  60 },
+    { /*   1:                     100 */  3,      4,  59 },
+    { /*   2:                    1010 */  4,     10,  61 },
+    { /*   3:                    1011 */  4,     11,  58 },
+    { /*   4:                    1100 */  4,     12,  62 },
+    { /*   5:                  1 1010 */  5,     26,  57 },
+    { /*   6:                  1 1011 */  5,     27,  63 },
+    { /*   7:                 11 1000 */  6,     56,  56 },
+    { /*   8:                 11 1001 */  6,     57,  64 },
+    { /*   9:                 11 1010 */  6,     58,  55 },
+    { /*  10:                 11 1011 */  6,     59,  65 },
+    { /*  11:                111 1000 */  7,    120,  66 },
+    { /*  12:                111 1001 */  7,    121,  54 },
+    { /*  13:                111 1010 */  7,    122,  67 },
+    { /*  14:               1111 0110 */  8,    246,  53 },
+    { /*  15:               1111 0111 */  8,    247,  68 },
+    { /*  16:               1111 1000 */  8,    248,  52 },
+    { /*  17:               1111 1001 */  8,    249,  69 },
+    { /*  18:               1111 1010 */  8,    250,  51 },
+    { /*  19:             1 1111 0110 */  9,    502,  70 },
+    { /*  20:             1 1111 0111 */  9,    503,  50 },
+    { /*  21:             1 1111 1000 */  9,    504,  49 },
+    { /*  22:             1 1111 1001 */  9,    505,  71 },
+    { /*  23:            11 1111 0100 */ 10,   1012,  72 },
+    { /*  24:            11 1111 0101 */ 10,   1013,  48 },
+    { /*  25:            11 1111 0110 */ 10,   1014,  73 },
+    { /*  26:            11 1111 0111 */ 10,   1015,  47 },
+    { /*  27:            11 1111 1000 */ 10,   1016,  74 },
+    { /*  28:            11 1111 1001 */ 10,   1017,  46 },
+    { /*  29:           111 1111 0100 */ 11,   2036,  76 },
+    { /*  30:           111 1111 0101 */ 11,   2037,  75 },
+    { /*  31:           111 1111 0110 */ 11,   2038,  77 },
+    { /*  32:           111 1111 0111 */ 11,   2039,  78 },
+    { /*  33:           111 1111 1000 */ 11,   2040,  45 },
+    { /*  34:           111 1111 1001 */ 11,   2041,  43 },
+    { /*  35:          1111 1111 0100 */ 12,   4084,  44 },
+    { /*  36:          1111 1111 0101 */ 12,   4085,  79 },
+    { /*  37:          1111 1111 0110 */ 12,   4086,  42 },
+    { /*  38:          1111 1111 0111 */ 12,   4087,  41 },
+    { /*  39:          1111 1111 1000 */ 12,   4088,  80 },
+    { /*  40:          1111 1111 1001 */ 12,   4089,  40 },
+    { /*  41:        1 1111 1111 0100 */ 13,   8180,  81 },
+    { /*  42:        1 1111 1111 0101 */ 13,   8181,  39 },
+    { /*  43:        1 1111 1111 0110 */ 13,   8182,  82 },
+    { /*  44:        1 1111 1111 0111 */ 13,   8183,  38 },
+    { /*  45:        1 1111 1111 1000 */ 13,   8184,  83 },
+    { /*  46:       11 1111 1111 0010 */ 14,  16370,  37 },
+    { /*  47:       11 1111 1111 0011 */ 14,  16371,  35 },
+    { /*  48:       11 1111 1111 0100 */ 14,  16372,  85 },
+    { /*  49:       11 1111 1111 0101 */ 14,  16373,  33 },
+    { /*  50:       11 1111 1111 0110 */ 14,  16374,  36 },
+    { /*  51:       11 1111 1111 0111 */ 14,  16375,  34 },
+    { /*  52:       11 1111 1111 1000 */ 14,  16376,  84 },
+    { /*  53:       11 1111 1111 1001 */ 14,  16377,  32 },
+    { /*  54:      111 1111 1111 0100 */ 15,  32756,  87 },
+    { /*  55:      111 1111 1111 0101 */ 15,  32757,  89 },
+    { /*  56:      111 1111 1111 0110 */ 15,  32758,  30 },
+    { /*  57:      111 1111 1111 0111 */ 15,  32759,  31 },
+    { /*  58:     1111 1111 1111 0000 */ 16,  65520,  86 },
+    { /*  59:     1111 1111 1111 0001 */ 16,  65521,  29 },
+    { /*  60:     1111 1111 1111 0010 */ 16,  65522,  26 },
+    { /*  61:     1111 1111 1111 0011 */ 16,  65523,  27 },
+    { /*  62:     1111 1111 1111 0100 */ 16,  65524,  28 },
+    { /*  63:     1111 1111 1111 0101 */ 16,  65525,  24 },
+    { /*  64:     1111 1111 1111 0110 */ 16,  65526,  88 },
+    { /*  65:   1 1111 1111 1110 1110 */ 17, 131054,  25 },
+    { /*  66:   1 1111 1111 1110 1111 */ 17, 131055,  22 },
+    { /*  67:   1 1111 1111 1111 0000 */ 17, 131056,  23 },
+    { /*  68:  11 1111 1111 1110 0010 */ 18, 262114,  90 },
+    { /*  69:  11 1111 1111 1110 0011 */ 18, 262115,  21 },
+    { /*  70:  11 1111 1111 1110 0100 */ 18, 262116,  19 },
+    { /*  71:  11 1111 1111 1110 0101 */ 18, 262117,   3 },
+    { /*  72:  11 1111 1111 1110 0110 */ 18, 262118,   1 },
+    { /*  73:  11 1111 1111 1110 0111 */ 18, 262119,   2 },
+    { /*  74:  11 1111 1111 1110 1000 */ 18, 262120,   0 },
+    { /*  75: 111 1111 1111 1101 0010 */ 19, 524242,  98 },
+    { /*  76: 111 1111 1111 1101 0011 */ 19, 524243,  99 },
+    { /*  77: 111 1111 1111 1101 0100 */ 19, 524244, 100 },
+    { /*  78: 111 1111 1111 1101 0101 */ 19, 524245, 101 },
+    { /*  79: 111 1111 1111 1101 0110 */ 19, 524246, 102 },
+    { /*  80: 111 1111 1111 1101 0111 */ 19, 524247, 117 },
+    { /*  81: 111 1111 1111 1101 1000 */ 19, 524248,  97 },
+    { /*  82: 111 1111 1111 1101 1001 */ 19, 524249,  91 },
+    { /*  83: 111 1111 1111 1101 1010 */ 19, 524250,  92 },
+    { /*  84: 111 1111 1111 1101 1011 */ 19, 524251,  93 },
+    { /*  85: 111 1111 1111 1101 1100 */ 19, 524252,  94 },
+    { /*  86: 111 1111 1111 1101 1101 */ 19, 524253,  95 },
+    { /*  87: 111 1111 1111 1101 1110 */ 19, 524254,  96 },
+    { /*  88: 111 1111 1111 1101 1111 */ 19, 524255, 104 },
+    { /*  89: 111 1111 1111 1110 0000 */ 19, 524256, 111 },
+    { /*  90: 111 1111 1111 1110 0001 */ 19, 524257, 112 },
+    { /*  91: 111 1111 1111 1110 0010 */ 19, 524258, 113 },
+    { /*  92: 111 1111 1111 1110 0011 */ 19, 524259, 114 },
+    { /*  93: 111 1111 1111 1110 0100 */ 19, 524260, 115 },
+    { /*  94: 111 1111 1111 1110 0101 */ 19, 524261, 116 },
+    { /*  95: 111 1111 1111 1110 0110 */ 19, 524262, 110 },
+    { /*  96: 111 1111 1111 1110 0111 */ 19, 524263, 105 },
+    { /*  97: 111 1111 1111 1110 1000 */ 19, 524264, 106 },
+    { /*  98: 111 1111 1111 1110 1001 */ 19, 524265, 107 },
+    { /*  99: 111 1111 1111 1110 1010 */ 19, 524266, 108 },
+    { /* 100: 111 1111 1111 1110 1011 */ 19, 524267, 109 },
+    { /* 101: 111 1111 1111 1110 1100 */ 19, 524268, 118 },
+    { /* 102: 111 1111 1111 1110 1101 */ 19, 524269,   6 },
+    { /* 103: 111 1111 1111 1110 1110 */ 19, 524270,   8 },
+    { /* 104: 111 1111 1111 1110 1111 */ 19, 524271,   9 },
+    { /* 105: 111 1111 1111 1111 0000 */ 19, 524272,  10 },
+    { /* 106: 111 1111 1111 1111 0001 */ 19, 524273,   5 },
+    { /* 107: 111 1111 1111 1111 0010 */ 19, 524274, 103 },
+    { /* 108: 111 1111 1111 1111 0011 */ 19, 524275, 120 },
+    { /* 109: 111 1111 1111 1111 0100 */ 19, 524276, 119 },
+    { /* 110: 111 1111 1111 1111 0101 */ 19, 524277,   4 },
+    { /* 111: 111 1111 1111 1111 0110 */ 19, 524278,   7 },
+    { /* 112: 111 1111 1111 1111 0111 */ 19, 524279,  15 },
+    { /* 113: 111 1111 1111 1111 1000 */ 19, 524280,  16 },
+    { /* 114: 111 1111 1111 1111 1001 */ 19, 524281,  18 },
+    { /* 115: 111 1111 1111 1111 1010 */ 19, 524282,  20 },
+    { /* 116: 111 1111 1111 1111 1011 */ 19, 524283,  17 },
+    { /* 117: 111 1111 1111 1111 1100 */ 19, 524284,  11 },
+    { /* 118: 111 1111 1111 1111 1101 */ 19, 524285,  12 },
+    { /* 119: 111 1111 1111 1111 1110 */ 19, 524286,  14 },
+    { /* 120: 111 1111 1111 1111 1111 */ 19, 524287,  13 }
+};
--- /dev/null
+++ b/libfaad/huffman.h
@@ -1,0 +1,192 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: huffman.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __HUFFMAN_H__
+#define __HUFFMAN_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "bits.h"
+
+#define ZERO_HCB       0
+#define FIRST_PAIR_HCB 5
+#define ESC_HCB        11
+#define QUAD_LEN       4
+#define PAIR_LEN       2
+#define NSPECBOOKS     ESC_HCB + 1
+#define BOOKSCL        NSPECBOOKS
+#define NOISE_HCB      13
+#define INTENSITY_HCB2 14
+#define INTENSITY_HCB  15
+
+typedef struct
+{
+    short len;
+    unsigned long cw;
+    char x, y, v, w;
+} codebook;
+
+typedef struct
+{
+    short len;
+    unsigned long cw;
+    int scl;
+} codebook_scl;
+
+extern codebook book1[];
+extern codebook book2[];
+extern codebook book3[];
+extern codebook book4[];
+extern codebook book5[];
+extern codebook book6[];
+extern codebook book7[];
+extern codebook book8[];
+extern codebook book9[];
+extern codebook book10[];
+extern codebook book11[];
+extern codebook_scl bookscl[];
+
+static codebook *book_table[] = {
+    0,
+    book1,
+    book2,
+    book3,
+    book4,
+    book5,
+    book6,
+    book7,
+    book8,
+    book9,
+    book10,
+    book11
+};
+
+#if defined(LINUX)
+#define huff_inline inline
+#elif defined(WIN32)
+#define huff_inline __inline
+#else
+#define huff_inline
+#endif
+
+static huff_inline int huffman_scale_factor(bitfile *ld)
+{
+    int i, j;
+    long cw;
+    codebook_scl *h = bookscl;
+
+    i = h->len;
+    cw = faad_getbits(ld, i);
+
+    while ((unsigned long)cw != h->cw)
+    {
+        h++;
+        j = h->len-i;
+        i = h->len;
+        if (j!=0) {
+            while (j--)
+                cw = (cw<<1) | faad_get1bit(ld);
+        }
+    }
+
+    return h->scl;
+}
+
+static huff_inline void huffman_spectral_data(int cb, bitfile *ld, short *sp)
+{
+    int i, j;
+    unsigned long cw;
+    codebook *h = book_table[cb];
+
+    i = h->len;
+    cw = faad_getbits(ld, i);
+
+    while (cw != h->cw)
+    {
+        h++;
+        j = h->len-i;
+        i = h->len;
+        if (j!=0) {
+            while (j--)
+                cw = (cw<<1) | faad_get1bit(ld);
+        }
+    }
+
+    if(cb < FIRST_PAIR_HCB)
+    {
+        sp[0] = h->x;
+        sp[1] = h->y;
+        sp[2] = h->v;
+        sp[3] = h->w;
+    } else {
+        sp[0] = h->x;
+        sp[1] = h->y;
+    }
+}
+
+static huff_inline void huffman_sign_bits(bitfile *ld, short *sp, int len)
+{
+    int i;
+
+    for(i = 0; i < len; i++)
+        if(sp[i])
+            if(faad_get1bit(ld) & 1)
+                sp[i] = -sp[i];
+}
+
+static huff_inline short huffman_getescape(bitfile *ld, short sp)
+{
+    int i, off, neg;
+
+    if (sp < 0) {
+        if(sp != -16)
+            return sp;
+        neg = 1;
+    } else {
+        if(sp != +16)
+            return sp;
+        neg = 0;
+    }
+
+    for (i = 4; ; i++){
+        if (faad_get1bit(ld) == 0)
+            break;
+    }
+
+    if (i > 16) {
+        off = faad_getbits(ld, i-16) << 16;
+        off |= faad_getbits(ld, 16);
+    } else {
+        off = faad_getbits(ld, i);
+    }
+
+    i = off + (1<<i);
+    if (neg)
+        i = -i;
+    return i;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/ic_predict.c
@@ -1,0 +1,177 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: ic_predict.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "syntax.h"
+#include "ic_predict.h"
+#include "pns.h"
+
+static void flt_round_inf(float *pf)
+{
+    int flg;
+    unsigned long tmp;
+    float *pt = (float *)&tmp;
+
+    *pt = *pf;
+    flg = tmp & (unsigned long)0x00008000;
+    tmp &= (unsigned long)0xffff0000;
+    *pf = *pt;
+
+    /* round 1/2 lsb toward infinity */
+    if (flg)
+    {
+        tmp &= (unsigned long)0xff800000; /* extract exponent and sign */
+        tmp |= (unsigned long)0x00010000; /* insert 1 lsb */
+        *pf += *pt;                       /* add 1 lsb and elided one */
+        tmp &= (unsigned long)0xff800000; /* extract exponent and sign */
+        *pf -= *pt;                       /* subtract elided one */
+    }
+}
+
+static void ic_predict(pred_state *state, float input, float *output, int pred)
+{
+    float dr1, predictedvalue;
+    float e0, e1;
+    float k1, k2;
+
+    float *r;
+    float *KOR;
+    float *VAR;
+
+    r   = state->r;   /* delay elements */
+    KOR = state->KOR; /* correlations */
+    VAR = state->VAR; /* variances */
+
+    k1 = KOR[0]/VAR[0]*B;
+
+    if (pred)
+    {
+        /* only needed for the actual predicted value, k1 is always needed */
+        k2 = KOR[1]/VAR[1]*B;
+
+        predictedvalue = k1*r[0] + k2*r[1];
+        flt_round_inf(&predictedvalue);
+
+        *output = input + predictedvalue;
+    } else {
+        *output = input;
+    }
+
+    /* calculate new state data */
+    e0 = *output;
+    e1 = e0 - k1 * r[0];
+
+    dr1 = k1 * e0;
+
+    VAR[0] = ALPHA * VAR[0] + (0.5f)*(r[0]*r[0] + e0*e0);
+    KOR[0] = ALPHA * KOR[0] + r[0]*e0;
+    VAR[1] = ALPHA * VAR[1] + (0.5f)*(r[1]*r[1] + e1*e1);
+    KOR[1] = ALPHA * KOR[1] + r[1]*e1;
+
+    r[1] = A * (r[0]-dr1);
+    r[0] = A * e0;
+}
+
+static void reset_pred_state(pred_state *state)
+{
+    state->r[0]   = 0.0f;
+    state->r[1]   = 0.0f;
+    state->KOR[0] = 0.0f;
+    state->KOR[1] = 0.0f;
+    state->VAR[0] = 1.0f;
+    state->VAR[1] = 1.0f;
+}
+
+void pns_reset_pred_state(ic_stream *ics, pred_state *state)
+{
+    int sfb, g, b, i;
+    int offs, size;
+
+    /* prediction only for long blocks */
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+        return;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        for (b = 0; b < ics->window_group_length[g]; b++)
+        {
+            for (sfb = 0; sfb < ics->max_sfb; sfb++)
+            {
+                if (is_noise(ics, g, sfb))
+                {
+                    offs = ics->swb_offset[sfb];
+                    size = ics->swb_offset[sfb+1] - offs;
+
+                    for (i = offs; i < size; i++)
+                        reset_pred_state(&state[i]);
+                }
+            }
+        }
+    }
+}
+
+void reset_all_predictors(pred_state *state)
+{
+    int i;
+
+    for (i = 0; i < 1024; i++)
+        reset_pred_state(&state[i]);
+}
+
+/* intra channel prediction */
+void ic_prediction(ic_stream *ics, float *spec, pred_state *state)
+{
+    int sfb, bin;
+
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+    {
+        reset_all_predictors(state);
+    } else {
+        for (sfb = 0; sfb < ics->pred.limit; sfb++)
+        {
+            int low  = ics->swb_offset[sfb];
+            int high = ics->swb_offset[sfb+1];
+
+            for (bin = low; bin < high; bin++)
+            {
+                ic_predict(&state[bin], spec[bin], &spec[bin],
+                    (ics->predictor_data_present &&
+                    ics->pred.prediction_used[sfb]));
+            }
+        }
+
+        if (ics->predictor_data_present)
+        {
+            if (ics->pred.predictor_reset)
+            {
+                for (bin = ics->pred.predictor_reset_group_number - 1;
+                     bin < 1024; bin += 30)
+                {
+                    reset_pred_state(&state[bin]);
+                }
+            }
+        }
+    }
+}
--- /dev/null
+++ b/libfaad/ic_predict.h
@@ -1,0 +1,50 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: ic_predict.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __IC_PREDICT_H__
+#define __IC_PREDICT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ALPHA      0.90625f
+#define A          0.953125f
+#define B          0.953125f
+
+
+/* used to save the state */
+typedef struct {
+    float r[2];
+    float KOR[2];
+    float VAR[2];
+} pred_state;
+
+
+void pns_reset_pred_state(ic_stream *ics, pred_state *state);
+void reset_all_predictors(pred_state *state);
+void ic_prediction(ic_stream *ics, float *spec, pred_state *state);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/is.c
@@ -1,0 +1,73 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: is.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "syntax.h"
+#include "is.h"
+
+void is_decode(ic_stream *ics, ic_stream *icsr, float *l_spec, float *r_spec)
+{
+    int g, sfb, b, i, k;
+    float scale;
+
+    int group = 0;
+
+    for (g = 0; g < icsr->num_window_groups; g++)
+    {
+        /* Do intensity stereo decoding */
+        for (b = 0; b < icsr->window_group_length[g]; b++)
+        {
+            for (sfb = 0; sfb < icsr->max_sfb; sfb++)
+            {
+                if (is_intensity(icsr, g, sfb))
+                {
+                    /* For scalefactor bands coded in intensity stereo the
+                       corresponding predictors in the right channel are
+                       switched to "off".
+                     */
+                    ics->pred.prediction_used[sfb] = 0;
+                    icsr->pred.prediction_used[sfb] = 0;
+
+                    scale = is_intensity(icsr, g, sfb) *
+                        invert_intensity(ics, g, sfb) *
+#ifdef __ICL
+                        powf(0.5f, (0.25f*icsr->scale_factors[g][sfb]));
+#else
+                        (float)pow(0.5, (0.25*icsr->scale_factors[g][sfb]));
+#endif
+
+                    /* Scale from left to right channel,
+                       do not touch left channel */
+                    for (i = icsr->swb_offset[sfb]; i < icsr->swb_offset[sfb+1]; i++)
+                    {
+                        k = (group*128)+i;
+                        r_spec[k] = l_spec[k] * scale;
+                    }
+                }
+            }
+            group++;
+        }
+    }
+}
--- /dev/null
+++ b/libfaad/is.h
@@ -1,0 +1,57 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: is.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __IS_H__
+#define __IS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "huffman.h"
+
+void is_decode(ic_stream *ics, ic_stream *icsr, float *l_spec, float *r_spec);
+
+static __inline int is_intensity(ic_stream *ics, int group, int sfb)
+{
+    switch (ics->sfb_cb[group][sfb])
+    {
+    case INTENSITY_HCB:
+        return 1;
+    case INTENSITY_HCB2:
+        return -1;
+    default:
+        return 0;
+    }
+}
+
+static __inline int invert_intensity(ic_stream *ics, int group, int sfb)
+{
+    if (ics->ms_mask_present == 1)
+        return (1-2*ics->ms_used[group][sfb]);
+    return 1;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/kbd_win.h
@@ -1,0 +1,1197 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: kbd_win.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __KBD_WIN_H__
+#define __KBD_WIN_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(disable:4305)
+#endif
+
+float kbd_long[] =
+{
+    0.00029256153896361,
+    0.00042998567353047,
+    0.00054674074589540,
+    0.00065482304299792,
+    0.00075870195068747,
+    0.00086059331713336,
+    0.00096177541439010,
+    0.0010630609410878,
+    0.0011650036308132,
+    0.0012680012194148,
+    0.0013723517232956,
+    0.0014782864109136,
+    0.0015859901976719,
+    0.0016956148252373,
+    0.0018072876903517,
+    0.0019211179405514,
+    0.0020372007924215,
+    0.0021556206591754,
+    0.0022764534599614,
+    0.0023997683540995,
+    0.0025256290631156,
+    0.0026540948920831,
+    0.0027852215281403,
+    0.0029190616715331,
+    0.0030556655443223,
+    0.0031950812943391,
+    0.0033373553240392,
+    0.0034825325586930,
+    0.0036306566699199,
+    0.0037817702604646,
+    0.0039359150179719,
+    0.0040931318437260,
+    0.0042534609610026,
+    0.0044169420066964,
+    0.0045836141091341,
+    0.0047535159544086,
+    0.0049266858431214,
+    0.0051031617390698,
+    0.0052829813111335,
+    0.0054661819693975,
+    0.0056528008963682,
+    0.0058428750739943,
+    0.0060364413070882,
+    0.0062335362436492,
+    0.0064341963925079,
+    0.0066384581386503,
+    0.0068463577565218,
+    0.0070579314215715,
+    0.0072732152202559,
+    0.0074922451586909,
+    0.0077150571701162,
+    0.0079416871213115,
+    0.0081721708180857,
+    0.0084065440099458,
+    0.0086448423940363,
+    0.0088871016184291,
+    0.0091333572848345,
+    0.0093836449507939,
+    0.0096380001314086,
+    0.0098964583006517,
+    0.010159054892306,
+    0.010425825300561,
+    0.010696804880310,
+    0.010972028947167,
+    0.011251532777236,
+    0.011535351606646,
+    0.011823520630897,
+    0.012116075003993,
+    0.012413049837429,
+    0.012714480198999,
+    0.013020401111478,
+    0.013330847551161,
+    0.013645854446288,
+    0.013965456675352,
+    0.014289689065314,
+    0.014618586389712,
+    0.014952183366697,
+    0.015290514656976,
+    0.015633614861688,
+    0.015981518520214,
+    0.016334260107915,
+    0.016691874033817,
+    0.017054394638241,
+    0.017421856190380,
+    0.017794292885832,
+    0.018171738844085,
+    0.018554228105962,
+    0.018941794631032,
+    0.019334472294980,
+    0.019732294886947,
+    0.020135296106839,
+    0.020543509562604,
+    0.020956968767488,
+    0.021375707137257,
+    0.021799757987407,
+    0.022229154530343,
+    0.022663929872540,
+    0.023104117011689,
+    0.023549748833816,
+    0.024000858110398,
+    0.024457477495451,
+    0.024919639522613,
+    0.025387376602207,
+    0.025860721018295,
+    0.026339704925726,
+    0.026824360347160,
+    0.027314719170100,
+    0.027810813143900,
+    0.028312673876775,
+    0.028820332832801,
+    0.029333821328905,
+    0.029853170531859,
+    0.030378411455255,
+    0.030909574956490,
+    0.031446691733739,
+    0.031989792322926,
+    0.032538907094693,
+    0.033094066251369,
+    0.033655299823935,
+    0.034222637668991,
+    0.034796109465717,
+    0.035375744712844,
+    0.035961572725616,
+    0.036553622632758,
+    0.037151923373446,
+    0.037756503694277,
+    0.038367392146243,
+    0.038984617081711,
+    0.039608206651398,
+    0.040238188801359,
+    0.040874591269976,
+    0.041517441584950,
+    0.042166767060301,
+    0.042822594793376,
+    0.043484951661852,
+    0.044153864320760,
+    0.044829359199509,
+    0.045511462498913,
+    0.046200200188234,
+    0.046895598002228,
+    0.047597681438201,
+    0.048306475753074,
+    0.049022005960455,
+    0.049744296827725,
+    0.050473372873129,
+    0.051209258362879,
+    0.051951977308273,
+    0.052701553462813,
+    0.053458010319350,
+    0.054221371107223,
+    0.054991658789428,
+    0.055768896059787,
+    0.056553105340134,
+    0.057344308777513,
+    0.058142528241393,
+    0.058947785320893,
+    0.059760101322019,
+    0.060579497264926,
+    0.061405993881180,
+    0.062239611611049,
+    0.063080370600799,
+    0.063928290700012,
+    0.064783391458919,
+    0.065645692125747,
+    0.066515211644086,
+    0.067391968650269,
+    0.068275981470777,
+    0.069167268119652,
+    0.070065846295935,
+    0.070971733381121,
+    0.071884946436630,
+    0.072805502201299,
+    0.073733417088896,
+    0.074668707185649,
+    0.075611388247794,
+    0.076561475699152,
+    0.077518984628715,
+    0.078483929788261,
+    0.079456325589986,
+    0.080436186104162,
+    0.081423525056808,
+    0.082418355827392,
+    0.083420691446553,
+    0.084430544593841,
+    0.085447927595483,
+    0.086472852422178,
+    0.087505330686900,
+    0.088545373642744,
+    0.089592992180780,
+    0.090648196827937,
+    0.091710997744919,
+    0.092781404724131,
+    0.093859427187640,
+    0.094945074185163,
+    0.096038354392069,
+    0.097139276107423,
+    0.098247847252041,
+    0.099364075366580,
+    0.10048796760965,
+    0.10161953075597,
+    0.10275877119451,
+    0.10390569492671,
+    0.10506030756469,
+    0.10622261432949,
+    0.10739262004941,
+    0.10857032915821,
+    0.10975574569357,
+    0.11094887329534,
+    0.11214971520402,
+    0.11335827425914,
+    0.11457455289772,
+    0.11579855315274,
+    0.11703027665170,
+    0.11826972461510,
+    0.11951689785504,
+    0.12077179677383,
+    0.12203442136263,
+    0.12330477120008,
+    0.12458284545102,
+    0.12586864286523,
+    0.12716216177615,
+    0.12846340009971,
+    0.12977235533312,
+    0.13108902455375,
+    0.13241340441801,
+    0.13374549116025,
+    0.13508528059173,
+    0.13643276809961,
+    0.13778794864595,
+    0.13915081676677,
+    0.14052136657114,
+    0.14189959174027,
+    0.14328548552671,
+    0.14467904075349,
+    0.14608024981336,
+    0.14748910466804,
+    0.14890559684750,
+    0.15032971744929,
+    0.15176145713790,
+    0.15320080614414,
+    0.15464775426459,
+    0.15610229086100,
+    0.15756440485987,
+    0.15903408475193,
+    0.16051131859170,
+    0.16199609399712,
+    0.16348839814917,
+    0.16498821779156,
+    0.16649553923042,
+    0.16801034833404,
+    0.16953263053270,
+    0.17106237081842,
+    0.17259955374484,
+    0.17414416342714,
+    0.17569618354193,
+    0.17725559732720,
+    0.17882238758238,
+    0.18039653666830,
+    0.18197802650733,
+    0.18356683858343,
+    0.18516295394233,
+    0.18676635319174,
+    0.18837701650148,
+    0.18999492360384,
+    0.19162005379380,
+    0.19325238592940,
+    0.19489189843209,
+    0.19653856928714,
+    0.19819237604409,
+    0.19985329581721,
+    0.20152130528605,
+    0.20319638069594,
+    0.20487849785865,
+    0.20656763215298,
+    0.20826375852540,
+    0.20996685149083,
+    0.21167688513330,
+    0.21339383310678,
+    0.21511766863598,
+    0.21684836451719,
+    0.21858589311922,
+    0.22033022638425,
+    0.22208133582887,
+    0.22383919254503,
+    0.22560376720111,
+    0.22737503004300,
+    0.22915295089517,
+    0.23093749916189,
+    0.23272864382838,
+    0.23452635346201,
+    0.23633059621364,
+    0.23814133981883,
+    0.23995855159925,
+    0.24178219846403,
+    0.24361224691114,
+    0.24544866302890,
+    0.24729141249740,
+    0.24914046059007,
+    0.25099577217522,
+    0.25285731171763,
+    0.25472504328019,
+    0.25659893052556,
+    0.25847893671788,
+    0.26036502472451,
+    0.26225715701781,
+    0.26415529567692,
+    0.26605940238966,
+    0.26796943845439,
+    0.26988536478190,
+    0.27180714189742,
+    0.27373472994256,
+    0.27566808867736,
+    0.27760717748238,
+    0.27955195536071,
+    0.28150238094021,
+    0.28345841247557,
+    0.28542000785059,
+    0.28738712458038,
+    0.28935971981364,
+    0.29133775033492,
+    0.29332117256704,
+    0.29530994257338,
+    0.29730401606034,
+    0.29930334837974,
+    0.30130789453132,
+    0.30331760916521,
+    0.30533244658452,
+    0.30735236074785,
+    0.30937730527195,
+    0.31140723343430,
+    0.31344209817583,
+    0.31548185210356,
+    0.31752644749341,
+    0.31957583629288,
+    0.32162997012390,
+    0.32368880028565,
+    0.32575227775738,
+    0.32782035320134,
+    0.32989297696566,
+    0.33197009908736,
+    0.33405166929523,
+    0.33613763701295,
+    0.33822795136203,
+    0.34032256116495,
+    0.34242141494820,
+    0.34452446094547,
+    0.34663164710072,
+    0.34874292107143,
+    0.35085823023181,
+    0.35297752167598,
+    0.35510074222129,
+    0.35722783841160,
+    0.35935875652060,
+    0.36149344255514,
+    0.36363184225864,
+    0.36577390111444,
+    0.36791956434930,
+    0.37006877693676,
+    0.37222148360070,
+    0.37437762881878,
+    0.37653715682603,
+    0.37870001161834,
+    0.38086613695607,
+    0.38303547636766,
+    0.38520797315322,
+    0.38738357038821,
+    0.38956221092708,
+    0.39174383740701,
+    0.39392839225157,
+    0.39611581767449,
+    0.39830605568342,
+    0.40049904808370,
+    0.40269473648218,
+    0.40489306229101,
+    0.40709396673153,
+    0.40929739083810,
+    0.41150327546197,
+    0.41371156127524,
+    0.41592218877472,
+    0.41813509828594,
+    0.42035022996702,
+    0.42256752381274,
+    0.42478691965848,
+    0.42700835718423,
+    0.42923177591866,
+    0.43145711524314,
+    0.43368431439580,
+    0.43591331247564,
+    0.43814404844658,
+    0.44037646114161,
+    0.44261048926688,
+    0.44484607140589,
+    0.44708314602359,
+    0.44932165147057,
+    0.45156152598727,
+    0.45380270770813,
+    0.45604513466581,
+    0.45828874479543,
+    0.46053347593880,
+    0.46277926584861,
+    0.46502605219277,
+    0.46727377255861,
+    0.46952236445718,
+    0.47177176532752,
+    0.47402191254100,
+    0.47627274340557,
+    0.47852419517009,
+    0.48077620502869,
+    0.48302871012505,
+    0.48528164755674,
+    0.48753495437962,
+    0.48978856761212,
+    0.49204242423966,
+    0.49429646121898,
+    0.49655061548250,
+    0.49880482394273,
+    0.50105902349665,
+    0.50331315103004,
+    0.50556714342194,
+    0.50782093754901,
+    0.51007447028990,
+    0.51232767852971,
+    0.51458049916433,
+    0.51683286910489,
+    0.51908472528213,
+    0.52133600465083,
+    0.52358664419420,
+    0.52583658092832,
+    0.52808575190648,
+    0.53033409422367,
+    0.53258154502092,
+    0.53482804148974,
+    0.53707352087652,
+    0.53931792048690,
+    0.54156117769021,
+    0.54380322992385,
+    0.54604401469766,
+    0.54828346959835,
+    0.55052153229384,
+    0.55275814053768,
+    0.55499323217338,
+    0.55722674513883,
+    0.55945861747062,
+    0.56168878730842,
+    0.56391719289930,
+    0.56614377260214,
+    0.56836846489188,
+    0.57059120836390,
+    0.57281194173835,
+    0.57503060386439,
+    0.57724713372458,
+    0.57946147043912,
+    0.58167355327012,
+    0.58388332162591,
+    0.58609071506528,
+    0.58829567330173,
+    0.59049813620770,
+    0.59269804381879,
+    0.59489533633802,
+    0.59708995413996,
+    0.59928183777495,
+    0.60147092797329,
+    0.60365716564937,
+    0.60584049190582,
+    0.60802084803764,
+    0.61019817553632,
+    0.61237241609393,
+    0.61454351160718,
+    0.61671140418155,
+    0.61887603613527,
+    0.62103735000336,
+    0.62319528854167,
+    0.62534979473088,
+    0.62750081178042,
+    0.62964828313250,
+    0.63179215246597,
+    0.63393236370030,
+    0.63606886099946,
+    0.63820158877577,
+    0.64033049169379,
+    0.64245551467413,
+    0.64457660289729,
+    0.64669370180740,
+    0.64880675711607,
+    0.65091571480603,
+    0.65302052113494,
+    0.65512112263906,
+    0.65721746613689,
+    0.65930949873289,
+    0.66139716782102,
+    0.66348042108842,
+    0.66555920651892,
+    0.66763347239664,
+    0.66970316730947,
+    0.67176824015260,
+    0.67382864013196,
+    0.67588431676768,
+    0.67793521989751,
+    0.67998129968017,
+    0.68202250659876,
+    0.68405879146403,
+    0.68609010541774,
+    0.68811639993588,
+    0.69013762683195,
+    0.69215373826012,
+    0.69416468671849,
+    0.69617042505214,
+    0.69817090645634,
+    0.70016608447958,
+    0.70215591302664,
+    0.70414034636163,
+    0.70611933911096,
+    0.70809284626630,
+    0.71006082318751,
+    0.71202322560554,
+    0.71398000962530,
+    0.71593113172842,
+    0.71787654877613,
+    0.71981621801195,
+    0.72175009706445,
+    0.72367814394990,
+    0.72560031707496,
+    0.72751657523927,
+    0.72942687763803,
+    0.73133118386457,
+    0.73322945391280,
+    0.73512164817975,
+    0.73700772746796,
+    0.73888765298787,
+    0.74076138636020,
+    0.74262888961827,
+    0.74449012521027,
+    0.74634505600152,
+    0.74819364527663,
+    0.75003585674175,
+    0.75187165452661,
+    0.75370100318668,
+    0.75552386770515,
+    0.75734021349500,
+    0.75915000640095,
+    0.76095321270137,
+    0.76274979911019,
+    0.76453973277875,
+    0.76632298129757,
+    0.76809951269819,
+    0.76986929545481,
+    0.77163229848604,
+    0.77338849115651,
+    0.77513784327849,
+    0.77688032511340,
+    0.77861590737340,
+    0.78034456122283,
+    0.78206625827961,
+    0.78378097061667,
+    0.78548867076330,
+    0.78718933170643,
+    0.78888292689189,
+    0.79056943022564,
+    0.79224881607494,
+    0.79392105926949,
+    0.79558613510249,
+    0.79724401933170,
+    0.79889468818046,
+    0.80053811833858,
+    0.80217428696334,
+    0.80380317168028,
+    0.80542475058405,
+    0.80703900223920,
+    0.80864590568089,
+    0.81024544041560,
+    0.81183758642175,
+    0.81342232415032,
+    0.81499963452540,
+    0.81656949894467,
+    0.81813189927991,
+    0.81968681787738,
+    0.82123423755821,
+    0.82277414161874,
+    0.82430651383076,
+    0.82583133844180,
+    0.82734860017528,
+    0.82885828423070,
+    0.83036037628369,
+    0.83185486248609,
+    0.83334172946597,
+    0.83482096432759,
+    0.83629255465130,
+    0.83775648849344,
+    0.83921275438615,
+    0.84066134133716,
+    0.84210223882952,
+    0.84353543682130,
+    0.84496092574524,
+    0.84637869650833,
+    0.84778874049138,
+    0.84919104954855,
+    0.85058561600677,
+    0.85197243266520,
+    0.85335149279457,
+    0.85472279013653,
+    0.85608631890295,
+    0.85744207377513,
+    0.85879004990298,
+    0.86013024290422,
+    0.86146264886346,
+    0.86278726433124,
+    0.86410408632306,
+    0.86541311231838,
+    0.86671434025950,
+    0.86800776855046,
+    0.86929339605590,
+    0.87057122209981,
+    0.87184124646433,
+    0.87310346938840,
+    0.87435789156650,
+    0.87560451414719,
+    0.87684333873173,
+    0.87807436737261,
+    0.87929760257204,
+    0.88051304728038,
+    0.88172070489456,
+    0.88292057925645,
+    0.88411267465117,
+    0.88529699580537,
+    0.88647354788545,
+    0.88764233649580,
+    0.88880336767692,
+    0.88995664790351,
+    0.89110218408260,
+    0.89223998355154,
+    0.89337005407600,
+    0.89449240384793,
+    0.89560704148345,
+    0.89671397602074,
+    0.89781321691786,
+    0.89890477405053,
+    0.89998865770993,
+    0.90106487860034,
+    0.90213344783689,
+    0.90319437694315,
+    0.90424767784873,
+    0.90529336288690,
+    0.90633144479201,
+    0.90736193669708,
+    0.90838485213119,
+    0.90940020501694,
+    0.91040800966776,
+    0.91140828078533,
+    0.91240103345685,
+    0.91338628315231,
+    0.91436404572173,
+    0.91533433739238,
+    0.91629717476594,
+    0.91725257481564,
+    0.91820055488334,
+    0.91914113267664,
+    0.92007432626589,
+    0.92100015408120,
+    0.92191863490944,
+    0.92282978789113,
+    0.92373363251740,
+    0.92463018862687,
+    0.92551947640245,
+    0.92640151636824,
+    0.92727632938624,
+    0.92814393665320,
+    0.92900435969727,
+    0.92985762037477,
+    0.93070374086684,
+    0.93154274367610,
+    0.93237465162328,
+    0.93319948784382,
+    0.93401727578443,
+    0.93482803919967,
+    0.93563180214841,
+    0.93642858899043,
+    0.93721842438279,
+    0.93800133327637,
+    0.93877734091223,
+    0.93954647281807,
+    0.94030875480458,
+    0.94106421296182,
+    0.94181287365556,
+    0.94255476352362,
+    0.94328990947213,
+    0.94401833867184,
+    0.94474007855439,
+    0.94545515680855,
+    0.94616360137644,
+    0.94686544044975,
+    0.94756070246592,
+    0.94824941610434,
+    0.94893161028248,
+    0.94960731415209,
+    0.95027655709525,
+    0.95093936872056,
+    0.95159577885924,
+    0.95224581756115,
+    0.95288951509097,
+    0.95352690192417,
+    0.95415800874314,
+    0.95478286643320,
+    0.95540150607863,
+    0.95601395895871,
+    0.95662025654373,
+    0.95722043049100,
+    0.95781451264084,
+    0.95840253501260,
+    0.95898452980058,
+    0.95956052937008,
+    0.96013056625336,
+    0.96069467314557,
+    0.96125288290073,
+    0.96180522852773,
+    0.96235174318622,
+    0.96289246018262,
+    0.96342741296604,
+    0.96395663512424,
+    0.96448016037959,
+    0.96499802258499,
+    0.96551025571985,
+    0.96601689388602,
+    0.96651797130376,
+    0.96701352230768,
+    0.96750358134269,
+    0.96798818295998,
+    0.96846736181297,
+    0.96894115265327,
+    0.96940959032667,
+    0.96987270976912,
+    0.97033054600270,
+    0.97078313413161,
+    0.97123050933818,
+    0.97167270687887,
+    0.97210976208030,
+    0.97254171033525,
+    0.97296858709871,
+    0.97339042788392,
+    0.97380726825843,
+    0.97421914384017,
+    0.97462609029350,
+    0.97502814332534,
+    0.97542533868127,
+    0.97581771214160,
+    0.97620529951759,
+    0.97658813664749,
+    0.97696625939282,
+    0.97733970363445,
+    0.97770850526884,
+    0.97807270020427,
+    0.97843232435704,
+    0.97878741364771,
+    0.97913800399743,
+    0.97948413132414,
+    0.97982583153895,
+    0.98016314054243,
+    0.98049609422096,
+    0.98082472844313,
+    0.98114907905608,
+    0.98146918188197,
+    0.98178507271438,
+    0.98209678731477,
+    0.98240436140902,
+    0.98270783068385,
+    0.98300723078342,
+    0.98330259730589,
+    0.98359396579995,
+    0.98388137176152,
+    0.98416485063031,
+    0.98444443778651,
+    0.98472016854752,
+    0.98499207816463,
+    0.98526020181980,
+    0.98552457462240,
+    0.98578523160609,
+    0.98604220772560,
+    0.98629553785362,
+    0.98654525677772,
+    0.98679139919726,
+    0.98703399972035,
+    0.98727309286089,
+    0.98750871303556,
+    0.98774089456089,
+    0.98796967165036,
+    0.98819507841154,
+    0.98841714884323,
+    0.98863591683269,
+    0.98885141615285,
+    0.98906368045957,
+    0.98927274328896,
+    0.98947863805473,
+    0.98968139804554,
+    0.98988105642241,
+    0.99007764621618,
+    0.99027120032501,
+    0.99046175151186,
+    0.99064933240208,
+    0.99083397548099,
+    0.99101571309153,
+    0.99119457743191,
+    0.99137060055337,
+    0.99154381435784,
+    0.99171425059582,
+    0.99188194086414,
+    0.99204691660388,
+    0.99220920909823,
+    0.99236884947045,
+    0.99252586868186,
+    0.99268029752989,
+    0.99283216664606,
+    0.99298150649419,
+    0.99312834736847,
+    0.99327271939167,
+    0.99341465251338,
+    0.99355417650825,
+    0.99369132097430,
+    0.99382611533130,
+    0.99395858881910,
+    0.99408877049612,
+    0.99421668923778,
+    0.99434237373503,
+    0.99446585249289,
+    0.99458715382906,
+    0.99470630587254,
+    0.99482333656229,
+    0.99493827364600,
+    0.99505114467878,
+    0.99516197702200,
+    0.99527079784214,
+    0.99537763410962,
+    0.99548251259777,
+    0.99558545988178,
+    0.99568650233767,
+    0.99578566614138,
+    0.99588297726783,
+    0.99597846149005,
+    0.99607214437834,
+    0.99616405129947,
+    0.99625420741595,
+    0.99634263768527,
+    0.99642936685928,
+    0.99651441948352,
+    0.99659781989663,
+    0.99667959222978,
+    0.99675976040620,
+    0.99683834814063,
+    0.99691537893895,
+    0.99699087609774,
+    0.99706486270391,
+    0.99713736163442,
+    0.99720839555593,
+    0.99727798692461,
+    0.99734615798589,
+    0.99741293077431,
+    0.99747832711337,
+    0.99754236861541,
+    0.99760507668158,
+    0.99766647250181,
+    0.99772657705478,
+    0.99778541110799,
+    0.99784299521785,
+    0.99789934972976,
+    0.99795449477828,
+    0.99800845028730,
+    0.99806123597027,
+    0.99811287133042,
+    0.99816337566108,
+    0.99821276804596,
+    0.99826106735952,
+    0.99830829226732,
+    0.99835446122649,
+    0.99839959248609,
+    0.99844370408765,
+    0.99848681386566,
+    0.99852893944805,
+    0.99857009825685,
+    0.99861030750869,
+    0.99864958421549,
+    0.99868794518504,
+    0.99872540702178,
+    0.99876198612738,
+    0.99879769870160,
+    0.99883256074295,
+    0.99886658804953,
+    0.99889979621983,
+    0.99893220065356,
+    0.99896381655254,
+    0.99899465892154,
+    0.99902474256924,
+    0.99905408210916,
+    0.99908269196056,
+    0.99911058634952,
+    0.99913777930986,
+    0.99916428468421,
+    0.99919011612505,
+    0.99921528709576,
+    0.99923981087174,
+    0.99926370054150,
+    0.99928696900779,
+    0.99930962898876,
+    0.99933169301910,
+    0.99935317345126,
+    0.99937408245662,
+    0.99939443202674,
+    0.99941423397457,
+    0.99943349993572,
+    0.99945224136972,
+    0.99947046956130,
+    0.99948819562171,
+    0.99950543049000,
+    0.99952218493439,
+    0.99953846955355,
+    0.99955429477803,
+    0.99956967087154,
+    0.99958460793242,
+    0.99959911589494,
+    0.99961320453077,
+    0.99962688345035,
+    0.99964016210433,
+    0.99965304978499,
+    0.99966555562769,
+    0.99967768861231,
+    0.99968945756473,
+    0.99970087115825,
+    0.99971193791510,
+    0.99972266620792,
+    0.99973306426121,
+    0.99974314015288,
+    0.99975290181568,
+    0.99976235703876,
+    0.99977151346914,
+    0.99978037861326,
+    0.99978895983845,
+    0.99979726437448,
+    0.99980529931507,
+    0.99981307161943,
+    0.99982058811377,
+    0.99982785549283,
+    0.99983488032144,
+    0.99984166903600,
+    0.99984822794606,
+    0.99985456323584,
+    0.99986068096572,
+    0.99986658707386,
+    0.99987228737764,
+    0.99987778757524,
+    0.99988309324717,
+    0.99988820985777,
+    0.99989314275675,
+    0.99989789718072,
+    0.99990247825468,
+    0.99990689099357,
+    0.99991114030376,
+    0.99991523098456,
+    0.99991916772971,
+    0.99992295512891,
+    0.99992659766930,
+    0.99993009973692,
+    0.99993346561824,
+    0.99993669950161,
+    0.99993980547870,
+    0.99994278754604,
+    0.99994564960642,
+    0.99994839547033,
+    0.99995102885747,
+    0.99995355339809,
+    0.99995597263451,
+    0.99995829002249,
+    0.99996050893264,
+    0.99996263265183,
+    0.99996466438460,
+    0.99996660725452,
+    0.99996846430558,
+    0.99997023850356,
+    0.99997193273736,
+    0.99997354982037,
+    0.99997509249183,
+    0.99997656341810,
+    0.99997796519400,
+    0.99997930034415,
+    0.99998057132421,
+    0.99998178052220,
+    0.99998293025975,
+    0.99998402279338,
+    0.99998506031574,
+    0.99998604495686,
+    0.99998697878536,
+    0.99998786380966,
+    0.99998870197921,
+    0.99998949518567,
+    0.99999024526408,
+    0.99999095399401,
+    0.99999162310077,
+    0.99999225425649,
+    0.99999284908128,
+    0.99999340914435,
+    0.99999393596510,
+    0.99999443101421,
+    0.99999489571473,
+    0.99999533144314,
+    0.99999573953040,
+    0.99999612126300,
+    0.99999647788395,
+    0.99999681059383,
+    0.99999712055178,
+    0.99999740887647,
+    0.99999767664709,
+    0.99999792490431,
+    0.99999815465123,
+    0.99999836685427,
+    0.99999856244415,
+    0.99999874231676,
+    0.99999890733405,
+    0.99999905832493,
+    0.99999919608613,
+    0.99999932138304,
+    0.99999943495056,
+    0.99999953749392,
+    0.99999962968950,
+    0.99999971218563,
+    0.99999978560337,
+    0.99999985053727,
+    0.99999990755616,
+    0.99999995720387
+};
+
+
+float kbd_short[] =
+{
+    4.3795702929468881e-005,
+    0.00011867384265436617,
+    0.0002307165763996192,
+    0.00038947282760568383,
+    0.00060581272288302553,
+    0.00089199695169487453,
+    0.0012617254423430522,
+    0.0017301724373162003,
+    0.0023140071937421476,
+    0.0030313989666022221,
+    0.0039020049735530842,
+    0.0049469401815512024,
+    0.0061887279335368318,
+    0.0076512306364647726,
+    0.0093595599562652423,
+    0.011339966208377799,
+    0.013619706891715299,
+    0.016226894586323766,
+    0.019190324717288168,
+    0.022539283975960878,
+    0.026303340480472455,
+    0.030512117046644357,
+    0.03519504922365594,
+    0.040381130021856941,
+    0.046098643518702249,
+    0.052374889768730587,
+    0.059235903660769147,
+    0.066706170556282418,
+    0.074808341703430481,
+    0.083562952548726227,
+    0.092988147159339674,
+    0.1030994120216919,
+    0.11390932249409955,
+    0.12542730516149531,
+    0.13765941926783826,
+    0.15060816028651081,
+    0.16427228853114245,
+    0.17864668550988483,
+    0.19372224048676889,
+    0.20948576943658073,
+    0.22591996826744942,
+    0.24300340184133981,
+    0.26071052995068139,
+    0.27901177101369551,
+    0.29787360383626599,
+    0.3172587073594233,
+    0.33712613787396362,
+    0.35743154274286698,
+    0.37812740923363009,
+    0.39916334663203618,
+    0.42048639939189658,
+    0.4420413886774246,
+    0.4637712792815169,
+    0.4856175685594023,
+    0.50752069370766872,
+    0.52942045344797806,
+    0.55125643994680196,
+    0.57296847662071559,
+    0.59449705734411495,
+    0.61578378249506627,
+    0.63677178724712891,
+    0.65740615754163356,
+    0.67763432925662526,
+    0.69740646622548552,
+    0.71667581294953808,
+    0.73539901809352737,
+    0.75353642514900732,
+    0.77105232699609816,
+    0.78791518148597028,
+    0.80409778560147072,
+    0.81957740622770781,
+    0.83433586607383625,
+    0.84835958382689225,
+    0.86163956818294229,
+    0.87417136598406997,
+    0.88595496528524853,
+    0.89699465477567619,
+    0.90729884157670959,
+    0.91687983002436779,
+    0.92575356460899649,
+    0.93393934077779084,
+    0.94145948779657318,
+    0.94833902830402828,
+    0.95460531956280026,
+    0.96028768170574896,
+    0.96541701848104766,
+    0.97002543610646474,
+    0.97414586584250062,
+    0.97781169577969584,
+    0.98105641710392333,
+    0.98391328975491177,
+    0.98641503193166202,
+    0.98859353733226141,
+    0.99047962335771556,
+    0.9921028127769449,
+    0.99349115056397752,
+    0.99467105680259038,
+    0.9956672157341897,
+    0.99650250022834352,
+    0.99719793020823266,
+    0.99777266288955657,
+    0.99824401211201486,
+    0.99862749357391212,
+    0.99893689243401962,
+    0.99918434952623147,
+    0.99938046234161726,
+    0.99953439696357238,
+    0.99965400728430465,
+    0.99974595807027455,
+    0.99981584876278362,
+    0.99986833527824281,
+    0.99990724749057802,
+    0.99993570051598468,
+    0.99995619835942084,
+    0.99997072890647543,
+    0.9999808496399144,
+    0.99998776381655818,
+    0.99999238714961569,
+    0.99999540529959718,
+    0.99999732268176988,
+    0.99999850325054862,
+    0.99999920402413744,
+    0.9999996021706401,
+    0.99999981649545566,
+    0.99999992415545547,
+    0.99999997338493041,
+    0.99999999295825959,
+    0.99999999904096815
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/libfaad.dsp
@@ -1,0 +1,240 @@
+# Microsoft Developer Studio Project File - Name="libfaad" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=libfaad - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "libfaad.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "libfaad.mak" CFG="libfaad - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "libfaad - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "libfaad - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=xicl6.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libfaad - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD CPP /nologo /G6 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD BASE RSC /l 0x413 /d "NDEBUG"
+# ADD RSC /l 0x413 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=xilink6.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF  "$(CFG)" == "libfaad - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x413 /d "_DEBUG"
+# ADD RSC /l 0x413 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=xilink6.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libfaad - Win32 Release"
+# Name "libfaad - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\bits.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\data.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\decoder.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\drc.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\error.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\filtbank.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\ic_predict.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\is.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\lt_predict.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mdct.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\ms.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\output.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\pns.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\pulse.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\specrec.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\syntax.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\tns.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\bits.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\data.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\decoder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\drc.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\error.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\filtbank.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\huffman.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ic_predict.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\is.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\kbd_win.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\lt_predict.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\mdct.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ms.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\output.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\pns.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\pulse.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\specrec.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\syntax.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\tns.h
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null
+++ b/libfaad/libfaad.dsw
@@ -1,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "libfaad"=.\libfaad.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+++ b/libfaad/lt_predict.c
@@ -1,0 +1,88 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: lt_predict.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#include "syntax.h"
+#include "lt_predict.h"
+#include "filtbank.h"
+#include "tns.h"
+
+static float codebook[8] =
+{
+    0.570829f, 0.696616f, 0.813004f, 0.911304f, 0.984900f, 1.067894f,
+    1.194601f, 1.369533f
+};
+
+void lt_prediction(ic_stream *ics, ltp_info *ltp, float *spec,
+                   float *lt_pred_stat, fb_info *fb, int win_shape,
+                   int win_shape_prev, int sr_index, int object_type)
+{
+    int sfb, i, bin;
+    int num_samples;
+    float x_est[2*1024];
+    float X_est[2*1024];
+
+    if (ics->window_sequence != EIGHT_SHORT_SEQUENCE)
+    {
+        if (ltp->data_present)
+        {
+            if (ltp->lag < 1024)
+                num_samples = 1024 + ltp->lag;
+            else
+                num_samples = 2*1024;
+
+            for(i = 0; i < num_samples; i++)
+                x_est[i] = codebook[ltp->coef] * lt_pred_stat[i - ltp->lag + 2*1024];
+            for( ; i < 2*1024; i++)
+                x_est[i] = 0.0f;
+
+            filter_bank_ltp(fb, ics->window_sequence, win_shape, win_shape_prev,
+                x_est, X_est);
+
+            tns_encode_frame(ics, &(ics->tns), sr_index, object_type, X_est);
+
+            for (sfb = 0; sfb < ltp->last_band; sfb++)
+            {
+                if (ltp->long_used[sfb])
+                {
+                    int low  = ics->swb_offset[sfb];
+                    int high = ics->swb_offset[sfb+1];
+
+                    for (bin = low; bin < high; bin++)
+                    {
+                        spec[bin] += X_est[bin];
+                    }
+                }
+            }
+        }
+    }
+}
+
+void lt_update_state(float *lt_pred_stat, float *time, float *overlap)
+{
+    int i;
+
+    for(i = 0; i < 1024; i++)
+    {
+        lt_pred_stat[i]          = lt_pred_stat[i + 1024];
+        lt_pred_stat[1024 + i]   = time[i];
+        lt_pred_stat[2*1024 + i] = overlap[i];
+    }
+}
\ No newline at end of file
--- /dev/null
+++ b/libfaad/lt_predict.h
@@ -1,0 +1,39 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: lt_predict.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __LT_PREDICT_H__
+#define __LT_PREDICT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "filtbank.h"
+
+void lt_prediction(ic_stream *ics, ltp_info *ltp, float *spec,
+                   float *lt_pred_stat, fb_info *fb, int win_shape,
+                   int win_shape_prev, int sr_index, int object_type);
+void lt_update_state(float *lt_pred_stat, float *time, float *overlap);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/mdct.c
@@ -1,0 +1,3224 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: mdct.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "mdct.h"
+
+#ifndef M_PI /* PI */
+#define M_PI 3.14159265358979323846
+#endif
+
+#ifndef M_PI_2 /* PI/2 */
+#define M_PI_2 1.57079632679489661923
+#endif
+
+void MDCT_long(fftw_real *in_data, fftw_real *out_data, short *unscrambled)
+{
+    fftw_complex FFTarray[512];
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq;
+    fftw_real fac,cosfreq8,sinfreq8;
+    int i;
+    int b = 2048 >> 1;
+    int N4 = 2048 >> 2;
+    int N2 = 2048 >> 1;
+    int a = 2048 - b;
+    int a2 = a >> 1;
+    int a4 = a >> 2;
+    int b4 = b >> 2;
+
+
+    fac = 2.; /* 2 from MDCT inverse  to forward */
+
+    /* prepare for recurrence relation in pre-twiddle */
+    cfreq = 0.99999529123306274f;
+    sfreq = 0.0030679567717015743f;
+    cosfreq8 = 0.99999994039535522f;
+    sinfreq8 = 0.00038349519824312089f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < N4; i++)
+    {
+        int n = 2048 / 2 - 1 - 2 * i;
+        if (i < b4)
+            tempr = in_data[a2 + n] + in_data[2048 + a2 - 1 - n];
+        else
+            tempr = in_data[a2 + n] - in_data[a2 - 1 - n];
+
+        n = 2 * i;
+        if (i < a4)
+            tempi = in_data[a2 + n] - in_data[a2 - 1 - n];
+        else
+            tempi = in_data[a2 + n] + in_data[2048 + a2 - 1 - n];
+
+        /* calculate pre-twiddled FFT input */
+        FFTarray[i].re = tempr * c + tempi * s;
+        FFTarray[i].im = tempi * c - tempr * s;
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex FFT of length N/4 */
+    pfftw_512(FFTarray);
+
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < N4; i++)
+    {
+        /* get post-twiddled FFT output  */
+        int unscr = unscrambled[i];
+
+        tempr = fac * (FFTarray[unscr].re * c + FFTarray[unscr].im * s);
+        tempi = fac * (FFTarray[unscr].im * c - FFTarray[unscr].re * s);
+
+        /* fill in output values */
+        out_data[2 * i]            = -tempr;  /* first half even */
+        out_data[N2 - 1 - 2 * i]   =  tempi;  /* first half odd */
+        out_data[N2 + 2 * i]       = -tempi;  /* second half even */
+        out_data[2048 - 1 - 2 * i] =  tempr;  /* second half odd */
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+}
+
+void MDCT_short(fftw_real *in_data, fftw_real *out_data, short *unscrambled)
+{
+    fftw_complex FFTarray[64];    /* the array for in-place FFT */
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+    fftw_real fac,cosfreq8,sinfreq8;
+    int i;
+    int b = 256 >> 1;
+    int N4 = 256 >> 2;
+    int N2 = 256 >> 1;
+    int a = 256 - b;
+    int a2 = a >> 1;
+    int a4 = a >> 2;
+    int b4 = b >> 2;
+
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+    fac = 2.; /* 2 from MDCT inverse  to forward */
+
+    /* prepare for recurrence relation in pre-twiddle */
+    cfreq = 0.99969881772994995f;
+    sfreq = 0.024541229009628296f;
+    cosfreq8 = 0.99999529123306274f;
+    sinfreq8 = 0.0030679568483393833f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < N4; i++)
+    {
+        int n = 256 / 2 - 1 - 2 * i;
+        if (i < b4)
+            tempr = in_data[a2 + n] + in_data[256 + a2 - 1 - n];
+        else
+            tempr = in_data[a2 + n] - in_data[a2 - 1 - n];
+
+        n = 2 * i;
+        if (i < a4)
+            tempi = in_data[a2 + n] - in_data[a2 - 1 - n];
+        else
+            tempi = in_data[a2 + n] + in_data[256 + a2 - 1 - n];
+
+        /* calculate pre-twiddled FFT input */
+        FFTarray[i].re = tempr * c + tempi * s;
+        FFTarray[i].im = tempi * c - tempr * s;
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex FFT of length N/4 */
+    pfftw_64(FFTarray);
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < N4; i++)
+    {
+        int unscr = unscrambled[i];
+
+        tempr = fac * (FFTarray[unscr].re * c + FFTarray[unscr].im * s);
+        tempi = fac * (FFTarray[unscr].im * c - FFTarray[unscr].re * s);
+
+        /* fill in output values */
+        out_data[2 * i]           = -tempr;  /* first half even */
+        out_data[N2 - 1 - 2 * i]  =  tempi;  /* first half odd */
+        out_data[N2 + 2 * i]      = -tempi;  /* second half even */
+        out_data[256 - 1 - 2 * i] =  tempr;  /* second half odd */
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+}
+
+void IMDCT_long(fftw_real *in_data, fftw_real *out_data, short *unscrambled)
+{
+    fftw_complex FFTarray[512];    /* the array for in-place FFT */
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+
+    fftw_real fac, cosfreq8, sinfreq8;
+    int i;
+    int Nd2 = 2048 >> 1;
+    int Nd4 = 2048 >> 2;
+    int Nd8 = 2048 >> 3;
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+    fac = 0.0009765625f;
+
+    /* prepare for recurrence relation in pre-twiddle */
+    cfreq = 0.99999529123306274f;
+    sfreq = 0.0030679567717015743f;
+    cosfreq8 = 0.99999994039535522f;
+    sinfreq8 = 0.00038349519824312089f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < Nd4; i++)
+    {
+        int unscr = unscrambled[i];
+
+        tempr = -in_data[2 * i];
+        tempi =  in_data[Nd2 - 1 - 2 * i];
+
+        /* calculate pre-twiddled FFT input */
+        FFTarray[unscr].re = tempr * c - tempi * s;
+        FFTarray[unscr].im = tempi * c + tempr * s;
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex IFFT of length N/4 */
+    pfftwi_512(FFTarray);
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < Nd4; i++)
+    {
+        /* get post-twiddled FFT output  */
+        tempr = fac * (FFTarray[i].re * c - FFTarray[i].im * s);
+        tempi = fac * (FFTarray[i].im * c + FFTarray[i].re * s);
+
+        /* fill in output values */
+        out_data [Nd2 + Nd4 - 1 - 2 * i] = tempr;
+        if (i < Nd8)
+            out_data[Nd2 + Nd4 + 2 * i] = tempr;
+        else
+            out_data[2 * i - Nd4] = -tempr;
+
+        out_data [Nd4 + 2 * i] = tempi;
+        if (i < Nd8)
+            out_data[Nd4 - 1 - 2 * i] = -tempi;
+        else
+            out_data[Nd4 + 2048 - 1 - 2*i] = tempi;
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+}
+
+void IMDCT_short(fftw_real *in_data, fftw_real *out_data, short *unscrambled)
+{
+    fftw_complex FFTarray[64];    /* the array for in-place FFT */
+    fftw_real tempr, tempi, c, s, cold, cfreq, sfreq; /* temps for pre and post twiddle */
+    fftw_real fac, cosfreq8, sinfreq8;
+    int i;
+    int Nd2 = 256 >> 1;
+    int Nd4 = 256 >> 2;
+    int Nd8 = 256 >> 3;
+
+    /* Choosing to allocate 2/N factor to Inverse Xform! */
+    fac = 0.0078125f; /* remaining 2/N from 4/N IFFT factor */
+
+    /* prepare for recurrence relation in pre-twiddle */
+    cfreq = 0.99969881772994995f;
+    sfreq = 0.024541229009628296f;
+    cosfreq8 = 0.99999529123306274f;
+    sinfreq8 = 0.0030679568483393833f;
+
+    c = cosfreq8;
+    s = sinfreq8;
+
+    for (i = 0; i < Nd4; i++)
+    {
+        int unscr = unscrambled[i];
+
+        tempr = -in_data[2 * i];
+        tempi = in_data[Nd2 - 1 - 2 * i];
+
+        /* calculate pre-twiddled FFT input */
+        FFTarray[unscr].re = tempr * c - tempi * s;
+        FFTarray[unscr].im = tempi * c + tempr * s;
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+
+    /* Perform in-place complex IFFT of length N/4 */
+    pfftwi_64(FFTarray);
+
+    /* prepare for recurrence relations in post-twiddle */
+    c = cosfreq8;
+    s = sinfreq8;
+
+    /* post-twiddle FFT output and then get output data */
+    for (i = 0; i < Nd4; i++)
+    {
+        /* get post-twiddled FFT output  */
+        tempr = fac * (FFTarray[i].re * c - FFTarray[i].im * s);
+        tempi = fac * (FFTarray[i].im * c + FFTarray[i].re * s);
+
+        /* fill in output values */
+        out_data [Nd2 + Nd4 - 1 - 2 * i] = tempr;
+        if (i < Nd8)
+            out_data[Nd2 + Nd4 + 2 * i] = tempr;
+        else
+            out_data[2 * i - Nd4] = -tempr;
+
+        out_data [Nd4 + 2 * i] = tempi;
+        if (i < Nd8)
+            out_data[Nd4 - 1 - 2 * i] = -tempi;
+        else
+            out_data[Nd4 + 256 - 1 - 2*i] = tempi;
+
+        /* use recurrence to prepare cosine and sine for next value of i */
+        cold = c;
+        c = c * cfreq - s * sfreq;
+        s = s * cfreq + cold * sfreq;
+    }
+}
+
+/* Fast FFT */
+#ifdef _MSC_VER
+#pragma warning(disable:4305)
+#endif
+
+
+static fftw_real K980785280[1] =
+{FFTW_KONST(+0.980785280403230449126182236134239036973933731)};
+static fftw_real K195090322[1] =
+{FFTW_KONST(+0.195090322016128267848284868477022240927691618)};
+static fftw_real K555570233[1] =
+{FFTW_KONST(+0.555570233019602224742830813948532874374937191)};
+static fftw_real K831469612[1] =
+{FFTW_KONST(+0.831469612302545237078788377617905756738560812)};
+static fftw_real K923879532[1] =
+{FFTW_KONST(+0.923879532511286756128183189396788286822416626)};
+static fftw_real K382683432[1] =
+{FFTW_KONST(+0.382683432365089771728459984030398866761344562)};
+static fftw_real K707106781[1] =
+{FFTW_KONST(+0.707106781186547524400844362104849039284835938)};
+
+static fftw_complex PFFTW(W_64)[30] = {
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.555570233019602, 0.831469612302545 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.38268343236509, 0.923879532511287 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.195090322016128, 0.98078528040323 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 6.12303176911189e-17, 1 },
+{ 0.634393284163645, 0.773010453362737 },
+{ -0.195090322016128, 0.98078528040323 },
+{ 0.555570233019602, 0.831469612302545 },
+{ -0.38268343236509, 0.923879532511287 },
+{ 0.471396736825998, 0.881921264348355 },
+{ -0.555570233019602, 0.831469612302545 },
+{ 0.38268343236509, 0.923879532511287 },
+{ -0.707106781186547, 0.707106781186548 },
+{ 0.290284677254462, 0.956940335732209 },
+{ -0.831469612302545, 0.555570233019602 },
+{ 0.195090322016128, 0.98078528040323 },
+{ -0.923879532511287, 0.38268343236509 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ -0.98078528040323, 0.195090322016129 },
+};
+
+static fftw_complex PFFTW(W_128)[62] = {
+{ 0.998795456205172, 0.049067674327418 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.989176509964781, 0.146730474455362 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.970031253194544, 0.242980179903264 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.941544065183021, 0.33688985339222 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 0.903989293123443, 0.427555093430282 },
+{ 0.634393284163645, 0.773010453362737 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.555570233019602, 0.831469612302545 },
+{ 0.857728610000272, 0.514102744193222 },
+{ 0.471396736825998, 0.881921264348355 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.38268343236509, 0.923879532511287 },
+{ 0.803207531480645, 0.595699304492433 },
+{ 0.290284677254462, 0.956940335732209 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.195090322016128, 0.98078528040323 },
+{ 0.740951125354959, 0.671558954847018 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 6.12303176911189e-17, 1 },
+{ 0.671558954847018, 0.740951125354959 },
+{ -0.0980171403295606, 0.995184726672197 },
+{ 0.634393284163645, 0.773010453362737 },
+{ -0.195090322016128, 0.98078528040323 },
+{ 0.595699304492433, 0.803207531480645 },
+{ -0.290284677254462, 0.956940335732209 },
+{ 0.555570233019602, 0.831469612302545 },
+{ -0.38268343236509, 0.923879532511287 },
+{ 0.514102744193222, 0.857728610000272 },
+{ -0.471396736825998, 0.881921264348355 },
+{ 0.471396736825998, 0.881921264348355 },
+{ -0.555570233019602, 0.831469612302545 },
+{ 0.427555093430282, 0.903989293123443 },
+{ -0.634393284163645, 0.773010453362737 },
+{ 0.38268343236509, 0.923879532511287 },
+{ -0.707106781186547, 0.707106781186548 },
+{ 0.33688985339222, 0.941544065183021 },
+{ -0.773010453362737, 0.634393284163645 },
+{ 0.290284677254462, 0.956940335732209 },
+{ -0.831469612302545, 0.555570233019602 },
+{ 0.242980179903264, 0.970031253194544 },
+{ -0.881921264348355, 0.471396736825998 },
+{ 0.195090322016128, 0.98078528040323 },
+{ -0.923879532511287, 0.38268343236509 },
+{ 0.146730474455362, 0.989176509964781 },
+{ -0.956940335732209, 0.290284677254462 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ -0.98078528040323, 0.195090322016129 },
+{ 0.0490676743274181, 0.998795456205172 },
+{ -0.995184726672197, 0.0980171403295608 },
+};
+
+static fftw_complex PFFTW(W_512)[254] = {
+{ 0.999924701839145, 0.0122715382857199 },
+{ 0.999698818696204, 0.0245412285229123 },
+{ 0.999698818696204, 0.0245412285229123 },
+{ 0.998795456205172, 0.049067674327418 },
+{ 0.99932238458835, 0.0368072229413588 },
+{ 0.99729045667869, 0.0735645635996674 },
+{ 0.998795456205172, 0.049067674327418 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.998118112900149, 0.0613207363022086 },
+{ 0.99247953459871, 0.122410675199216 },
+{ 0.99729045667869, 0.0735645635996674 },
+{ 0.989176509964781, 0.146730474455362 },
+{ 0.996312612182778, 0.0857973123444399 },
+{ 0.985277642388941, 0.170961888760301 },
+{ 0.995184726672197, 0.0980171403295606 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.993906970002356, 0.110222207293883 },
+{ 0.975702130038529, 0.21910124015687 },
+{ 0.99247953459871, 0.122410675199216 },
+{ 0.970031253194544, 0.242980179903264 },
+{ 0.99090263542778, 0.134580708507126 },
+{ 0.96377606579544, 0.266712757474898 },
+{ 0.989176509964781, 0.146730474455362 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.987301418157858, 0.158858143333861 },
+{ 0.949528180593037, 0.313681740398892 },
+{ 0.985277642388941, 0.170961888760301 },
+{ 0.941544065183021, 0.33688985339222 },
+{ 0.983105487431216, 0.183039887955141 },
+{ 0.932992798834739, 0.359895036534988 },
+{ 0.98078528040323, 0.195090322016128 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.978317370719628, 0.207111376192219 },
+{ 0.914209755703531, 0.40524131400499 },
+{ 0.975702130038529, 0.21910124015687 },
+{ 0.903989293123443, 0.427555093430282 },
+{ 0.97293995220556, 0.231058108280671 },
+{ 0.893224301195515, 0.449611329654607 },
+{ 0.970031253194544, 0.242980179903264 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.966976471044852, 0.254865659604515 },
+{ 0.870086991108711, 0.492898192229784 },
+{ 0.96377606579544, 0.266712757474898 },
+{ 0.857728610000272, 0.514102744193222 },
+{ 0.960430519415566, 0.278519689385053 },
+{ 0.844853565249707, 0.534997619887097 },
+{ 0.956940335732209, 0.290284677254462 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.953306040354194, 0.302005949319228 },
+{ 0.817584813151584, 0.575808191417845 },
+{ 0.949528180593037, 0.313681740398892 },
+{ 0.803207531480645, 0.595699304492433 },
+{ 0.945607325380521, 0.325310292162263 },
+{ 0.788346427626606, 0.615231590580627 },
+{ 0.941544065183021, 0.33688985339222 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.937339011912575, 0.348418680249435 },
+{ 0.757208846506485, 0.653172842953777 },
+{ 0.932992798834739, 0.359895036534988 },
+{ 0.740951125354959, 0.671558954847018 },
+{ 0.928506080473216, 0.371317193951838 },
+{ 0.724247082951467, 0.689540544737067 },
+{ 0.923879532511287, 0.38268343236509 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 0.919113851690058, 0.393992040061048 },
+{ 0.689540544737067, 0.724247082951467 },
+{ 0.914209755703531, 0.40524131400499 },
+{ 0.671558954847018, 0.740951125354959 },
+{ 0.909167983090522, 0.416429560097637 },
+{ 0.653172842953777, 0.757208846506484 },
+{ 0.903989293123443, 0.427555093430282 },
+{ 0.634393284163645, 0.773010453362737 },
+{ 0.898674465693954, 0.438616238538528 },
+{ 0.615231590580627, 0.788346427626606 },
+{ 0.893224301195515, 0.449611329654607 },
+{ 0.595699304492433, 0.803207531480645 },
+{ 0.887639620402854, 0.46053871095824 },
+{ 0.575808191417845, 0.817584813151584 },
+{ 0.881921264348355, 0.471396736825998 },
+{ 0.555570233019602, 0.831469612302545 },
+{ 0.876070094195407, 0.482183772079123 },
+{ 0.534997619887097, 0.844853565249707 },
+{ 0.870086991108711, 0.492898192229784 },
+{ 0.514102744193222, 0.857728610000272 },
+{ 0.863972856121587, 0.503538383725718 },
+{ 0.492898192229784, 0.870086991108711 },
+{ 0.857728610000272, 0.514102744193222 },
+{ 0.471396736825998, 0.881921264348355 },
+{ 0.851355193105265, 0.524589682678469 },
+{ 0.449611329654607, 0.893224301195515 },
+{ 0.844853565249707, 0.534997619887097 },
+{ 0.427555093430282, 0.903989293123443 },
+{ 0.838224705554838, 0.545324988422046 },
+{ 0.40524131400499, 0.914209755703531 },
+{ 0.831469612302545, 0.555570233019602 },
+{ 0.38268343236509, 0.923879532511287 },
+{ 0.824589302785025, 0.565731810783613 },
+{ 0.359895036534988, 0.932992798834739 },
+{ 0.817584813151584, 0.575808191417845 },
+{ 0.33688985339222, 0.941544065183021 },
+{ 0.810457198252595, 0.585797857456439 },
+{ 0.313681740398892, 0.949528180593037 },
+{ 0.803207531480645, 0.595699304492433 },
+{ 0.290284677254462, 0.956940335732209 },
+{ 0.795836904608884, 0.605511041404326 },
+{ 0.266712757474898, 0.96377606579544 },
+{ 0.788346427626606, 0.615231590580627 },
+{ 0.242980179903264, 0.970031253194544 },
+{ 0.780737228572094, 0.624859488142386 },
+{ 0.21910124015687, 0.975702130038529 },
+{ 0.773010453362737, 0.634393284163645 },
+{ 0.195090322016128, 0.98078528040323 },
+{ 0.765167265622459, 0.643831542889791 },
+{ 0.170961888760301, 0.985277642388941 },
+{ 0.757208846506485, 0.653172842953777 },
+{ 0.146730474455362, 0.989176509964781 },
+{ 0.749136394523459, 0.662415777590172 },
+{ 0.122410675199216, 0.99247953459871 },
+{ 0.740951125354959, 0.671558954847018 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ 0.732654271672413, 0.680600997795453 },
+{ 0.0735645635996675, 0.99729045667869 },
+{ 0.724247082951467, 0.689540544737067 },
+{ 0.0490676743274181, 0.998795456205172 },
+{ 0.715730825283819, 0.698376249408973 },
+{ 0.0245412285229123, 0.999698818696204 },
+{ 0.707106781186548, 0.707106781186547 },
+{ 6.12303176911189e-17, 1 },
+{ 0.698376249408973, 0.715730825283819 },
+{ -0.0245412285229121, 0.999698818696204 },
+{ 0.689540544737067, 0.724247082951467 },
+{ -0.049067674327418, 0.998795456205172 },
+{ 0.680600997795453, 0.732654271672413 },
+{ -0.0735645635996673, 0.99729045667869 },
+{ 0.671558954847018, 0.740951125354959 },
+{ -0.0980171403295606, 0.995184726672197 },
+{ 0.662415777590172, 0.749136394523459 },
+{ -0.122410675199216, 0.99247953459871 },
+{ 0.653172842953777, 0.757208846506484 },
+{ -0.146730474455362, 0.989176509964781 },
+{ 0.643831542889791, 0.765167265622459 },
+{ -0.170961888760301, 0.985277642388941 },
+{ 0.634393284163645, 0.773010453362737 },
+{ -0.195090322016128, 0.98078528040323 },
+{ 0.624859488142386, 0.780737228572094 },
+{ -0.21910124015687, 0.975702130038529 },
+{ 0.615231590580627, 0.788346427626606 },
+{ -0.242980179903264, 0.970031253194544 },
+{ 0.605511041404326, 0.795836904608883 },
+{ -0.266712757474898, 0.96377606579544 },
+{ 0.595699304492433, 0.803207531480645 },
+{ -0.290284677254462, 0.956940335732209 },
+{ 0.585797857456439, 0.810457198252595 },
+{ -0.313681740398891, 0.949528180593037 },
+{ 0.575808191417845, 0.817584813151584 },
+{ -0.33688985339222, 0.941544065183021 },
+{ 0.565731810783613, 0.824589302785025 },
+{ -0.359895036534988, 0.932992798834739 },
+{ 0.555570233019602, 0.831469612302545 },
+{ -0.38268343236509, 0.923879532511287 },
+{ 0.545324988422046, 0.838224705554838 },
+{ -0.40524131400499, 0.914209755703531 },
+{ 0.534997619887097, 0.844853565249707 },
+{ -0.427555093430282, 0.903989293123443 },
+{ 0.524589682678469, 0.851355193105265 },
+{ -0.449611329654607, 0.893224301195515 },
+{ 0.514102744193222, 0.857728610000272 },
+{ -0.471396736825998, 0.881921264348355 },
+{ 0.503538383725718, 0.863972856121587 },
+{ -0.492898192229784, 0.870086991108711 },
+{ 0.492898192229784, 0.870086991108711 },
+{ -0.514102744193222, 0.857728610000272 },
+{ 0.482183772079123, 0.876070094195407 },
+{ -0.534997619887097, 0.844853565249707 },
+{ 0.471396736825998, 0.881921264348355 },
+{ -0.555570233019602, 0.831469612302545 },
+{ 0.46053871095824, 0.887639620402854 },
+{ -0.575808191417845, 0.817584813151584 },
+{ 0.449611329654607, 0.893224301195515 },
+{ -0.595699304492433, 0.803207531480645 },
+{ 0.438616238538528, 0.898674465693954 },
+{ -0.615231590580627, 0.788346427626606 },
+{ 0.427555093430282, 0.903989293123443 },
+{ -0.634393284163645, 0.773010453362737 },
+{ 0.416429560097637, 0.909167983090522 },
+{ -0.653172842953777, 0.757208846506485 },
+{ 0.40524131400499, 0.914209755703531 },
+{ -0.671558954847018, 0.740951125354959 },
+{ 0.393992040061048, 0.919113851690058 },
+{ -0.689540544737067, 0.724247082951467 },
+{ 0.38268343236509, 0.923879532511287 },
+{ -0.707106781186547, 0.707106781186548 },
+{ 0.371317193951838, 0.928506080473215 },
+{ -0.724247082951467, 0.689540544737067 },
+{ 0.359895036534988, 0.932992798834739 },
+{ -0.740951125354959, 0.671558954847019 },
+{ 0.348418680249435, 0.937339011912575 },
+{ -0.757208846506485, 0.653172842953777 },
+{ 0.33688985339222, 0.941544065183021 },
+{ -0.773010453362737, 0.634393284163645 },
+{ 0.325310292162263, 0.945607325380521 },
+{ -0.788346427626606, 0.615231590580627 },
+{ 0.313681740398892, 0.949528180593037 },
+{ -0.803207531480645, 0.595699304492433 },
+{ 0.302005949319228, 0.953306040354194 },
+{ -0.817584813151584, 0.575808191417845 },
+{ 0.290284677254462, 0.956940335732209 },
+{ -0.831469612302545, 0.555570233019602 },
+{ 0.278519689385053, 0.960430519415566 },
+{ -0.844853565249707, 0.534997619887097 },
+{ 0.266712757474898, 0.96377606579544 },
+{ -0.857728610000272, 0.514102744193222 },
+{ 0.254865659604515, 0.966976471044852 },
+{ -0.870086991108711, 0.492898192229784 },
+{ 0.242980179903264, 0.970031253194544 },
+{ -0.881921264348355, 0.471396736825998 },
+{ 0.231058108280671, 0.97293995220556 },
+{ -0.893224301195515, 0.449611329654607 },
+{ 0.21910124015687, 0.975702130038529 },
+{ -0.903989293123443, 0.427555093430282 },
+{ 0.207111376192219, 0.978317370719628 },
+{ -0.914209755703531, 0.40524131400499 },
+{ 0.195090322016128, 0.98078528040323 },
+{ -0.923879532511287, 0.38268343236509 },
+{ 0.183039887955141, 0.983105487431216 },
+{ -0.932992798834739, 0.359895036534988 },
+{ 0.170961888760301, 0.985277642388941 },
+{ -0.941544065183021, 0.33688985339222 },
+{ 0.158858143333861, 0.987301418157858 },
+{ -0.949528180593037, 0.313681740398891 },
+{ 0.146730474455362, 0.989176509964781 },
+{ -0.956940335732209, 0.290284677254462 },
+{ 0.134580708507126, 0.99090263542778 },
+{ -0.96377606579544, 0.266712757474898 },
+{ 0.122410675199216, 0.99247953459871 },
+{ -0.970031253194544, 0.242980179903264 },
+{ 0.110222207293883, 0.993906970002356 },
+{ -0.975702130038528, 0.21910124015687 },
+{ 0.0980171403295608, 0.995184726672197 },
+{ -0.98078528040323, 0.195090322016129 },
+{ 0.0857973123444399, 0.996312612182778 },
+{ -0.985277642388941, 0.170961888760301 },
+{ 0.0735645635996675, 0.99729045667869 },
+{ -0.989176509964781, 0.146730474455362 },
+{ 0.0613207363022086, 0.998118112900149 },
+{ -0.99247953459871, 0.122410675199216 },
+{ 0.0490676743274181, 0.998795456205172 },
+{ -0.995184726672197, 0.0980171403295608 },
+{ 0.036807222941359, 0.99932238458835 },
+{ -0.99729045667869, 0.0735645635996677 },
+{ 0.0245412285229123, 0.999698818696204 },
+{ -0.998795456205172, 0.049067674327418 },
+{ 0.0122715382857199, 0.999924701839145 },
+{ -0.999698818696204, 0.0245412285229123 },
+};
+
+void PFFTW(16) (fftw_complex * input) {
+     fftw_real tmp332;
+     fftw_real tmp331;
+     fftw_real tmp330;
+     fftw_real tmp329;
+     fftw_real tmp328;
+     fftw_real tmp327;
+     fftw_real tmp326;
+     fftw_real tmp325;
+     fftw_real tmp324;
+     fftw_real tmp323;
+     fftw_real tmp322;
+     fftw_real tmp321;
+     fftw_real tmp320;
+     fftw_real tmp319;
+     fftw_real tmp318;
+     fftw_real tmp317;
+     fftw_real tmp316;
+     fftw_real tmp315;
+     fftw_real tmp314;
+     fftw_real tmp313;
+     fftw_real tmp312;
+     fftw_real tmp311;
+     fftw_real tmp310;
+     fftw_real tmp309;
+     fftw_real tmp308;
+     fftw_real tmp307;
+     fftw_real tmp306;
+     fftw_real tmp305;
+     fftw_real tmp304;
+     fftw_real tmp303;
+     fftw_real tmp302;
+     fftw_real tmp301;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[0]);
+     st8 = st8 - c_re(input[8]);
+     st7 = c_im(input[4]);
+     st7 = st7 - c_im(input[12]);
+     st6 = c_re(input[4]);
+     st5 = st8 - st7;
+     st8 = st8 + st7;
+     st6 = st6 - c_re(input[12]);
+     st4 = c_im(input[0]);
+     st4 = st4 - c_im(input[8]);
+     st3 = c_re(input[0]);
+     st2 = st6 + st4;
+     st4 = st4 - st6;
+     st3 = st3 + c_re(input[8]);
+     st1 = c_re(input[4]);
+     st1 = st1 + c_re(input[12]);
+     st7 = c_im(input[0]);
+     st6 = st3 + st1;
+     st3 = st3 - st1;
+     st7 = st7 + c_im(input[8]);
+     st1 = c_im(input[4]);
+     st1 = st1 + c_im(input[12]);
+     tmp301 = st4;
+     st4 = c_re(input[2]);
+     tmp302 = st8;
+     st8 = st7 + st1;
+     st7 = st7 - st1;
+     st4 = st4 + c_re(input[10]);
+     st1 = c_re(input[6]);
+     st1 = st1 + c_re(input[14]);
+     tmp303 = st2;
+     st2 = c_im(input[2]);
+     tmp304 = st5;
+     st5 = st4 + st1;
+     st4 = st4 - st1;
+     st2 = st2 + c_im(input[10]);
+     st1 = st6 + st5;
+     st6 = st6 - st5;
+     st5 = st4 + st7;
+     st7 = st7 - st4;
+     st4 = c_im(input[6]);
+     st4 = st4 + c_im(input[14]);
+     tmp305 = st5;
+     st5 = c_re(input[6]);
+     tmp306 = st7;
+     st7 = st2 + st4;
+     st2 = st2 - st4;
+     st4 = st8 - st7;
+     st8 = st8 + st7;
+     st7 = st3 - st2;
+     st3 = st3 + st2;
+     st5 = st5 - c_re(input[14]);
+     st2 = c_im(input[2]);
+     st2 = st2 - c_im(input[10]);
+     tmp307 = st3;
+     st3 = c_re(input[2]);
+     tmp308 = st6;
+     st6 = st5 + st2;
+     st2 = st2 - st5;
+     st3 = st3 - c_re(input[10]);
+     st5 = c_im(input[6]);
+     st5 = st5 - c_im(input[14]);
+     tmp309 = st7;
+     st7 = c_re(input[5]);
+     tmp310 = st8;
+     st8 = st3 - st5;
+     st3 = st3 + st5;
+     st5 = st6 - st8;
+     st6 = st6 + st8;
+     st5 = st5 * K707106781[0];
+     st8 = st2 + st3;
+     st6 = st6 * K707106781[0];
+     st2 = st2 - st3;
+     st8 = st8 * K707106781[0];
+     st7 = st7 - c_re(input[13]);
+     st2 = st2 * K707106781[0];
+     st3 = tmp304 + st5;
+     tmp311 = st4;
+     st4 = tmp303 + st6;
+     st6 = tmp303 - st6;
+     st5 = tmp304 - st5;
+     tmp312 = st1;
+     st1 = tmp302 - st8;
+     st8 = tmp302 + st8;
+     tmp313 = st8;
+     st8 = tmp301 + st2;
+     st2 = tmp301 - st2;
+     tmp314 = st2;
+     st2 = c_im(input[1]);
+     st2 = st2 - c_im(input[9]);
+     tmp315 = st8;
+     st8 = c_re(input[1]);
+     tmp316 = st1;
+     st1 = st7 + st2;
+     st2 = st2 - st7;
+     st7 = st1 * K923879532[0];
+     st8 = st8 - c_re(input[9]);
+     st1 = st1 * K382683432[0];
+     tmp317 = st5;
+     st5 = c_im(input[5]);
+     tmp318 = st6;
+     st6 = st2 * K923879532[0];
+     st5 = st5 - c_im(input[13]);
+     st2 = st2 * K382683432[0];
+     tmp319 = st4;
+     st4 = st8 - st5;
+     st8 = st8 + st5;
+     st5 = st4 * K382683432[0];
+     tmp320 = st3;
+     st3 = c_re(input[7]);
+     st4 = st4 * K923879532[0];
+     st7 = st7 + st5;
+     st5 = st8 * K382683432[0];
+     st1 = st1 - st4;
+     st8 = st8 * K923879532[0];
+     st6 = st6 - st5;
+     st2 = st2 + st8;
+     st3 = st3 - c_re(input[15]);
+     st4 = c_im(input[3]);
+     st4 = st4 - c_im(input[11]);
+     st5 = c_re(input[3]);
+     st8 = st3 + st4;
+     st4 = st4 - st3;
+     st3 = st8 * K382683432[0];
+     st5 = st5 - c_re(input[11]);
+     st8 = st8 * K923879532[0];
+     tmp321 = st2;
+     st2 = c_im(input[7]);
+     tmp322 = st6;
+     st6 = st4 * K382683432[0];
+     st2 = st2 - c_im(input[15]);
+     st4 = st4 * K923879532[0];
+     tmp323 = st1;
+     st1 = st5 - st2;
+     st5 = st5 + st2;
+     st2 = st1 * K923879532[0];
+     tmp324 = st7;
+     st7 = c_re(input[1]);
+     st1 = st1 * K382683432[0];
+     st3 = st3 + st2;
+     st2 = st5 * K923879532[0];
+     st1 = st1 - st8;
+     st5 = st5 * K382683432[0];
+     st6 = st6 - st2;
+     st4 = st4 + st5;
+     st7 = st7 + c_re(input[9]);
+     st8 = tmp324 - st3;
+     st3 = tmp324 + st3;
+     st2 = tmp320 - st8;
+     st8 = tmp320 + st8;
+     st5 = tmp319 - st3;
+     st3 = tmp319 + st3;
+     tmp325 = st3;
+     st3 = tmp323 + st1;
+     st1 = tmp323 - st1;
+     tmp326 = st5;
+     st5 = tmp318 - st3;
+     st3 = tmp318 + st3;
+     tmp327 = st5;
+     st5 = tmp317 - st1;
+     st1 = tmp317 + st1;
+     tmp328 = st3;
+     st3 = tmp322 - st6;
+     tmp329 = st5;
+     st5 = tmp321 + st4;
+     tmp330 = st1;
+     st1 = tmp316 - st3;
+     st3 = tmp316 + st3;
+     tmp331 = st2;
+     st2 = tmp313 - st5;
+     st5 = tmp313 + st5;
+     st6 = tmp322 + st6;
+     c_re(input[9]) = st2;
+     c_re(input[1]) = st5;
+     st2 = tmp315 - st6;
+     st6 = tmp315 + st6;
+     st4 = tmp321 - st4;
+     st5 = c_re(input[5]);
+     c_re(input[5]) = st3;
+     st5 = st5 + c_re(input[13]);
+     c_re(input[13]) = st1;
+     st1 = st7 + st5;
+     st7 = st7 - st5;
+     st3 = tmp314 - st4;
+     st4 = tmp314 + st4;
+     st5 = c_im(input[1]);
+     c_im(input[1]) = st6;
+     st5 = st5 + c_im(input[9]);
+     c_im(input[9]) = st2;
+     st2 = c_im(input[5]);
+     c_im(input[5]) = st3;
+     st2 = st2 + c_im(input[13]);
+     c_im(input[13]) = st4;
+     st6 = st5 - st2;
+     st5 = st5 + st2;
+     st3 = c_re(input[3]);
+     c_re(input[3]) = st8;
+     st3 = st3 + c_re(input[11]);
+     c_re(input[11]) = tmp331;
+     st8 = c_re(input[7]);
+     c_re(input[7]) = tmp330;
+     st8 = st8 + c_re(input[15]);
+     c_re(input[15]) = tmp329;
+     st4 = st3 + st8;
+     st3 = st3 - st8;
+     st2 = st1 + st4;
+     st1 = st1 - st4;
+     st8 = st3 + st6;
+     st6 = st6 - st3;
+     st4 = tmp312 - st2;
+     st2 = tmp312 + st2;
+     st3 = tmp311 - st1;
+     c_re(input[8]) = st4;
+     c_re(input[0]) = st2;
+     c_im(input[4]) = st3;
+     st1 = st1 + tmp311;
+     st4 = c_im(input[3]);
+     c_im(input[3]) = tmp328;
+     c_im(input[12]) = st1;
+     st4 = st4 + c_im(input[11]);
+     c_im(input[11]) = tmp327;
+     st2 = c_im(input[7]);
+     c_im(input[7]) = tmp326;
+     st2 = st2 + c_im(input[15]);
+     c_im(input[15]) = tmp325;
+     st3 = st4 - st2;
+     st4 = st4 + st2;
+     st1 = st7 - st3;
+     st2 = st5 - st4;
+     tmp332 = st2;
+     st2 = st8 - st1;
+     st8 = st8 + st1;
+     st2 = st2 * K707106781[0];
+     st5 = st5 + st4;
+     st8 = st8 * K707106781[0];
+     st7 = st7 + st3;
+     st3 = tmp310 + st5;
+     st4 = st6 - st7;
+     st6 = st6 + st7;
+     c_im(input[0]) = st3;
+     st4 = st4 * K707106781[0];
+     st5 = tmp310 - st5;
+     st6 = st6 * K707106781[0];
+     st1 = tmp309 - st2;
+     c_im(input[8]) = st5;
+     c_re(input[14]) = st1;
+     st2 = tmp309 + st2;
+     st7 = tmp308 + tmp332;
+     st3 = tmp308 - tmp332;
+     c_re(input[6]) = st2;
+     c_re(input[4]) = st7;
+     c_re(input[12]) = st3;
+     st5 = tmp306 - st4;
+     st4 = tmp306 + st4;
+     st1 = tmp307 - st6;
+     c_im(input[10]) = st5;
+     c_im(input[2]) = st4;
+     c_re(input[10]) = st1;
+     st6 = tmp307 + st6;
+     st2 = tmp305 - st8;
+     st8 = tmp305 + st8;
+     c_re(input[2]) = st6;
+     c_im(input[6]) = st2;
+     c_im(input[14]) = st8;
+}
+
+void PFFTW(32) (fftw_complex * input) {
+     fftw_real tmp714;
+     fftw_real tmp713;
+     fftw_real tmp712;
+     fftw_real tmp711;
+     fftw_real tmp710;
+     fftw_real tmp709;
+     fftw_real tmp708;
+     fftw_real tmp707;
+     fftw_real tmp706;
+     fftw_real tmp705;
+     fftw_real tmp704;
+     fftw_real tmp703;
+     fftw_real tmp702;
+     fftw_real tmp701;
+     fftw_real tmp700;
+     fftw_real tmp699;
+     fftw_real tmp698;
+     fftw_real tmp697;
+     fftw_real tmp696;
+     fftw_real tmp695;
+     fftw_real tmp694;
+     fftw_real tmp693;
+     fftw_real tmp692;
+     fftw_real tmp691;
+     fftw_real tmp690;
+     fftw_real tmp689;
+     fftw_real tmp688;
+     fftw_real tmp687;
+     fftw_real tmp686;
+     fftw_real tmp685;
+     fftw_real tmp684;
+     fftw_real tmp683;
+     fftw_real tmp682;
+     fftw_real tmp681;
+     fftw_real tmp680;
+     fftw_real tmp679;
+     fftw_real tmp678;
+     fftw_real tmp677;
+     fftw_real tmp676;
+     fftw_real tmp675;
+     fftw_real tmp674;
+     fftw_real tmp673;
+     fftw_real tmp672;
+     fftw_real tmp671;
+     fftw_real tmp670;
+     fftw_real tmp669;
+     fftw_real tmp668;
+     fftw_real tmp667;
+     fftw_real tmp666;
+     fftw_real tmp665;
+     fftw_real tmp664;
+     fftw_real tmp663;
+     fftw_real tmp662;
+     fftw_real tmp661;
+     fftw_real tmp660;
+     fftw_real tmp659;
+     fftw_real tmp658;
+     fftw_real tmp657;
+     fftw_real tmp656;
+     fftw_real tmp655;
+     fftw_real tmp654;
+     fftw_real tmp653;
+     fftw_real tmp652;
+     fftw_real tmp651;
+     fftw_real tmp650;
+     fftw_real tmp649;
+     fftw_real tmp648;
+     fftw_real tmp647;
+     fftw_real tmp646;
+     fftw_real tmp645;
+     fftw_real tmp644;
+     fftw_real tmp643;
+     fftw_real tmp642;
+     fftw_real tmp641;
+     fftw_real tmp640;
+     fftw_real tmp639;
+     fftw_real tmp638;
+     fftw_real tmp637;
+     fftw_real tmp636;
+     fftw_real tmp635;
+     fftw_real tmp634;
+     fftw_real tmp633;
+     fftw_real tmp632;
+     fftw_real tmp631;
+     fftw_real tmp630;
+     fftw_real tmp629;
+     fftw_real tmp628;
+     fftw_real tmp627;
+     fftw_real tmp626;
+     fftw_real tmp625;
+     fftw_real tmp624;
+     fftw_real tmp623;
+     fftw_real tmp622;
+     fftw_real tmp621;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[0]);
+     st8 = st8 - c_re(input[16]);
+     st7 = c_im(input[8]);
+     st7 = st7 - c_im(input[24]);
+     st6 = st8 - st7;
+     st8 = st8 + st7;
+     st5 = c_re(input[0]);
+     st5 = st5 + c_re(input[16]);
+     st4 = c_re(input[8]);
+     st4 = st4 + c_re(input[24]);
+     st3 = st5 + st4;
+     st5 = st5 - st4;
+     st2 = c_im(input[0]);
+     st2 = st2 + c_im(input[16]);
+     st1 = c_im(input[8]);
+     st1 = st1 + c_im(input[24]);
+     st7 = st2 + st1;
+     st2 = st2 - st1;
+     st4 = c_re(input[4]);
+     st4 = st4 + c_re(input[20]);
+     st1 = c_re(input[28]);
+     st1 = st1 + c_re(input[12]);
+     tmp621 = st6;
+     st6 = st4 + st1;
+     st1 = st1 - st4;
+     st4 = st3 + st6;
+     st3 = st3 - st6;
+     st6 = st2 - st1;
+     st1 = st1 + st2;
+     st2 = c_im(input[4]);
+     st2 = st2 + c_im(input[20]);
+     tmp622 = st1;
+     st1 = c_im(input[28]);
+     st1 = st1 + c_im(input[12]);
+     tmp623 = st6;
+     st6 = st2 + st1;
+     st2 = st2 - st1;
+     st1 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = st5 - st2;
+     st5 = st5 + st2;
+     st2 = c_re(input[8]);
+     st2 = st2 - c_re(input[24]);
+     tmp624 = st5;
+     st5 = c_im(input[0]);
+     st5 = st5 - c_im(input[16]);
+     tmp625 = st6;
+     st6 = st2 + st5;
+     st5 = st5 - st2;
+     st2 = c_im(input[4]);
+     st2 = st2 - c_im(input[20]);
+     tmp626 = st3;
+     st3 = c_re(input[4]);
+     st3 = st3 - c_re(input[20]);
+     tmp627 = st1;
+     st1 = st2 - st3;
+     st3 = st3 + st2;
+     st2 = c_re(input[28]);
+     st2 = st2 - c_re(input[12]);
+     tmp628 = st7;
+     st7 = c_im(input[28]);
+     st7 = st7 - c_im(input[12]);
+     tmp629 = st4;
+     st4 = st2 + st7;
+     st2 = st2 - st7;
+     st7 = st1 - st4;
+     st7 = st7 * K707106781[0];
+     st1 = st1 + st4;
+     st1 = st1 * K707106781[0];
+     st4 = st2 - st3;
+     st4 = st4 * K707106781[0];
+     st3 = st3 + st2;
+     st3 = st3 * K707106781[0];
+     st2 = st8 - st3;
+     tmp630 = st2;
+     st2 = st5 - st1;
+     tmp631 = st2;
+     st2 = tmp621 - st7;
+     tmp632 = st2;
+     st2 = st6 - st4;
+     st7 = tmp621 + st7;
+     st6 = st6 + st4;
+     st8 = st8 + st3;
+     st5 = st5 + st1;
+     st1 = c_re(input[2]);
+     st1 = st1 + c_re(input[18]);
+     st4 = c_re(input[10]);
+     st4 = st4 + c_re(input[26]);
+     st3 = st1 + st4;
+     st1 = st1 - st4;
+     st4 = c_im(input[2]);
+     st4 = st4 + c_im(input[18]);
+     tmp633 = st5;
+     st5 = c_im(input[10]);
+     st5 = st5 + c_im(input[26]);
+     tmp634 = st8;
+     st8 = st4 + st5;
+     st4 = st4 - st5;
+     st5 = st1 + st4;
+     st4 = st4 - st1;
+     st1 = c_re(input[30]);
+     st1 = st1 + c_re(input[14]);
+     tmp635 = st6;
+     st6 = c_re(input[6]);
+     st6 = st6 + c_re(input[22]);
+     tmp636 = st7;
+     st7 = st1 + st6;
+     st1 = st1 - st6;
+     st6 = st3 + st7;
+     st7 = st7 - st3;
+     st3 = tmp629 + st6;
+     st6 = tmp629 - st6;
+     tmp637 = st6;
+     st6 = st7 + tmp628;
+     st7 = tmp628 - st7;
+     tmp638 = st7;
+     st7 = c_im(input[30]);
+     st7 = st7 + c_im(input[14]);
+     tmp639 = st6;
+     st6 = c_im(input[6]);
+     st6 = st6 + c_im(input[22]);
+     tmp640 = st3;
+     st3 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = st8 + st3;
+     st8 = st8 - st3;
+     st3 = st1 - st7;
+     tmp641 = st2;
+     st2 = st3 - st5;
+     st2 = st2 * K707106781[0];
+     st5 = st5 + st3;
+     st5 = st5 * K707106781[0];
+     st1 = st1 + st7;
+     st7 = st4 - st1;
+     st7 = st7 * K707106781[0];
+     st4 = st4 + st1;
+     st4 = st4 * K707106781[0];
+     st3 = tmp627 - st6;
+     st6 = tmp627 + st6;
+     st1 = tmp626 - st8;
+     st8 = tmp626 + st8;
+     tmp642 = st8;
+     st8 = tmp625 + st7;
+     st7 = tmp625 - st7;
+     tmp643 = st7;
+     st7 = tmp623 - st2;
+     st2 = tmp623 + st2;
+     tmp644 = st2;
+     st2 = tmp624 + st5;
+     st5 = tmp624 - st5;
+     tmp645 = st5;
+     st5 = tmp622 - st4;
+     st4 = tmp622 + st4;
+     tmp646 = st4;
+     st4 = c_re(input[6]);
+     st4 = st4 - c_re(input[22]);
+     tmp647 = st5;
+     st5 = c_im(input[30]);
+     st5 = st5 - c_im(input[14]);
+     tmp648 = st2;
+     st2 = st4 + st5;
+     tmp649 = st7;
+     st7 = st2 * K382683432[0];
+     st5 = st5 - st4;
+     st2 = st2 * K923879532[0];
+     st4 = c_re(input[30]);
+     tmp650 = st8;
+     st8 = st5 * K923879532[0];
+     st4 = st4 - c_re(input[14]);
+     st5 = st5 * K382683432[0];
+     tmp651 = st1;
+     st1 = c_im(input[6]);
+     st1 = st1 - c_im(input[22]);
+     tmp652 = st6;
+     st6 = st4 - st1;
+     tmp653 = st3;
+     st3 = st6 * K923879532[0];
+     st4 = st4 + st1;
+     st6 = st6 * K382683432[0];
+     st7 = st7 + st3;
+     st1 = st4 * K382683432[0];
+     st6 = st6 - st2;
+     st4 = st4 * K923879532[0];
+     st8 = st8 + st1;
+     st4 = st4 - st5;
+     st2 = c_re(input[10]);
+     st2 = st2 - c_re(input[26]);
+     st5 = c_im(input[2]);
+     st5 = st5 - c_im(input[18]);
+     st3 = st2 + st5;
+     st1 = st3 * K382683432[0];
+     st5 = st5 - st2;
+     st3 = st3 * K923879532[0];
+     st2 = c_re(input[2]);
+     tmp654 = st6;
+     st6 = st5 * K923879532[0];
+     st2 = st2 - c_re(input[18]);
+     st5 = st5 * K382683432[0];
+     tmp655 = st7;
+     st7 = c_im(input[10]);
+     st7 = st7 - c_im(input[26]);
+     tmp656 = st4;
+     st4 = st2 - st7;
+     tmp657 = st8;
+     st8 = st4 * K923879532[0];
+     st2 = st2 + st7;
+     st4 = st4 * K382683432[0];
+     st1 = st1 - st8;
+     st7 = st2 * K382683432[0];
+     st3 = st3 + st4;
+     st2 = st2 * K923879532[0];
+     st6 = st6 - st7;
+     st5 = st5 + st2;
+     st8 = st6 - tmp657;
+     st4 = tmp630 + st8;
+     st8 = tmp630 - st8;
+     st7 = tmp656 - st5;
+     st2 = tmp631 - st7;
+     st7 = tmp631 + st7;
+     tmp658 = st7;
+     st7 = st1 - tmp655;
+     tmp659 = st8;
+     st8 = tmp632 + st7;
+     st7 = tmp632 - st7;
+     tmp660 = st7;
+     st7 = tmp654 - st3;
+     tmp661 = st8;
+     st8 = tmp641 - st7;
+     st7 = tmp641 + st7;
+     st3 = st3 + tmp654;
+     tmp662 = st7;
+     st7 = tmp636 + st3;
+     st3 = tmp636 - st3;
+     st1 = st1 + tmp655;
+     tmp663 = st3;
+     st3 = tmp635 - st1;
+     st1 = tmp635 + st1;
+     st5 = st5 + tmp656;
+     tmp664 = st1;
+     st1 = tmp634 + st5;
+     st5 = tmp634 - st5;
+     st6 = st6 + tmp657;
+     tmp665 = st5;
+     st5 = tmp633 - st6;
+     st6 = tmp633 + st6;
+     tmp666 = st6;
+     st6 = c_re(input[1]);
+     st6 = st6 + c_re(input[17]);
+     tmp667 = st5;
+     st5 = c_re(input[9]);
+     st5 = st5 + c_re(input[25]);
+     tmp668 = st1;
+     st1 = st6 + st5;
+     st6 = st6 - st5;
+     st5 = c_im(input[1]);
+     st5 = st5 + c_im(input[17]);
+     tmp669 = st3;
+     st3 = c_im(input[9]);
+     st3 = st3 + c_im(input[25]);
+     tmp670 = st7;
+     st7 = st5 - st3;
+     st5 = st5 + st3;
+     st3 = c_re(input[5]);
+     st3 = st3 + c_re(input[21]);
+     tmp671 = st8;
+     st8 = c_re(input[29]);
+     st8 = st8 + c_re(input[13]);
+     tmp672 = st2;
+     st2 = st3 + st8;
+     st8 = st8 - st3;
+     st3 = st1 + st2;
+     st1 = st1 - st2;
+     st2 = st8 + st7;
+     tmp673 = st4;
+     st4 = st2 * K382683432[0];
+     st7 = st7 - st8;
+     st2 = st2 * K923879532[0];
+     st8 = c_im(input[5]);
+     tmp674 = st3;
+     st3 = st7 * K923879532[0];
+     st8 = st8 + c_im(input[21]);
+     st7 = st7 * K382683432[0];
+     tmp675 = st4;
+     st4 = c_im(input[29]);
+     st4 = st4 + c_im(input[13]);
+     tmp676 = st7;
+     st7 = st8 - st4;
+     st8 = st8 + st4;
+     st4 = st5 + st8;
+     st5 = st5 - st8;
+     st8 = st1 + st5;
+     st5 = st5 - st1;
+     st1 = st6 + st7;
+     tmp677 = st8;
+     st8 = st1 * K923879532[0];
+     st6 = st6 - st7;
+     st1 = st1 * K382683432[0];
+     st2 = st2 - st1;
+     st7 = st6 * K382683432[0];
+     st3 = st3 + st7;
+     st6 = st6 * K923879532[0];
+     st6 = tmp676 - st6;
+     st8 = tmp675 + st8;
+     st1 = c_re(input[31]);
+     st1 = st1 + c_re(input[15]);
+     st7 = c_re(input[7]);
+     st7 = st7 + c_re(input[23]);
+     tmp678 = st8;
+     st8 = st1 + st7;
+     st1 = st1 - st7;
+     st7 = c_im(input[31]);
+     st7 = st7 + c_im(input[15]);
+     tmp679 = st2;
+     st2 = c_im(input[7]);
+     st2 = st2 + c_im(input[23]);
+     tmp680 = st3;
+     st3 = st7 - st2;
+     st7 = st7 + st2;
+     st2 = c_re(input[3]);
+     st2 = st2 + c_re(input[19]);
+     tmp681 = st6;
+     st6 = c_re(input[27]);
+     st6 = st6 + c_re(input[11]);
+     tmp682 = st5;
+     st5 = st2 + st6;
+     st6 = st6 - st2;
+     st2 = st8 + st5;
+     st8 = st8 - st5;
+     st5 = st6 + st3;
+     tmp683 = st4;
+     st4 = st5 * K382683432[0];
+     st3 = st3 - st6;
+     st5 = st5 * K923879532[0];
+     st6 = tmp674 + st2;
+     tmp684 = st4;
+     st4 = st3 * K923879532[0];
+     tmp685 = st5;
+     st5 = tmp640 - st6;
+     st3 = st3 * K382683432[0];
+     st6 = tmp640 + st6;
+     st2 = st2 - tmp674;
+     c_re(input[16]) = st5;
+     st5 = st2 + tmp653;
+     st2 = tmp653 - st2;
+     c_re(input[0]) = st6;
+     st6 = c_im(input[3]);
+     st6 = st6 + c_im(input[19]);
+     c_im(input[8]) = st5;
+     st5 = c_im(input[27]);
+     st5 = st5 + c_im(input[11]);
+     c_im(input[24]) = st2;
+     st2 = st6 - st5;
+     st6 = st6 + st5;
+     st5 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = st8 - st7;
+     st8 = st8 + st7;
+     st7 = st1 + st2;
+     tmp686 = st4;
+     st4 = st7 * K923879532[0];
+     st1 = st1 - st2;
+     st7 = st7 * K382683432[0];
+     st2 = tmp683 + st5;
+     tmp687 = st4;
+     st4 = st1 * K382683432[0];
+     tmp688 = st7;
+     st7 = tmp652 - st2;
+     st1 = st1 * K923879532[0];
+     st2 = tmp652 + st2;
+     st5 = tmp683 - st5;
+     c_im(input[16]) = st7;
+     st7 = tmp637 - st5;
+     st5 = tmp637 + st5;
+     c_im(input[0]) = st2;
+     st2 = tmp682 + st8;
+     st2 = st2 * K707106781[0];
+     c_re(input[24]) = st7;
+     st7 = tmp639 - st2;
+     st2 = tmp639 + st2;
+     st8 = tmp682 - st8;
+     st8 = st8 * K707106781[0];
+     c_re(input[8]) = st5;
+     st5 = tmp651 - st8;
+     st8 = tmp651 + st8;
+     c_im(input[20]) = st7;
+     st7 = tmp677 + st6;
+     st7 = st7 * K707106781[0];
+     c_im(input[4]) = st2;
+     st2 = tmp642 - st7;
+     st7 = tmp642 + st7;
+     st6 = st6 - tmp677;
+     st6 = st6 * K707106781[0];
+     c_re(input[28]) = st5;
+     st5 = tmp638 - st6;
+     st6 = tmp638 + st6;
+     st3 = st3 + st1;
+     st1 = tmp681 - st3;
+     st3 = tmp681 + st3;
+     st4 = st4 - tmp686;
+     c_re(input[12]) = st8;
+     st8 = tmp680 + st4;
+     st4 = st4 - tmp680;
+     c_re(input[20]) = st2;
+     st2 = tmp650 - st8;
+     st8 = tmp650 + st8;
+     c_re(input[4]) = st7;
+     st7 = tmp649 - st4;
+     st4 = tmp649 + st4;
+     c_im(input[28]) = st5;
+     st5 = tmp643 - st1;
+     st1 = tmp643 + st1;
+     c_im(input[12]) = st6;
+     st6 = tmp644 - st3;
+     st3 = tmp644 + st3;
+     c_re(input[22]) = st2;
+     st2 = tmp685 + tmp688;
+     c_re(input[6]) = st8;
+     st8 = tmp679 - st2;
+     st2 = tmp679 + st2;
+     c_im(input[30]) = st7;
+     st7 = tmp687 - tmp684;
+     c_im(input[14]) = st4;
+     st4 = tmp678 + st7;
+     st7 = st7 - tmp678;
+     c_re(input[30]) = st5;
+     st5 = tmp648 - st4;
+     st4 = tmp648 + st4;
+     c_re(input[14]) = st1;
+     st1 = tmp647 - st7;
+     st7 = tmp647 + st7;
+     c_im(input[22]) = st6;
+     st6 = tmp645 - st8;
+     st8 = tmp645 + st8;
+     c_im(input[6]) = st3;
+     st3 = tmp646 - st2;
+     st2 = tmp646 + st2;
+     c_re(input[18]) = st5;
+     st5 = c_re(input[31]);
+     st5 = st5 - c_re(input[15]);
+     c_re(input[2]) = st4;
+     st4 = c_im(input[7]);
+     st4 = st4 - c_im(input[23]);
+     c_im(input[26]) = st1;
+     st1 = st5 - st4;
+     st5 = st5 + st4;
+     c_im(input[10]) = st7;
+     st7 = c_re(input[7]);
+     st7 = st7 - c_re(input[23]);
+     c_re(input[26]) = st6;
+     st6 = c_im(input[31]);
+     st6 = st6 - c_im(input[15]);
+     c_re(input[10]) = st8;
+     st8 = st7 + st6;
+     st6 = st6 - st7;
+     c_im(input[18]) = st3;
+     st3 = c_im(input[3]);
+     st3 = st3 - c_im(input[19]);
+     c_im(input[2]) = st2;
+     st2 = c_re(input[3]);
+     st2 = st2 - c_re(input[19]);
+     st4 = st3 - st2;
+     st2 = st2 + st3;
+     st7 = c_re(input[27]);
+     st7 = st7 - c_re(input[11]);
+     st3 = c_im(input[27]);
+     st3 = st3 - c_im(input[11]);
+     tmp689 = st5;
+     st5 = st7 + st3;
+     st7 = st7 - st3;
+     st3 = st4 - st5;
+     st3 = st3 * K707106781[0];
+     st4 = st4 + st5;
+     st4 = st4 * K707106781[0];
+     st5 = st7 - st2;
+     st5 = st5 * K707106781[0];
+     st2 = st2 + st7;
+     st2 = st2 * K707106781[0];
+     st7 = st1 - st3;
+     tmp690 = st2;
+     st2 = st7 * K980785280[0];
+     st1 = st1 + st3;
+     st7 = st7 * K195090322[0];
+     st3 = st6 - st4;
+     tmp691 = st7;
+     st7 = st3 * K555570233[0];
+     st6 = st6 + st4;
+     st3 = st3 * K831469612[0];
+     st4 = st8 - st5;
+     tmp692 = st6;
+     st6 = st4 * K195090322[0];
+     st8 = st8 + st5;
+     st4 = st4 * K980785280[0];
+     st5 = tmp689 - tmp690;
+     tmp693 = st4;
+     st4 = st5 * K831469612[0];
+     tmp694 = st2;
+     st2 = tmp689 + tmp690;
+     st5 = st5 * K555570233[0];
+     st4 = st4 + st7;
+     st7 = st8 * K831469612[0];
+     st5 = st5 - st3;
+     st3 = st1 * K555570233[0];
+     st6 = st6 + tmp694;
+     st1 = st1 * K831469612[0];
+     tmp695 = st6;
+     st6 = tmp691 - tmp693;
+     st8 = st8 * K555570233[0];
+     st7 = st7 + st3;
+     st3 = st2 * K195090322[0];
+     st1 = st1 - st8;
+     st8 = tmp692 * K980785280[0];
+     st3 = st3 + st8;
+     st2 = st2 * K980785280[0];
+     st8 = c_re(input[9]);
+     tmp696 = st3;
+     st3 = tmp692 * K195090322[0];
+     st8 = st8 - c_re(input[25]);
+     st2 = st2 - st3;
+     st3 = c_im(input[1]);
+     st3 = st3 - c_im(input[17]);
+     tmp697 = st2;
+     st2 = st8 + st3;
+     st3 = st3 - st8;
+     st8 = c_re(input[1]);
+     st8 = st8 - c_re(input[17]);
+     tmp698 = st1;
+     st1 = c_im(input[9]);
+     st1 = st1 - c_im(input[25]);
+     tmp699 = st7;
+     st7 = st8 - st1;
+     st8 = st8 + st1;
+     st1 = c_re(input[29]);
+     st1 = st1 - c_re(input[13]);
+     tmp700 = st6;
+     st6 = c_im(input[29]);
+     st6 = st6 - c_im(input[13]);
+     tmp701 = st5;
+     st5 = st1 - st6;
+     st1 = st1 + st6;
+     st6 = c_re(input[5]);
+     st6 = st6 - c_re(input[21]);
+     tmp702 = st4;
+     st4 = c_im(input[5]);
+     st4 = st4 - c_im(input[21]);
+     tmp703 = st8;
+     st8 = st6 + st4;
+     st4 = st4 - st6;
+     st6 = st5 - st8;
+     st6 = st6 * K707106781[0];
+     st8 = st8 + st5;
+     st8 = st8 * K707106781[0];
+     st5 = st4 - st1;
+     st5 = st5 * K707106781[0];
+     st4 = st4 + st1;
+     st4 = st4 * K707106781[0];
+     st1 = st2 - st6;
+     tmp704 = st8;
+     st8 = st1 * K195090322[0];
+     st2 = st2 + st6;
+     st1 = st1 * K980785280[0];
+     st6 = st3 - st4;
+     tmp705 = st1;
+     st1 = st6 * K555570233[0];
+     st3 = st3 + st4;
+     st6 = st6 * K831469612[0];
+     st4 = st7 - st5;
+     tmp706 = st8;
+     st8 = st4 * K980785280[0];
+     st7 = st7 + st5;
+     st4 = st4 * K195090322[0];
+     st5 = tmp703 - tmp704;
+     tmp707 = st4;
+     st4 = st5 * K831469612[0];
+     tmp708 = st8;
+     st8 = tmp703 + tmp704;
+     st5 = st5 * K555570233[0];
+     st1 = st1 - st4;
+     st4 = st2 * K831469612[0];
+     tmp709 = st4;
+     st4 = st1 - tmp702;
+     tmp710 = st4;
+     st4 = st7 * K555570233[0];
+     st1 = st1 + tmp702;
+     st2 = st2 * K555570233[0];
+     st5 = st5 + st6;
+     st7 = st7 * K831469612[0];
+     st6 = st5 + tmp701;
+     tmp711 = st2;
+     st2 = st3 * K980785280[0];
+     st5 = tmp701 - st5;
+     tmp712 = st2;
+     st2 = st8 * K195090322[0];
+     tmp713 = st2;
+     st2 = tmp673 - st6;
+     st8 = st8 * K980785280[0];
+     st3 = st3 * K195090322[0];
+     st6 = tmp673 + st6;
+     c_re(input[21]) = st2;
+     st2 = tmp672 - st5;
+     st5 = tmp672 + st5;
+     c_re(input[5]) = st6;
+     st6 = tmp659 - tmp710;
+     c_im(input[29]) = st2;
+     st2 = tmp659 + tmp710;
+     c_im(input[13]) = st5;
+     st5 = tmp658 - st1;
+     st1 = tmp658 + st1;
+     c_re(input[29]) = st6;
+     st6 = tmp706 - tmp708;
+     c_re(input[13]) = st2;
+     st2 = st6 - tmp695;
+     st6 = st6 + tmp695;
+     c_im(input[21]) = st5;
+     st5 = tmp705 + tmp707;
+     c_im(input[5]) = st1;
+     st1 = st5 + tmp700;
+     st5 = tmp700 - st5;
+     tmp714 = st8;
+     st8 = tmp661 - st1;
+     st1 = tmp661 + st1;
+     c_re(input[23]) = st8;
+     st8 = tmp671 - st5;
+     st5 = tmp671 + st5;
+     c_re(input[7]) = st1;
+     st1 = tmp660 - st2;
+     st2 = tmp660 + st2;
+     c_im(input[31]) = st8;
+     st8 = tmp662 - st6;
+     st6 = tmp662 + st6;
+     st4 = tmp709 - st4;
+     c_im(input[15]) = st5;
+     st5 = st4 - tmp699;
+     st4 = st4 + tmp699;
+     st7 = tmp711 + st7;
+     c_re(input[31]) = st1;
+     st1 = st7 + tmp698;
+     st7 = tmp698 - st7;
+     c_re(input[15]) = st2;
+     st2 = tmp670 - st1;
+     st1 = tmp670 + st1;
+     c_im(input[23]) = st8;
+     st8 = tmp669 - st7;
+     st7 = tmp669 + st7;
+     c_im(input[7]) = st6;
+     st6 = tmp663 - st5;
+     st5 = tmp663 + st5;
+     c_re(input[19]) = st2;
+     st2 = tmp664 - st4;
+     st4 = tmp664 + st4;
+     c_re(input[3]) = st1;
+     st1 = tmp712 - tmp713;
+     c_im(input[27]) = st8;
+     st8 = st1 - tmp696;
+     st1 = st1 + tmp696;
+     st3 = tmp714 + st3;
+     c_im(input[11]) = st7;
+     st7 = st3 + tmp697;
+     st3 = tmp697 - st3;
+     c_re(input[27]) = st6;
+     st6 = tmp668 - st7;
+     st7 = tmp668 + st7;
+     c_re(input[11]) = st5;
+     st5 = tmp667 - st3;
+     st3 = tmp667 + st3;
+     c_im(input[19]) = st2;
+     st2 = tmp665 - st8;
+     st8 = tmp665 + st8;
+     c_im(input[3]) = st4;
+     st4 = tmp666 - st1;
+     st1 = tmp666 + st1;
+     c_re(input[17]) = st6;
+     c_re(input[1]) = st7;
+     c_im(input[25]) = st5;
+     c_im(input[9]) = st3;
+     c_re(input[25]) = st2;
+     c_re(input[9]) = st8;
+     c_im(input[17]) = st4;
+     c_im(input[1]) = st1;
+}
+
+void  PFFTW(64)(fftw_complex *input)
+{
+     PFFTW(twiddle_4)(input, PFFTW(W_64), 16);
+     PFFTW(16)(input );
+     PFFTW(16)(input + 16);
+     PFFTW(16)(input + 32);
+     PFFTW(16)(input + 48);
+}
+
+void PFFTW(128)(fftw_complex *input)
+{
+     PFFTW(twiddle_4)(input, PFFTW(W_128), 32);
+     PFFTW(32)(input );
+     PFFTW(32)(input + 32);
+     PFFTW(32)(input + 64);
+     PFFTW(32)(input + 96);
+}
+
+void PFFTW(512)(fftw_complex *input)
+{
+     PFFTW(twiddle_4)(input, PFFTW(W_512), 128);
+     PFFTW(128)(input );
+     PFFTW(128)(input + 128);
+     PFFTW(128)(input + 256);
+     PFFTW(128)(input + 384);
+}
+
+void PFFTWI(16) (fftw_complex * input) {
+     fftw_real tmp333;
+     fftw_real tmp332;
+     fftw_real tmp331;
+     fftw_real tmp330;
+     fftw_real tmp329;
+     fftw_real tmp328;
+     fftw_real tmp327;
+     fftw_real tmp326;
+     fftw_real tmp325;
+     fftw_real tmp324;
+     fftw_real tmp323;
+     fftw_real tmp322;
+     fftw_real tmp321;
+     fftw_real tmp320;
+     fftw_real tmp319;
+     fftw_real tmp318;
+     fftw_real tmp317;
+     fftw_real tmp316;
+     fftw_real tmp315;
+     fftw_real tmp314;
+     fftw_real tmp313;
+     fftw_real tmp312;
+     fftw_real tmp311;
+     fftw_real tmp310;
+     fftw_real tmp309;
+     fftw_real tmp308;
+     fftw_real tmp307;
+     fftw_real tmp306;
+     fftw_real tmp305;
+     fftw_real tmp304;
+     fftw_real tmp303;
+     fftw_real tmp302;
+     fftw_real tmp301;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[4]);
+     st8 = st8 - c_re(input[12]);
+     st7 = c_im(input[0]);
+     st7 = st7 - c_im(input[8]);
+     st6 = c_re(input[0]);
+     st6 = st6 - c_re(input[8]);
+     st5 = st8 + st7;
+     st7 = st7 - st8;
+     st4 = c_im(input[4]);
+     st4 = st4 - c_im(input[12]);
+     st3 = c_re(input[0]);
+     st3 = st3 + c_re(input[8]);
+     st2 = st6 - st4;
+     st6 = st6 + st4;
+     st1 = c_re(input[4]);
+     st1 = st1 + c_re(input[12]);
+     st8 = c_im(input[0]);
+     st8 = st8 + c_im(input[8]);
+     st4 = st3 + st1;
+     st3 = st3 - st1;
+     st1 = c_im(input[4]);
+     st1 = st1 + c_im(input[12]);
+     tmp301 = st6;
+     st6 = c_re(input[2]);
+     st6 = st6 + c_re(input[10]);
+     tmp302 = st7;
+     st7 = st8 + st1;
+     st8 = st8 - st1;
+     st1 = c_re(input[6]);
+     st1 = st1 + c_re(input[14]);
+     tmp303 = st2;
+     st2 = c_im(input[2]);
+     st2 = st2 + c_im(input[10]);
+     tmp304 = st5;
+     st5 = st6 + st1;
+     st6 = st6 - st1;
+     st1 = c_im(input[6]);
+     st1 = st1 + c_im(input[14]);
+     tmp305 = st3;
+     st3 = st4 + st5;
+     st4 = st4 - st5;
+     st5 = st2 + st1;
+     st2 = st2 - st1;
+     st1 = st6 + st8;
+     tmp306 = st1;
+     st1 = st7 - st5;
+     st7 = st7 + st5;
+     st5 = tmp305 - st2;
+     st2 = tmp305 + st2;
+     st8 = st8 - st6;
+     st6 = c_re(input[6]);
+     st6 = st6 - c_re(input[14]);
+     tmp307 = st8;
+     st8 = c_im(input[2]);
+     st8 = st8 - c_im(input[10]);
+     tmp308 = st2;
+     st2 = c_re(input[2]);
+     st2 = st2 - c_re(input[10]);
+     tmp309 = st4;
+     st4 = st6 + st8;
+     st8 = st8 - st6;
+     st6 = c_im(input[6]);
+     st6 = st6 - c_im(input[14]);
+     tmp310 = st5;
+     st5 = c_re(input[1]);
+     st5 = st5 - c_re(input[9]);
+     tmp311 = st7;
+     st7 = st2 - st6;
+     st2 = st2 + st6;
+     st6 = c_im(input[5]);
+     tmp312 = st1;
+     st1 = st4 + st7;
+     st7 = st7 - st4;
+     st4 = st2 - st8;
+     st1 = st1 * K707106781[0];
+     st8 = st8 + st2;
+     st7 = st7 * K707106781[0];
+     st6 = st6 - c_im(input[13]);
+     st4 = st4 * K707106781[0];
+     st2 = tmp304 - st1;
+     st8 = st8 * K707106781[0];
+     tmp313 = st3;
+     st3 = st5 - st6;
+     st5 = st5 + st6;
+     st6 = tmp303 + st7;
+     tmp314 = st6;
+     st6 = st3 * K923879532[0];
+     st7 = tmp303 - st7;
+     st3 = st3 * K382683432[0];
+     st1 = tmp304 + st1;
+     tmp315 = st1;
+     st1 = st5 * K382683432[0];
+     tmp316 = st7;
+     st7 = tmp302 - st4;
+     st5 = st5 * K923879532[0];
+     st4 = tmp302 + st4;
+     tmp317 = st4;
+     st4 = tmp301 - st8;
+     st8 = tmp301 + st8;
+     tmp318 = st8;
+     st8 = c_re(input[5]);
+     st8 = st8 - c_re(input[13]);
+     tmp319 = st4;
+     st4 = c_im(input[1]);
+     st4 = st4 - c_im(input[9]);
+     tmp320 = st7;
+     st7 = c_re(input[3]);
+     st7 = st7 - c_re(input[11]);
+     tmp321 = st2;
+     st2 = st8 + st4;
+     st4 = st4 - st8;
+     st8 = c_im(input[7]);
+     tmp322 = st5;
+     st5 = st2 * K382683432[0];
+     st8 = st8 - c_im(input[15]);
+     st2 = st2 * K923879532[0];
+     st6 = st6 - st5;
+     st5 = st4 * K923879532[0];
+     st2 = st2 + st3;
+     st4 = st4 * K382683432[0];
+     st1 = st1 - st5;
+     st3 = st7 - st8;
+     st4 = st4 + tmp322;
+     st7 = st7 + st8;
+     st8 = st3 * K382683432[0];
+     st5 = c_re(input[7]);
+     st3 = st3 * K923879532[0];
+     st5 = st5 - c_re(input[15]);
+     tmp323 = st4;
+     st4 = st7 * K923879532[0];
+     tmp324 = st1;
+     st1 = c_im(input[3]);
+     st7 = st7 * K382683432[0];
+     st1 = st1 - c_im(input[11]);
+     tmp325 = st2;
+     st2 = c_re(input[1]);
+     st2 = st2 + c_re(input[9]);
+     tmp326 = st6;
+     st6 = st5 + st1;
+     st1 = st1 - st5;
+     st5 = c_re(input[5]);
+     tmp327 = st7;
+     st7 = st6 * K923879532[0];
+     st5 = st5 + c_re(input[13]);
+     st6 = st6 * K382683432[0];
+     st8 = st8 - st7;
+     st7 = st1 * K382683432[0];
+     st6 = st6 + st3;
+     st1 = st1 * K923879532[0];
+     st7 = st7 - st4;
+     st3 = st2 + st5;
+     st1 = st1 + tmp327;
+     st2 = st2 - st5;
+     st4 = tmp326 - st8;
+     st8 = tmp326 + st8;
+     st5 = tmp325 - st6;
+     tmp328 = st2;
+     st2 = tmp321 - st4;
+     st4 = tmp321 + st4;
+     tmp329 = st3;
+     st3 = tmp314 - st8;
+     st8 = tmp314 + st8;
+     tmp330 = st2;
+     st2 = tmp316 - st5;
+     st5 = tmp316 + st5;
+     c_re(input[9]) = st3;
+     c_re(input[1]) = st8;
+     c_re(input[5]) = st2;
+     c_re(input[13]) = st5;
+     st6 = tmp325 + st6;
+     st3 = tmp324 - st7;
+     st8 = tmp323 - st1;
+     st2 = tmp315 - st6;
+     st6 = tmp315 + st6;
+     st5 = tmp320 - st3;
+     st3 = tmp320 + st3;
+     tmp331 = st5;
+     st5 = tmp317 - st8;
+     st8 = tmp317 + st8;
+     st7 = tmp324 + st7;
+     st1 = tmp323 + st1;
+     tmp332 = st3;
+     st3 = c_im(input[1]);
+     c_im(input[1]) = st6;
+     st3 = st3 + c_im(input[9]);
+     c_im(input[9]) = st2;
+     st2 = tmp319 - st7;
+     st7 = tmp319 + st7;
+     st6 = tmp318 - st1;
+     st1 = tmp318 + st1;
+     tmp333 = st5;
+     st5 = c_im(input[5]);
+     c_im(input[5]) = st4;
+     st5 = st5 + c_im(input[13]);
+     c_im(input[13]) = tmp330;
+     st4 = st3 - st5;
+     st3 = st3 + st5;
+     st5 = c_re(input[3]);
+     c_re(input[3]) = st7;
+     st5 = st5 + c_re(input[11]);
+     c_re(input[11]) = st2;
+     st2 = c_re(input[7]);
+     c_re(input[7]) = st6;
+     st2 = st2 + c_re(input[15]);
+     c_re(input[15]) = st1;
+     st7 = st5 + st2;
+     st5 = st5 - st2;
+     st6 = c_im(input[3]);
+     c_im(input[3]) = st8;
+     st6 = st6 + c_im(input[11]);
+     c_im(input[11]) = tmp333;
+     st8 = tmp329 + st7;
+     st7 = tmp329 - st7;
+     st1 = st5 + st4;
+     st4 = st4 - st5;
+     st2 = tmp313 - st8;
+     st8 = tmp313 + st8;
+     st5 = st7 + tmp312;
+     st7 = tmp312 - st7;
+     c_re(input[8]) = st2;
+     c_re(input[0]) = st8;
+     c_im(input[4]) = st5;
+     c_im(input[12]) = st7;
+     st2 = c_im(input[7]);
+     c_im(input[7]) = tmp332;
+     st2 = st2 + c_im(input[15]);
+     c_im(input[15]) = tmp331;
+     st8 = st6 - st2;
+     st6 = st6 + st2;
+     st5 = tmp328 - st8;
+     st8 = tmp328 + st8;
+     st7 = st3 - st6;
+     st2 = st5 - st1;
+     st1 = st1 + st5;
+     st3 = st3 + st6;
+     st2 = st2 * K707106781[0];
+     st6 = st4 + st8;
+     st1 = st1 * K707106781[0];
+     st8 = st8 - st4;
+     st6 = st6 * K707106781[0];
+     st4 = tmp311 + st3;
+     st8 = st8 * K707106781[0];
+     st3 = tmp311 - st3;
+     st5 = tmp310 - st2;
+     c_im(input[0]) = st4;
+     c_im(input[8]) = st3;
+     c_re(input[10]) = st5;
+     st2 = tmp310 + st2;
+     st4 = tmp309 + st7;
+     st7 = tmp309 - st7;
+     st3 = tmp308 - st6;
+     c_re(input[2]) = st2;
+     c_re(input[12]) = st4;
+     c_re(input[4]) = st7;
+     c_re(input[6]) = st3;
+     st6 = tmp308 + st6;
+     st5 = tmp307 - st8;
+     st8 = tmp307 + st8;
+     st2 = tmp306 - st1;
+     c_re(input[14]) = st6;
+     c_im(input[14]) = st5;
+     c_im(input[6]) = st8;
+     c_im(input[10]) = st2;
+     st1 = tmp306 + st1;
+     c_im(input[2]) = st1;
+}
+
+void PFFTWI(32) (fftw_complex * input) {
+     fftw_real tmp714;
+     fftw_real tmp713;
+     fftw_real tmp712;
+     fftw_real tmp711;
+     fftw_real tmp710;
+     fftw_real tmp709;
+     fftw_real tmp708;
+     fftw_real tmp707;
+     fftw_real tmp706;
+     fftw_real tmp705;
+     fftw_real tmp704;
+     fftw_real tmp703;
+     fftw_real tmp702;
+     fftw_real tmp701;
+     fftw_real tmp700;
+     fftw_real tmp699;
+     fftw_real tmp698;
+     fftw_real tmp697;
+     fftw_real tmp696;
+     fftw_real tmp695;
+     fftw_real tmp694;
+     fftw_real tmp693;
+     fftw_real tmp692;
+     fftw_real tmp691;
+     fftw_real tmp690;
+     fftw_real tmp689;
+     fftw_real tmp688;
+     fftw_real tmp687;
+     fftw_real tmp686;
+     fftw_real tmp685;
+     fftw_real tmp684;
+     fftw_real tmp683;
+     fftw_real tmp682;
+     fftw_real tmp681;
+     fftw_real tmp680;
+     fftw_real tmp679;
+     fftw_real tmp678;
+     fftw_real tmp677;
+     fftw_real tmp676;
+     fftw_real tmp675;
+     fftw_real tmp674;
+     fftw_real tmp673;
+     fftw_real tmp672;
+     fftw_real tmp671;
+     fftw_real tmp670;
+     fftw_real tmp669;
+     fftw_real tmp668;
+     fftw_real tmp667;
+     fftw_real tmp666;
+     fftw_real tmp665;
+     fftw_real tmp664;
+     fftw_real tmp663;
+     fftw_real tmp662;
+     fftw_real tmp661;
+     fftw_real tmp660;
+     fftw_real tmp659;
+     fftw_real tmp658;
+     fftw_real tmp657;
+     fftw_real tmp656;
+     fftw_real tmp655;
+     fftw_real tmp654;
+     fftw_real tmp653;
+     fftw_real tmp652;
+     fftw_real tmp651;
+     fftw_real tmp650;
+     fftw_real tmp649;
+     fftw_real tmp648;
+     fftw_real tmp647;
+     fftw_real tmp646;
+     fftw_real tmp645;
+     fftw_real tmp644;
+     fftw_real tmp643;
+     fftw_real tmp642;
+     fftw_real tmp641;
+     fftw_real tmp640;
+     fftw_real tmp639;
+     fftw_real tmp638;
+     fftw_real tmp637;
+     fftw_real tmp636;
+     fftw_real tmp635;
+     fftw_real tmp634;
+     fftw_real tmp633;
+     fftw_real tmp632;
+     fftw_real tmp631;
+     fftw_real tmp630;
+     fftw_real tmp629;
+     fftw_real tmp628;
+     fftw_real tmp627;
+     fftw_real tmp626;
+     fftw_real tmp625;
+     fftw_real tmp624;
+     fftw_real tmp623;
+     fftw_real tmp622;
+     fftw_real tmp621;
+     fftw_real st1;
+     fftw_real st2;
+     fftw_real st3;
+     fftw_real st4;
+     fftw_real st5;
+     fftw_real st6;
+     fftw_real st7;
+     fftw_real st8;
+     st8 = c_re(input[8]);
+     st8 = st8 - c_re(input[24]);
+     st7 = c_im(input[0]);
+     st7 = st7 - c_im(input[16]);
+     st6 = st8 + st7;
+     st7 = st7 - st8;
+     st5 = c_re(input[0]);
+     st5 = st5 + c_re(input[16]);
+     st4 = c_re(input[8]);
+     st4 = st4 + c_re(input[24]);
+     st3 = st5 + st4;
+     st5 = st5 - st4;
+     st2 = c_im(input[0]);
+     st2 = st2 + c_im(input[16]);
+     st1 = c_im(input[8]);
+     st1 = st1 + c_im(input[24]);
+     st8 = st2 + st1;
+     st2 = st2 - st1;
+     st4 = c_re(input[4]);
+     st4 = st4 + c_re(input[20]);
+     st1 = c_re(input[28]);
+     st1 = st1 + c_re(input[12]);
+     tmp621 = st6;
+     st6 = st4 + st1;
+     st4 = st4 - st1;
+     st1 = st3 + st6;
+     st3 = st3 - st6;
+     st6 = st2 - st4;
+     st4 = st4 + st2;
+     st2 = c_im(input[4]);
+     st2 = st2 + c_im(input[20]);
+     tmp622 = st4;
+     st4 = c_im(input[28]);
+     st4 = st4 + c_im(input[12]);
+     tmp623 = st6;
+     st6 = st2 + st4;
+     st4 = st4 - st2;
+     st2 = st8 + st6;
+     st8 = st8 - st6;
+     st6 = st5 - st4;
+     st5 = st5 + st4;
+     st4 = c_re(input[0]);
+     st4 = st4 - c_re(input[16]);
+     tmp624 = st5;
+     st5 = c_im(input[8]);
+     st5 = st5 - c_im(input[24]);
+     tmp625 = st6;
+     st6 = st4 - st5;
+     st4 = st4 + st5;
+     st5 = c_re(input[4]);
+     st5 = st5 - c_re(input[20]);
+     tmp626 = st3;
+     st3 = c_im(input[4]);
+     st3 = st3 - c_im(input[20]);
+     tmp627 = st2;
+     st2 = st5 + st3;
+     st5 = st5 - st3;
+     st3 = c_im(input[28]);
+     st3 = st3 - c_im(input[12]);
+     tmp628 = st8;
+     st8 = c_re(input[28]);
+     st8 = st8 - c_re(input[12]);
+     tmp629 = st1;
+     st1 = st3 - st8;
+     st8 = st8 + st3;
+     st3 = st2 + st1;
+     st3 = st3 * K707106781[0];
+     st1 = st1 - st2;
+     st1 = st1 * K707106781[0];
+     st2 = st5 + st8;
+     st2 = st2 * K707106781[0];
+     st5 = st5 - st8;
+     st5 = st5 * K707106781[0];
+     st8 = st7 - st5;
+     tmp630 = st8;
+     st8 = st4 - st1;
+     tmp631 = st8;
+     st8 = tmp621 - st3;
+     tmp632 = st8;
+     st8 = st6 - st2;
+     st3 = tmp621 + st3;
+     st6 = st6 + st2;
+     st7 = st7 + st5;
+     st4 = st4 + st1;
+     st1 = c_re(input[2]);
+     st1 = st1 + c_re(input[18]);
+     st2 = c_re(input[10]);
+     st2 = st2 + c_re(input[26]);
+     st5 = st1 + st2;
+     st1 = st1 - st2;
+     st2 = c_im(input[2]);
+     st2 = st2 + c_im(input[18]);
+     tmp633 = st4;
+     st4 = c_im(input[10]);
+     st4 = st4 + c_im(input[26]);
+     tmp634 = st7;
+     st7 = st2 + st4;
+     st2 = st2 - st4;
+     st4 = st1 + st2;
+     st1 = st1 - st2;
+     st2 = c_re(input[30]);
+     st2 = st2 + c_re(input[14]);
+     tmp635 = st6;
+     st6 = c_re(input[6]);
+     st6 = st6 + c_re(input[22]);
+     tmp636 = st3;
+     st3 = st2 + st6;
+     st2 = st2 - st6;
+     st6 = st5 + st3;
+     st5 = st5 - st3;
+     st3 = tmp629 + st6;
+     st6 = tmp629 - st6;
+     tmp637 = st6;
+     st6 = tmp628 - st5;
+     st5 = st5 + tmp628;
+     tmp638 = st5;
+     st5 = c_im(input[30]);
+     st5 = st5 + c_im(input[14]);
+     tmp639 = st6;
+     st6 = c_im(input[6]);
+     st6 = st6 + c_im(input[22]);
+     tmp640 = st3;
+     st3 = st5 + st6;
+     st5 = st5 - st6;
+     st6 = st7 + st3;
+     st3 = st3 - st7;
+     st7 = st5 - st2;
+     tmp641 = st8;
+     st8 = st7 - st4;
+     st8 = st8 * K707106781[0];
+     st4 = st4 + st7;
+     st4 = st4 * K707106781[0];
+     st2 = st2 + st5;
+     st5 = st1 - st2;
+     st5 = st5 * K707106781[0];
+     st1 = st1 + st2;
+     st1 = st1 * K707106781[0];
+     st7 = tmp627 - st6;
+     st6 = tmp627 + st6;
+     st2 = tmp626 + st3;
+     st3 = tmp626 - st3;
+     tmp642 = st3;
+     st3 = tmp623 + st5;
+     st5 = tmp623 - st5;
+     tmp643 = st5;
+     st5 = tmp625 - st8;
+     st8 = tmp625 + st8;
+     tmp644 = st8;
+     st8 = tmp622 + st4;
+     st4 = tmp622 - st4;
+     tmp645 = st4;
+     st4 = tmp624 - st1;
+     st1 = tmp624 + st1;
+     tmp646 = st1;
+     st1 = c_re(input[6]);
+     st1 = st1 - c_re(input[22]);
+     tmp647 = st4;
+     st4 = c_im(input[30]);
+     st4 = st4 - c_im(input[14]);
+     tmp648 = st8;
+     st8 = st1 + st4;
+     tmp649 = st5;
+     st5 = st8 * K382683432[0];
+     st4 = st4 - st1;
+     st8 = st8 * K923879532[0];
+     st1 = c_re(input[30]);
+     tmp650 = st3;
+     st3 = st4 * K923879532[0];
+     st1 = st1 - c_re(input[14]);
+     st4 = st4 * K382683432[0];
+     tmp651 = st2;
+     st2 = c_im(input[6]);
+     st2 = st2 - c_im(input[22]);
+     tmp652 = st6;
+     st6 = st1 - st2;
+     tmp653 = st7;
+     st7 = st6 * K923879532[0];
+     st1 = st1 + st2;
+     st6 = st6 * K382683432[0];
+     st5 = st5 + st7;
+     st2 = st1 * K382683432[0];
+     st8 = st8 - st6;
+     st1 = st1 * K923879532[0];
+     st3 = st3 + st2;
+     st4 = st4 - st1;
+     st7 = c_re(input[2]);
+     st7 = st7 - c_re(input[18]);
+     st6 = c_im(input[10]);
+     st6 = st6 - c_im(input[26]);
+     st2 = st7 - st6;
+     st1 = st2 * K923879532[0];
+     st7 = st7 + st6;
+     st2 = st2 * K382683432[0];
+     st6 = c_re(input[10]);
+     tmp654 = st8;
+     st8 = st7 * K382683432[0];
+     st6 = st6 - c_re(input[26]);
+     st7 = st7 * K923879532[0];
+     tmp655 = st5;
+     st5 = c_im(input[2]);
+     st5 = st5 - c_im(input[18]);
+     tmp656 = st4;
+     st4 = st6 + st5;
+     tmp657 = st3;
+     st3 = st4 * K382683432[0];
+     st5 = st5 - st6;
+     st4 = st4 * K923879532[0];
+     st1 = st1 - st3;
+     st6 = st5 * K923879532[0];
+     st4 = st4 + st2;
+     st5 = st5 * K382683432[0];
+     st8 = st8 - st6;
+     st5 = st5 + st7;
+     st2 = st8 - tmp657;
+     st7 = tmp630 + st2;
+     st2 = tmp630 - st2;
+     st3 = tmp656 - st5;
+     st6 = tmp631 - st3;
+     st3 = tmp631 + st3;
+     tmp658 = st3;
+     st3 = st1 - tmp655;
+     tmp659 = st2;
+     st2 = tmp632 - st3;
+     st3 = tmp632 + st3;
+     tmp660 = st3;
+     st3 = tmp654 - st4;
+     tmp661 = st2;
+     st2 = tmp641 + st3;
+     st3 = tmp641 - st3;
+     st4 = st4 + tmp654;
+     tmp662 = st3;
+     st3 = tmp636 - st4;
+     st4 = tmp636 + st4;
+     st1 = st1 + tmp655;
+     tmp663 = st4;
+     st4 = tmp635 + st1;
+     st1 = tmp635 - st1;
+     st5 = st5 + tmp656;
+     tmp664 = st1;
+     st1 = tmp634 + st5;
+     st5 = tmp634 - st5;
+     st8 = st8 + tmp657;
+     tmp665 = st5;
+     st5 = tmp633 - st8;
+     st8 = tmp633 + st8;
+     tmp666 = st8;
+     st8 = c_re(input[1]);
+     st8 = st8 + c_re(input[17]);
+     tmp667 = st5;
+     st5 = c_re(input[9]);
+     st5 = st5 + c_re(input[25]);
+     tmp668 = st1;
+     st1 = st8 + st5;
+     st8 = st8 - st5;
+     st5 = c_im(input[1]);
+     st5 = st5 + c_im(input[17]);
+     tmp669 = st4;
+     st4 = c_im(input[9]);
+     st4 = st4 + c_im(input[25]);
+     tmp670 = st3;
+     st3 = st5 + st4;
+     st5 = st5 - st4;
+     st4 = c_re(input[5]);
+     st4 = st4 + c_re(input[21]);
+     tmp671 = st2;
+     st2 = c_re(input[29]);
+     st2 = st2 + c_re(input[13]);
+     tmp672 = st6;
+     st6 = st4 + st2;
+     st4 = st4 - st2;
+     st2 = st1 + st6;
+     st1 = st1 - st6;
+     st6 = st4 + st5;
+     tmp673 = st7;
+     st7 = st6 * K923879532[0];
+     st5 = st5 - st4;
+     st6 = st6 * K382683432[0];
+     st4 = c_im(input[5]);
+     tmp674 = st2;
+     st2 = st5 * K382683432[0];
+     st4 = st4 + c_im(input[21]);
+     st5 = st5 * K923879532[0];
+     tmp675 = st7;
+     st7 = c_im(input[29]);
+     st7 = st7 + c_im(input[13]);
+     tmp676 = st5;
+     st5 = st4 + st7;
+     st7 = st7 - st4;
+     st4 = st3 + st5;
+     st3 = st3 - st5;
+     st5 = st1 - st3;
+     st1 = st1 + st3;
+     st3 = st8 + st7;
+     tmp677 = st1;
+     st1 = st3 * K382683432[0];
+     st8 = st8 - st7;
+     st3 = st3 * K923879532[0];
+     st3 = st3 - st6;
+     st6 = st8 * K923879532[0];
+     st2 = st2 + st6;
+     st8 = st8 * K382683432[0];
+     st8 = st8 - tmp676;
+     st1 = tmp675 + st1;
+     st7 = c_re(input[31]);
+     st7 = st7 + c_re(input[15]);
+     st6 = c_re(input[7]);
+     st6 = st6 + c_re(input[23]);
+     tmp678 = st1;
+     st1 = st7 + st6;
+     st7 = st7 - st6;
+     st6 = c_im(input[31]);
+     st6 = st6 + c_im(input[15]);
+     tmp679 = st3;
+     st3 = c_im(input[7]);
+     st3 = st3 + c_im(input[23]);
+     tmp680 = st2;
+     st2 = st6 + st3;
+     st6 = st6 - st3;
+     st3 = c_re(input[3]);
+     st3 = st3 + c_re(input[19]);
+     tmp681 = st8;
+     st8 = c_re(input[27]);
+     st8 = st8 + c_re(input[11]);
+     tmp682 = st5;
+     st5 = st3 + st8;
+     st3 = st3 - st8;
+     st8 = st1 + st5;
+     st1 = st1 - st5;
+     st5 = st3 + st6;
+     tmp683 = st4;
+     st4 = st5 * K923879532[0];
+     st6 = st6 - st3;
+     st5 = st5 * K382683432[0];
+     st3 = tmp674 + st8;
+     tmp684 = st4;
+     st4 = st6 * K382683432[0];
+     tmp685 = st5;
+     st5 = tmp640 - st3;
+     st6 = st6 * K923879532[0];
+     st3 = tmp640 + st3;
+     st8 = tmp674 - st8;
+     c_re(input[16]) = st5;
+     st5 = st8 + tmp653;
+     st8 = tmp653 - st8;
+     c_re(input[0]) = st3;
+     st3 = c_im(input[3]);
+     st3 = st3 + c_im(input[19]);
+     c_im(input[8]) = st5;
+     st5 = c_im(input[27]);
+     st5 = st5 + c_im(input[11]);
+     c_im(input[24]) = st8;
+     st8 = st3 + st5;
+     st5 = st5 - st3;
+     st3 = st2 + st8;
+     st2 = st2 - st8;
+     st8 = st1 + st2;
+     st2 = st2 - st1;
+     st1 = st7 + st5;
+     tmp686 = st4;
+     st4 = st1 * K382683432[0];
+     st7 = st7 - st5;
+     st1 = st1 * K923879532[0];
+     st5 = tmp683 + st3;
+     tmp687 = st4;
+     st4 = st7 * K923879532[0];
+     tmp688 = st1;
+     st1 = tmp652 - st5;
+     st7 = st7 * K382683432[0];
+     st5 = tmp652 + st5;
+     st3 = st3 - tmp683;
+     c_im(input[16]) = st1;
+     st1 = tmp637 - st3;
+     st3 = tmp637 + st3;
+     c_im(input[0]) = st5;
+     st5 = tmp682 - st8;
+     st5 = st5 * K707106781[0];
+     c_re(input[24]) = st1;
+     st1 = tmp639 - st5;
+     st5 = tmp639 + st5;
+     st8 = tmp682 + st8;
+     st8 = st8 * K707106781[0];
+     c_re(input[8]) = st3;
+     st3 = tmp651 - st8;
+     st8 = tmp651 + st8;
+     c_im(input[28]) = st1;
+     st1 = st2 - tmp677;
+     st1 = st1 * K707106781[0];
+     c_im(input[12]) = st5;
+     st5 = tmp642 - st1;
+     st1 = tmp642 + st1;
+     st2 = tmp677 + st2;
+     st2 = st2 * K707106781[0];
+     c_re(input[20]) = st3;
+     st3 = tmp638 - st2;
+     st2 = tmp638 + st2;
+     st6 = st6 + st7;
+     st7 = tmp681 - st6;
+     st6 = tmp681 + st6;
+     st4 = tmp686 - st4;
+     c_re(input[4]) = st8;
+     st8 = tmp680 + st4;
+     st4 = st4 - tmp680;
+     c_re(input[28]) = st5;
+     st5 = tmp650 - st8;
+     st8 = tmp650 + st8;
+     c_re(input[12]) = st1;
+     st1 = tmp649 - st4;
+     st4 = tmp649 + st4;
+     c_im(input[20]) = st3;
+     st3 = tmp643 - st7;
+     st7 = tmp643 + st7;
+     c_im(input[4]) = st2;
+     st2 = tmp644 - st6;
+     st6 = tmp644 + st6;
+     c_im(input[22]) = st5;
+     st5 = tmp685 + tmp688;
+     c_im(input[6]) = st8;
+     st8 = tmp679 - st5;
+     st5 = tmp679 + st5;
+     c_re(input[30]) = st1;
+     st1 = tmp684 - tmp687;
+     c_re(input[14]) = st4;
+     st4 = tmp678 + st1;
+     st1 = st1 - tmp678;
+     c_im(input[30]) = st3;
+     st3 = tmp648 - st4;
+     st4 = tmp648 + st4;
+     c_im(input[14]) = st7;
+     st7 = tmp647 - st1;
+     st1 = tmp647 + st1;
+     c_re(input[22]) = st2;
+     st2 = tmp645 - st8;
+     st8 = tmp645 + st8;
+     c_re(input[6]) = st6;
+     st6 = tmp646 - st5;
+     st5 = tmp646 + st5;
+     c_im(input[18]) = st3;
+     st3 = c_re(input[31]);
+     st3 = st3 - c_re(input[15]);
+     c_im(input[2]) = st4;
+     st4 = c_im(input[7]);
+     st4 = st4 - c_im(input[23]);
+     c_re(input[26]) = st7;
+     st7 = st3 - st4;
+     st3 = st3 + st4;
+     c_re(input[10]) = st1;
+     st1 = c_re(input[7]);
+     st1 = st1 - c_re(input[23]);
+     c_im(input[26]) = st2;
+     st2 = c_im(input[31]);
+     st2 = st2 - c_im(input[15]);
+     c_im(input[10]) = st8;
+     st8 = st1 + st2;
+     st2 = st2 - st1;
+     c_re(input[18]) = st6;
+     st6 = c_re(input[3]);
+     st6 = st6 - c_re(input[19]);
+     c_re(input[2]) = st5;
+     st5 = c_im(input[3]);
+     st5 = st5 - c_im(input[19]);
+     st4 = st6 - st5;
+     st6 = st6 + st5;
+     st1 = c_re(input[27]);
+     st1 = st1 - c_re(input[11]);
+     st5 = c_im(input[27]);
+     st5 = st5 - c_im(input[11]);
+     tmp689 = st2;
+     st2 = st1 + st5;
+     st5 = st5 - st1;
+     st1 = st4 + st2;
+     st1 = st1 * K707106781[0];
+     st4 = st4 - st2;
+     st4 = st4 * K707106781[0];
+     st2 = st6 + st5;
+     st2 = st2 * K707106781[0];
+     st5 = st5 - st6;
+     st5 = st5 * K707106781[0];
+     st6 = st7 - st1;
+     tmp690 = st4;
+     st4 = st6 * K831469612[0];
+     st7 = st7 + st1;
+     st6 = st6 * K555570233[0];
+     st1 = st3 - st5;
+     tmp691 = st6;
+     st6 = st1 * K195090322[0];
+     st3 = st3 + st5;
+     st1 = st1 * K980785280[0];
+     st5 = st8 - st2;
+     tmp692 = st3;
+     st3 = st5 * K555570233[0];
+     st8 = st8 + st2;
+     st5 = st5 * K831469612[0];
+     st2 = tmp689 - tmp690;
+     tmp693 = st5;
+     st5 = st2 * K980785280[0];
+     tmp694 = st4;
+     st4 = tmp689 + tmp690;
+     st2 = st2 * K195090322[0];
+     st5 = st5 + st6;
+     st6 = st8 * K980785280[0];
+     st2 = st2 - st1;
+     st1 = st7 * K195090322[0];
+     st3 = st3 - tmp694;
+     st7 = st7 * K980785280[0];
+     tmp695 = st3;
+     st3 = tmp691 + tmp693;
+     st8 = st8 * K195090322[0];
+     st6 = st6 - st1;
+     st1 = st4 * K555570233[0];
+     st7 = st7 + st8;
+     st8 = tmp692 * K831469612[0];
+     st1 = st1 + st8;
+     st4 = st4 * K831469612[0];
+     st8 = c_re(input[1]);
+     tmp696 = st1;
+     st1 = tmp692 * K555570233[0];
+     st8 = st8 - c_re(input[17]);
+     st4 = st4 - st1;
+     st1 = c_im(input[9]);
+     st1 = st1 - c_im(input[25]);
+     tmp697 = st4;
+     st4 = st8 - st1;
+     st8 = st8 + st1;
+     st1 = c_re(input[9]);
+     st1 = st1 - c_re(input[25]);
+     tmp698 = st7;
+     st7 = c_im(input[1]);
+     st7 = st7 - c_im(input[17]);
+     tmp699 = st6;
+     st6 = st1 + st7;
+     st7 = st7 - st1;
+     st1 = c_re(input[5]);
+     st1 = st1 - c_re(input[21]);
+     tmp700 = st3;
+     st3 = c_im(input[5]);
+     st3 = st3 - c_im(input[21]);
+     tmp701 = st2;
+     st2 = st1 - st3;
+     st1 = st1 + st3;
+     st3 = c_re(input[29]);
+     st3 = st3 - c_re(input[13]);
+     tmp702 = st5;
+     st5 = c_im(input[29]);
+     st5 = st5 - c_im(input[13]);
+     tmp703 = st7;
+     st7 = st3 + st5;
+     st5 = st5 - st3;
+     st3 = st2 + st7;
+     st3 = st3 * K707106781[0];
+     st2 = st2 - st7;
+     st2 = st2 * K707106781[0];
+     st7 = st1 + st5;
+     st7 = st7 * K707106781[0];
+     st5 = st5 - st1;
+     st5 = st5 * K707106781[0];
+     st1 = st4 - st3;
+     tmp704 = st2;
+     st2 = st1 * K831469612[0];
+     st4 = st4 + st3;
+     st1 = st1 * K555570233[0];
+     st3 = st8 - st5;
+     tmp705 = st1;
+     st1 = st3 * K195090322[0];
+     st8 = st8 + st5;
+     st3 = st3 * K980785280[0];
+     st5 = st6 - st7;
+     tmp706 = st2;
+     st2 = st5 * K555570233[0];
+     st6 = st6 + st7;
+     st5 = st5 * K831469612[0];
+     st7 = tmp703 - tmp704;
+     tmp707 = st5;
+     st5 = st7 * K980785280[0];
+     tmp708 = st2;
+     st2 = tmp703 + tmp704;
+     st7 = st7 * K195090322[0];
+     st1 = st1 - st5;
+     st5 = st4 * K195090322[0];
+     tmp709 = st5;
+     st5 = st1 - tmp702;
+     tmp710 = st5;
+     st5 = st6 * K980785280[0];
+     st1 = st1 + tmp702;
+     st4 = st4 * K980785280[0];
+     st7 = st7 + st3;
+     st6 = st6 * K195090322[0];
+     st3 = st7 + tmp701;
+     tmp711 = st4;
+     st4 = st8 * K831469612[0];
+     st7 = tmp701 - st7;
+     tmp712 = st4;
+     st4 = st2 * K555570233[0];
+     tmp713 = st4;
+     st4 = tmp673 - st3;
+     st2 = st2 * K831469612[0];
+     st8 = st8 * K555570233[0];
+     st3 = tmp673 + st3;
+     c_im(input[23]) = st4;
+     st4 = tmp672 - st7;
+     st7 = tmp672 + st7;
+     c_im(input[7]) = st3;
+     st3 = tmp659 - tmp710;
+     c_re(input[31]) = st4;
+     st4 = tmp659 + tmp710;
+     c_re(input[15]) = st7;
+     st7 = tmp658 - st1;
+     st1 = tmp658 + st1;
+     c_im(input[31]) = st3;
+     st3 = tmp706 + tmp708;
+     c_im(input[15]) = st4;
+     st4 = st3 + tmp695;
+     st3 = tmp695 - st3;
+     c_re(input[23]) = st7;
+     st7 = tmp705 - tmp707;
+     c_re(input[7]) = st1;
+     st1 = st7 - tmp700;
+     st7 = st7 + tmp700;
+     tmp714 = st2;
+     st2 = tmp661 - st1;
+     st1 = tmp661 + st1;
+     c_im(input[29]) = st2;
+     st2 = tmp671 - st7;
+     st7 = tmp671 + st7;
+     c_im(input[13]) = st1;
+     st1 = tmp660 - st4;
+     st4 = tmp660 + st4;
+     c_re(input[21]) = st2;
+     st2 = tmp662 - st3;
+     st3 = tmp662 + st3;
+     st5 = tmp709 + st5;
+     c_re(input[5]) = st7;
+     st7 = st5 + tmp699;
+     st5 = tmp699 - st5;
+     st6 = tmp711 - st6;
+     c_im(input[21]) = st1;
+     st1 = st6 - tmp698;
+     st6 = st6 + tmp698;
+     c_im(input[5]) = st4;
+     st4 = tmp670 - st1;
+     st1 = tmp670 + st1;
+     c_re(input[29]) = st2;
+     st2 = tmp669 - st6;
+     st6 = tmp669 + st6;
+     c_re(input[13]) = st3;
+     st3 = tmp663 - st7;
+     st7 = tmp663 + st7;
+     c_im(input[25]) = st4;
+     st4 = tmp664 - st5;
+     st5 = tmp664 + st5;
+     c_im(input[9]) = st1;
+     st1 = tmp712 - tmp713;
+     c_re(input[17]) = st2;
+     st2 = st1 - tmp696;
+     st1 = st1 + tmp696;
+     st8 = tmp714 + st8;
+     c_re(input[1]) = st6;
+     st6 = st8 + tmp697;
+     st8 = tmp697 - st8;
+     c_im(input[17]) = st3;
+     st3 = tmp668 - st6;
+     st6 = tmp668 + st6;
+     c_im(input[1]) = st7;
+     st7 = tmp667 - st8;
+     st8 = tmp667 + st8;
+     c_re(input[25]) = st4;
+     st4 = tmp665 - st2;
+     st2 = tmp665 + st2;
+     c_re(input[9]) = st5;
+     st5 = tmp666 - st1;
+     st1 = tmp666 + st1;
+     c_im(input[19]) = st3;
+     c_im(input[3]) = st6;
+     c_re(input[27]) = st7;
+     c_re(input[11]) = st8;
+     c_im(input[27]) = st4;
+     c_im(input[11]) = st2;
+     c_re(input[19]) = st5;
+     c_re(input[3]) = st1;
+}
+
+void PFFTWI(64)(fftw_complex *input)
+{
+     PFFTWI(16)(input );
+     PFFTWI(16)(input + 16);
+     PFFTWI(16)(input + 32);
+     PFFTWI(16)(input + 48);
+     PFFTWI(twiddle_4)(input, PFFTW(W_64), 16);
+}
+
+void PFFTWI(128)(fftw_complex *input)
+{
+     PFFTWI(32)(input );
+     PFFTWI(32)(input + 32);
+     PFFTWI(32)(input + 64);
+     PFFTWI(32)(input + 96);
+     PFFTWI(twiddle_4)(input, PFFTW(W_128), 32);
+}
+
+void PFFTWI(512)(fftw_complex *input)
+{
+     PFFTWI(128)(input );
+     PFFTWI(128)(input + 128);
+     PFFTWI(128)(input + 256);
+     PFFTWI(128)(input + 384);
+     PFFTWI(twiddle_4)(input, PFFTW(W_512), 128);
+}
+
+void  PFFTW(twiddle_4) (fftw_complex * A, const fftw_complex * W, int iostride) {
+     int i;
+     fftw_complex *inout;
+     inout = A;
+     {
+      fftw_real st1;
+      fftw_real st2;
+      fftw_real st3;
+      fftw_real st4;
+      fftw_real st5;
+      fftw_real st6;
+      fftw_real st7;
+      fftw_real st8;
+      st8 = c_re(inout[0]);
+      st8 = st8 + c_re(inout[2 * iostride]);
+      st7 = c_re(inout[iostride]);
+      st7 = st7 + c_re(inout[3 * iostride]);
+      st6 = st8 - st7;
+      st8 = st8 + st7;
+      st5 = c_im(inout[0]);
+      st5 = st5 + c_im(inout[2 * iostride]);
+      st4 = c_im(inout[iostride]);
+      st4 = st4 + c_im(inout[3 * iostride]);
+      st3 = st5 - st4;
+      st5 = st5 + st4;
+      st2 = c_im(inout[0]);
+      st2 = st2 - c_im(inout[2 * iostride]);
+      st1 = c_re(inout[iostride]);
+      st1 = st1 - c_re(inout[3 * iostride]);
+      st7 = st2 - st1;
+      st1 = st1 + st2;
+      st4 = c_re(inout[0]);
+      st4 = st4 - c_re(inout[2 * iostride]);
+      c_re(inout[2 * iostride]) = st6;
+      st6 = c_im(inout[iostride]);
+      st6 = st6 - c_im(inout[3 * iostride]);
+      c_re(inout[0]) = st8;
+      st8 = st4 - st6;
+      st4 = st4 + st6;
+      c_im(inout[0]) = st5;
+      c_im(inout[2 * iostride]) = st3;
+      c_im(inout[iostride]) = st7;
+      c_im(inout[3 * iostride]) = st1;
+      c_re(inout[3 * iostride]) = st8;
+      c_re(inout[iostride]) = st4;
+     }
+     inout = inout + 1;
+     i = iostride - 1;
+     do {
+      {
+           fftw_real st1;
+           fftw_real st2;
+           fftw_real st3;
+           fftw_real st4;
+           fftw_real st5;
+           fftw_real st6;
+           fftw_real st7;
+           fftw_real st8;
+           st8 = c_re(inout[0]);
+           st8 = st8 + c_re(inout[2 * iostride]);
+           st7 = c_re(inout[iostride]);
+           st7 = st7 + c_re(inout[3 * iostride]);
+           st6 = st8 - st7;
+           st5 = st6 * c_im(W[1]);
+           st8 = st8 + st7;
+           st6 = st6 * c_re(W[1]);
+           st4 = c_im(inout[0]);
+           st4 = st4 + c_im(inout[2 * iostride]);
+           st3 = c_im(inout[iostride]);
+           st3 = st3 + c_im(inout[3 * iostride]);
+           st2 = st4 - st3;
+           st1 = st2 * c_im(W[1]);
+           st4 = st4 + st3;
+           st2 = st2 * c_re(W[1]);
+           st2 = st2 - st5;
+           st6 = st6 + st1;
+           st7 = c_re(inout[0]);
+           st7 = st7 - c_re(inout[2 * iostride]);
+           st5 = c_im(inout[iostride]);
+           st5 = st5 - c_im(inout[3 * iostride]);
+           c_re(inout[0]) = st8;
+           st8 = st7 - st5;
+           st3 = st8 * c_re(W[0]);
+           st7 = st7 + st5;
+           st8 = st8 * c_im(W[0]);
+           st1 = c_re(inout[iostride]);
+           c_re(inout[2 * iostride]) = st6;
+           st6 = st7 * c_im(W[0]);
+           st1 = st1 - c_re(inout[3 * iostride]);
+           st7 = st7 * c_re(W[0]);
+           st5 = c_im(inout[0]);
+           st5 = st5 - c_im(inout[2 * iostride]);
+           c_im(inout[0]) = st4;
+           st4 = st1 + st5;
+           c_im(inout[2 * iostride]) = st2;
+           st2 = st4 * c_im(W[0]);
+           st5 = st5 - st1;
+           st4 = st4 * c_re(W[0]);
+           st3 = st3 - st2;
+           st1 = st5 * c_re(W[0]);
+           st5 = st5 * c_im(W[0]);
+           st4 = st4 + st8;
+           st5 = st5 + st7;
+           st1 = st1 - st6;
+           c_re(inout[3 * iostride]) = st3;
+           c_im(inout[3 * iostride]) = st4;
+           c_re(inout[iostride]) = st5;
+           c_im(inout[iostride]) = st1;
+      }
+      i = i - 1, inout = inout + 1, W = W + 2;
+     } while (i > 0);
+}
+
+void PFFTWI(twiddle_4) (fftw_complex * A, const fftw_complex * W, int iostride) {
+     int i;
+     fftw_complex *inout;
+     inout = A;
+     {
+      fftw_real st1;
+      fftw_real st2;
+      fftw_real st3;
+      fftw_real st4;
+      fftw_real st5;
+      fftw_real st6;
+      fftw_real st7;
+      fftw_real st8;
+      st8 = c_re(inout[0]);
+      st8 = st8 + c_re(inout[2 * iostride]);
+      st7 = c_re(inout[iostride]);
+      st7 = st7 + c_re(inout[3 * iostride]);
+      st6 = st8 - st7;
+      st8 = st8 + st7;
+      st5 = c_im(inout[0]);
+      st5 = st5 + c_im(inout[2 * iostride]);
+      st4 = c_im(inout[iostride]);
+      st4 = st4 + c_im(inout[3 * iostride]);
+      st3 = st5 - st4;
+      st5 = st5 + st4;
+      st2 = c_re(inout[iostride]);
+      st2 = st2 - c_re(inout[3 * iostride]);
+      st1 = c_im(inout[0]);
+      st1 = st1 - c_im(inout[2 * iostride]);
+      st7 = st2 + st1;
+      st1 = st1 - st2;
+      st4 = c_re(inout[0]);
+      st4 = st4 - c_re(inout[2 * iostride]);
+      c_re(inout[2 * iostride]) = st6;
+      st6 = c_im(inout[iostride]);
+      st6 = st6 - c_im(inout[3 * iostride]);
+      c_re(inout[0]) = st8;
+      st8 = st4 - st6;
+      st4 = st4 + st6;
+      c_im(inout[0]) = st5;
+      c_im(inout[2 * iostride]) = st3;
+      c_im(inout[iostride]) = st7;
+      c_im(inout[3 * iostride]) = st1;
+      c_re(inout[iostride]) = st8;
+      c_re(inout[3 * iostride]) = st4;
+     }
+     inout = inout + 1;
+     i = iostride - 1;
+     do {
+      {
+           fftw_real st1;
+           fftw_real st2;
+           fftw_real st3;
+           fftw_real st4;
+           fftw_real st5;
+           fftw_real st6;
+           fftw_real st7;
+           fftw_real st8;
+           st8 = c_re(inout[2 * iostride]);
+           st8 = st8 * c_re(W[1]);
+           st7 = c_im(inout[2 * iostride]);
+           st7 = st7 * c_im(W[1]);
+           st8 = st8 - st7;
+           st6 = st8 + c_re(inout[0]);
+           st8 = c_re(inout[0]) - st8;
+           st5 = c_re(inout[2 * iostride]);
+           st5 = st5 * c_im(W[1]);
+           st4 = c_im(inout[2 * iostride]);
+           st4 = st4 * c_re(W[1]);
+           st5 = st5 + st4;
+           st3 = st5 + c_im(inout[0]);
+           st5 = c_im(inout[0]) - st5;
+           st2 = c_re(inout[iostride]);
+           st2 = st2 * c_re(W[0]);
+           st1 = c_im(inout[iostride]);
+           st1 = st1 * c_im(W[0]);
+           st2 = st2 - st1;
+           st7 = c_re(inout[3 * iostride]);
+           st7 = st7 * c_re(W[0]);
+           st4 = c_im(inout[3 * iostride]);
+           st4 = st4 * c_im(W[0]);
+           st7 = st7 + st4;
+           st1 = st2 + st7;
+           st2 = st2 - st7;
+           st4 = st6 - st1;
+           st6 = st6 + st1;
+           st7 = st2 + st5;
+           st5 = st5 - st2;
+           st1 = c_re(inout[iostride]);
+           st1 = st1 * c_im(W[0]);
+           st2 = c_im(inout[iostride]);
+           st2 = st2 * c_re(W[0]);
+           st1 = st1 + st2;
+           c_re(inout[2 * iostride]) = st4;
+           st4 = c_im(inout[3 * iostride]);
+           st4 = st4 * c_re(W[0]);
+           c_re(inout[0]) = st6;
+           st6 = c_re(inout[3 * iostride]);
+           st6 = st6 * c_im(W[0]);
+           st4 = st4 - st6;
+           c_im(inout[iostride]) = st7;
+           st7 = st1 - st4;
+           st1 = st1 + st4;
+           c_im(inout[3 * iostride]) = st5;
+           st5 = st8 - st7;
+           st8 = st8 + st7;
+           st2 = st1 + st3;
+           st3 = st3 - st1;
+           c_re(inout[iostride]) = st5;
+           c_re(inout[3 * iostride]) = st8;
+           c_im(inout[0]) = st2;
+           c_im(inout[2 * iostride]) = st3;
+      }
+      i = i - 1, inout = inout + 1, W = W + 2;
+     } while (i > 0);
+}
+
+int PFFTW(permutation_64)(int i)
+{
+    int i1 = i % 4;
+    int i2 = i / 4;
+    if (i1 <= 2)
+       return (i1 * 16 + i2);
+    else
+       return (i1 * 16 + ((i2 + 1) % 16));
+}
+
+int PFFTW(permutation_128)(int i)
+{
+    int i1 = i % 4;
+    int i2 = i / 4;
+    if (i1 <= 2)
+       return (i1 * 32 + i2);
+    else
+       return (i1 * 32 + ((i2 + 1) % 32));
+}
+
+int PFFTW(permutation_512)(int i)
+{
+    int i1 = i % 4;
+    int i2 = i / 4;
+    if (i1 <= 2)
+       return (i1 * 128 + PFFTW(permutation_128)(i2));
+    else
+       return (i1 * 128 + PFFTW(permutation_128)((i2 + 1) % 128));
+}
+
+void make_fft_order(short *unscrambled64, short *unscrambled512)
+{
+    int i;
+
+    for (i = 0; i < 64; i++)
+        unscrambled64[i] = PFFTW(permutation_64)(i);
+
+    for (i = 0; i < 512; i++)
+        unscrambled512[i] = PFFTW(permutation_512)(i);
+}
--- /dev/null
+++ b/libfaad/mdct.h
@@ -1,0 +1,68 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: mdct.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __MDCT_H__
+#define __MDCT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef float fftw_real;
+
+typedef struct {
+     fftw_real re, im;
+} fftw_complex;
+
+#define c_re(c)  ((c).re)
+#define c_im(c)  ((c).im)
+
+#define DEFINE_PFFTW(size)          \
+ void pfftwi_##size(fftw_complex *input);   \
+ void pfftw_##size(fftw_complex *input);    \
+ int  pfftw_permutation_##size(int i);
+
+DEFINE_PFFTW(16)
+DEFINE_PFFTW(32)
+DEFINE_PFFTW(64)
+DEFINE_PFFTW(128)
+DEFINE_PFFTW(512)
+
+void make_fft_order(short *unscrambled64, short *unscrambled512);
+void IMDCT_long(fftw_real *in_data, fftw_real *out_data, short *unscrambled);
+void IMDCT_short(fftw_real *in_data, fftw_real *out_data, short *unscrambled);
+
+void MDCT_long(fftw_real *in_data, fftw_real *out_data, short *unscrambled);
+void MDCT_short(fftw_real *in_data, fftw_real *out_data, short *unscrambled);
+
+#define PFFTW(name)  CONCAT(pfftw_, name)
+#define PFFTWI(name)  CONCAT(pfftwi_, name)
+#define CONCAT_AUX(a, b) a ## b
+#define CONCAT(a, b) CONCAT_AUX(a,b)
+#define FFTW_KONST(x) ((fftw_real) x)
+
+void PFFTW(twiddle_4)(fftw_complex *A, const fftw_complex *W, int iostride);
+void PFFTWI(twiddle_4)(fftw_complex *A, const fftw_complex *W, int iostride);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/ms.c
@@ -1,0 +1,63 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: ms.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#include "syntax.h"
+#include "ms.h"
+#include "is.h"
+#include "pns.h"
+
+void ms_decode(ic_stream *ics, ic_stream *icsr, float *l_spec, float *r_spec)
+{
+    int g, b, sfb, i;
+    int group = 0;
+
+    int k;
+    float tmp;
+
+    if (ics->ms_mask_present >= 1)
+    {
+        for (g = 0; g < ics->num_window_groups; g++) 
+        {
+            for (b = 0; b < ics->window_group_length[g]; b++)
+            {
+                for(sfb = 0; sfb < ics->max_sfb; sfb++)
+                {
+                    /* If intensity stereo coding or noise substitution is on
+                       for a particular scalefactor band, no M/S stereo decoding
+                       is carried out.
+                     */
+                    if ((ics->ms_used[g][sfb] || ics->ms_mask_present == 2) &&
+                        !is_intensity(icsr, g, sfb) && !is_noise(ics, g, sfb))
+                    {
+                        for (i = ics->swb_offset[sfb]; i < ics->swb_offset[sfb+1]; i++)
+                        {
+                            k = (group*128) + i;
+                            tmp = l_spec[k] - r_spec[k];
+                            l_spec[k] = l_spec[k] + r_spec[k];
+                            r_spec[k] = tmp;
+                        }
+                    }
+                }
+                group++;
+            }
+        }
+    }
+}
--- /dev/null
+++ b/libfaad/ms.h
@@ -1,0 +1,34 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: ms.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __MS_H__
+#define __MS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void ms_decode(ic_stream *ics, ic_stream *icsr, float *l_spec, float *r_spec);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/output.c
@@ -1,0 +1,95 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: output.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "output.h"
+#include "decoder.h"
+
+#define ftol(A,B) {tmp = *(int*) & A - 0x4B7F8000; \
+                   B = (short)((tmp==(short)tmp) ? tmp : (tmp>>31)^0x7FFF);}
+#ifdef __ICL
+#define ROUND(x) ((int)floorf((x) + 0.5f))
+#else
+#define ROUND(x) ((int)floor((x) + 0.5))
+#endif
+#define FLOAT_SCALE (1.0f/(1<<15))
+
+
+void* output_to_PCM(float **input, void *sample_buffer, int channels,
+                    int format)
+{
+    int ch, i;
+
+    short *short_sample_buffer = (short*)sample_buffer;
+    int   *int_sample_buffer = (int*)sample_buffer;
+    float *float_sample_buffer = (float*)sample_buffer;
+
+    /* Copy output to a standard PCM buffer */
+    switch (format)
+    {
+    case FAAD_FMT_16BIT:
+        for (ch = 0; ch < channels; ch++)
+        {
+            for(i = 0; i < 1024; i++)
+            {
+                int tmp;
+                float ftemp;
+
+                ftemp = input[ch][i] + 0xff8000;
+                ftol(ftemp, short_sample_buffer[(i*channels)+ch]);
+            }
+        }
+        break;
+    case FAAD_FMT_24BIT:
+        for (ch = 0; ch < channels; ch++)
+        {
+            for(i = 0; i < 1024; i++)
+            {
+                int_sample_buffer[(i*channels)+ch] = ROUND(input[ch][i]*(1<<8));
+            }
+        }
+        break;
+    case FAAD_FMT_32BIT:
+        for (ch = 0; ch < channels; ch++)
+        {
+            for(i = 0; i < 1024; i++)
+            {
+                int_sample_buffer[(i*channels)+ch] = ROUND(input[ch][i]*(1<<16));
+            }
+        }
+        break;
+    case FAAD_FMT_FLOAT:
+        for (ch = 0; ch < channels; ch++)
+        {
+            for(i = 0; i < 1024; i++)
+            {
+                float_sample_buffer[(i*channels)+ch] = input[ch][i]*FLOAT_SCALE;
+            }
+        }
+        break;
+    }
+
+    return sample_buffer;
+}
\ No newline at end of file
--- /dev/null
+++ b/libfaad/output.h
@@ -1,0 +1,36 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: output.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __OUTPUT_H__
+#define __OUTPUT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void* output_to_PCM(float **input, void *samplebuffer, int channels,
+                    int format);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/pns.c
@@ -1,0 +1,126 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: pns.c,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "pns.h"
+
+
+/* Needs some more work */
+/* From the spec:
+   If the same scalefactor band and group is coded by perceptual noise
+   substitution in both channels of a channel pair, the correlation of
+   the noise signal can be controlled by means of the ms_used field: While
+   the default noise generation process works independently for each channel
+   (separate generation of random vectors), the same random vector is used
+   for both channels if ms_used[] is set for a particular scalefactor band
+   and group. In this case, no M/S stereo coding is carried out (because M/S
+   stereo coding and noise substitution coding are mutually exclusive).
+   If the same scalefactor band and group is coded by perceptual noise
+   substitution in only one channel of a channel pair the setting of ms_used[]
+   is not evaluated.
+*/
+
+
+
+static __inline long random2(long *seed)
+{
+    *seed = (1664525L * *seed) + 1013904223L;  /* Numerical recipes */
+
+    return *seed;
+}
+
+/* The function gen_rand_vector(addr, size) generates a vector of length
+   <size> with signed random values of average energy MEAN_NRG per random
+   value. A suitable random number generator can be realized using one
+   multiplication/accumulation per random value.
+*/
+static __inline void gen_rand_vector(float *spec, int size, long *state)
+{
+    int i;
+
+    for (i = 0; i < size; i++)
+    {
+        spec[i] = (float)random2(state);
+    }
+}
+
+void pns_decode(ic_stream *ics, float *spec)
+{
+    int g, sfb, b, i;
+    int size, offs;
+    float scale;
+
+    int group = 0;
+
+    static int state = 1;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        /* Do perceptual noise substitution decoding */
+        for (b = 0; b < ics->window_group_length[g]; b++)
+        {
+            for (sfb = 0; sfb < ics->max_sfb; sfb++)
+            {
+                if (is_noise(ics, g, sfb))
+                {
+                    /* Simultaneous use of LTP and PNS is not prevented in the
+                       syntax. If both LTP, and PNS are enabled on the same
+                       scalefactor band, PNS takes precedence, and no prediction
+                       is applied to this band.
+                     */
+                    ics->ltp.long_used[sfb] = 0;
+                    ics->ltp2.long_used[sfb] = 0;
+
+                    /* For scalefactor bands coded using PNS the corresponding
+                       predictors are switched to "off".
+                     */
+                    ics->pred.prediction_used[sfb] = 0;
+                    
+                    offs = ics->swb_offset[sfb];
+                    size = ics->swb_offset[sfb+1] - offs;
+
+                    /* Generate random vector */
+                    gen_rand_vector(&spec[(group*128)+offs], size, &state);
+
+                    /* 14496-3 says:
+                       scale = 1.0f/(size * (float)sqrt(MEAN_NRG));
+                     */
+#ifdef __ICL
+                    scale = 1.0f/sqrtf(size * MEAN_NRG);
+                    scale *= powf(2.0f, 0.25f*ics->scale_factors[g][sfb]);
+#else
+                    scale = 1.0f/(float)sqrt(size * MEAN_NRG);
+                    scale *= (float)pow(2.0, 0.25*ics->scale_factors[g][sfb]);
+#endif
+
+                    /* Scale random vector to desired target energy */
+                    for (i = 0; i < size; i++)
+                        spec[(group*128)+offs+i] *= scale;
+                }
+            }
+            group++;
+        }
+    }
+}
--- /dev/null
+++ b/libfaad/pns.h
@@ -1,0 +1,51 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: pns.h,v 1.1 2002/01/14 19:15:56 menno Exp $
+**/
+
+#ifndef __PNS_H__
+#define __PNS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "huffman.h"
+#include "syntax.h"
+
+#define NOISE_OFFSET 90
+#define MEAN_NRG 1.537228e+18 /* (2^31)^2 / 3 */
+
+
+void pns_decode(ic_stream *ics, float *spec);
+
+static __inline long random2(long *seed);
+static void gen_rand_vector(float *spec, int size, long *state);
+
+static __inline int is_noise(ic_stream *ics, int group, int sfb)
+{
+    if (ics->sfb_cb[group][sfb] == NOISE_HCB)
+        return 1;
+    return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/predict.c
@@ -1,0 +1,201 @@
+/*
+ * FAAD - Freeware Advanced Audio Decoder
+ * Copyright (C) 2001 M. Bakker
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser 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
+ *
+ * $Id: predict.c,v 1.1 2002/01/14 19:15:57 menno Exp $
+ */
+
+#include "syntax.h"
+#include "ic_predict.h"
+
+void quantize_pred_state(pred_state *state, tmp_pred_state *tmp_state)
+{
+    int i;
+    short *s;
+    unsigned long *s_tmp;
+
+    s     = (short*)state;
+    s_tmp = (unsigned long*)tmp_state;
+
+    for (i = 0; i < 6; i++)
+        s[i] = (short)(s_tmp[i]>>16);
+}
+
+void inv_quantize_pred_state(pred_state *state, tmp_pred_state *tmp_state)
+{
+    int i;
+    short *s;
+    unsigned long *s_tmp;
+
+
+    s_tmp = (unsigned long*)tmp_state;
+    s     = (short*)state;
+    
+    for (i = 0; i < 6; i++)
+        s_tmp[i] = ((unsigned long)s[i])<<16;
+}
+
+static void flt_round_inf(float *pf)
+{
+    int flg;
+    unsigned long tmp;
+    float *pt = (float *)&tmp;
+
+    *pt = *pf;
+    flg = tmp & (unsigned long)0x00008000;
+    tmp &= (unsigned long)0xffff0000;
+    *pf = *pt;
+
+    /* round 1/2 lsb toward infinity */
+    if (flg)
+    {
+        tmp &= (unsigned long)0xff800000; /* extract exponent and sign */
+        tmp |= (unsigned long)0x00010000; /* insert 1 lsb */
+        *pf += *pt;                       /* add 1 lsb and elided one */
+        tmp &= (unsigned long)0xff800000; /* extract exponent and sign */
+        *pf -= *pt;                       /* subtract elided one */
+    }
+}
+
+static void ic_predict(pred_state *state, float input, float *output,
+                        int pred, float *mnt_table, float *exp_table)
+{
+    unsigned long tmp;
+    int i, j;
+    float dr1, predictedvalue;
+    float e0, e1;
+    float r0, r1;
+    float k1, k2;
+
+    float *r;
+    float *KOR;
+    float *VAR;
+
+    tmp_pred_state tmp_state2;
+    tmp_pred_state *tmp_state;
+
+    tmp_state = &tmp_state2;
+
+    /* inversely quantize the prediction state */
+    inv_quantize_pred_state(state, tmp_state);
+
+    r   = tmp_state->r;   /* delay elements */
+    KOR = tmp_state->KOR; /* correlations */
+    VAR = tmp_state->VAR; /* variances */
+
+    r0 = r[0];
+    r1 = r[1];
+
+    tmp = state->VAR[0];
+    j   = (tmp >> 7); /* exponent */
+    i   = tmp & 0x7f; /* mantissa */
+    k1  = KOR[1-1] * exp_table[j] * mnt_table[i];
+
+    if (pred)
+    {
+        /* only needed for the actual predicted value, k1 is always needed */
+        tmp = state->VAR[1];
+        j   = (tmp >> 7); /* exponent */
+        i   = tmp & 0x7f; /* mantissa */
+        k2  = KOR[2-1] * exp_table[j] * mnt_table[i];
+
+        predictedvalue = k1*r0 + k2*r1;
+        flt_round_inf(&predictedvalue);
+
+        *output = input + predictedvalue;
+    } else {
+        *output = input;
+    }
+
+    /* calculate new state data */
+    e0 = *output;
+    e1 = e0 - k1 * r0;
+
+    dr1 = k1 * e0;
+
+    VAR[0] = ALPHA * VAR[0] + (0.5f)*(r0*r0 + e0*e0);
+    KOR[0] = ALPHA * KOR[0] + r0*e0;
+    VAR[1] = ALPHA * VAR[1] + (0.5f)*(r1*r1 + e1*e1);
+    KOR[1] = ALPHA * KOR[1] + r1*e1;
+
+    r1 = A * (r0-dr1);
+    r0 = A * e0;
+
+    r[0] = r0;
+    r[1] = r1;
+
+    /* quantize the prediction state */
+    quantize_pred_state(state, tmp_state);
+}
+
+static void reset_pred_state(pred_state *state)
+{
+    state->r[0]   = 0;
+    state->r[1]   = 0;
+    state->KOR[0] = 0;
+    state->KOR[1] = 0;
+    state->VAR[0] = 0x3F80;
+    state->VAR[1] = 0x3F80;
+}
+
+static void reset_all_predictors(pred_state *state)
+{
+    int i;
+
+    for (i = 0; i < 1024; i++)
+        reset_pred_state(&state[i]);
+}
+
+void ic_prediction_init(pred_state *state)
+{
+}
+
+/* intra channel prediction */
+void ic_prediction(ic_stream *ics, float *spec, pred_state *state,
+                   pred_tables *tables)
+{
+    int sfb, bin;
+
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+    {
+        reset_all_predictors(state);
+    } else {
+        for (sfb = 0; sfb < ics->pred.limit; sfb++)
+        {
+            int fc = ics->swb_offset[sfb];
+            int lc = ics->swb_offset[sfb+1];
+
+            for (bin = fc; bin < lc; bin++)
+            {
+                ic_predict(&state[bin], spec[bin], &spec[bin],
+                    (ics->predictor_data_present &&
+                    ics->pred.prediction_used[sfb]), tables->mnt_table,
+                    tables->exp_table);
+            }
+        }
+
+        if (ics->pred.predictor_reset)
+        {
+            int reset_group_number = ics->pred.predictor_reset_group_number;
+
+            for (bin = reset_group_number - 1; bin < 1024; bin += 30)
+            {
+                reset_pred_state(&state[bin]);
+            }
+        }
+    }
+}
--- /dev/null
+++ b/libfaad/pulse.c
@@ -1,0 +1,39 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: pulse.c,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+#include "syntax.h"
+#include "pulse.h"
+
+void pulse_decode(ic_stream *ics, short *spec_data)
+{
+    int i, k;
+    pulse_info *pul = &ics->pul;
+
+    k = ics->swb_offset[pul->pulse_start_sfb];
+
+    for(i = 0; i <= pul->number_pulse; i++) {
+        k += pul->pulse_offset[i];
+        if (spec_data[k] > 0)
+            spec_data[k] += pul->pulse_amp[i];
+        else
+            spec_data[k] -= pul->pulse_amp[i];
+    }
+}
--- /dev/null
+++ b/libfaad/pulse.h
@@ -1,0 +1,34 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: pulse.h,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+#ifndef __PULSE_H__
+#define __PULSE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void pulse_decode(ic_stream *ics, short *spec_coef);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/specrec.c
@@ -1,0 +1,304 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: specrec.c,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+/*
+  Spectral reconstruction:
+   - grouping/sectioning
+   - inverse quantization
+   - applying scalefactors
+*/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "specrec.h"
+#include "syntax.h"
+#include "data.h"
+
+
+#define bit_set(A, B) ((A) & (1<<(B)))
+
+/* 4.5.2.3.4 */
+/*
+  - determine the number of windows in a window_sequence named num_windows
+  - determine the number of window_groups named num_window_groups
+  - determine the number of windows in each group named window_group_length[g]
+  - determine the total number of scalefactor window bands named num_swb for
+    the actual window type
+  - determine swb_offset[swb], the offset of the first coefficient in
+    scalefactor window band named swb of the window actually used
+  - determine sect_sfb_offset[g][section],the offset of the first coefficient
+    in section named section. This offset depends on window_sequence and
+    scale_factor_grouping and is needed to decode the spectral_data().
+*/
+int window_grouping_info(ic_stream *ics, int fs_index)
+{
+    int i, g;
+
+    switch (ics->window_sequence) {
+    case ONLY_LONG_SEQUENCE:
+    case LONG_START_SEQUENCE:
+    case LONG_STOP_SEQUENCE:
+        ics->num_windows = 1;
+        ics->num_window_groups = 1;
+        ics->window_group_length[ics->num_window_groups-1] = 1;
+        ics->num_swb = num_swb_long_window[fs_index];
+
+        /* preparation of sect_sfb_offset for long blocks */
+        /* also copy the last value! */
+        for (i = 0; i < ics->num_swb + 1; i++)
+        {
+            ics->sect_sfb_offset[0][i] = swb_offset_long_window[fs_index][i];
+            ics->swb_offset[i] = swb_offset_long_window[fs_index][i];
+        }
+        return 0;
+    case EIGHT_SHORT_SEQUENCE:
+        ics->num_windows = 8;
+        ics->num_window_groups = 1;
+        ics->window_group_length[ics->num_window_groups-1] = 1;
+        ics->num_swb = num_swb_short_window[fs_index];
+
+        for (i = 0; i < ics->num_swb + 1; i++)
+            ics->swb_offset[i] = swb_offset_short_window[fs_index][i];
+
+        for (i = 0; i < ics->num_windows-1; i++) {
+            if (bit_set(ics->scale_factor_grouping, 6-i) == 0)
+            {
+                ics->num_window_groups += 1;
+                ics->window_group_length[ics->num_window_groups-1] = 1;
+            } else {
+                ics->window_group_length[ics->num_window_groups-1] += 1;
+            }
+        }
+
+        /* preparation of sect_sfb_offset for short blocks */
+        for (g = 0; g < ics->num_window_groups; g++)
+        {
+            int width;
+            int sect_sfb = 0;
+            int offset = 0;
+            for (i = 0; i < ics->num_swb; i++)
+            {
+                width = swb_offset_short_window[fs_index][i+1] -
+                    swb_offset_short_window[fs_index][i];
+                width *= ics->window_group_length[g];
+                ics->sect_sfb_offset[g][sect_sfb++] = offset;
+                offset += width;
+            }
+            ics->sect_sfb_offset[g][sect_sfb] = offset;
+        }
+        return 0;
+    default:
+        return 1;
+    }
+}
+
+/*
+  For ONLY_LONG_SEQUENCE windows (num_window_groups = 1,
+  window_group_length[0] = 1) the spectral data is in ascending spectral
+  order.
+  For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the
+  grouping in the following manner:
+  - Groups are ordered sequentially
+  - Within a group, a scalefactor band consists of the spectral data of all
+    grouped SHORT_WINDOWs for the associated scalefactor window band. To
+    clarify via example, the length of a group is in the range of one to eight
+    SHORT_WINDOWs.
+  - If there are eight groups each with length one (num_window_groups = 8,
+    window_group_length[0..7] = 1), the result is a sequence of eight spectra,
+    each in ascending spectral order.
+  - If there is only one group with length eight (num_window_groups = 1,
+    window_group_length[0] = 8), the result is that spectral data of all eight
+    SHORT_WINDOWs is interleaved by scalefactor window bands.
+  - Within a scalefactor window band, the coefficients are in ascending
+    spectral order.
+*/
+void quant_to_spec(ic_stream *ics, float *spec_data)
+{
+    int g, width, sfb, win, bin;
+    float *start_inptr, *start_win_ptr, *win_ptr;
+
+    float tmp_spec[1024];
+    float *tmp_spec_ptr, *spec_ptr;
+
+    tmp_spec_ptr = tmp_spec;
+    for (g = 1024/16-1; g >= 0; --g)
+    {
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+        *tmp_spec_ptr++ = 0; *tmp_spec_ptr++ = 0;
+    }
+
+    spec_ptr = spec_data;
+    tmp_spec_ptr = tmp_spec;
+    start_win_ptr = tmp_spec_ptr;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        int j = 0;
+        int win_inc = 0;
+
+        start_inptr = spec_ptr;
+
+        win_inc = ics->swb_offset[ics->num_swb];
+
+        for (sfb = 0; sfb < ics->num_swb; sfb++)
+        {
+            width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb];
+
+            win_ptr = start_win_ptr;
+
+            for (win = 0; win < ics->window_group_length[g]; win++)
+            {
+                tmp_spec_ptr = win_ptr + j;
+
+                for (bin = 0; bin < width; bin++)
+                    *tmp_spec_ptr++ = *spec_ptr++;
+
+                win_ptr += win_inc;
+            }
+            j += width;
+        }
+        start_win_ptr += (spec_ptr - start_inptr);
+    }
+
+    spec_ptr = spec_data;
+    tmp_spec_ptr = tmp_spec;
+
+    for (g = 1024/16 - 1; g >= 0; --g)
+    {
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+        *spec_ptr++ = *tmp_spec_ptr++; *spec_ptr++ = *tmp_spec_ptr++;
+    }
+}
+
+void build_tables(float *iq_table, float *pow2_table)
+{
+    int i;
+
+    /* build pow() table for inverse quantization */
+    for(i = 0; i < IQ_TABLE_SIZE; i++)
+    {
+#ifdef __ICL
+        iq_table[i] = powf(i, 4.0f/3.0f);
+#else
+        iq_table[i] = (float)pow(i, 4.0/3.0);
+#endif
+    }
+
+    /* build pow(2, 0.25) table for scalefactors */
+    for(i = 0; i < POW_TABLE_SIZE; i++)
+    {
+#ifdef __ICL
+        pow2_table[i] = powf(2.0f, 0.25f * (i-100));
+#else
+        pow2_table[i] = (float)pow(2.0, 0.25 * (i-100));
+#endif
+    }
+}
+
+void inverse_quantization(float *x_invquant, short *x_quant, float *iq_table)
+{
+    int i;
+
+    for(i = 0; i < 1024; i++)
+    {
+        short q = x_quant[i];
+
+        if (q > 0)
+        {
+            if (q < IQ_TABLE_SIZE)
+                x_invquant[i] = iq_table[q];
+            else
+#ifdef __ICL
+                x_invquant[i] = powf(q, 4.0f/3.0f);
+#else
+                x_invquant[i] = (float)pow(q, 4.0/3.0);
+#endif
+        } else if (q < 0) {
+            q = -q;
+            if (q < IQ_TABLE_SIZE)
+                x_invquant[i] = -iq_table[q];
+            else
+#ifdef __ICL
+                x_invquant[i] = -powf(q, 4.0f/3.0f);
+#else
+                x_invquant[i] = -(float)pow(q, 4.0/3.0);
+#endif
+        } else {
+            x_invquant[i] = 0.0f;
+        }
+    }
+}
+
+static __inline float get_scale_factor_gain(int scale_factor, float *pow2_table)
+{
+    if ((scale_factor >= 0) && (scale_factor < POW_TABLE_SIZE))
+        return pow2_table[scale_factor];
+    else
+#ifdef __ICL
+        return powf(2.0f, 0.25f * (scale_factor - 100));
+#else
+        return (float)pow(2.0, 0.25 * (scale_factor - 100));
+#endif
+}
+
+void apply_scalefactors(ic_stream *ics, float *x_invquant, float *pow2_table)
+{
+    int g, sfb, top;
+    float *fp, scale;
+    int groups = 0;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        int k = 0;
+
+        /* using this 128*groups doesn't hurt long blocks, because
+           long blocks only have 1 group, so that means 'groups' is
+           always 0 for long blocks
+        */
+        fp = x_invquant + (groups*128);
+
+        for (sfb = 0; sfb < ics->max_sfb; sfb++)
+        {
+            top = ics->sect_sfb_offset[g][sfb+1];
+
+            scale = get_scale_factor_gain(ics->scale_factors[g][sfb], pow2_table);
+
+            for ( ; k < top; k++)
+                *fp++ *= scale;
+        }
+        groups += ics->window_group_length[g];
+    }
+}
--- /dev/null
+++ b/libfaad/specrec.h
@@ -1,0 +1,45 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: specrec.h,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+#ifndef __SPECREC_H__
+#define __SPECREC_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "syntax.h"
+
+#define IQ_TABLE_SIZE   200
+#define POW_TABLE_SIZE  200
+
+
+int window_grouping_info(ic_stream *ics, int fs_index);
+void quant_to_spec(ic_stream *ics, float *spec_data);
+void build_tables(float *iq_table, float *pow2_table);
+void inverse_quantization(float *x_invquant, short *x_quant, float *iq_table);
+void apply_scalefactors(ic_stream *ics, float *x_invquant, float *pow2_table);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/syntax.c
@@ -1,0 +1,765 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: syntax.c,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+/*
+   Reads the AAC bitstream as defined in 14496-3 (MPEG-4 Audio)
+
+   (Note that there are some differences with 13818-7 (MPEG2), these
+   are alse read correctly when the MPEG ID is known (can be found in
+   an ADTS header)).
+*/
+
+#include <stdlib.h>
+#include <memory.h>
+#include "syntax.h"
+#include "specrec.h"
+#include "huffman.h"
+#include "bits.h"
+#include "data.h"
+#include "pulse.h"
+
+/* Table 4.4.2 */
+/* An MPEG-4 Audio decoder is only required to follow the Program
+   Configuration Element in GASpecificConfig(). The decoder shall ignore
+   any Program Configuration Elements that may occur in raw data blocks.
+   PCEs transmitted in raw data blocks cannot be used to convey decoder
+   configuration information.
+*/
+int program_config_element(program_config *pce, bitfile *ld)
+{
+    int i;
+
+    pce->channels = 0;
+
+    pce->element_instance_tag = faad_getbits(ld, 4);
+
+    pce->object_type = faad_getbits(ld, 2);
+    pce->sf_index = faad_getbits(ld, 4);
+    pce->num_front_channel_elements = faad_getbits(ld, 4);
+    pce->num_side_channel_elements = faad_getbits(ld, 4);
+    pce->num_back_channel_elements = faad_getbits(ld, 4);
+    pce->num_lfe_channel_elements = faad_getbits(ld, 2);
+    pce->num_assoc_data_elements = faad_getbits(ld, 3);
+    pce->num_valid_cc_elements = faad_getbits(ld, 4);
+
+    pce->mono_mixdown_present = faad_get1bit(ld);
+    if (pce->mono_mixdown_present == 1)
+        pce->mono_mixdown_element_number = faad_getbits(ld, 4);
+
+    pce->stereo_mixdown_present = faad_get1bit(ld);
+    if (pce->stereo_mixdown_present == 1)
+        pce->stereo_mixdown_element_number = faad_getbits(ld, 4);
+
+    pce->matrix_mixdown_idx_present = faad_get1bit(ld);
+    if (pce->matrix_mixdown_idx_present == 1)
+    {
+        pce->matrix_mixdown_idx = faad_getbits(ld, 2);
+        pce->pseudo_surround_enable = faad_get1bit(ld);
+    }
+
+    for (i = 0; i < pce->num_front_channel_elements; i++)
+    {
+        if ((pce->front_element_is_cpe[i] = faad_get1bit(ld)) & 1)
+            pce->channels += 2;
+        else
+            pce->channels++;
+        pce->front_element_tag_select[i] = faad_getbits(ld, 4);
+    }
+
+    for (i = 0; i < pce->num_side_channel_elements; i++)
+    {
+        if ((pce->side_element_is_cpe[i] = faad_get1bit(ld)) & 1)
+            pce->channels += 2;
+        else
+            pce->channels++;
+        pce->side_element_tag_select[i] = faad_getbits(ld, 4);
+    }
+
+    for (i = 0; i < pce->num_back_channel_elements; i++)
+    {
+        if ((pce->back_element_is_cpe[i] = faad_get1bit(ld)) & 1)
+            pce->channels += 2;
+        else
+            pce->channels++;
+        pce->back_element_tag_select[i] = faad_getbits(ld, 4);
+    }
+
+    for (i = 0; i < pce->num_lfe_channel_elements; i++)
+    {
+        pce->channels++;
+        pce->lfe_element_tag_select[i] = faad_getbits(ld, 4);
+    }
+
+    for (i = 0; i < pce->num_assoc_data_elements; i++)
+        pce->assoc_data_element_tag_select[i] = faad_getbits(ld, 4);
+
+    for (i = 0; i < pce->num_valid_cc_elements; i++)
+    {
+        /* have to count these as channels too?? */
+        pce->cc_element_is_ind_sw[i] = faad_get1bit(ld);
+        pce->valid_cc_element_tag_select[i] = faad_getbits(ld, 4);
+    }
+
+    faad_byte_align(ld);
+
+    pce->comment_field_bytes = faad_getbits(ld, 8);
+    i = 0;
+    for (i = 0; i < pce->comment_field_bytes; i++)
+        pce->comment_field_data[i] = faad_getbits(ld, 8);
+    pce->comment_field_data[i] = 0;
+
+    return 0;
+}
+
+/* Table 4.4.4 and */
+/* Table 4.4.9 */
+int single_lfe_channel_element(element *sce, bitfile *ld, short *spec_data,
+                               int sf_index, int object_type)
+{
+    ic_stream *ics = &sce->ics1;
+
+    sce->element_instance_tag = faad_getbits(ld, LEN_TAG);
+
+    return individual_channel_stream(sce, ld, ics, 0, spec_data, sf_index,
+        object_type);
+}
+
+/* Table 4.4.5 */
+int channel_pair_element(element *cpe, bitfile *ld, short *spec_data1,
+                         short *spec_data2, int sf_index, int object_type)
+{
+    int result;
+
+    ic_stream *ics1 = &cpe->ics1;
+    ic_stream *ics2 = &cpe->ics2;
+
+    cpe->element_instance_tag = faad_getbits(ld, LEN_TAG);
+
+    if ((cpe->common_window = faad_get1bit(ld)) & 1)
+    {
+        /* both channels have common ics information */
+        if ((result = ics_info(ics1, ld, cpe->common_window, sf_index,
+            object_type)) > 0)
+            return result;
+
+        ics1->ms_mask_present = faad_getbits(ld, 2);
+        if (ics1->ms_mask_present == 1)
+        {
+            int g, sfb;
+            for (g = 0; g < ics1->num_window_groups; g++)
+            {
+                for (sfb = 0; sfb < ics1->max_sfb; sfb++)
+                {
+                    ics1->ms_used[g][sfb] = faad_get1bit(ld);
+                }
+            }
+        }
+
+        memcpy(ics2, ics1, sizeof(ic_stream));
+    } else {
+        ics1->ms_mask_present = 0;
+    }
+
+    if ((result = individual_channel_stream(cpe, ld, ics1, 0, spec_data1,
+        sf_index, object_type)) > 0)
+        return result;
+    if ((result = individual_channel_stream(cpe, ld, ics2, 0, spec_data2,
+        sf_index, object_type)) > 0)
+        return result;
+
+    return 0;
+}
+
+/* Table 4.4.6 */
+static int ics_info(ic_stream *ics, bitfile *ld, int common_window,
+                    int sf_index, int object_type)
+{
+    /* ics->ics_reserved_bit = */ faad_get1bit(ld);
+    ics->window_sequence = faad_getbits(ld, 2);
+    ics->window_shape = faad_get1bit(ld);
+
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+    {
+        ics->max_sfb = faad_getbits(ld, 4);
+        ics->scale_factor_grouping = faad_getbits(ld, 7);
+    } else {
+        ics->max_sfb = faad_getbits(ld, 6);
+
+        if (object_type == LTP)
+        {
+            if ((ics->predictor_data_present = faad_get1bit(ld)) & 1)
+            {
+                if ((ics->ltp.data_present = faad_get1bit(ld)) & 1)
+                    ltp_data(ics, &ics->ltp, ld);
+                if (common_window)
+                    if ((ics->ltp2.data_present = faad_get1bit(ld)) & 1)
+                        ltp_data(ics, &ics->ltp2, ld);
+            }
+        } else { /* MPEG2 style AAC predictor */
+            if ((ics->predictor_data_present = faad_get1bit(ld)) & 1)
+            {
+                int sfb;
+                ics->pred.limit = min(ics->max_sfb, pred_sfb_max[sf_index]);
+
+                if ((ics->pred.predictor_reset = faad_get1bit(ld)) & 1)
+                    ics->pred.predictor_reset_group_number = faad_getbits(ld, 5);
+
+                for (sfb = 0; sfb < ics->pred.limit; sfb++)
+                    ics->pred.prediction_used[sfb] = faad_get1bit(ld);
+            }
+        }
+    }
+
+    /* get the grouping information */
+    return window_grouping_info(ics, sf_index);
+}
+
+/* Table 4.4.7 */
+static void pulse_data(pulse_info *pul, bitfile *ld)
+{
+    int i;
+
+    pul->number_pulse = faad_getbits(ld, 2);
+    pul->pulse_start_sfb = faad_getbits(ld, 6);
+
+    for (i = 0; i < pul->number_pulse+1; i++) {
+        pul->pulse_offset[i] = faad_getbits(ld, 5);
+        pul->pulse_amp[i] = faad_getbits(ld, 4);
+    }
+}
+
+/* Table 4.4.10 */
+int data_stream_element(bitfile *ld)
+{
+    int i, byte_aligned, count;
+    char data_stream_byte;
+
+    /* element_instance_tag = */ faad_getbits(ld, LEN_TAG);
+    byte_aligned = faad_get1bit(ld);
+    count = faad_getbits(ld, 8);
+    if (count == 255)
+        count += faad_getbits(ld, 8);
+    if (byte_aligned)
+        faad_byte_align(ld);
+
+    for (i = 0; i < count; i++)
+        data_stream_byte = faad_getbits(ld, LEN_BYTE);
+
+    return count;
+}
+
+/* Table 4.4.11 */
+int fill_element(bitfile *ld, drc_info *drc)
+{
+    int count;
+
+    count = faad_getbits(ld, 4);
+    if (count == 15)
+        count += faad_getbits(ld, 8) - 1;
+
+    while (count > 0)
+    {
+        count -= extension_payload(ld, drc, count);
+    }
+
+    return 0;
+}
+
+/* Table 4.4.24 */
+static int individual_channel_stream(element *ele, bitfile *ld,
+                                     ic_stream *ics, int scal_flag,
+                                     short *spec_data, int sf_index,
+                                     int object_type)
+{
+    int result;
+
+    ics->global_gain = faad_getbits(ld, 8);
+
+    if (!ele->common_window && !scal_flag)
+    {
+        if ((result = ics_info(ics, ld, ele->common_window, sf_index,
+            object_type)) > 0)
+            return result;
+    }
+    section_data(ics, ld);
+    if ((result = scale_factor_data(ics, ld)) > 0)
+        return result;
+
+    if (!scal_flag)
+    {
+        /* get pulse data */
+        if ((ics->pulse_data_present = faad_get1bit(ld)) & 1)
+            pulse_data(&ics->pul, ld);
+
+        /* get tns data */
+        if ((ics->tns_data_present = faad_get1bit(ld)) & 1)
+            tns_data(ics, &ics->tns, ld);
+
+        /* get gain control data */
+        if ((ics->gain_control_data_present = faad_get1bit(ld)) & 1)
+            return 1;
+    }
+
+    /* decode the spectral data */
+    if ((result = spectral_data(ics, ld, spec_data)) > 0)
+        return result;
+
+    /* pulse coding reconstruction */
+    if (ics->pulse_data_present)
+    {
+        if (ics->window_sequence != EIGHT_SHORT_SEQUENCE)
+            pulse_decode(ics, spec_data);
+        else
+            return 2; /* pulse coding not allowed for long blocks */
+    }
+
+    return 0;
+}
+
+/* Table 4.4.25 */
+static void section_data(ic_stream *ics, bitfile *ld)
+{
+    int g;
+    int sect_esc_val, sect_bits;
+
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+        sect_bits = 3;
+    else
+        sect_bits = 5;
+    sect_esc_val = (1<<sect_bits) - 1;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        int k = 0;
+        int i = 0;
+
+        while (k < ics->max_sfb)
+        {
+            int sfb;
+            int sect_len_incr;
+            int sect_len = 0;
+
+            ics->sect_cb[g][i] = faad_getbits(ld, 4);
+
+            while ((sect_len_incr = faad_getbits(ld, sect_bits)) == sect_esc_val)
+                sect_len += sect_esc_val;
+            sect_len += sect_len_incr;
+
+            ics->sect_start[g][i] = k;
+            ics->sect_end[g][i] = k + sect_len;
+
+            for (sfb = k; sfb < k + sect_len; sfb++)
+                ics->sfb_cb[g][sfb] = ics->sect_cb[g][i];
+
+            k += sect_len;
+            i++;
+        }
+        ics->num_sec[g] = i;
+    }
+}
+
+/*
+  All scalefactors (and also the stereo positions and pns energies) are
+  transmitted using Huffman coded DPCM relative to the previous active
+  scalefactor (respectively previous stereo position or previous pns energy,
+  see subclause 4.6.2 and 4.6.3). The first active scalefactor is
+  differentially coded relative to the global gain.
+*/
+/* Table 4.4.26 */
+static int scale_factor_data(ic_stream *ics, bitfile *ld)
+{
+    int g, sfb, t;
+    int noise_pcm_flag = 1;
+    int scale_factor = ics->global_gain;
+    int is_position = 0;
+    int noise_energy = ics->global_gain - 90;
+
+    for (g = 0; g < ics->num_window_groups; g++)
+    {
+        for (sfb = 0; sfb < ics->max_sfb; sfb++)
+        {
+            switch (ics->sfb_cb[g][sfb])
+            {
+            case ZERO_HCB: /* zero book */
+                ics->scale_factors[g][sfb] = 0;
+                break;
+            case INTENSITY_HCB: /* intensity books */
+            case INTENSITY_HCB2:
+
+                /* decode intensity position */
+                t = huffman_scale_factor(ld) - 60;
+                is_position += t;
+                ics->scale_factors[g][sfb] = is_position;
+
+                break;
+            case NOISE_HCB: /* noise books */
+
+                /* decode noise energy */
+                if (noise_pcm_flag) {
+                    noise_pcm_flag = 0;
+                    t = faad_getbits(ld, 9) - 256;
+                } else
+                    t = huffman_scale_factor(ld) - 60;
+                noise_energy += t;
+                ics->scale_factors[g][sfb] = noise_energy;
+
+                break;
+            case BOOKSCL: /* invalid books */
+                return 3;
+            default: /* spectral books */
+
+                /* decode scale factor */
+                t = huffman_scale_factor(ld) - 60;
+                scale_factor += t;
+                if (scale_factor < 0)
+                    return 4;
+                ics->scale_factors[g][sfb] = scale_factor;
+
+                break;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/* Table 4.4.27 */
+static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld)
+{
+    int w, filt, i, coef_bits;
+    int n_filt_bits = 2;
+    int length_bits = 6;
+    int order_bits = 5;
+
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+    {
+        n_filt_bits = 1;
+        length_bits = 4;
+        order_bits = 3;
+    }
+
+    for (w = 0; w < ics->num_windows; w++)
+    {
+        tns->n_filt[w] = faad_getbits(ld, n_filt_bits);
+
+        if (tns->n_filt[w])
+        {
+            if ((tns->coef_res[w] = faad_get1bit(ld)) & 1)
+                coef_bits = 4;
+            else
+                coef_bits = 3;
+        }
+
+        for (filt = 0; filt < tns->n_filt[w]; filt++)
+        {
+            tns->length[w][filt] = faad_getbits(ld, length_bits);
+            tns->order[w][filt]  = faad_getbits(ld, order_bits);
+            if (tns->order[w][filt])
+            {
+                tns->direction[w][filt] = faad_get1bit(ld);
+                tns->coef_compress[w][filt] = faad_get1bit(ld);
+
+                coef_bits -= tns->coef_compress[w][filt];
+                for (i = 0; i < tns->order[w][filt]; i++)
+                {
+                    tns->coef[w][filt][i] = faad_getbits(ld, coef_bits);
+                }
+            }
+        }
+    }
+}
+
+/* Table 4.4.28 */
+/*
+   The limit MAX_LTP_SFB is not defined in 14496-3, this is a bug in the document
+   and will be corrected in one of the corrigenda.
+*/
+static void ltp_data(ic_stream *ics, ltp_info *ltp, bitfile *ld)
+{
+    int sfb, w;
+
+    ltp->lag = faad_getbits(ld, 11);
+    ltp->coef = faad_getbits(ld, 3);
+
+    if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
+    {
+        for (w = 0; w < ics->num_windows; w++)
+        {
+            if ((ltp->short_used[w] = faad_get1bit(ld)) & 1)
+            {
+                ltp->short_lag_present[w] = faad_get1bit(ld);
+                if (ltp->short_lag_present[w])
+                    ltp->short_lag[w] = faad_getbits(ld, 4);
+			}
+        }
+    } else {
+        ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB);
+
+        for (sfb = 0; sfb < ltp->last_band; sfb++)
+            ltp->long_used[sfb] = faad_get1bit(ld);
+    }
+}
+
+/* defines whether a huffman codebook is unsigned or not */
+/* Table 4.6.2 */
+static int unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 };
+
+/* Table 4.4.29 */
+static int spectral_data(ic_stream *ics, bitfile *ld, short *spectral_data)
+{
+    int g, i, k, inc;
+    short *sp;
+    int p = 0;
+    int groups = 0;
+
+    sp = spectral_data;
+    for (i = 1024/16-1; i >= 0; --i)
+    {
+        *sp++ = 0; *sp++ = 0; *sp++ = 0; *sp++ = 0;
+        *sp++ = 0; *sp++ = 0; *sp++ = 0; *sp++ = 0;
+        *sp++ = 0; *sp++ = 0; *sp++ = 0; *sp++ = 0;
+        *sp++ = 0; *sp++ = 0; *sp++ = 0; *sp++ = 0;
+    }
+
+    for(g = 0; g < ics->num_window_groups; g++)
+    {
+        p = groups*128;
+
+        for (i = 0; i < ics->num_sec[g]; i++)
+        {
+            switch (ics->sect_cb[g][i])
+            {
+            case ZERO_HCB:
+            case NOISE_HCB:
+            case INTENSITY_HCB:
+            case INTENSITY_HCB2:
+                p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] -
+                    ics->sect_sfb_offset[g][ics->sect_start[g][i]]);
+                break;
+            default:
+                for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]];
+                     k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; )
+                {
+                    sp = spectral_data + p;
+
+                    inc = (ics->sect_cb[g][i] < FIRST_PAIR_HCB)?QUAD_LEN:PAIR_LEN;
+
+                    huffman_spectral_data(ics->sect_cb[g][i], ld, sp);
+                    if (unsigned_cb[ics->sect_cb[g][i]])
+                        huffman_sign_bits(ld, sp, inc);
+                    k += inc;
+                    p += inc;
+                    if (ics->sect_cb[g][i] == ESC_HCB)
+                    {
+                        sp[0] = huffman_getescape(ld, sp[0]);
+                        sp[1] = huffman_getescape(ld, sp[1]);
+                    }
+                }
+                break;
+            }
+        }
+        groups += ics->window_group_length[g];
+    }
+
+    return 0;
+}
+
+/* Table 4.4.30 */
+static int extension_payload(bitfile *ld, drc_info *drc, int count)
+{
+    int i, n;
+    int extension_type = faad_getbits(ld, 4);
+
+    switch (extension_type)
+    {
+    case EXT_DYNAMIC_RANGE:
+        drc->present = 1;
+        n = dynamic_range_info(ld, drc);
+        return n;
+    case EXT_FILL_DATA:
+        /* fill_nibble = */ faad_getbits(ld, 4); /* must be �0000� */
+        for (i = 0; i < count-1; i++)
+            /* fill_byte[i] = */ faad_getbits(ld, 8); /* must be �10100101� */
+        return count;
+    default:
+        for (i = 0; i < 8*(count-1)+4; i++)
+            /* other_bits[i] = */ faad_get1bit(ld);
+        return count;
+    }
+}
+
+/* Table 4.4.31 */
+static int dynamic_range_info(bitfile *ld, drc_info *drc)
+{
+    int i, n = 1;
+    int band_incr;
+
+    drc->num_bands = 1;
+
+    if (faad_get1bit(ld) & 1)
+    {
+        drc->pce_instance_tag = faad_getbits(ld, 4);
+        /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4);
+        n++;
+    }
+
+    drc->excluded_chns_present = faad_get1bit(ld);
+    if (drc->excluded_chns_present == 1)
+    {
+        n += excluded_channels(ld, drc);
+    }
+
+    if (faad_get1bit(ld) & 1)
+    {
+        band_incr = faad_getbits(ld, 4);
+        /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4);
+        n++;
+        drc->num_bands += band_incr;
+
+        for (i = 0; i < drc->num_bands; i++);
+        {
+            drc->band_top[i] = faad_getbits(ld, 8);
+            n++;
+        }
+    }
+
+    if (faad_get1bit(ld) & 1)
+    {
+        drc->prog_ref_level = faad_getbits(ld, 7);
+        /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld);
+        n++;
+    }
+
+    for (i = 0; i < drc->num_bands; i++)
+    {
+        drc->dyn_rng_sgn[i] = faad_get1bit(ld);
+        drc->dyn_rng_ctl[i] = faad_getbits(ld, 7);
+        n++;
+    }
+
+    return n;
+}
+
+/* Table 4.4.32 */
+static int excluded_channels(bitfile *ld, drc_info *drc)
+{
+    int i, n = 0;
+    int num_excl_chan = 7;
+
+    for (i = 0; i < 7; i++)
+        drc->exclude_mask[i] = faad_get1bit(ld);
+    n++;
+
+    while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld)) == 1)
+    {
+        for (i = num_excl_chan; i < num_excl_chan+7; i++)
+            drc->exclude_mask[i] = faad_get1bit(ld);
+        n++;
+        num_excl_chan += 7;
+    }
+
+    return n;
+}
+
+/* Annex A: Audio Interchange Formats */
+
+/* Table 1.A.2 */
+void get_adif_header(adif_header *adif, bitfile *ld)
+{
+    int i;
+
+    /* adif_id[0] = */ faad_getbits(ld, 8);
+    /* adif_id[1] = */ faad_getbits(ld, 8);
+    /* adif_id[2] = */ faad_getbits(ld, 8);
+    /* adif_id[3] = */ faad_getbits(ld, 8);
+    adif->copyright_id_present = faad_get1bit(ld);
+    if(adif->copyright_id_present)
+    {
+        for (i = 0; i < 72/8; i++)
+            adif->copyright_id[i] = faad_getbits(ld, 8);
+        adif->copyright_id[i] = 0;
+    }
+    adif->original_copy  = faad_get1bit(ld);
+    adif->home = faad_get1bit(ld);
+    adif->bitstream_type = faad_get1bit(ld);
+    adif->bitrate = faad_getbits(ld, 23);
+    adif->num_program_config_elements = faad_getbits(ld, 4);
+
+    for (i = 0; i < adif->num_program_config_elements + 1; i++)
+    {
+        if(adif->bitstream_type == 0)
+            adif->adif_buffer_fullness = faad_getbits(ld, 20);
+        else
+            adif->adif_buffer_fullness = 0;
+
+        program_config_element(&adif->pce, ld);
+    }
+}
+
+/* Table 1.A.5 */
+int adts_frame(adts_header *adts, bitfile *ld)
+{
+    /* faad_byte_align(ld); */
+    if (adts_fixed_header(adts, ld))
+        return 5;
+    adts_variable_header(adts, ld);
+    adts_error_check(adts, ld);
+
+    return 0;
+}
+
+/* Table 1.A.6 */
+static int adts_fixed_header(adts_header *adts, bitfile *ld)
+{
+    adts->syncword = faad_getbits(ld, 12);
+    if (adts->syncword != 0xFFF)
+        return 5;
+    adts->id = faad_get1bit(ld);
+    adts->layer = faad_getbits(ld, 2);
+    adts->protection_absent = faad_get1bit(ld);
+    adts->profile = faad_getbits(ld, 2);
+    adts->sf_index = faad_getbits(ld, 4);
+    adts->private_bit = faad_get1bit(ld);
+    adts->channel_configuration = faad_getbits(ld, 3);
+    adts->original = faad_get1bit(ld);
+    adts->home = faad_get1bit(ld);
+    if (adts->id == 0)
+        adts->emphasis = faad_getbits(ld, 2);
+
+    return 0;
+}
+
+/* Table 1.A.7 */
+static void adts_variable_header(adts_header *adts, bitfile *ld)
+{
+    adts->copyright_identification_bit = faad_get1bit(ld);
+    adts->copyright_identification_start = faad_get1bit(ld);
+    adts->aac_frame_length = faad_getbits(ld, 13);
+    adts->adts_buffer_fullness = faad_getbits(ld, 11);
+    adts->no_raw_data_blocks_in_frame = faad_getbits(ld, 2);
+}
+
+/* Table 1.A.8 */
+static void adts_error_check(adts_header *adts, bitfile *ld)
+{
+    if (adts->protection_absent == 0)
+        adts->crc_check = faad_getbits(ld, 16);
+}
--- /dev/null
+++ b/libfaad/syntax.h
@@ -1,0 +1,283 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: syntax.h,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+#ifndef __SYNTAX_H__
+#define __SYNTAX_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "bits.h"
+
+#define MAIN 0
+#define LC   1
+#define SSR  2
+#define LTP  3
+
+
+/* Bitstream */
+#define LEN_SE_ID 3
+#define LEN_TAG   4
+#define LEN_BYTE  8
+
+#define EXT_FILL_DATA     1
+#define EXT_DYNAMIC_RANGE 11
+
+/* Syntax elements */
+#define ID_SCE 0x0
+#define ID_CPE 0x1
+#define ID_CCE 0x2
+#define ID_LFE 0x3
+#define ID_DSE 0x4
+#define ID_PCE 0x5
+#define ID_FIL 0x6
+#define ID_END 0x7
+
+#define MAX_CHANNELS        64
+#define MAX_SYNTAX_ELEMENTS 48
+#define MAX_WINDOW_GROUPS    8
+#define MAX_SFB             51
+#define MAX_LTP_SFB         40
+#define MAX_LTP_SFB_S        8
+
+
+#define ONLY_LONG_SEQUENCE   0x0
+#define LONG_START_SEQUENCE  0x1
+#define EIGHT_SHORT_SEQUENCE 0x2
+#define LONG_STOP_SEQUENCE   0x3
+
+
+typedef struct
+{
+    int element_instance_tag;
+    int object_type;
+    int sf_index;
+    int num_front_channel_elements;
+    int num_side_channel_elements;
+    int num_back_channel_elements;
+    int num_lfe_channel_elements;
+    int num_assoc_data_elements;
+    int num_valid_cc_elements;
+    int mono_mixdown_present;
+    int mono_mixdown_element_number;
+    int stereo_mixdown_present;
+    int stereo_mixdown_element_number;
+    int matrix_mixdown_idx_present;
+    int pseudo_surround_enable;
+    int matrix_mixdown_idx;
+    int front_element_is_cpe[16];
+    int front_element_tag_select[16];
+    int side_element_is_cpe[16];
+    int side_element_tag_select[16];
+    int back_element_is_cpe[16];
+    int back_element_tag_select[16];
+    int lfe_element_tag_select[16];
+    int assoc_data_element_tag_select[16];
+    int cc_element_is_ind_sw[16];
+    int valid_cc_element_tag_select[16];
+
+    int channels;
+
+    int comment_field_bytes;
+    unsigned char comment_field_data[257];
+} program_config;
+
+typedef struct
+{
+    int syncword;
+    int id;
+    int layer;
+    int protection_absent;
+    int profile;
+    int sf_index;
+    int private_bit;
+    int channel_configuration;
+    int original;
+    int home;
+    int emphasis;
+    int copyright_identification_bit;
+    int copyright_identification_start;
+    int aac_frame_length;
+    int adts_buffer_fullness;
+    int no_raw_data_blocks_in_frame;
+    int crc_check;
+} adts_header;
+
+typedef struct
+{
+    int copyright_id_present;
+    char copyright_id[10];
+    int original_copy;
+    int home;
+    int bitstream_type;
+    int bitrate;
+    int num_program_config_elements;
+    int adif_buffer_fullness;
+
+    program_config pce;
+} adif_header;
+
+typedef struct
+{
+    int last_band;
+    int data_present;
+    int lag;
+    int coef;
+    int short_used[8];
+    int short_lag_present[8];
+    int short_lag[8];
+    int long_used[51];
+} ltp_info;
+
+typedef struct
+{
+    int limit;
+    int predictor_reset;
+    int predictor_reset_group_number;
+    int prediction_used[41];
+} pred_info;
+
+typedef struct
+{
+    int number_pulse;
+    int pulse_start_sfb;
+    int pulse_offset[4];
+    int pulse_amp[4];
+} pulse_info;
+
+typedef struct
+{
+    int n_filt[8];
+    int coef_res[8];
+    int length[8][4];
+    int order[8][4];
+    int direction[8][4];
+    int coef_compress[8][4];
+    int coef[8][4][32];
+} tns_info;
+
+typedef struct
+{
+    float ctrl1;
+    float ctrl2;
+
+    int present;
+
+    int num_bands;
+    int pce_instance_tag;
+    int excluded_chns_present;
+    int band_top[17];
+    int prog_ref_level;
+    int dyn_rng_sgn[17];
+    int dyn_rng_ctl[17];
+    int exclude_mask[MAX_CHANNELS];
+    int additional_excluded_chns[MAX_CHANNELS];
+} drc_info;
+
+typedef struct
+{
+    int max_sfb;
+
+    int num_swb;
+    int num_window_groups;
+    int num_windows;
+    int window_sequence;
+    int window_group_length[8];
+    int window_shape;
+    int scale_factor_grouping;
+    int sect_sfb_offset[8][15*8];
+    int swb_offset[51];
+
+    int sect_cb[8][15*8];
+    int sect_start[8][15*8];
+    int sect_end[8][15*8];
+    int sfb_cb[8][8*15];
+    int num_sec[8]; /* number of sections in a group */
+
+    int global_gain;
+
+    int ms_mask_present;
+    int ms_used[MAX_WINDOW_GROUPS][MAX_SFB];
+
+    int pulse_data_present;
+    int tns_data_present;
+    int gain_control_data_present;
+    int predictor_data_present;
+    int scale_factors[8][51];
+
+    pulse_info pul;
+    tns_info tns;
+    pred_info pred;
+    ltp_info ltp;
+    ltp_info ltp2;
+} ic_stream; /* individual channel stream */
+
+typedef struct
+{
+    int ele_id;
+
+    int channel;
+    int paired_channel;
+
+    int element_instance_tag;
+    int common_window;
+
+    ic_stream ics1;
+    ic_stream ics2;
+} element; /* syntax element (SCE, CPE, LFE) */
+
+int single_lfe_channel_element(element *sce, bitfile *ld, short *spec_data,
+                               int sf_index, int object_type);
+int channel_pair_element(element *cpe, bitfile *ld, short *spec_data1,
+                         short *spec_data2, int sf_index, int object_type);
+int data_stream_element(bitfile *ld);
+int program_config_element(program_config *pce, bitfile *ld);
+int fill_element(bitfile *ld, drc_info *drc);
+int adts_frame(adts_header *adts, bitfile *ld);
+void get_adif_header(adif_header *adif, bitfile *ld);
+
+
+/* static functions */
+static int individual_channel_stream(element *ele, bitfile *ld,
+                                     ic_stream *ics, int scal_flag,
+                                     short *spec_data, int sf_index,
+                                     int object_type);
+static int ics_info(ic_stream *ics, bitfile *ld,
+                    int common_window, int fs_index, int object_type);
+static void section_data(ic_stream *ics, bitfile *ld);
+static int scale_factor_data(ic_stream *ics, bitfile *ld);
+static int spectral_data(ic_stream *ics, bitfile *ld, short *spectral_data);
+static int extension_payload(bitfile *ld, drc_info *drc, int count);
+static void pulse_data(pulse_info *pul, bitfile *ld);
+static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld);
+static void ltp_data(ic_stream *ics, ltp_info *ltp, bitfile *ld);
+static int adts_fixed_header(adts_header *adts, bitfile *ld);
+static void adts_variable_header(adts_header *adts, bitfile *ld);
+static void adts_error_check(adts_header *adts, bitfile *ld);
+static int dynamic_range_info(bitfile *ld, drc_info *drc);
+static int excluded_channels(bitfile *ld, drc_info *drc);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--- /dev/null
+++ b/libfaad/tns.c
@@ -1,0 +1,301 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: tns.c,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+#ifdef __ICL
+#include <mathf.h>
+#else
+#include <math.h>
+#endif
+#include "syntax.h"
+#include "tns.h"
+
+
+/* TNS decoding for one channel and frame */
+void tns_decode_frame(ic_stream *ics, tns_info *tns, int sr_index,
+                      int object_type, float *spec)
+{
+    int w, bottom, f, top, start, end, size, inc;
+    int tns_order;
+    float lpc[TNS_MAX_ORDER+1];
+
+    if (!ics->tns_data_present)
+        return;
+
+    for (w = 0; w < ics->num_windows; w++)
+    {
+        bottom = ics->num_swb;
+
+        for (f = 0; f < tns->n_filt[w]; f++)
+        {
+            top = bottom;
+            bottom = max(top - tns->length[w][f], 0);
+            tns_order = min(tns->order[w][f], tns_max_order(ics, sr_index,
+                object_type));
+            if (!tns_order)
+                continue;
+
+            tns_decode_coef(tns_order, tns->coef_res[w]+3,
+                tns->coef_compress[w][f], tns->coef[w][f], lpc);
+
+            start = ics->swb_offset[min(bottom,
+                min(tns_max_bands(ics, sr_index), ics->max_sfb))];
+            end = ics->swb_offset[min(top,
+                min(tns_max_bands(ics, sr_index), ics->max_sfb))];
+
+            if ((size = end - start) <= 0)
+                continue;
+
+            if (tns->direction[w][f])
+            {
+                inc = -1;
+                start = end - 1;
+            } else
+                inc = 1;
+
+            tns_ar_filter(&spec[(w*128)+start], size, inc, lpc, tns_order);
+        }
+    }
+}
+
+/* TNS encoding for one channel and frame */
+void tns_encode_frame(ic_stream *ics, tns_info *tns, int sr_index,
+                      int object_type, float *spec)
+{
+    int w, bottom, f, top, start, end, size, inc;
+    int tns_order;
+    float lpc[TNS_MAX_ORDER+1];
+
+    if (!ics->tns_data_present)
+        return;
+
+    for (w = 0; w < ics->num_windows; w++)
+    {
+        bottom = ics->num_swb;
+
+        for (f = 0; f < tns->n_filt[w]; f++)
+        {
+            top = bottom;
+            bottom = max(top - tns->length[w][f], 0);
+            tns_order = min(tns->order[w][f], tns_max_order(ics, sr_index,
+                object_type));
+            if (!tns_order)
+                continue;
+
+            tns_decode_coef(tns_order, tns->coef_res[w]+3,
+                tns->coef_compress[w][f], tns->coef[w][f], lpc);
+
+            start = ics->swb_offset[min(bottom,
+                min(tns_max_bands(ics, sr_index), ics->max_sfb))];
+            end = ics->swb_offset[min(top,
+                min(tns_max_bands(ics, sr_index), ics->max_sfb))];
+
+            if ((size = end - start) <= 0)
+                continue;
+
+            if (tns->direction[w][f])
+            {
+                inc = -1;
+                start = end - 1;
+            } else
+                inc = 1;
+
+            tns_ma_filter(&spec[(w*128)+start], size, inc, lpc, tns_order);
+        }
+    }
+}
+
+/* Decoder transmitted coefficients for one TNS filter */
+static void tns_decode_coef(int order, int coef_res_bits, int coef_compress,
+                            int *coef, float *a)
+{
+    int i, m;
+    int coef_res2, s_mask, n_mask;
+    int tmp[TNS_MAX_ORDER+1];
+    float tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1];
+    float iqfac, iqfac_m;
+
+    /* Some internal tables */
+    int sgn_mask[] = { 0x2, 0x4, 0x8 };
+    int neg_mask[] = { ~0x3, ~0x7, ~0xf };
+
+    /* size used for transmission */
+    coef_res2 = coef_res_bits - coef_compress;
+    s_mask = sgn_mask[coef_res2 - 2]; /* mask for sign bit */
+    n_mask = neg_mask[coef_res2 - 2]; /* mask for padding neg. values */
+
+    /* Conversion to signed integer */
+    for (i = 0; i < order; i++)
+        tmp[i] = (coef[i] & s_mask) ? (coef[i] | n_mask) : coef[i];
+
+    /* Inverse quantization */
+    iqfac = ((1 << (coef_res_bits-1)) - 0.5f) / (M_PI/2.0f);
+    iqfac_m = ((1 << (coef_res_bits-1)) + 0.5f) / (M_PI/2.0f);
+
+    for (i = 0; i < order; i++)
+#ifdef __ICL
+        tmp2[i] = sinf(tmp[i] / ((tmp[i] >= 0) ? iqfac : iqfac_m));
+#else
+        tmp2[i] = (float)sin(tmp[i] / ((tmp[i] >= 0) ? iqfac : iqfac_m));
+#endif
+
+    /* Conversion to LPC coefficients */
+    a[0] = 1;
+    for (m = 1; m <= order; m++)
+    {
+        for (i = 1; i < m; i++) /* loop only while i<m */
+            b[i] = a[i] + tmp2[m-1] * a[m-i];
+
+        for (i = 1; i < m; i++) /* loop only while i<m */
+            a[i] = b[i];
+
+        a[m] = tmp2[m-1]; /* changed */
+    }
+}
+
+static void tns_ar_filter(float *spectrum, int size, int inc, float *lpc,
+                          int order)
+{
+    /*
+     - Simple all-pole filter of order "order" defined by
+       y(n) = x(n) - lpc[1]*y(n-1) - ... - lpc[order]*y(n-order)
+     - The state variables of the filter are initialized to zero every time
+     - The output data is written over the input data ("in-place operation")
+     - An input vector of "size" samples is processed and the index increment
+       to the next data sample is given by "inc"
+    */
+
+    int i, j;
+    float y, state[TNS_MAX_ORDER];
+
+    for (i = 0; i < order; i++)
+        state[i] = 0;
+
+    for (i = 0; i < size; i++)
+    {
+        y = *spectrum;
+
+        for (j = 0; j < order; j++)
+            y -= lpc[j+1] * state[j];
+
+        for (j = order-1; j > 0; j--)
+            state[j] = state[j-1];
+
+        state[0] = y;
+        *spectrum = y;
+        spectrum += inc;
+    }
+}
+
+static void tns_ma_filter(float *spectrum, int size, int inc, float *lpc,
+                          int order)
+{
+    /*
+     - Simple all-zero filter of order "order" defined by
+       y(n) =  x(n) + a(2)*x(n-1) + ... + a(order+1)*x(n-order)
+     - The state variables of the filter are initialized to zero every time
+     - The output data is written over the input data ("in-place operation")
+     - An input vector of "size" samples is processed and the index increment
+       to the next data sample is given by "inc"
+    */
+
+    int i, j;
+    float y, state[TNS_MAX_ORDER];
+
+    for (i = 0; i < order; i++)
+        state[i] = 0;
+
+    for (i = 0; i < size; i++)
+    {
+        y = *spectrum;
+
+        for (j = 0; j < order; j++)
+            y += lpc[j+1] * state[j];
+
+        for (j = order-1; j > 0; j--)
+            state[j] = state[j-1];
+
+        state[0] = *spectrum;
+        *spectrum = y;
+        spectrum += inc;
+    }
+}
+
+static int tns_max_bands_table[12][4] =
+{
+    /* entry for each sampling rate
+     * 1    Main/LC long window
+     * 2    Main/LC short window
+     * 3    SSR long window
+     * 4    SSR short window
+     */
+    { 31,  9, 28, 7 },       /* 96000 */
+    { 31,  9, 28, 7 },       /* 88200 */
+    { 34, 10, 27, 7 },       /* 64000 */
+    { 40, 14, 26, 6 },       /* 48000 */
+    { 42, 14, 26, 6 },       /* 44100 */
+    { 51, 14, 26, 6 },       /* 32000 */
+    { 46, 14, 29, 7 },       /* 24000 */
+    { 46, 14, 29, 7 },       /* 22050 */
+    { 42, 14, 23, 8 },       /* 16000 */
+    { 42, 14, 23, 8 },       /* 12000 */
+    { 42, 14, 23, 8 },       /* 11025 */
+    { 39, 14, 19, 7 },       /* 8000  */
+};
+
+static int tns_max_bands(ic_stream *ics, int sr_index)
+{
+    int i;
+
+    i = (ics->window_sequence == EIGHT_SHORT_SEQUENCE) ? 1 : 0;
+
+    return tns_max_bands_table[sr_index][i];
+}
+
+static int tns_max_order(ic_stream *ics, int sr_index,
+                         int object_type)
+{
+    /* Correction in 14496-3 Cor. 1
+       Works like MPEG2-AAC (13818-7) now
+
+       For other object types (scalable) the following goes for tns max order
+       for long windows:
+       if (sr_index <= 5)
+           return 12;
+       else
+           return 20;
+    */
+    if (ics->window_sequence != EIGHT_SHORT_SEQUENCE)
+    {
+        switch (object_type)
+        {
+        case MAIN:
+        case LTP:
+            return 20;
+        case LC:
+        case SSR:
+            return 12;
+        }
+    } else {
+        return 7;
+    }
+
+    return 0;
+}
--- /dev/null
+++ b/libfaad/tns.h
@@ -1,0 +1,63 @@
+/*
+** FAAD - Freeware Advanced Audio Decoder
+** Copyright (C) 2002 M. Bakker
+**  
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+** 
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+** 
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software 
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** $Id: tns.h,v 1.1 2002/01/14 19:15:57 menno Exp $
+**/
+
+#ifndef __TNS_H__
+#define __TNS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef max
+#define max(a, b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef min
+#define min(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846f
+#endif
+
+
+#define TNS_MAX_ORDER 20
+
+    
+void tns_decode_frame(ic_stream *ics, tns_info *tns, int sr_index,
+                      int object_type, float *spec);
+void tns_encode_frame(ic_stream *ics, tns_info *tns, int sr_index,
+                      int object_type, float *spec);
+
+static void tns_decode_coef(int order, int coef_res_bits, int coef_compress,
+                            int *coef, float *a);
+static void tns_ar_filter(float *spectrum, int size, int inc, float *lpc,
+                          int order);
+static void tns_ma_filter(float *spectrum, int size, int inc, float *lpc,
+                          int order);
+static int tns_max_bands(ic_stream *ics, int sr_index);
+static int tns_max_order(ic_stream *ics, int sr_index,
+                         int object_type);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
--