summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Mixer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
-rw-r--r--Source/Core/AudioCommon/Mixer.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp
index 1229d8faa1..a57b6024b7 100644
--- a/Source/Core/AudioCommon/Mixer.cpp
+++ b/Source/Core/AudioCommon/Mixer.cpp
@@ -53,7 +53,8 @@ void Mixer::DoState(PointerWrap& p)
{
m_dma_mixer.DoState(p);
m_streaming_mixer.DoState(p);
- m_wiimote_speaker_mixer.DoState(p);
+ for (auto& mixer : m_wiimote_speaker_mixers)
+ mixer.DoState(p);
m_skylander_portal_mixer.DoState(p);
for (auto& mixer : m_gba_mixers)
mixer.DoState(p);
@@ -169,7 +170,11 @@ std::size_t Mixer::Mix(s16* samples, std::size_t num_samples)
m_dma_mixer.Mix(samples, num_samples);
m_streaming_mixer.Mix(samples, num_samples);
- m_wiimote_speaker_mixer.Mix(samples, num_samples);
+ for (std::size_t i = 0; i < m_wiimote_speaker_mixers.size(); ++i)
+ {
+ if (!m_config_wiimote_routing_enabled || !m_config_wiimote_output_enabled[i])
+ m_wiimote_speaker_mixers[i].Mix(samples, num_samples);
+ }
m_skylander_portal_mixer.Mix(samples, num_samples);
for (auto& mixer : m_gba_mixers)
mixer.Mix(samples, num_samples);
@@ -254,22 +259,33 @@ void Mixer::PushStreamingSamples(const s16* samples, std::size_t num_samples)
}
}
-void Mixer::PushWiimoteSpeakerSamples(const s16* samples, std::size_t num_samples,
- u32 sample_rate_divisor)
+void Mixer::PushWiimoteSpeakerSamples(std::size_t wiimote_index, const s16* samples,
+ std::size_t num_samples, u32 sample_rate_divisor)
{
- if (!IsOutputSampleRateValid())
+ if (!IsOutputSampleRateValid() || wiimote_index >= m_wiimote_speaker_mixers.size())
return;
// WiimoteEmu produces host-endian mono samples.
- m_wiimote_speaker_mixer.SetInputSampleRateDivisor(sample_rate_divisor);
+ m_wiimote_speaker_mixers[wiimote_index].SetInputSampleRateDivisor(sample_rate_divisor);
for (const s16 sample : std::span{samples, num_samples})
{
- m_wiimote_speaker_mixer.PushSample(sample, sample);
+ m_wiimote_speaker_mixers[wiimote_index].PushSample(sample, sample);
}
}
+std::size_t Mixer::MixWiimoteSpeaker(std::size_t wiimote_index, s16* samples,
+ std::size_t num_samples)
+{
+ if (!samples || wiimote_index >= m_wiimote_speaker_mixers.size())
+ return 0;
+
+ memset(samples, 0, num_samples * 2 * sizeof(s16));
+ m_wiimote_speaker_mixers[wiimote_index].Mix(samples, num_samples);
+ return num_samples;
+}
+
void Mixer::PushSkylanderPortalSamples(const u8* samples, std::size_t num_samples)
{
if (!IsOutputSampleRateValid())
@@ -322,9 +338,10 @@ void Mixer::SetStreamingVolume(u32 lvolume, u32 rvolume)
std::clamp<u32>(rvolume, 0x00, 0xff));
}
-void Mixer::SetWiimoteSpeakerVolume(u32 lvolume, u32 rvolume)
+void Mixer::SetWiimoteSpeakerVolume(std::size_t wiimote_index, u32 lvolume, u32 rvolume)
{
- m_wiimote_speaker_mixer.SetVolume(lvolume, rvolume);
+ if (wiimote_index < m_wiimote_speaker_mixers.size())
+ m_wiimote_speaker_mixers[wiimote_index].SetVolume(lvolume, rvolume);
}
void Mixer::SetGBAVolume(std::size_t device_number, u32 lvolume, u32 rvolume)
@@ -413,6 +430,9 @@ void Mixer::RefreshConfig()
m_config_audio_preserve_pitch = Config::Get(Config::MAIN_AUDIO_PRESERVE_PITCH);
m_config_fill_audio_gaps = Config::Get(Config::MAIN_AUDIO_FILL_GAPS);
m_config_audio_buffer_ms = Config::Get(Config::MAIN_AUDIO_BUFFER_SIZE);
+ m_config_wiimote_routing_enabled = Config::Get(Config::MAIN_WIIMOTE_AUDIO_ROUTING_ENABLED);
+ for (std::size_t i = 0; i < m_config_wiimote_output_enabled.size(); ++i)
+ m_config_wiimote_output_enabled[i] = Config::Get(Config::MAIN_WIIMOTE_AUDIO_OUTPUT_ENABLED[i]);
}
void Mixer::MixerFifo::DoState(PointerWrap& p)