diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index 70accf240f..0a71fbd98b 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -121,6 +121,7 @@ unsigned int CMixer::Mix(short* samples, unsigned int num_samples, bool consider m_dma_mixer.Mix(samples, num_samples, consider_framelimit); m_streaming_mixer.Mix(samples, num_samples, consider_framelimit); + m_wiimote_speaker_mixer.Mix(samples, num_samples, consider_framelimit); if (m_logAudio) g_wave_writer.AddStereoSamples(samples, num_samples); return num_samples; @@ -167,6 +168,31 @@ void CMixer::PushStreamingSamples(const short *samples, unsigned int num_samples m_streaming_mixer.PushSamples(samples, num_samples); } +void CMixer::PushWiimoteSpeakerSamples(const short *samples, unsigned int num_samples, unsigned int sample_rate, const u8 wiimote_index) +{ + short samples_stereo[MAX_SAMPLES * 2]; + + if (num_samples < MAX_SAMPLES) + { + m_wiimote_speaker_mixer.SetInputSampleRate(sample_rate); + + for (unsigned int i = 0; i < num_samples; ++i) + { + // Position the Wiimotes as follow + // Wiimote 0 = Center + // Wiimote 1 = Left + // Wiimote 2 = Right + // Wiimote 3 = Center + if (wiimote_index != 2) + samples_stereo[i * 2] = Common::swap16(samples[i]); + if (wiimote_index != 1) + samples_stereo[i * 2 + 1] = Common::swap16(samples[i]); + } + + m_wiimote_speaker_mixer.PushSamples(samples_stereo, num_samples); + } +} + void CMixer::SetDMAInputSampleRate(unsigned int rate) { m_dma_mixer.SetInputSampleRate(rate); @@ -182,6 +208,11 @@ void CMixer::SetStreamingVolume(unsigned int lvolume, unsigned int rvolume) m_streaming_mixer.SetVolume(lvolume, rvolume); } +void CMixer::SetWiimoteSpeakerVolume(unsigned int lvolume, unsigned int rvolume) +{ + m_wiimote_speaker_mixer.SetVolume(lvolume, rvolume); +} + void CMixer::MixerFifo::SetInputSampleRate(unsigned int rate) { m_input_sample_rate = rate; diff --git a/Source/Core/AudioCommon/Mixer.h b/Source/Core/AudioCommon/Mixer.h index 806e6aa83a..f12066d22f 100644 --- a/Source/Core/AudioCommon/Mixer.h +++ b/Source/Core/AudioCommon/Mixer.h @@ -24,6 +24,7 @@ public: CMixer(unsigned int BackendSampleRate) : m_dma_mixer(this, 32000) , m_streaming_mixer(this, 48000) + , m_wiimote_speaker_mixer(this, 3000) , m_sampleRate(BackendSampleRate) , m_logAudio(0) , m_speed(0) @@ -39,11 +40,13 @@ public: // Called from main thread virtual void PushSamples(const short* samples, unsigned int num_samples); virtual void PushStreamingSamples(const short* samples, unsigned int num_samples); + virtual void PushWiimoteSpeakerSamples(const short* samples, unsigned int num_samples, unsigned int sample_rate, const u8 wiimote_index); unsigned int GetSampleRate() const { return m_sampleRate; } void SetDMAInputSampleRate(unsigned int rate); void SetStreamInputSampleRate(unsigned int rate); void SetStreamingVolume(unsigned int lvolume, unsigned int rvolume); + void SetWiimoteSpeakerVolume(unsigned int lvolume, unsigned int rvolume); virtual void StartLogAudio(const std::string& filename) { @@ -112,6 +115,7 @@ protected: }; MixerFifo m_dma_mixer; MixerFifo m_streaming_mixer; + MixerFifo m_wiimote_speaker_mixer; unsigned int m_sampleRate; WaveFileWriter g_wave_writer; diff --git a/Source/Core/Core/HW/WiimoteEmu/Speaker.cpp b/Source/Core/Core/HW/WiimoteEmu/Speaker.cpp index 97e6df5b15..a0e374cf23 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Speaker.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Speaker.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include "AudioCommon/AudioCommon.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h" //#define WIIMOTE_SPEAKER_DUMP @@ -64,6 +65,9 @@ void stopdamnwav(){wav.Stop();ofile.close();} void Wiimote::SpeakerData(wm_speaker_data* sd) { + if (!SConfig::GetInstance().m_WiimoteEnableSpeaker) + return; + // TODO consider using static max size instead of new s16 *samples = new s16[sd->length * 2]; @@ -74,6 +78,8 @@ void Wiimote::SpeakerData(wm_speaker_data* sd) { samples[i] = (s16)(s8)sd->data[i]; } + soundStream->GetMixer()->SetWiimoteSpeakerVolume(256, 256); + soundStream->GetMixer()->PushWiimoteSpeakerSamples(samples, sd->length, 1500, m_index); } else if (m_reg_speaker.format == 0x00) { @@ -83,6 +89,8 @@ void Wiimote::SpeakerData(wm_speaker_data* sd) samples[i * 2] = adpcm_yamaha_expand_nibble(m_adpcm_state, (sd->data[i] >> 4) & 0xf); samples[i * 2 + 1] = adpcm_yamaha_expand_nibble(m_adpcm_state, sd->data[i] & 0xf); } + soundStream->GetMixer()->SetWiimoteSpeakerVolume(256, 256); + soundStream->GetMixer()->PushWiimoteSpeakerSamples(samples, sd->length, 3000, m_index); } #ifdef WIIMOTE_SPEAKER_DUMP diff --git a/Source/Core/DolphinWX/WiimoteConfigDiag.cpp b/Source/Core/DolphinWX/WiimoteConfigDiag.cpp index 54b9beb6dd..984f8cf0f2 100644 --- a/Source/Core/DolphinWX/WiimoteConfigDiag.cpp +++ b/Source/Core/DolphinWX/WiimoteConfigDiag.cpp @@ -113,15 +113,10 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputConfig& config continuous_scanning->Bind(wxEVT_CHECKBOX, &WiimoteConfigDiag::OnContinuousScanning, this); continuous_scanning->SetValue(SConfig::GetInstance().m_WiimoteContinuousScanning); - auto wiimote_speaker = new wxCheckBox(this, wxID_ANY, _("Enable Speaker Data")); - wiimote_speaker->Bind(wxEVT_CHECKBOX, &WiimoteConfigDiag::OnEnableSpeaker, this); - wiimote_speaker->SetValue(SConfig::GetInstance().m_WiimoteEnableSpeaker); - real_wiimotes_sizer->Add(continuous_scanning, 0, wxALIGN_CENTER_VERTICAL); real_wiimotes_sizer->AddStretchSpacer(1); real_wiimotes_sizer->Add(refresh_btn, 0, wxALL | wxALIGN_CENTER, 5); - real_wiimotes_group->Add(wiimote_speaker, 0); real_wiimotes_group->Add(real_wiimotes_sizer, 0, wxEXPAND); // "General Settings" controls @@ -131,6 +126,10 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputConfig& config wxSlider* const WiimoteSpkVolume = new wxSlider(this, wxID_ANY, 0, 0, 127); wxCheckBox* const WiimoteMotor = new wxCheckBox(this, wxID_ANY, _("Wiimote Motor")); + auto wiimote_speaker = new wxCheckBox(this, wxID_ANY, _("Enable Speaker Data")); + wiimote_speaker->Bind(wxEVT_CHECKBOX, &WiimoteConfigDiag::OnEnableSpeaker, this); + wiimote_speaker->SetValue(SConfig::GetInstance().m_WiimoteEnableSpeaker); + wxStaticText* const WiiSensBarPosText = new wxStaticText(this, wxID_ANY, _("Sensor Bar Position:")); wxStaticText* const WiiSensBarSensText = new wxStaticText(this, wxID_ANY, _("IR Sensitivity:")); wxStaticText* const WiiSensBarSensMinText = new wxStaticText(this, wxID_ANY, _("Min")); @@ -204,6 +203,7 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputConfig& config wxGridSizer* const general_wiimote_sizer = new wxGridSizer(1, 5, 5); general_wiimote_sizer->Add(WiimoteMotor); + general_wiimote_sizer->Add(wiimote_speaker, 0); general_sizer->Add(choice_sizer); general_sizer->Add(general_wiimote_sizer);