From Schmid.wiki
Jump to: navigation, search

libao provides a simple API for audio output. pyao is Python bindings for libao.

Installation

# emerge pyao

Test

$ vim libaotest.c

Enter this test program:

/* C IMPLEMENTAION FILE ______________________________________________ vim:textwidth=100:tabstop=8
            
 *               file : libaotest.c
 *             author : Jakob Schmid
 *              notes : based on original source by Stan Seibert - July 2001
 *                      LEGAL TERMS of the original source:
 *                      This source file is released into the public domain.  It is
 *                      distributed without any warranty; without even the implied
 *                      warranty * of merchantability or fitness for a particular
 *                      purpose.
    _______________________________________________________________________________________________
 */


// INCLUDES _______________________________________________________________________________________
#include <stdio.h>
#include <ao/ao.h>
#include <math.h>
// DEFINITIONS ____________________________________________________________________________________
#define BUF_SIZE 4096
int main(int argc, char **argv)
{
    ao_device *device;
    ao_sample_format format;
    int default_driver;
    char *buffer;
    int buf_size;
    int sample;
    float freq = 440.0;
    int i;
    // Initialize
    // fprintf(stderr, "libao example program\n");
    ao_initialize();
    // Setup for default driver
    default_driver = ao_default_driver_id();
    format.bits        = 16;
    format.channels    = 2;
    format.rate        = 44100;
    format.byte_format = AO_FMT_LITTLE;
    // Open driver
    device = ao_open_live(default_driver, &format, NULL /* no options */);
    if (device == NULL) {
        fprintf(stderr, "Error opening device.\n");
        return 1;
    }   
    // Play some stuff
    buf_size = format.bits/8 * format.channels * format.rate;
    buffer = calloc(buf_size, sizeof(char));
    for(freq = 50; freq < 2000; freq += 200)
    {
        for (i = 0; i < format.rate; i++) {
            sample = (int)(0.75 * 32768.0 * 
                    sin(2 * M_PI * freq * ((float) i/format.rate)));

            /* Put the same stuff in left and right channel */
            buffer[4*i] = buffer[4*i+2] = sample & 0xff;
            buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff;
        }
        ao_play(device, buffer, buf_size);
    }
    // Close and shutdown
    ao_close(device);
    ao_shutdown();
    return (0);
}
 $ gcc -lao -ldl -lm -o libaotest libaotest.c

References

http://www.xiph.org/ao/