/* FLAC - Free Lossless Audio Codec
 * Copyright (C) 2001,2002,2003  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
  * `libFLAC', a library which implements reference encoders and
    decoders, and a metadata interface
  * `libFLAC++', a C++ object wrapper library around libFLAC
  * `libOggFLAC' and `libOggFLAC++', which provide encoders and
    decoders for FLAC streams in an Ogg container
  * `flac', a command-line program for encoding and decoding files
  * `metaflac', a command-line program for editing FLAC metadata
  * player plugins for XMMS and Winamp
  * user and API documentation

The libraries (libFLAC, libFLAC++, libOggFLAC, and libOggFLAC++) are
licensed under the GNU Lesser General Public License (LGPL).  All other
programs and plugins are licensed under the GNU General Public License
(GPL).  The documentation is licensed under the GNU Free Documentation
License (GFDL).


===============================================================================
FLAC - 1.0.5_beta2 - Contents
===============================================================================

- Introduction
- Building in a GNU environment
- Building with Makefile.lite
- Building with MSVC
- Building on Mac OS X
- Note to embedded developers


===============================================================================
Introduction
===============================================================================

@@@@ NOTE @@@@
This is a beta release.  The CUESHEET metadata block specification has not
been finalized.

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
	flac.pbproj/  the Mac OS X Project Builder project
	include/      public include files for libFLAC and libFLAC++
	man/          the man page for `flac'
	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 check && make install

The 'make check' step is optional; omit it to skip all the tests,
which can take several hours and use around 70-80 megs of disk space.

NOTE: Despite our best efforts it's entirely possible to have
problems when using older versions of autoconf, automake, or
libtool.  If you have the latest versions and 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.

--with-ogg=
--with-id3lib=
--with-xmms-prefix=
--with-libiconv-prefix=
Use these if you have these packages but configure can't find them.

If you want to build completely from scratch (i.e. starting with just
configure.in and Makefile.am) you should be able to just run 'autogen.sh'
but make sure and read the comments in that file first.


===============================================================================
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 are two ways to build with MSVC:

  1. Project Files
  ----------------
  Prerequisite: you must have the Ogg libraries installed as described
  later.

  Prerequisite: you must have nasm installed, and have the environment
  variable FLAC_NASM set to the full path to nasmw.exe, e.g

    C:\nasm\nasmw.exe

  To build everything, run Developer Studio, do File|Open Workspace,
  and open FLAC.dsw.  Switch to the 'Files' tab, select 'all files'
  from the tree, do right-mouse-button and 'Set as active project'.
  The default build mode will probably be Debug; to change to release
  do Build|Set Active Configuration and select 'all - Win32 Release'.
  Then do Project|Build.  This will build all libraries both statically
  (e.g. obj\debug\lib\libFLAC_static.lib) and as DLLs (e.g.
  obj\debug\bin\libFLAC.dll), and it will build all binaries, statically
  linked (e.g. obj\debug\bin\flac.exe).

  2. nmake
  --------
  Prerequisite: you must have the Ogg libraries installed as described
  later.

  Prerequisite: you must have nasm installed and nasmw.exe must be in
  your path.

  To build everything, open a Command window, cd to the top-level
  directory (where this README is) and do

    nmake /f Makefile.vc

  This will recur into all the source directories in the right order
  and build everything.  The libraries will be build only as static
  libs.  You need only to install the binaries.  To clean up everything
  you can do

    nmake /f Makefile.vc clean

  from the top level directory, or any directory which has a
  Makefile.vc

Everything will end up in the 'obj' directory.  DLLs and .exe files
are all that are needed and can be copied to an installation area and
added to the PATH.  The plugins have to be copied to their appropriate
place in the player area.  For Winamp2 this is <winamp2-dir>\Plugins
and for Winamp3 this is <winamp3-dir>\Wacs.

By default the code is configured with Ogg support.  Before building FLAC
you will need to get the Ogg source distribution
(see http://xiph.org/ogg/vorbis/download/), build ogg_static.lib (load and
build win32\ogg_static.dsp), copy ogg_static.lib into FLAC's
'obj\release\lib' directory, and copy the entire include\ogg tree into
FLAC's 'include' directory (so that there is an 'ogg' directory in FLAC's
'include' directory with the files ogg.h, os_types.h and config_types.h).


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


===============================================================================
Note to embedded developers
===============================================================================

libFLAC has grown larger over time as more functionality has been
included, but much of it may be unnecessary for a particular embedded
implementation.  Unused parts may be pruned by some simple editing of
configure.in and src/libFLAC/Makefile.am; the following dependency
graph shows which modules may be pruned without breaking things
further down:

file_encoder.h
	stream_encoder.h
		format.h

file_decoder.h
	seekable_stream_decoder.h
		stream_decoder.h
			format.h

metadata.h
	format.h

There is a section dedicated to embedded use in the libFLAC API
HTML documentation (see doc/html/api/index.html).
