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