diff options
author | Michael Pavone <pavone@retrodev.com> | 2019-01-18 00:09:36 -0800 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2019-01-18 00:09:36 -0800 |
commit | d367860466e6d17f4de74ec8ef69992b042f95d0 (patch) | |
tree | 4be80838c4c1c13576b5a3fdf49c15094d534078 /render_sdl.c | |
parent | e660f70b0c9ec21b2a0e4eb35bb2243c74b3caef (diff) |
Modified audio code to support an arbitrary number of output channels so that things aren't weird if SDL2 picks a number of channels other than what we ask for
Diffstat (limited to 'render_sdl.c')
-rwxr-xr-x | render_sdl.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/render_sdl.c b/render_sdl.c index 4a2d0c7..64f4272 100755 --- a/render_sdl.c +++ b/render_sdl.c @@ -45,6 +45,7 @@ static uint8_t scanlines = 0; static uint32_t last_frame = 0; +static uint8_t output_channels; static uint32_t buffer_samples, sample_rate; static uint32_t missing_count; @@ -83,23 +84,28 @@ static int32_t mix_s16(audio_source *audio, void *vstream, int len) { int samples = len/(sizeof(int16_t)*2); int16_t *stream = vstream; - int16_t *end = stream + 2*samples; + int16_t *end = stream + output_channels*samples; int16_t *src = audio->front; uint32_t i = audio->read_start; uint32_t i_end = audio->read_end; int16_t *cur = stream; + size_t first_add = output_channels > 1 ? 1 : 0, second_add = output_channels > 1 ? output_channels - 1 : 1; if (audio->num_channels == 1) { while (cur < end && i != i_end) { - *(cur++) += src[i]; - *(cur++) += src[i++]; + *cur += src[i]; + cur += first_add; + *cur += src[i++]; + cur += second_add; i &= audio->mask; } } else { while (cur < end && i != i_end) { - *(cur++) += src[i++]; - *(cur++) += src[i++]; + *cur += src[i++]; + cur += first_add; + *cur += src[i++]; + cur += second_add; i &= audio->mask; } } @@ -127,18 +133,23 @@ static int32_t mix_f32(audio_source *audio, void *vstream, int len) uint32_t i = audio->read_start; uint32_t i_end = audio->read_end; float *cur = stream; + size_t first_add = output_channels > 1 ? 1 : 0, second_add = output_channels > 1 ? output_channels - 1 : 1; if (audio->num_channels == 1) { while (cur < end && i != i_end) { - *(cur++) += ((float)src[i]) / 0x7FFF; - *(cur++) += ((float)src[i++]) / 0x7FFF; + *cur += ((float)src[i]) / 0x7FFF; + cur += first_add; + *cur += ((float)src[i++]) / 0x7FFF; + cur += second_add; i &= audio->mask; } } else { while(cur < end && i != i_end) { - *(cur++) += ((float)src[i++]) / 0x7FFF; - *(cur++) += ((float)src[i++]) / 0x7FFF; + *cur += ((float)src[i++]) / 0x7FFF; + cur += first_add; + *cur += ((float)src[i++]) / 0x7FFF; + cur += second_add; i &= audio->mask; } } @@ -1027,6 +1038,7 @@ static void init_audio() } buffer_samples = actual.samples; sample_rate = actual.freq; + output_channels = actual.channels; printf("Initialized audio at frequency %d with a %d sample buffer, ", actual.freq, actual.samples); if (actual.format == AUDIO_S16SYS) { puts("signed 16-bit int format"); |