Skip to content

Commit c9c7afa

Browse files
committed
make portal audio a setting
1 parent 317e44c commit c9c7afa

File tree

8 files changed

+193
-48
lines changed

8 files changed

+193
-48
lines changed

src/Cafe/HW/Latte/Core/LatteShaderCache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class BootSoundPlayer
209209

210210
try
211211
{
212-
bootSndAudioDev = IAudioAPI::CreateDeviceFromConfig(true, sampleRate, nChannels, samplesPerBlock, bitsPerSample);
212+
bootSndAudioDev = IAudioAPI::CreateDeviceFromConfig(IAudioAPI::AudioType::TV, sampleRate, nChannels, samplesPerBlock, bitsPerSample);
213213
if(!bootSndAudioDev)
214214
return;
215215
}

src/Cafe/OS/libs/nsyshid/Skylander.cpp

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -566,28 +566,9 @@ namespace nsyshid
566566

567567
if (!g_portalAudio)
568568
{
569-
auto& config = GetConfig();
570-
auto& selectedDevice = L"default";
571-
572-
const auto audio_api = (IAudioAPI::AudioAPI)config.audio_api;
573-
IAudioAPI::DeviceDescriptionPtr device_description;
574-
if (IAudioAPI::IsAudioAPIAvailable(audio_api))
575-
{
576-
auto devices = IAudioAPI::GetDevices(audio_api);
577-
const auto it = std::find_if(devices.begin(), devices.end(), [&selectedDevice](const auto& d) {
578-
return d->GetIdentifier() == selectedDevice;
579-
});
580-
if (it != devices.end())
581-
{
582-
device_description = *it;
583-
}
584-
}
585-
if (!device_description)
586-
throw std::runtime_error("failed to find selected device while trying to create audio device");
587-
588569
// Portal audio is mono channel, 16 bit audio.
589570
// Audio is unsigned 16 bit, supplied as 64 bytes which is 32 samples per block
590-
g_portalAudio = IAudioAPI::CreateDevice((IAudioAPI::AudioAPI)GetConfig().audio_api, device_description, 8000, 1, 32, 16);
571+
g_portalAudio = IAudioAPI::CreateDeviceFromConfig(IAudioAPI::AudioType::Portal, 8000, 32, 16);
591572
}
592573
std::array<sint16, 32> mono_samples;
593574
for (unsigned int i = 0; i < mono_samples.size(); ++i)

