revision 434:8af49a412d92
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 434:8af49a412d92 |
parent | 433:a4f61551d79d |
child | 435:7a5d71e8560b |
author | nkeynes |
date | Tue Oct 09 11:37:36 2007 +0000 (16 years ago) |
Fix ADPCM (to some degree at least)
Fix key-on/off (triggers all channels at once)
Fix key-on/off (triggers all channels at once)
![]() | src/aica/aica.c | view | annotate | diff | log | |
![]() | src/aica/audio.c | view | annotate | diff | log | |
![]() | src/aica/audio.h | view | annotate | diff | log |
1.1 --- a/src/aica/aica.c Tue Oct 09 08:48:28 2007 +00001.2 +++ b/src/aica/aica.c Tue Oct 09 11:37:36 2007 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: aica.c,v 1.22 2007-10-09 08:11:51 nkeynes Exp $1.6 + * $Id: aica.c,v 1.23 2007-10-09 11:37:36 nkeynes Exp $1.7 *1.8 * This is the core sound system (ie the bit which does the actual work)1.9 *1.10 @@ -289,6 +289,19 @@1.11 return rate;1.12 }1.14 +void aica_start_stop_channels()1.15 +{1.16 + int i;1.17 + for( i=0; i<32; i++ ) {1.18 + uint32_t val = MMIO_READ( AICA0, i<<7 );1.19 + audio_start_stop_channel(i, val&0x4000);1.20 + }1.21 + for( ; i<64; i++ ) {1.22 + uint32_t val = MMIO_READ( AICA1, (i-32)<<7 );1.23 + audio_start_stop_channel(i, val&0x4000);1.24 + }1.25 +}1.26 +1.27 /**1.28 * Derived directly from Dan Potter's log table1.29 */1.30 @@ -334,16 +347,8 @@1.31 channel->sample_format = AUDIO_FMT_ADPCM;1.32 break;1.33 }1.34 - switch( (val >> 14) & 0x03 ) {1.35 - case 2:1.36 - audio_stop_channel( channelNo );1.37 - break;1.38 - case 3:1.39 - audio_start_channel( channelNo );1.40 - break;1.41 - default:1.42 - break;1.43 - /* Hrmm... */1.44 + if( val & 0x8000 ) {1.45 + aica_start_stop_channels();1.46 }1.47 break;1.48 case 0x04: /* Low 16 address bits */
2.1 --- a/src/aica/audio.c Tue Oct 09 08:48:28 2007 +00002.2 +++ b/src/aica/audio.c Tue Oct 09 11:37:36 2007 +00002.3 @@ -1,5 +1,5 @@2.4 /**2.5 - * $Id: audio.c,v 1.8 2007-10-09 08:11:51 nkeynes Exp $2.6 + * $Id: audio.c,v 1.9 2007-10-09 11:37:36 nkeynes Exp $2.7 *2.8 * Audio mixer core. Combines all the active streams into a single sound2.9 * buffer for output.2.10 @@ -25,7 +25,7 @@2.11 #include <string.h>2.13 #define NUM_BUFFERS 32.14 -#define MS_PER_BUFFER 502.15 +#define MS_PER_BUFFER 1002.17 #define BUFFER_EMPTY 02.18 #define BUFFER_WRITING 12.19 @@ -198,7 +198,7 @@2.20 switch( channel->sample_format ) {2.21 case AUDIO_FMT_16BIT:2.22 for( j=0; j<num_samples; j++ ) {2.23 - sample = *(int16_t *)(arm_mem + channel->posn + channel->start);2.24 + sample = ((int16_t *)(arm_mem + channel->start))[channel->posn];2.25 result_buf[j][0] += sample * vol_left;2.26 result_buf[j][1] += sample * vol_right;2.28 @@ -221,7 +221,7 @@2.29 break;2.30 case AUDIO_FMT_8BIT:2.31 for( j=0; j<num_samples; j++ ) {2.32 - sample = (*(int8_t *)(arm_mem + channel->posn + channel->start)) << 8;2.33 + sample = ((int8_t *)(arm_mem + channel->start))[channel->posn] << 8;2.34 result_buf[j][0] += sample * vol_left;2.35 result_buf[j][1] += sample * vol_right;2.37 @@ -250,22 +250,23 @@2.38 channel->posn_left += channel->sample_rate;2.39 while( channel->posn_left > audio.output_rate ) {2.40 channel->posn_left -= audio.output_rate;2.41 - if( channel->adpcm_nibble == 0 ) {2.42 - uint8_t data = *(uint8_t *)(arm_mem + channel->posn + channel->start);2.43 - adpcm_yamaha_decode_nibble( channel, (data >> 4) & 0x0F );2.44 - channel->adpcm_nibble = 1;2.45 - } else {2.46 - channel->posn++;2.47 - if( channel->posn == channel->end ) {2.48 - if( channel->loop )2.49 - channel->posn = channel->loop_start;2.50 - else2.51 - audio_stop_channel(i);2.52 + channel->posn++;2.53 + if( channel->posn == channel->end ) {2.54 + if( channel->loop ) {2.55 + channel->posn = channel->loop_start;2.56 + channel->adpcm_predict = 0;2.57 + channel->adpcm_step = 0;2.58 + } else {2.59 + audio_stop_channel(i);2.60 + j = num_samples;2.61 break;2.62 }2.63 - uint8_t data = *(uint8_t *)(arm_mem + channel->posn + channel->start);2.64 + }2.65 + uint8_t data = ((uint8_t *)(arm_mem + channel->start))[channel->posn>>1];2.66 + if( channel->posn&1 ) {2.67 + adpcm_yamaha_decode_nibble( channel, (data >> 4) & 0x0F );2.68 + } else {2.69 adpcm_yamaha_decode_nibble( channel, data & 0x0F );2.70 - channel->adpcm_nibble = 0;2.71 }2.72 }2.73 }2.74 @@ -314,6 +315,17 @@2.75 return &audio.channels[channel];2.76 }2.78 +void audio_start_stop_channel( int channel, gboolean start )2.79 +{2.80 + if( audio.channels[channel].active ) {2.81 + if( !start ) {2.82 + audio_stop_channel(channel);2.83 + }2.84 + } else if( start ) {2.85 + audio_start_channel(channel);2.86 + }2.87 +}2.88 +2.89 void audio_stop_channel( int channel )2.90 {2.91 audio.channels[channel].active = FALSE;2.92 @@ -324,8 +336,11 @@2.93 {2.94 audio.channels[channel].posn = 0;2.95 audio.channels[channel].posn_left = 0;2.96 - audio.channels[channel].adpcm_nibble = 0;2.97 - audio.channels[channel].adpcm_step = 0;2.98 - audio.channels[channel].adpcm_predict = 0;2.99 audio.channels[channel].active = TRUE;2.100 + if( audio.channels[channel].sample_format == AUDIO_FMT_ADPCM ) {2.101 + audio.channels[channel].adpcm_step = 0;2.102 + audio.channels[channel].adpcm_predict = 0;2.103 + uint8_t data = ((uint8_t *)(arm_mem + audio.channels[channel].start))[0];2.104 + adpcm_yamaha_decode_nibble( &audio.channels[channel], data & 0x0F );2.105 + }2.106 }
3.1 --- a/src/aica/audio.h Tue Oct 09 08:48:28 2007 +00003.2 +++ b/src/aica/audio.h Tue Oct 09 11:37:36 2007 +00003.3 @@ -1,5 +1,5 @@3.4 /**3.5 - * $Id: audio.h,v 1.7 2006-03-16 12:41:59 nkeynes Exp $3.6 + * $Id: audio.h,v 1.8 2007-10-09 11:37:36 nkeynes Exp $3.7 *3.8 * Audio engine, ie the part that does the actual work.3.9 *3.10 @@ -37,7 +37,7 @@3.12 typedef struct audio_channel {3.13 gboolean active;3.14 - uint32_t posn;3.15 + uint32_t posn; /* current sample #, 0 = first sample */3.16 uint32_t posn_left;3.17 uint32_t start;3.18 uint32_t end;3.19 @@ -49,7 +49,6 @@3.20 int sample_format;3.21 /* Envelope etc stuff */3.22 /* ADPCM */3.23 - int adpcm_nibble; /* 0 = low nibble, 1 = high nibble */3.24 int adpcm_step;3.25 int adpcm_predict;3.26 } *audio_channel_t;3.27 @@ -102,6 +101,7 @@3.28 */3.29 audio_channel_t audio_get_channel( int channel );3.31 +void audio_start_stop_channel( int channel, gboolean start );3.32 void audio_start_channel( int channel );3.33 void audio_stop_channel( int channel );
.