filename | src/aica/audio.h |
changeset | 111:230243c2b520 |
prev | 106:9048bac046c3 |
next | 434:8af49a412d92 |
author | nkeynes |
date | Sun Feb 11 10:09:32 2007 +0000 (17 years ago) |
permissions | -rw-r--r-- |
last change | Bug 27: Implement opengl framebuffer objects Rewrite much of the final video output stage. Now uses generic "render buffers", implemented on GL using framebuffer objects + textures. |
file | annotate | diff | log | raw |
nkeynes@66 | 1 | /** |
nkeynes@111 | 2 | * $Id: audio.h,v 1.7 2006-03-16 12:41:59 nkeynes Exp $ |
nkeynes@66 | 3 | * |
nkeynes@66 | 4 | * Audio engine, ie the part that does the actual work. |
nkeynes@66 | 5 | * |
nkeynes@66 | 6 | * Copyright (c) 2005 Nathan Keynes. |
nkeynes@66 | 7 | * |
nkeynes@66 | 8 | * This program is free software; you can redistribute it and/or modify |
nkeynes@66 | 9 | * it under the terms of the GNU General Public License as published by |
nkeynes@66 | 10 | * the Free Software Foundation; either version 2 of the License, or |
nkeynes@66 | 11 | * (at your option) any later version. |
nkeynes@66 | 12 | * |
nkeynes@66 | 13 | * This program is distributed in the hope that it will be useful, |
nkeynes@66 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nkeynes@66 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nkeynes@66 | 16 | * GNU General Public License for more details. |
nkeynes@66 | 17 | */ |
nkeynes@66 | 18 | #ifndef dream_audio_H |
nkeynes@66 | 19 | #define dream_audio_H 1 |
nkeynes@66 | 20 | |
nkeynes@66 | 21 | #include <stdint.h> |
nkeynes@66 | 22 | #include <glib/gtypes.h> |
nkeynes@66 | 23 | |
nkeynes@66 | 24 | #ifdef __cplusplus |
nkeynes@66 | 25 | extern "C" { |
nkeynes@66 | 26 | #endif |
nkeynes@66 | 27 | |
nkeynes@66 | 28 | #define AUDIO_FMT_8BIT 0 |
nkeynes@66 | 29 | #define AUDIO_FMT_16BIT 1 |
nkeynes@66 | 30 | #define AUDIO_FMT_ADPCM 2 |
nkeynes@66 | 31 | #define AUDIO_FMT_MONO 0 |
nkeynes@66 | 32 | #define AUDIO_FMT_STEREO 4 |
nkeynes@66 | 33 | #define AUDIO_FMT_SIGNED 0 |
nkeynes@66 | 34 | #define AUDIO_FMT_UNSIGNED 8 |
nkeynes@66 | 35 | |
nkeynes@106 | 36 | #define AUDIO_FMT_16ST (AUDIO_FMT_16BIT|AUDIO_FMT_STEREO) |
nkeynes@66 | 37 | |
nkeynes@66 | 38 | typedef struct audio_channel { |
nkeynes@66 | 39 | gboolean active; |
nkeynes@66 | 40 | uint32_t posn; |
nkeynes@66 | 41 | uint32_t posn_left; |
nkeynes@66 | 42 | uint32_t start; |
nkeynes@66 | 43 | uint32_t end; |
nkeynes@73 | 44 | gboolean loop; |
nkeynes@66 | 45 | uint32_t loop_start; |
nkeynes@82 | 46 | int vol; /* 0..255 */ |
nkeynes@82 | 47 | int pan; /* 0 (left) .. 31 (right) */ |
nkeynes@66 | 48 | uint32_t sample_rate; |
nkeynes@66 | 49 | int sample_format; |
nkeynes@66 | 50 | /* Envelope etc stuff */ |
nkeynes@66 | 51 | /* ADPCM */ |
nkeynes@66 | 52 | int adpcm_nibble; /* 0 = low nibble, 1 = high nibble */ |
nkeynes@66 | 53 | int adpcm_step; |
nkeynes@66 | 54 | int adpcm_predict; |
nkeynes@66 | 55 | } *audio_channel_t; |
nkeynes@66 | 56 | |
nkeynes@66 | 57 | |
nkeynes@66 | 58 | typedef struct audio_buffer { |
nkeynes@73 | 59 | uint32_t length; /* Bytes */ |
nkeynes@73 | 60 | uint32_t posn; /* Bytes */ |
nkeynes@66 | 61 | int status; |
nkeynes@66 | 62 | char data[0]; |
nkeynes@66 | 63 | } *audio_buffer_t; |
nkeynes@66 | 64 | |
nkeynes@91 | 65 | typedef struct audio_driver { |
nkeynes@74 | 66 | char *name; |
nkeynes@66 | 67 | gboolean (*set_output_format)( uint32_t sample_rate, uint32_t format ); |
nkeynes@66 | 68 | gboolean (*process_buffer)( audio_buffer_t buffer ); |
nkeynes@91 | 69 | } *audio_driver_t; |
nkeynes@66 | 70 | |
nkeynes@106 | 71 | extern struct audio_driver audio_null_driver; |
nkeynes@106 | 72 | extern struct audio_driver audio_esd_driver; |
nkeynes@66 | 73 | |
nkeynes@66 | 74 | /** |
nkeynes@66 | 75 | * Set the output driver, sample rate and format. Also initializes the |
nkeynes@66 | 76 | * output buffers, flushing any current data and reallocating as |
nkeynes@66 | 77 | * necessary. Must be called before attempting to generate any audio. |
nkeynes@66 | 78 | */ |
nkeynes@111 | 79 | gboolean audio_set_driver( audio_driver_t driver, uint32_t samplerate, |
nkeynes@66 | 80 | int format ); |
nkeynes@66 | 81 | |
nkeynes@66 | 82 | /** |
nkeynes@66 | 83 | * Mark the current write buffer as full and prepare the next buffer for |
nkeynes@66 | 84 | * writing. Returns the next buffer to write to. |
nkeynes@66 | 85 | * If all buffers are full, returns NULL. |
nkeynes@66 | 86 | */ |
nkeynes@66 | 87 | audio_buffer_t audio_next_write_buffer(); |
nkeynes@66 | 88 | |
nkeynes@66 | 89 | /** |
nkeynes@66 | 90 | * Mark the current read buffer as empty and return the next buffer for |
nkeynes@66 | 91 | * reading. If there is no next buffer yet, returns NULL. |
nkeynes@66 | 92 | */ |
nkeynes@66 | 93 | audio_buffer_t audio_next_read_buffer(); |
nkeynes@66 | 94 | |
nkeynes@66 | 95 | /** |
nkeynes@66 | 96 | * Mix a single output sample and append it to the output buffers |
nkeynes@66 | 97 | */ |
nkeynes@73 | 98 | void audio_mix_samples( int num_samples ); |
nkeynes@66 | 99 | |
nkeynes@66 | 100 | /** |
nkeynes@66 | 101 | * Retrieve the channel information for the channel, numbered 0..63. |
nkeynes@66 | 102 | */ |
nkeynes@66 | 103 | audio_channel_t audio_get_channel( int channel ); |
nkeynes@66 | 104 | |
nkeynes@66 | 105 | void audio_start_channel( int channel ); |
nkeynes@66 | 106 | void audio_stop_channel( int channel ); |
nkeynes@66 | 107 | |
nkeynes@66 | 108 | |
nkeynes@66 | 109 | #ifdef __cplusplus |
nkeynes@66 | 110 | } |
nkeynes@66 | 111 | #endif |
nkeynes@66 | 112 | #endif |
.