nkeynes@66: /** nkeynes@463: * $Id: audio.h,v 1.9 2007-10-24 21:24:09 nkeynes Exp $ nkeynes@66: * nkeynes@66: * Audio engine, ie the part that does the actual work. nkeynes@66: * nkeynes@66: * Copyright (c) 2005 Nathan Keynes. nkeynes@66: * nkeynes@66: * This program is free software; you can redistribute it and/or modify nkeynes@66: * it under the terms of the GNU General Public License as published by nkeynes@66: * the Free Software Foundation; either version 2 of the License, or nkeynes@66: * (at your option) any later version. nkeynes@66: * nkeynes@66: * This program is distributed in the hope that it will be useful, nkeynes@66: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@66: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@66: * GNU General Public License for more details. nkeynes@66: */ nkeynes@66: #ifndef dream_audio_H nkeynes@66: #define dream_audio_H 1 nkeynes@66: nkeynes@66: #include nkeynes@66: #include nkeynes@66: nkeynes@66: #ifdef __cplusplus nkeynes@66: extern "C" { nkeynes@66: #endif nkeynes@66: nkeynes@66: #define AUDIO_FMT_8BIT 0 nkeynes@66: #define AUDIO_FMT_16BIT 1 nkeynes@66: #define AUDIO_FMT_ADPCM 2 nkeynes@66: #define AUDIO_FMT_MONO 0 nkeynes@66: #define AUDIO_FMT_STEREO 4 nkeynes@66: #define AUDIO_FMT_SIGNED 0 nkeynes@66: #define AUDIO_FMT_UNSIGNED 8 nkeynes@66: nkeynes@106: #define AUDIO_FMT_16ST (AUDIO_FMT_16BIT|AUDIO_FMT_STEREO) nkeynes@66: nkeynes@463: typedef enum { LOOP_OFF = 0, LOOP_ON = 1, LOOP_LOOPED = 2 } loop_t; nkeynes@463: nkeynes@66: typedef struct audio_channel { nkeynes@66: gboolean active; nkeynes@434: uint32_t posn; /* current sample #, 0 = first sample */ nkeynes@66: uint32_t posn_left; nkeynes@66: uint32_t start; nkeynes@66: uint32_t end; nkeynes@463: loop_t loop; nkeynes@66: uint32_t loop_start; nkeynes@82: int vol; /* 0..255 */ nkeynes@82: int pan; /* 0 (left) .. 31 (right) */ nkeynes@66: uint32_t sample_rate; nkeynes@66: int sample_format; nkeynes@66: /* Envelope etc stuff */ nkeynes@66: /* ADPCM */ nkeynes@66: int adpcm_step; nkeynes@66: int adpcm_predict; nkeynes@66: } *audio_channel_t; nkeynes@66: nkeynes@66: nkeynes@66: typedef struct audio_buffer { nkeynes@73: uint32_t length; /* Bytes */ nkeynes@73: uint32_t posn; /* Bytes */ nkeynes@66: int status; nkeynes@66: char data[0]; nkeynes@66: } *audio_buffer_t; nkeynes@66: nkeynes@91: typedef struct audio_driver { nkeynes@74: char *name; nkeynes@66: gboolean (*set_output_format)( uint32_t sample_rate, uint32_t format ); nkeynes@66: gboolean (*process_buffer)( audio_buffer_t buffer ); nkeynes@91: } *audio_driver_t; nkeynes@66: nkeynes@106: extern struct audio_driver audio_null_driver; nkeynes@106: extern struct audio_driver audio_esd_driver; nkeynes@66: nkeynes@66: /** nkeynes@66: * Set the output driver, sample rate and format. Also initializes the nkeynes@66: * output buffers, flushing any current data and reallocating as nkeynes@66: * necessary. Must be called before attempting to generate any audio. nkeynes@66: */ nkeynes@111: gboolean audio_set_driver( audio_driver_t driver, uint32_t samplerate, nkeynes@66: int format ); nkeynes@66: nkeynes@66: /** nkeynes@66: * Mark the current write buffer as full and prepare the next buffer for nkeynes@66: * writing. Returns the next buffer to write to. nkeynes@66: * If all buffers are full, returns NULL. nkeynes@66: */ nkeynes@66: audio_buffer_t audio_next_write_buffer(); nkeynes@66: nkeynes@66: /** nkeynes@66: * Mark the current read buffer as empty and return the next buffer for nkeynes@66: * reading. If there is no next buffer yet, returns NULL. nkeynes@66: */ nkeynes@66: audio_buffer_t audio_next_read_buffer(); nkeynes@66: nkeynes@66: /** nkeynes@66: * Mix a single output sample and append it to the output buffers nkeynes@66: */ nkeynes@73: void audio_mix_samples( int num_samples ); nkeynes@66: nkeynes@66: /** nkeynes@66: * Retrieve the channel information for the channel, numbered 0..63. nkeynes@66: */ nkeynes@66: audio_channel_t audio_get_channel( int channel ); nkeynes@66: nkeynes@434: void audio_start_stop_channel( int channel, gboolean start ); nkeynes@66: void audio_start_channel( int channel ); nkeynes@66: void audio_stop_channel( int channel ); nkeynes@66: nkeynes@66: nkeynes@66: #ifdef __cplusplus nkeynes@66: } nkeynes@66: #endif nkeynes@66: #endif