filename | src/aica/audio.c |
changeset | 434:8af49a412d92 |
prev | 431:248dd77a9e44 |
next | 463:0655796f9bb5 |
author | nkeynes |
date | Tue Oct 09 11:37:36 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Fix ADPCM (to some degree at least) Fix key-on/off (triggers all channels at once) |
file | annotate | diff | log | raw |
1.1 --- a/src/aica/audio.c Tue Oct 09 08:12:29 2007 +00001.2 +++ b/src/aica/audio.c Tue Oct 09 11:37:36 2007 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: audio.c,v 1.8 2007-10-09 08:11:51 nkeynes Exp $1.6 + * $Id: audio.c,v 1.9 2007-10-09 11:37:36 nkeynes Exp $1.7 *1.8 * Audio mixer core. Combines all the active streams into a single sound1.9 * buffer for output.1.10 @@ -25,7 +25,7 @@1.11 #include <string.h>1.13 #define NUM_BUFFERS 31.14 -#define MS_PER_BUFFER 501.15 +#define MS_PER_BUFFER 1001.17 #define BUFFER_EMPTY 01.18 #define BUFFER_WRITING 11.19 @@ -198,7 +198,7 @@1.20 switch( channel->sample_format ) {1.21 case AUDIO_FMT_16BIT:1.22 for( j=0; j<num_samples; j++ ) {1.23 - sample = *(int16_t *)(arm_mem + channel->posn + channel->start);1.24 + sample = ((int16_t *)(arm_mem + channel->start))[channel->posn];1.25 result_buf[j][0] += sample * vol_left;1.26 result_buf[j][1] += sample * vol_right;1.28 @@ -221,7 +221,7 @@1.29 break;1.30 case AUDIO_FMT_8BIT:1.31 for( j=0; j<num_samples; j++ ) {1.32 - sample = (*(int8_t *)(arm_mem + channel->posn + channel->start)) << 8;1.33 + sample = ((int8_t *)(arm_mem + channel->start))[channel->posn] << 8;1.34 result_buf[j][0] += sample * vol_left;1.35 result_buf[j][1] += sample * vol_right;1.37 @@ -250,22 +250,23 @@1.38 channel->posn_left += channel->sample_rate;1.39 while( channel->posn_left > audio.output_rate ) {1.40 channel->posn_left -= audio.output_rate;1.41 - if( channel->adpcm_nibble == 0 ) {1.42 - uint8_t data = *(uint8_t *)(arm_mem + channel->posn + channel->start);1.43 - adpcm_yamaha_decode_nibble( channel, (data >> 4) & 0x0F );1.44 - channel->adpcm_nibble = 1;1.45 - } else {1.46 - channel->posn++;1.47 - if( channel->posn == channel->end ) {1.48 - if( channel->loop )1.49 - channel->posn = channel->loop_start;1.50 - else1.51 - audio_stop_channel(i);1.52 + channel->posn++;1.53 + if( channel->posn == channel->end ) {1.54 + if( channel->loop ) {1.55 + channel->posn = channel->loop_start;1.56 + channel->adpcm_predict = 0;1.57 + channel->adpcm_step = 0;1.58 + } else {1.59 + audio_stop_channel(i);1.60 + j = num_samples;1.61 break;1.62 }1.63 - uint8_t data = *(uint8_t *)(arm_mem + channel->posn + channel->start);1.64 + }1.65 + uint8_t data = ((uint8_t *)(arm_mem + channel->start))[channel->posn>>1];1.66 + if( channel->posn&1 ) {1.67 + adpcm_yamaha_decode_nibble( channel, (data >> 4) & 0x0F );1.68 + } else {1.69 adpcm_yamaha_decode_nibble( channel, data & 0x0F );1.70 - channel->adpcm_nibble = 0;1.71 }1.72 }1.73 }1.74 @@ -314,6 +315,17 @@1.75 return &audio.channels[channel];1.76 }1.78 +void audio_start_stop_channel( int channel, gboolean start )1.79 +{1.80 + if( audio.channels[channel].active ) {1.81 + if( !start ) {1.82 + audio_stop_channel(channel);1.83 + }1.84 + } else if( start ) {1.85 + audio_start_channel(channel);1.86 + }1.87 +}1.88 +1.89 void audio_stop_channel( int channel )1.90 {1.91 audio.channels[channel].active = FALSE;1.92 @@ -324,8 +336,11 @@1.93 {1.94 audio.channels[channel].posn = 0;1.95 audio.channels[channel].posn_left = 0;1.96 - audio.channels[channel].adpcm_nibble = 0;1.97 - audio.channels[channel].adpcm_step = 0;1.98 - audio.channels[channel].adpcm_predict = 0;1.99 audio.channels[channel].active = TRUE;1.100 + if( audio.channels[channel].sample_format == AUDIO_FMT_ADPCM ) {1.101 + audio.channels[channel].adpcm_step = 0;1.102 + audio.channels[channel].adpcm_predict = 0;1.103 + uint8_t data = ((uint8_t *)(arm_mem + audio.channels[channel].start))[0];1.104 + adpcm_yamaha_decode_nibble( &audio.channels[channel], data & 0x0F );1.105 + }1.106 }
.