src/Cafe/OS/libs/snd_core/ax_out.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ namespace snd_core
404404
{
405405
try
406406
{
407-
g_tvAudio = IAudioAPI::CreateDeviceFromConfig(true, 48000, snd_core::AX_SAMPLES_PER_3MS_48KHZ * AX_FRAMES_PER_GROUP, 16);
407+
g_tvAudio = IAudioAPI::CreateDeviceFromConfig(IAudioAPI::AudioType::TV, 48000, snd_core::AX_SAMPLES_PER_3MS_48KHZ * AX_FRAMES_PER_GROUP, 16);
408408
}
409409
catch (std::runtime_error& ex)
410410
{
@@ -417,7 +417,7 @@ namespace snd_core
417417
{
418418
try
419419
{
420-
g_padAudio = IAudioAPI::CreateDeviceFromConfig(false, 48000, snd_core::AX_SAMPLES_PER_3MS_48KHZ * AX_FRAMES_PER_GROUP, 16);
420+
g_padAudio = IAudioAPI::CreateDeviceFromConfig(IAudioAPI::AudioType::Gamepad, 48000, snd_core::AX_SAMPLES_PER_3MS_48KHZ * AX_FRAMES_PER_GROUP, 16);
421421
if(g_padAudio)
422422
g_padVolume = g_padAudio->GetVolume();
423423
}
@@ -442,6 +442,11 @@ namespace snd_core
442442
g_padAudio->Stop();
443443
g_padAudio.reset();
444444
}
445+
if (g_portalAudio)
446+
{
447+
g_portalAudio->Stop();
448+
g_portalAudio.reset();
449+
}
445450
}
446451

447452
void AXOut_updateDevicePlayState(bool isPlaying)

src/audio/IAudioAPI.cpp

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ uint32 IAudioAPI::s_audioDelay = 2;
2020
std::array<bool, IAudioAPI::AudioAPIEnd> IAudioAPI::s_availableApis{};
2121

2222
IAudioAPI::IAudioAPI(uint32 samplerate, uint32 channels, uint32 samples_per_block, uint32 bits_per_sample)
23-
: m_samplerate(samplerate), m_channels(channels), m_samplesPerBlock(samples_per_block), m_bitsPerSample(bits_per_sample)
23+
: m_samplerate(samplerate), m_channels(channels), m_samplesPerBlock(samples_per_block), m_bitsPerSample(bits_per_sample)
2424
{
2525
m_bytesPerBlock = samples_per_block * channels * (bits_per_sample / 8);
2626
InitWFX(m_samplerate, m_channels, m_bitsPerSample);
@@ -81,7 +81,7 @@ void IAudioAPI::InitializeStatic()
8181
#if BOOST_OS_WINDOWS
8282
s_availableApis[DirectSound] = true;
8383
s_availableApis[XAudio2] = XAudio2API::InitializeStatic();
84-
if(!s_availableApis[XAudio2]) // don't try to initialize the older lib if the newer version is available
84+
if (!s_availableApis[XAudio2]) // don't try to initialize the older lib if the newer version is available
8585
s_availableApis[XAudio27] = XAudio27API::InitializeStatic();
8686
#endif
8787
#if HAS_CUBEB
@@ -98,30 +98,29 @@ bool IAudioAPI::IsAudioAPIAvailable(AudioAPI api)
9898
return false;
9999
}
100100

101-
AudioAPIPtr IAudioAPI::CreateDeviceFromConfig(bool TV, sint32 rate, sint32 samples_per_block, sint32 bits_per_sample)
101+
AudioAPIPtr IAudioAPI::CreateDeviceFromConfig(AudioType type, sint32 rate, sint32 samples_per_block, sint32 bits_per_sample)
102102
{
103-
auto& config = GetConfig();
104-
sint32 channels = CemuConfig::AudioChannelsToNChannels(TV ? config.tv_channels : config.pad_channels);
103+
sint32 channels = CemuConfig::AudioChannelsToNChannels(AudioTypeToChannels(type));
105104
return CreateDeviceFromConfig(TV, rate, channels, samples_per_block, bits_per_sample);
106105
}
107106

108-
AudioAPIPtr IAudioAPI::CreateDeviceFromConfig(bool TV, sint32 rate, sint32 channels, sint32 samples_per_block, sint32 bits_per_sample)
107+
AudioAPIPtr IAudioAPI::CreateDeviceFromConfig(AudioType type, sint32 rate, sint32 channels, sint32 samples_per_block, sint32 bits_per_sample)
109108
{
110109
AudioAPIPtr audioAPIDev;
111110

112111
auto& config = GetConfig();
113112

114113
const auto audio_api = (IAudioAPI::AudioAPI)config.audio_api;
115-
auto& selectedDevice = TV ? config.tv_device : config.pad_device;
114+
auto selectedDevice = GetDeviceFromType(type);
116115

117-
if(selectedDevice.empty())
116+
if (selectedDevice.empty())
118117
return {};
119118

120119
IAudioAPI::DeviceDescriptionPtr device_description;
121120
if (IAudioAPI::IsAudioAPIAvailable(audio_api))
122121
{
123122
auto devices = IAudioAPI::GetDevices(audio_api);
124-
const auto it = std::find_if(devices.begin(), devices.end(), [&selectedDevice](const auto& d) {return d->GetIdentifier() == selectedDevice; });
123+
const auto it = std::find_if(devices.begin(), devices.end(), [&selectedDevice](const auto& d) { return d->GetIdentifier() == selectedDevice; });
125124
if (it != devices.end())
126125
device_description = *it;
127126
}
@@ -138,7 +137,7 @@ AudioAPIPtr IAudioAPI::CreateDevice(AudioAPI api, const DeviceDescriptionPtr& de
138137
if (!IsAudioAPIAvailable(api))
139138
return {};
140139

141-
switch(api)
140+
switch (api)
142141
{
143142
#if BOOST_OS_WINDOWS
144143
case DirectSound:
@@ -158,11 +157,11 @@ AudioAPIPtr IAudioAPI::CreateDevice(AudioAPI api, const DeviceDescriptionPtr& de
158157
}
159158
#endif
160159
#if HAS_CUBEB
161-
case Cubeb:
162-
{
163-
const auto tmp = std::dynamic_pointer_cast<CubebAPI::CubebDeviceDescription>(device);
164-
return std::make_unique<CubebAPI>(tmp->GetDeviceId(), samplerate, channels, samples_per_block, bits_per_sample);
165-
}
160+
case Cubeb:
161+
{
162+
const auto tmp = std::dynamic_pointer_cast<CubebAPI::CubebDeviceDescription>(device);
163+
return std::make_unique<CubebAPI>(tmp->GetDeviceId(), samplerate, channels, samples_per_block, bits_per_sample);
164+
}
166165
#endif
167166
default:
168167
throw std::runtime_error(fmt::format("invalid audio api: {}", api));
@@ -173,8 +172,8 @@ std::vector<IAudioAPI::DeviceDescriptionPtr> IAudioAPI::GetDevices(AudioAPI api)
173172
{
174173
if (!IsAudioAPIAvailable(api))
175174
return {};
176-
177-
switch(api)
175+
176+
switch (api)
178177
{
179178
#if BOOST_OS_WINDOWS
180179
case DirectSound:
@@ -210,3 +209,35 @@ uint32 IAudioAPI::GetAudioDelay() const
210209
{
211210
return m_audioDelayOverride > 0 ? m_audioDelayOverride : s_audioDelay;
212211
}
212+
213+
AudioChannels IAudioAPI::AudioTypeToChannels(AudioType type)
214+
{
215+
auto& config = GetConfig();
216+
switch (type)
217+
{
218+
case TV:
219+
return config.tv_channels;
220+
case Gamepad:
221+
return config.pad_channels;
222+
case Portal:
223+
return config.portal_channels;
224+
default:
225+
return kMono;
226+
}
227+
}
228+
229+
std::wstring IAudioAPI::GetDeviceFromType(AudioType type)
230+
{
231+
auto& config = GetConfig();
232+
switch (type)
233+
{
234+
case TV:
235+
return config.tv_device;
236+
case Gamepad:
237+
return config.pad_device;
238+
case Portal:
239+
return config.portal_device;
240+
default:
241+
return L"";
242+
}
243+
}

src/audio/IAudioAPI.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <mmreg.h>
55
#endif
66

7+
#include "config/CemuConfig.h"
8+
79
class IAudioAPI
810
{
911
friend class GeneralSettings2;
@@ -30,6 +32,13 @@ class IAudioAPI
3032

3133
using DeviceDescriptionPtr = std::shared_ptr<DeviceDescription>;
3234

35+
enum AudioType
36+
{
37+
TV = 0,
38+
Gamepad,
39+
Portal
40+
};
41+
3342
enum AudioAPI
3443
{
3544
DirectSound = 0,
@@ -62,8 +71,8 @@ class IAudioAPI
6271
static void InitializeStatic();
6372
static bool IsAudioAPIAvailable(AudioAPI api);
6473

65-
static std::unique_ptr<IAudioAPI> CreateDeviceFromConfig(bool TV, sint32 rate, sint32 samples_per_block, sint32 bits_per_sample);
66-
static std::unique_ptr<IAudioAPI> CreateDeviceFromConfig(bool TV, sint32 rate, sint32 channels, sint32 samples_per_block, sint32 bits_per_sample);
74+
static std::unique_ptr<IAudioAPI> CreateDeviceFromConfig(AudioType type, sint32 rate, sint32 samples_per_block, sint32 bits_per_sample);
75+
static std::unique_ptr<IAudioAPI> CreateDeviceFromConfig(AudioType type, sint32 rate, sint32 channels, sint32 samples_per_block, sint32 bits_per_sample);
6776
static std::unique_ptr<IAudioAPI> CreateDevice(AudioAPI api, const DeviceDescriptionPtr& device, sint32 samplerate, sint32 channels, sint32 samples_per_block, sint32 bits_per_sample);
6877
static std::vector<DeviceDescriptionPtr> GetDevices(AudioAPI api);
6978

@@ -84,6 +93,8 @@ class IAudioAPI
8493
private:
8594
static uint32 s_audioDelay;
8695
void InitWFX(sint32 samplerate, sint32 channels, sint32 bits_per_sample);
96+
static AudioChannels AudioTypeToChannels(AudioType type);
97+
static std::wstring GetDeviceFromType(AudioType type);
8798

8899
};
89100

src/config/CemuConfig.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,9 +479,9 @@ struct CemuConfig
479479
// audio
480480
sint32 audio_api = 0;
481481
sint32 audio_delay = 2;
482-
AudioChannels tv_channels = kStereo, pad_channels = kStereo, input_channels = kMono;
483-
sint32 tv_volume = 50, pad_volume = 0, input_volume = 50;
484-
std::wstring tv_device{ L"default" }, pad_device, input_device;
482+
AudioChannels tv_channels = kStereo, pad_channels = kStereo, input_channels = kMono, portal_channels = kMono;
483+
sint32 tv_volume = 50, pad_volume = 0, input_volume = 50, portal_volume = 50;
484+
std::wstring tv_device{ L"default" }, pad_device, input_device, portal_device;
485485

486486
// account
487487
struct

0 commit comments

Comments
 (0)