/* FLAC - Free Lossless Audio Codec
 * Copyright (C) 2001,2002  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.2
============

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 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

NOTE: automake 1.5 has a bug which will affect the x86 assembly
part of the build.  If you have automake 1.5 and have x86
assembly optimizations turned on, you will need to get a newer
version of automake or patch your /usr/bin/automake using the
included 'automake-1.5.patch' file.

If you still can't get it to work, 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.

--enable-sse : 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 --enable-sse.  Note that
--disable-asm-optimizations implies --disable-sse.

--enable-3dnow : If you are building for an AMD CPU which has 3DNOW!
support, you can use this flag to enable some assembly routines
which use 3DNOW! instructions.  There have been some reports that
they may cause flac to crash, which is why it is not turned on
by default.  Note that --disable-asm-optimizations overrides
--enable-3dnow.


===========================
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 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.


====================
Building on Mac OS X
====================

If you have Fink, the Gnu flow above should work.  Otherwise,
there is a Project Builder project in the top-level source
directory to build libFLAC and the command-line utilities on
Mac OS X.  In a terminal, cd to the top-level directory (the
one that contains this README file) and type:

	pbxbuild -alltargets

This will create everything and leave it in the build/ directory.
Don't worry about the rest of the stuff that is in build/ or
the stuff that was already there before building.

There currently is no install procedure; you will have to
manually copy the tools to wherever you need them.
