From 2ab3d99967d68c79351fe2a3df22c445447e3010 Mon Sep 17 00:00:00 2001 From: Michał Cichoń Date: Tue, 15 Nov 2011 22:28:48 +0100 Subject: Initial import. --- libao/src/include/ao/ao.h | 139 +++++++++++++++++++++++++ libao/src/include/ao/ao_private.h | 211 ++++++++++++++++++++++++++++++++++++++ libao/src/include/ao/os_types.h | 39 +++++++ libao/src/include/ao/plugin.h | 51 +++++++++ 4 files changed, 440 insertions(+) create mode 100644 libao/src/include/ao/ao.h create mode 100644 libao/src/include/ao/ao_private.h create mode 100644 libao/src/include/ao/os_types.h create mode 100644 libao/src/include/ao/plugin.h (limited to 'libao/src/include/ao') diff --git a/libao/src/include/ao/ao.h b/libao/src/include/ao/ao.h new file mode 100644 index 0000000..cb8c035 --- /dev/null +++ b/libao/src/include/ao/ao.h @@ -0,0 +1,139 @@ +/* + * + * ao.h + * + * Original Copyright (C) Aaron Holtzman - May 1999 + * Modifications Copyright (C) Stan Seibert - July 2000, July 2001 + * More Modifications Copyright (C) Jack Moffitt - October 2000 + * + * This file is part of libao, a cross-platform audio outputlibrary. See + * README for a history of this source code. + * + * 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. + * + */ +#ifndef __AO_H__ +#define __AO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include +#include +#include +#include "os_types.h" + +/* --- Constants ---*/ + +#define AO_TYPE_LIVE 1 +#define AO_TYPE_FILE 2 + + +#define AO_ENODRIVER 1 +#define AO_ENOTFILE 2 +#define AO_ENOTLIVE 3 +#define AO_EBADOPTION 4 +#define AO_EOPENDEVICE 5 +#define AO_EOPENFILE 6 +#define AO_EFILEEXISTS 7 +#define AO_EBADFORMAT 8 + +#define AO_EFAIL 100 + + +#define AO_FMT_LITTLE 1 +#define AO_FMT_BIG 2 +#define AO_FMT_NATIVE 4 + +/* --- Structures --- */ + +typedef struct ao_info { + int type; /* live output or file output? */ + char *name; /* full name of driver */ + char *short_name; /* short name of driver */ + char *author; /* driver author */ + char *comment; /* driver comment */ + int preferred_byte_format; + int priority; + char **options; + int option_count; +} ao_info; + +typedef struct ao_functions ao_functions; +typedef struct ao_device ao_device; + +typedef struct ao_sample_format { + int bits; /* bits per sample */ + int rate; /* samples per second (in a single channel) */ + int channels; /* number of audio channels */ + int byte_format; /* Byte ordering in sample, see constants below */ + char *matrix; /* input channel location/ordering */ +} ao_sample_format; + +typedef struct ao_option { + char *key; + char *value; + struct ao_option *next; +} ao_option; + +#if defined(AO_BUILDING_LIBAO) +#include "ao_private.h" +#endif + +/* --- Functions --- */ + +/* library setup/teardown */ +void ao_initialize(void); +void ao_shutdown(void); + +/* device setup/playback/teardown */ +int ao_append_global_option(const char *key, + const char *value); +int ao_append_option(ao_option **options, + const char *key, + const char *value); +void ao_free_options(ao_option *options); +ao_device* ao_open_live(int driver_id, + ao_sample_format *format, + ao_option *option); +ao_device* ao_open_file(int driver_id, + const char *filename, + int overwrite, + ao_sample_format *format, + ao_option *option); + +int ao_play(ao_device *device, + char *output_samples, + uint_32 num_bytes); +int ao_close(ao_device *device); + +/* driver information */ +int ao_driver_id(const char *short_name); +int ao_default_driver_id(void); +ao_info *ao_driver_info(int driver_id); +ao_info **ao_driver_info_list(int *driver_count); +char *ao_file_extension(int driver_id); + +/* miscellaneous */ +int ao_is_big_endian(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __AO_H__ */ diff --git a/libao/src/include/ao/ao_private.h b/libao/src/include/ao/ao_private.h new file mode 100644 index 0000000..5d4dfd6 --- /dev/null +++ b/libao/src/include/ao/ao_private.h @@ -0,0 +1,211 @@ +/* + * + * ao_private.c + * + * Copyright (C) Stan Seibert - July 2001 + * + * This file is part of libao, a cross-platform audio output library. See + * README for a history of this source code. + * + * 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. + * + */ + +#ifndef __AO_PRIVATE_H__ +#define __AO_PRIVATE_H__ + +/* --- Operating System Compatibility --- */ + +/* + OpenBSD systems with a.out binaries require dlsym()ed symbols to be + prepended with an underscore, so we need the following nasty #ifdef + hack. +*/ +#if defined(__OpenBSD__) && !defined(__ELF__) +#define dlsym(h,s) dlsym(h, "_" s) +#endif + +/* RTLD_NOW is the preferred symbol resolution behavior, but + * some platforms do not support it. The autoconf script will have + * already defined DLOPEN_FLAG if the default is unacceptable on the + * current platform. + * + * ALSA requires RTLD_GLOBAL. + */ +#if !defined(DLOPEN_FLAG) +#define DLOPEN_FLAG (RTLD_NOW | RTLD_GLOBAL) +#endif + +/* --- Constants --- */ + +#ifndef AO_SYSTEM_CONFIG +#define AO_SYSTEM_CONFIG "/etc/libao.conf" +#endif +#ifndef AO_USER_CONFIG +#define AO_USER_CONFIG "/.libao" +#endif + +/* --- Structures --- */ + +typedef struct ao_config { + char *default_driver; +} ao_config; + +typedef enum { + AO_OUTPUT_MATRIX_UNDEFINED=0, /* matrix unset */ + AO_OUTPUT_MATRIX_FIXED=1, /* fixed, immutable channel order, eg, ALSA */ + AO_OUTPUT_MATRIX_COLLAPSIBLE=2, /* fixed order but only used channels sent, eg MACOS */ + AO_OUTPUT_MATRIX_PERMUTABLE=3, /* channel map is fully permutable. eg Pulse */ +} ao_outorder; + +struct ao_device { + int type; /* live output or file output? */ + int driver_id; + ao_functions *funcs; + FILE *file; /* File for output if this is a file driver */ + + /* input not necessarily == output. Right now, byte order, channel + count, and channel mappings may be altered. */ + + int client_byte_format; + int machine_byte_format; + int driver_byte_format; + char *swap_buffer; + int swap_buffer_size; /* Bytes allocated to swap_buffer */ + + int input_channels; + int output_channels; + int bytewidth; + int rate; + + ao_outorder output_matrix_order; + char *output_matrix; /* physical output channel + ordering/numbering matrix set by + driver if there's a channel + name->number mapping useful to the + backend driver in some way. Eg, + Pulse has fully permutable input + channel masks, but specific channels + locations (eg, 'Center') still have + assigned numbers even if not a + specific slot int he input + interleave. */ + int output_mask; + int *input_map; /* input permutation mapping from each + input channel to a location in the + output_matrix. Made by ao_open, + intended for convenience use by + driver in device open. */ + + char *inter_matrix; /* channel matrix as presented to the + backend API */ + int *inter_permute; /* maps from each channel in the + inter_matrix back to an input channel + (if any) */ + + void *internal; /* Pointer to driver-specific data */ + + int verbose; +}; + +struct ao_functions { + int (*test)(void); + ao_info* (*driver_info)(void); + int (*device_init)(ao_device *device); + int (*set_option)(ao_device *device, const char *key, + const char *value); + int (*open)(ao_device *device, ao_sample_format *format); + int (*play)(ao_device *device, const char *output_samples, + uint_32 num_bytes); + int (*close)(ao_device *device); + void (*device_clear)(ao_device *device); + char* (*file_extension)(void); +}; + +/* --- Functions --- */ + +void ao_read_config_files (ao_config *config); + +#define adebug(format, ...) {\ + if(device->verbose==2){ \ + if(strcmp(format,"\n")){ \ + if(device->funcs->driver_info()->short_name){ \ + fprintf(stderr,"ao_%s debug: " format,device->funcs->driver_info()->short_name,##__VA_ARGS__); \ + }else{ \ + fprintf(stderr,"debug: " format,##__VA_ARGS__); \ + } \ + }else{ \ + fprintf(stderr,"\n"); \ + } \ + } \ + } + +#define averbose(format, ...) {\ + if(device->verbose>0){ \ + if(strcmp(format,"\n")){ \ + if(device->funcs->driver_info()->short_name){ \ + fprintf(stderr,"ao_%s info: " format,device->funcs->driver_info()->short_name,##__VA_ARGS__); \ + }else{ \ + fprintf(stderr,"info: " format,##__VA_ARGS__); \ + } \ + }else{ \ + fprintf(stderr,"\n"); \ + } \ + } \ + } + +#define ainfo(format, ...) {\ + if(device->verbose>=0){ \ + if(strcmp(format,"\n")){ \ + if(device->funcs->driver_info()->short_name){ \ + fprintf(stderr,"ao_%s info: " format,device->funcs->driver_info()->short_name,##__VA_ARGS__); \ + }else{ \ + fprintf(stderr,"info: " format,##__VA_ARGS__); \ + } \ + }else{ \ + fprintf(stderr,"\n"); \ + } \ + } \ + } + +#define awarn(format, ...) {\ + if(device->verbose>=0){ \ + if(strcmp(format,"\n")){ \ + if(device->funcs->driver_info()->short_name){ \ + fprintf(stderr,"ao_%s WARNING: " format,device->funcs->driver_info()->short_name,##__VA_ARGS__); \ + }else{ \ + fprintf(stderr,"WARNING: " format,##__VA_ARGS__); \ + } \ + }else{ \ + fprintf(stderr,"\n"); \ + } \ + } \ + } + +#define aerror(format, ...) { \ + if(device->verbose>=0){ \ + if(strcmp(format,"\n")){ \ + if(device->funcs->driver_info()->short_name){ \ + fprintf(stderr,"ao_%s ERROR: " format,device->funcs->driver_info()->short_name,##__VA_ARGS__); \ + }else{ \ + fprintf(stderr,"ERROR: " format,##__VA_ARGS__); \ + } \ + }else{ \ + fprintf(stderr,"\n"); \ + } \ + } \ + } + +#endif /* __AO_PRIVATE_H__ */ diff --git a/libao/src/include/ao/os_types.h b/libao/src/include/ao/os_types.h new file mode 100644 index 0000000..8a56553 --- /dev/null +++ b/libao/src/include/ao/os_types.h @@ -0,0 +1,39 @@ +/* + * + * os_types.h + * + * Original Copyright (C) Aaron Holtzman - May 1999 + * Modifications Copyright (C) Stan Seibert - July 2000 + * + * This file is part of libao, a cross-platform audio output library. See + * README for a history of this source code. + * + * 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. + * + */ + +/* Set type sizes for this platform (Requires Autoconf) */ + +#ifndef __OS_TYPES_H__ +#define __OS_TYPES_H__ + +typedef unsigned char uint_8; +typedef unsigned short uint_16; +typedef unsigned int uint_32; +typedef signed char sint_8; +typedef signed short sint_16; +typedef signed int sint_32; + +#endif /* __OS_TYPES_H__ */ diff --git a/libao/src/include/ao/plugin.h b/libao/src/include/ao/plugin.h new file mode 100644 index 0000000..29a3d96 --- /dev/null +++ b/libao/src/include/ao/plugin.h @@ -0,0 +1,51 @@ +/* + * + * plugin.h - function declarations for libao plugins + * + * Copyright (C) Stan Seibert - June 2001 + * + * This file is part of libao, a cross-platform audio outputlibrary. See + * README for a history of this source code. + * + * 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. + * + */ +#ifndef __PLUGIN_H__ +#define __PLUGIN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include +#include "os_types.h" + +int ao_plugin_test(); +ao_info *ao_plugin_driver_info(); +int ao_plugin_device_init(ao_device *device); +int ao_plugin_set_option(ao_device *device, const char *key, const char *value); +int ao_plugin_open(ao_device *device, ao_sample_format *format); +int ao_plugin_play(ao_device *device, const char *output_samples, + uint_32 num_bytes); +int ao_plugin_close(ao_device *device); +void ao_plugin_device_clear(ao_device *device); +char *ao_plugin_file_extension(); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __PLUGIN_H__ */ -- cgit v1.2.3