From 99e6e574d315044ac20672ce417dc0418d7a7277 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 Dec 2014 21:21:09 +0100 Subject: De-macroize render_sample macros --- sound.c | 78 +++++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/sound.c b/sound.c index 78a9daa..d05ff8b 100644 --- a/sound.c +++ b/sound.c @@ -69,34 +69,6 @@ void sound_timer_queue32(u32 channel, u32 value) sound_timer_queue(8, value >> 24); } -// Unqueue 1 sample from the base of the DS FIFO and place it on the audio -// buffer for as many samples as necessary. If the DS FIFO is 16 bytes or -// smaller and if DMA is enabled for the sound channel initiate a DMA transfer -// to the DS FIFO. - -#define render_sample_null() \ - -#define render_sample_left() \ - sound_buffer[buffer_index] += current_sample + \ - fp16_16_to_u32((next_sample - current_sample) * (fifo_fractional >> 8)) \ - -#define render_sample_right() \ - sound_buffer[buffer_index + 1] += current_sample + \ - fp16_16_to_u32((next_sample - current_sample) * (fifo_fractional >> 8)) \ - -#define render_sample_both() \ - dest_sample = current_sample + \ - fp16_16_to_u32((next_sample - current_sample) * (fifo_fractional >> 8)); \ - sound_buffer[buffer_index] += dest_sample; \ - sound_buffer[buffer_index + 1] += dest_sample \ - -#define render_samples(type) \ - while(fifo_fractional <= 0xFFFFFF) \ - { \ - render_sample_##type(); \ - fifo_fractional += frequency_step; \ - buffer_index = (buffer_index + 2) % BUFFER_SIZE; \ - } \ void sound_timer(fixed8_24 frequency_step, u32 channel) { @@ -105,7 +77,7 @@ void sound_timer(fixed8_24 frequency_step, u32 channel) fixed8_24 fifo_fractional = ds->fifo_fractional; u32 buffer_index = ds->buffer_index; - s16 current_sample, next_sample, dest_sample; + s16 current_sample, next_sample; current_sample = ds->fifo[ds->fifo_base] << 4; ds->fifo_base = (ds->fifo_base + 1) % 32; @@ -123,22 +95,62 @@ void sound_timer(fixed8_24 frequency_step, u32 channel) } + // Unqueue 1 sample from the base of the DS FIFO and place it on the audio + // buffer for as many samples as necessary. If the DS FIFO is 16 bytes or + // smaller and if DMA is enabled for the sound channel initiate a DMA transfer + // to the DS FIFO. + switch(sample_status) { case DIRECT_SOUND_INACTIVE: - render_samples(null); + /* render samples NULL */ + while(fifo_fractional <= 0xFFFFFF) + { + fifo_fractional += frequency_step; + buffer_index = (buffer_index + 2) % BUFFER_SIZE; + } break; case DIRECT_SOUND_RIGHT: - render_samples(right); + /* render samples RIGHT */ + while(fifo_fractional <= 0xFFFFFF) + { + s16 dest_sample = current_sample + + fp16_16_to_u32((next_sample - current_sample) * (fifo_fractional >> 8)); + + sound_buffer[buffer_index + 1] += dest_sample; + + fifo_fractional += frequency_step; + buffer_index = (buffer_index + 2) % BUFFER_SIZE; + } break; case DIRECT_SOUND_LEFT: - render_samples(left); + /* render samples LEFT */ + while(fifo_fractional <= 0xFFFFFF) + { + s16 dest_sample = current_sample + + fp16_16_to_u32((next_sample - current_sample) * (fifo_fractional >> 8)); + + sound_buffer[buffer_index] += dest_sample; + + fifo_fractional += frequency_step; + buffer_index = (buffer_index + 2) % BUFFER_SIZE; + } break; case DIRECT_SOUND_LEFTRIGHT: - render_samples(both); + /* render samples LEFT and RIGHT. */ + while(fifo_fractional <= 0xFFFFFF) + { + s16 dest_sample = current_sample + + fp16_16_to_u32((next_sample - current_sample) * (fifo_fractional >> 8)); + + sound_buffer[buffer_index] += dest_sample; + sound_buffer[buffer_index + 1] += dest_sample; + fifo_fractional += frequency_step; + buffer_index = (buffer_index + 2) % BUFFER_SIZE; + } break; } -- cgit v1.2.3