Skip to content

Commit

Permalink
audio/wiiu: Add maps for mono and stereo audio
Browse files Browse the repository at this point in the history
  • Loading branch information
ashquarky committed Nov 21, 2019
1 parent f7568b7 commit 71e6352
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 27 deletions.
44 changes: 17 additions & 27 deletions src/audio/wiiu/SDL_wiiuaudio.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "../SDL_audiodev_c.h"
#include "../SDL_sysaudio.h"
#include "SDL_wiiuaudio.h"
#include "SDL_wiiuaudio_mix.h"

#include <sndcore2/core.h>
#include <sndcore2/voice.h>
Expand Down Expand Up @@ -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;

Expand All @@ -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? */
Expand Down Expand Up @@ -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
Expand Down
65 changes: 65 additions & 0 deletions src/audio/wiiu/SDL_wiiuaudio_mix.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
Simple DirectMedia Layer
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
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_

0 comments on commit 71e6352

Please sign in to comment.