From 71e63524fcdd7bd44f7291e58d381eaa6e0ed958 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Thu, 21 Nov 2019 13:38:45 +1100 Subject: [PATCH] audio/wiiu: Add maps for mono and stereo audio --- src/audio/wiiu/SDL_wiiuaudio.c | 44 ++++++++------------ src/audio/wiiu/SDL_wiiuaudio_mix.h | 65 ++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 src/audio/wiiu/SDL_wiiuaudio_mix.h diff --git a/src/audio/wiiu/SDL_wiiuaudio.c b/src/audio/wiiu/SDL_wiiuaudio.c index ce2acdc0b..bce47b412 100644 --- a/src/audio/wiiu/SDL_wiiuaudio.c +++ b/src/audio/wiiu/SDL_wiiuaudio.c @@ -31,6 +31,7 @@ #include "../SDL_audiodev_c.h" #include "../SDL_sysaudio.h" #include "SDL_wiiuaudio.h" +#include "SDL_wiiuaudio_mix.h" #include #include @@ -63,24 +64,6 @@ static int WIIUAUDIO_OpenDevice(_THIS, void* handle, const char* devname, int is AXVoiceVeData vol = { .volume = 0x8000, }; - //TODO: AXGetDeviceChannelCount. For now we'll use Decaf's values and - //configure for stereo (muted surrounds). - //According to Decaf, the TV has 6 channels and the gamepad has 4. We set up - //both arrays with 6, the Gamepad callbacks just won't use the whole buffer. - AXVoiceDeviceMixData l_mix[6] = { - [0] = { // left channel - .bus = { - { .volume = 0x8000 }, //bus 0 (master) - } - }, - }; - AXVoiceDeviceMixData r_mix[6] = { - [1] = { //right channel - .bus = { - { .volume = 0x8000 }, //bus 0 (master) - } - }, - }; uint32_t old_affinity; float srcratio; @@ -102,9 +85,9 @@ static int WIIUAUDIO_OpenDevice(_THIS, void* handle, const char* devname, int is AXInitWithParams(&initparams); } else printf("DEBUG: AX already up?\n"); -/* Stereo only for now TODO */ if (this->spec.channels < 1) this->spec.channels = 1; - if (this->spec.channels > 2) this->spec.channels = 2; + if (this->spec.channels > WIIU_MAX_VALID_CHANNELS) + this->spec.channels = WIIU_MAX_VALID_CHANNELS; /* Force wiiu-compatible audio formats. TODO verify - unsigned or signed? */ @@ -163,14 +146,21 @@ static int WIIUAUDIO_OpenDevice(_THIS, void* handle, const char* devname, int is AXVoiceBegin(this->hidden->voice[i]); AXSetVoiceType(this->hidden->voice[i], 0); - /* Set the voice's volume. TODO temp hack for l/r pan, make actual maps */ + /* Set the voice's volume. */ AXSetVoiceVe(this->hidden->voice[i], &vol); - if (i == 0) { - AXSetVoiceDeviceMix(this->hidden->voice[i], AX_DEVICE_TYPE_DRC, 0, l_mix); - AXSetVoiceDeviceMix(this->hidden->voice[i], AX_DEVICE_TYPE_TV, 0, l_mix); - } else { - AXSetVoiceDeviceMix(this->hidden->voice[i], AX_DEVICE_TYPE_DRC, 0, r_mix); - AXSetVoiceDeviceMix(this->hidden->voice[i], AX_DEVICE_TYPE_TV, 0, r_mix); + switch (this->spec.channels) { + case 1: /* mono */ { + AXSetVoiceDeviceMix(this->hidden->voice[i], + AX_DEVICE_TYPE_DRC, 0, mono_mix[i]); + AXSetVoiceDeviceMix(this->hidden->voice[i], + AX_DEVICE_TYPE_TV, 0, mono_mix[i]); + } break; + case 2: /* stereo */ { + AXSetVoiceDeviceMix(this->hidden->voice[i], + AX_DEVICE_TYPE_DRC, 0, stereo_mix[i]); + AXSetVoiceDeviceMix(this->hidden->voice[i], + AX_DEVICE_TYPE_TV, 0, stereo_mix[i]); + } break; } /* Set the samplerate conversion ratio diff --git a/src/audio/wiiu/SDL_wiiuaudio_mix.h b/src/audio/wiiu/SDL_wiiuaudio_mix.h new file mode 100644 index 000000000..57b661c89 --- /dev/null +++ b/src/audio/wiiu/SDL_wiiuaudio_mix.h @@ -0,0 +1,65 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2018 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_wiiuaudio_mix_h_ +#define SDL_wiiuaudio_mix_h_ + +/* Some defines to help make the code below more readable */ +#define AX_VOICE(x) x +#define AX_CHANNEL_LEFT 0 +#define AX_CHANNEL_RIGHT 1 +#define AX_BUS_MASTER 0 + +/* TODO: AXGetDeviceChannelCount. For now we'll use Decaf's values. + * According to Decaf, the TV has 6 channels and the gamepad has 4. We set up + * both arrays with 6, the Gamepad callbacks just won't use the whole buffer. */ +#define AX_NUM_CHANNELS 6 + +static AXVoiceDeviceMixData stereo_mix[2 /* voices */][AX_NUM_CHANNELS] = { + [AX_VOICE(0)] = { + [AX_CHANNEL_LEFT] = { + .bus = { + [AX_BUS_MASTER] = { .volume = 0x8000 }, + } + }, + }, + [AX_VOICE(1)] = { + [AX_CHANNEL_RIGHT] = { + .bus = { + [AX_BUS_MASTER] = { .volume = 0x8000 }, + } + }, + }, +}; +static AXVoiceDeviceMixData mono_mix[1 /* voice */][AX_NUM_CHANNELS] = { + [AX_VOICE(0)] = { + [AX_CHANNEL_LEFT] = { .bus = { + [AX_BUS_MASTER] = { .volume = 0x8000 }, + }}, + [AX_CHANNEL_RIGHT] = { .bus = { + [AX_BUS_MASTER] = { .volume = 0x8000 }, + }}, + }, +}; + +#define WIIU_MAX_VALID_CHANNELS 2 + +#endif //SDL_wiiuaudio_mix_h_