ref: dae87c6106c4b971d84934e199c0a425611e8121
parent: f64f924b54ea085fcb6813ee6af79963aaff795d
author: Clownacy <Clownacy@users.noreply.github.com>
date: Wed Jun 24 13:34:25 EDT 2020
Update Wii U audio backend
--- a/src/Backends/Audio/WiiU-Software.cpp
+++ b/src/Backends/Audio/WiiU-Software.cpp
@@ -27,12 +27,12 @@
static AXVoice *voices[2];
static short *stream_buffers[2];
-static float *stream_buffer_float;
+static long *stream_buffer_long;
static size_t buffer_length;
static unsigned long output_frequency;
-static void FillMixerBuffer(float *stream, size_t frames_total)
+static void MixSoundsAndUpdateOrganya(long *stream, size_t frames_total)
{
OSLockMutex(&organya_mutex);
@@ -91,39 +91,38 @@
if (current_buffer != last_buffer)
{
// Clear the mixer buffer
- for (unsigned int i = 0; i < buffer_length * 2; ++i)
- stream_buffer_float[i] = 0.0f;
+ memset(stream_buffer_long, 0, buffer_length * sizeof(long) * 2);
// Fill mixer buffer
- FillMixerBuffer(stream_buffer_float, buffer_length);
+ MixSoundsAndUpdateOrganya(stream_buffer_long, buffer_length);
// Deinterlate samples, convert them to S16, and write them to the double-buffers
short *left_output_buffer = &stream_buffers[0][buffer_length * last_buffer];
short *right_output_buffer = &stream_buffers[1][buffer_length * last_buffer];
- float *mixer_buffer_pointer = stream_buffer_float;
+ long *mixer_buffer_pointer = stream_buffer_long;
short *left_output_buffer_pointer = left_output_buffer;
short *right_output_buffer_pointer = right_output_buffer;
for (unsigned int i = 0; i < buffer_length; ++i)
{
- float left_sample = *mixer_buffer_pointer++;
- float right_sample = *mixer_buffer_pointer++;
+ const long left_sample = *mixer_buffer_pointer++;
+ const long right_sample = *mixer_buffer_pointer++;
- // Clamp samples to sane limits
- if (left_sample < -1.0f)
- left_sample = -1.0f;
- else if (left_sample > 1.0f)
- left_sample = 1.0f;
+ // Clamp samples to sane limits, convert to S16, and store in double-buffers
+ if (left_sample > 0x7FFF)
+ *left_output_buffer_pointer++ = 0x7FFF;
+ else if (left_sample < -0x7FFF)
+ *left_output_buffer_pointer++ = -0x7FFF;
+ else
+ *left_output_buffer_pointer++ = (short)left_sample;
- if (right_sample < -1.0f)
- right_sample = -1.0f;
- else if (right_sample > 1.0f)
- right_sample = 1.0f;
-
- // Convert to S16 and store in double-buffers
- *left_output_buffer_pointer++ = (short)(left_sample * 32767.0f);
- *right_output_buffer_pointer++ = (short)(right_sample * 32767.0f);
+ if (right_sample > 0x7FFF)
+ *right_output_buffer_pointer++ = 0x7FFF;
+ else if (right_sample < -0x7FFF)
+ *right_output_buffer_pointer++ = -0x7FFF;
+ else
+ *right_output_buffer_pointer++ = (short)right_sample;
}
// Make sure the sound hardware can see our data
@@ -158,11 +157,11 @@
// Create and initialise two 'voices': each one will stream its own
// audio - one for the left speaker, and one for the right.
- // The software-mixer outputs interlaced float samples, so create
- // a buffer for it here.
- stream_buffer_float = (float*)malloc(buffer_length * sizeof(float) * 2); // `* 2` because it's an interlaced stereo buffer
+ // The software-mixer outputs interlaced samples into a buffer of `long`s,
+ // so create a buffer for it here.
+ stream_buffer_long = (long*)malloc(buffer_length * sizeof(long) * 2); // `* 2` because it's an interlaced stereo buffer
- if (stream_buffer_float != NULL)
+ if (stream_buffer_long != NULL)
{
stream_buffers[0] = (short*)malloc(buffer_length * sizeof(short) * 2); // `* 2` because it's a double-buffer
@@ -232,7 +231,7 @@
free(stream_buffers[0]);
}
- free(stream_buffer_float);
+ free(stream_buffer_long);
}
return false;