/* FLAC - Free Lossless Audio Codec
 * Copyright (C) 2001  Josh Coalson
 *
 * This program is part of FLAC; 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.
 */


FLAC (http://flac.sourceforge.net/) is an Open Source lossless audio
codec developed by Josh Coalson.

FLAC is comprised of 1) `libFLAC', a library which implements
reference encoders and decoders, licensed under the GNU Lesser
General Public License (LGPL); 2) `flac', a command-line program for
encoding and decoding files, licensed under the GNU General public
License (GPL); 3) `metaflac', a command-line program for editing
FLAC metadata, licensed under the GPL; 4) player plugins for XMMS
and Winamp, licensed under the GPL; and 5) documentation, licensed
under the GNU Free Documentation License.

==========
FLAC - 1.0
==========

This is the source release for the FLAC project.  See

	doc/index.html

for full documentation.

A brief description of the directory tree:

	doc/       the HTML documentation
	include/   public include files for libFLAC
	src/       the source code and private headers
	test/      the test scripts


=============================
Building in a GNU environment
=============================

FLAC now uses autoconf and libtool for configuring and
building.  Better documentation for these will be
forthcoming, but in general, this should work:

./configure ; make ; make install

If it doesn't, see the next section on Makefile.lite.

There are a few FLAC-specific arguments you can give to
`configure':

--enable-debug : Builds everything with debug symbols and some
extra (and more verbose) error checking.

--disable-asm-optimizations : Disables the compilation of the
assembly routines.  Many routines have assembly versions for
speed and `configure' is pretty good about knowing what is
supported, but you can use this option to build only from the
C sources.

--sse-os : If you are building for an x86 CPU that supports
SSE instructions, you can enable some of the faster routines
if your operating system also supports SSE instructions.  flac
can tell if the CPU supports the instructions but currently has
no way to test if the OS does, so if it does, you must pass
this argument to configure to use the SSE routines.  If flac
crashes when built with this option you will have to go back and
configure without --sse-os.  Note that --disable-asm-optimizations
overrides --sse-os.


===========================
Building with Makefile.lite
===========================

There is a more lightweight build system for do-it-yourself-ers.
It is also useful if configure isn't working, which may be the
case since lately we've had some problems with different versions
of automake and libtool.  The Makefile.lite system should work
on Gnu systems with few or no minor adjustments.

From the top level just 'make -f Makefile.lite'.  You can
specify zero or one optional target from 'release', 'debug',
'test', or 'clean'.  The default is 'release'.  There is no
'install' target but everything you need will end up in the
obj/ directory.

If you are not on an x86 system or you don't have nasm, you
may have to change the DEFINES in src/libFLAC/Makefile.lite.  If
you don't have nasm, remove -DFLAC__HAS_NASM.  If your target is
not an x86, change -DFLAC__CPU_IA32 to -DFLAC__CPU_UNKNOWN.


==================
Building with MSVC
==================

There is no overall make system for MSVC but the individual
source directories with a 'Makefile.vc' file in them allow
building with MSVC.  Just 'nmake /f Makefile.vc'.  Currently
the Makefile.vc for libFLAC is hardcoded to use nasm.  If
you don't have nasm, or don't want any assembly optimizations,
edit the makefile, adding '/D FLAC__NO_ASM' and delete the
rules which compile the .s files.
