diff options
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/Mixer.cpp | 38 |
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) |
