Skip to content
Snippets Groups Projects
Jack Moffitt's avatar
Jack Moffitt authored
git-svn-id: http://svn.xiph.org/trunk/ao@627 0101bb08-14d6-0310-b084-bc0e0c8e3800
4cc89dea
History
libao - A Cross-platform Audio Library, Version 0.5.0

Originally Copyright (C) Aaron Holtzman - May 1999
Changes Copyright (C) Stan Seibert - July 2000

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

libao 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 GNU Make; see the file COPYING.  If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

---------------------------------------------------------------------

OVERVIEW

Libao is a cross-platform audio library that allows programs to output
audio using a simple API on a wide variety of platforms.  It currently
supports:
   * Open Sound System (Linux, *BSD)
   * ESounD
   * Advanced Linux Sound Architecture
   * Solaris (untested)
   * IRIX (untested)
   * WAV files

HISTORY

Libao began life as cross-platform audio library inside of ac3dec, an
AC3 decoder by Aaron Holtzman that is part of the LiViD project.  When
ogg123 (part of the command line vorbis tools) needed a way to play
audio on multiple operating systems, someone on the vorbis-dev mailing
list suggested the libao library as a possible way to add
cross-platform support to ogg123.  I (Stan Seibert) downloaded the
libao library, severely hacked it up in order to make the build
process simpler and support multiple live-playback devices.  (The
original code allowed one live playback driver, the wav driver, and a
null driver to be compiled into the library.)  The result is what you
see here.

This code is being maintained by Stan Seibert (indigo@aztec.asu.edu).
Please DO NOT annoy Aaron Holtzman about bugs, features, comments,
etc. regarding this code.

USAGE

Libao is currently a statically-linked library.  This means if you
want to use it, you have to rewrite your program to use the libao API
and link libao.a to your programs.

First, copy the libao directory into your source tree at an
appropriate location.  Libao uses GNU autoconf to discover
platform information and decide which output modules to compile into
the library.  If you are already using autoconf in your project, just
add the line

AC_CONFIG_SUBDIRS(libao)

(or whatever directory libao is located in) to your configure.in file
and re-run autoconf.  Now your configure script will call libao's
configure script.

If you do not use autoconf, you need to modify your installation
procedure (either manual or automatic) to run the configure script in
the libao directory.

Next you need to modify your Makefile so that either
   * make target (optimized code)
   * make profile (for profiling your code)
   * make debug (for running gdb on your code)
is run in the libao directory.  Additionally, need to add the line

include libao/ao_libs.in

to the top of your Makefile.  This defines the variable $(LIBAO_LIBS)
which sets the compiler flags to link to any extra libraries libao
needed.  Make sure you add $(LIBAO_LIBS) to the link command for your
program.

Finally, you need to modify your program to use the libao API.

CONFIGURE OPTIONS

The configure script used to build libao accepts several options to
control which drivers are included in the library.  The script will
compile all of the drivers supported by the system if given no
options.  Usually this is sufficient, however sometimes the defaults
need to be overridden (often the default output driver).

--enable-DRIVER
--disable-DRIVER

Replace DRIVER with oss, irix, solaris, esd, or alsa.  These options
specifically add or remove a driver from the final library.  Since all
of the driver which can be built are built by default, usually only
the --disable-DRIVER option is used.

--enable-default-output=DRIVER

Replace driver with oss, irix, solaris, esd, alsa, null, or wav.  This
option sets the default output driver returned by the library when
ao_get_driver_id(NULL) is called.

API

The libao API makes a distinction between drivers and devices.  A
driver is a set of functions that allow audio to be played on a
particular platform (i.e. Solaris, ESD, etc.).  A device is a
particular output target that uses a driver.  For example, on my
system, I use the OSS driver to play to the /dev/dsp device.

Using the libao API is fairly simple.  Your program should go like
this:

   * Include the audio_out.h header into your program.

   * Call ao_get_driver_id() with a string corresponding to the short
     name of the device (i.e. "oss", "wav", etc.) or NULL to get the
     default output driver for this platform.

   * Create an option list pointer of type (ao_option_t *) and
     initialize it to NULL.

   * Through successive calls to ao_append_option(), add any driver
     specific options you need.  Note that the option string has the
     form "key:value" where supported keys are listed below in the
     DEVICE DRIVER section.

   * Call ao_open() and save the returned device pointer.

   * Call ao_play() to output each block of audio.

   * Call ao_close() to close the device.  Note that this will
     automatically free the memory that was allocated for the device.
     Do not attempt to free the device pointer yourself


FUNCTIONS

Before reading the function descriptions below, you should read
through the audio_out.h header file and see the data structures used.

int ao_get_driver_id (const char *short_name)

Purpose: Get the id number for a particular driver.

Parameters:
    const char* short_name - The short name of the driver or NULL for
                             the default output driver.

Returns: The driver id number or -1 if the driver does not exist.

---

ao_info_t* ao_get_driver_info (int driver_id)

Parameters:
    int driver_id - The number returned from ao_get_driver_id().

Purpose: To get the ao_info_t structure that describes this driver.

Returns: A pointer to the info structure.  Do not modify this
structure.

---

int ao_append_option (ao_option_t **options, const char* op_str)

Purpose: Append an option to a linked list of options.

Parameters:
    ao_option_t **options - A pointer to the linked list pointer.
    const char* op_str - The option string.  Form "key:value".

Returns: 1 if the option was appended successfully
         0 if the option was not appended (either due to memory
           allocation failure or incorrect option format)

---

void ao_free_options (ao_option_t *options)

Purpose: Free all of the memory allocated to an option list, including
the key and value strings.

Parameters:
    ao_option_t *options - A pointer to the option list.

---

ao_device_t* ao_open  (int driver_id, uint_32 bits, uint_32 rate, 
                       uint_32 channels, ao_option_t *options)

Purpose: To open a particular device for writing.

Parameters:
    int driver_id - ID number for the driver to use with this device
    uint_32 bits - Bits per audio sample (8 or 16)
    uint_32 rate - Samples per second (44100, 22050, etc.)
    uint_32 channels - Audio channels (1 = mono, 2 = stereo)
    ao_option_t *options - Option list

Returns: Pointer to internal data used for this device.  Must be used
in later calls to ao_play() or ao_close().  NULL is returned if the
device cannot be opened.

---

void ao_play (ao_device_t *device, void* output_samples, 
              uint_32 num_bytes)
 
Purpose: To ouput some audio data to the device.

Parameters:
    ao_device_t *device - Device pointer
    void *output_samples - Memory buffer containing audio data
    uint_32 num_bytes - Number of bytes of audio data in memory buffer

---

void ao_close (ao_device_t *device)

Purpose: To close the audio device and free device memory. [Do not free
device memory yourself!]

Parameters
    ao_device_t *device - Device pointer


DEVICE DRIVERS

Below are the short names of the devices that libao supports:

null
----
Null device.  This is just a test device.  It counts the
number of bytes sent, but does not write them anywhere.
    Option keys: None.

oss
---
Open Sound System.  This is the audio driver system for
Linux and Free/Net/OpenBSD as well as other UNIX-like systems.
    Option keys:
        "dsp" - set the dsp device.  By default, this is
                "/dev/dsp". 

irix
----
IRIX audio driver.  This was inherited from the original
libao, but has not been tested.  Use at your own risk.  (Better yet,
fix it!  I don't have access to an IRIX system.)
    Option keys: None.

solaris
-------
Solaris audio driver.  This was also inherited from the
original libao.  Same caveats apply.
    Option keys: None.

esd
---
ESounD audio driver.  This driver by default connects to the ESounD
Daemon on the localhost.
    Option keys:
        "host" - The hostname where esd is running.  This can include
                 a port number after a colon, as in "whizbang.com:555".

alsa
----
Advanced Linux Sound Architecture.  This driver borrows some code from
Jaroslav Kysela's <perex@suse.cz> GPLed aplay that is included with
the alsa-util distribution.  It defaults to device 0 on card 0.
Because of the way ALSA reads data, this driver packs sound from
successive calls into a fixed size buffer (defaults to 32kB) and sends
it to the card.
    Option keys:
       "card" - Sound card number
       "dev" - Device number on the sound card
       "buf_size" - Override the default buffer size (in bytes)
 
esd
---
ESounD audio driver.  Uses libesd to communicate with the audio
server.
    Option keys:
        "host" - Hostname where esd is running.  By default, this is
                 the localhost.

wav
---
WAV file output.  This produces a wav file from the audio
data you output.
    Option keys:
        "file" - Sets the output file.  By default, this is
                 "output.wav".


ADDING NEW DRIVERS

[To be written. - Stan]

WANTED

* Testers to check out the IRIX and Solaris drivers.
* Win32 driver
* BeOS driver
* Other audio file formats.