From 531a3ed09a85f646aff5dfb5754f0a2147842518 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 14 Jan 2016 00:58:01 -0500 Subject: [PATCH 1/3] Mixer: Devirtualize Nothing in the codebase inherits from this class --- Source/Core/AudioCommon/Mixer.cpp | 4 ++++ Source/Core/AudioCommon/Mixer.h | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index 5d1207bbe3..eff1dbe584 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -31,6 +31,10 @@ CMixer::CMixer(unsigned int BackendSampleRate) INFO_LOG(AUDIO_INTERFACE, "Mixer is initialized"); } +CMixer::~CMixer() +{ +} + // Executed from sound stream thread unsigned int CMixer::MixerFifo::Mix(short* samples, unsigned int numSamples, bool consider_framelimit) { diff --git a/Source/Core/AudioCommon/Mixer.h b/Source/Core/AudioCommon/Mixer.h index 4ced71f360..75e47d9aef 100644 --- a/Source/Core/AudioCommon/Mixer.h +++ b/Source/Core/AudioCommon/Mixer.h @@ -18,19 +18,19 @@ #define CONTROL_FACTOR 0.2f // in freq_shift per fifo size offset #define CONTROL_AVG 32 -class CMixer +class CMixer final { public: - CMixer(unsigned int BackendSampleRate); - virtual ~CMixer() {} + explicit CMixer(unsigned int BackendSampleRate); + ~CMixer(); // Called from audio threads - virtual unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true); + unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true); // 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); + void PushSamples(const short* samples, unsigned int num_samples); + void PushStreamingSamples(const short* samples, unsigned int num_samples); + void PushWiimoteSpeakerSamples(const short* samples, unsigned int num_samples, unsigned int sample_rate); unsigned int GetSampleRate() const { return m_sampleRate; } void SetDMAInputSampleRate(unsigned int rate); @@ -47,8 +47,9 @@ public: float GetCurrentSpeed() const { return m_speed.load(); } void UpdateSpeed(float val) { m_speed.store(val); } -protected: - class MixerFifo { +private: + class MixerFifo final + { public: MixerFifo(CMixer *mixer, unsigned sample_rate) : m_mixer(mixer) From fc6a2f490ffe9bfcf68d56549b4887e6ff5aa515 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 14 Jan 2016 01:19:25 -0500 Subject: [PATCH 2/3] Mixer: Directly initialize class members --- Source/Core/AudioCommon/Mixer.cpp | 14 +++-------- Source/Core/AudioCommon/Mixer.h | 42 +++++++++++++------------------ 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index eff1dbe584..505a3b2551 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -6,11 +6,11 @@ #include "AudioCommon/AudioCommon.h" #include "AudioCommon/Mixer.h" -#include "Common/CPUDetect.h" +#include "Common/CommonFuncs.h" +#include "Common/CommonTypes.h" #include "Common/MathUtil.h" +#include "Common/Logging/Log.h" #include "Core/ConfigManager.h" -#include "Core/Core.h" -#include "Core/HW/AudioInterface.h" // UGLINESS #include "Core/PowerPC/PowerPC.h" @@ -20,13 +20,7 @@ #endif CMixer::CMixer(unsigned int BackendSampleRate) - : m_dma_mixer(this, 32000) - , m_streaming_mixer(this, 48000) - , m_wiimote_speaker_mixer(this, 3000) - , m_sampleRate(BackendSampleRate) - , m_log_dtk_audio(false) - , m_log_dsp_audio(false) - , m_speed(0) + : m_sampleRate(BackendSampleRate) { INFO_LOG(AUDIO_INTERFACE, "Mixer is initialized"); } diff --git a/Source/Core/AudioCommon/Mixer.h b/Source/Core/AudioCommon/Mixer.h index 75e47d9aef..be3d9f33c9 100644 --- a/Source/Core/AudioCommon/Mixer.h +++ b/Source/Core/AudioCommon/Mixer.h @@ -4,11 +4,11 @@ #pragma once +#include #include -#include -#include #include "AudioCommon/WaveFile.h" +#include "Common/CommonTypes.h" // 16 bit Stereo #define MAX_SAMPLES (1024 * 4) // 128 ms @@ -51,44 +51,38 @@ private: class MixerFifo final { public: - MixerFifo(CMixer *mixer, unsigned sample_rate) + MixerFifo(CMixer* mixer, unsigned sample_rate) : m_mixer(mixer) , m_input_sample_rate(sample_rate) - , m_indexW(0) - , m_indexR(0) - , m_LVolume(256) - , m_RVolume(256) - , m_numLeftI(0.0f) - , m_frac(0) { - memset(m_buffer, 0, sizeof(m_buffer)); } void PushSamples(const short* samples, unsigned int num_samples); unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true); void SetInputSampleRate(unsigned int rate); void SetVolume(unsigned int lvolume, unsigned int rvolume); private: - CMixer *m_mixer; + CMixer* m_mixer; unsigned m_input_sample_rate; - short m_buffer[MAX_SAMPLES * 2]; - std::atomic m_indexW; - std::atomic m_indexR; + std::array m_buffer{}; + std::atomic m_indexW{0}; + std::atomic m_indexR{0}; // Volume ranges from 0-256 - std::atomic m_LVolume; - std::atomic m_RVolume; - float m_numLeftI; - u32 m_frac; + std::atomic m_LVolume{256}; + std::atomic m_RVolume{256}; + float m_numLeftI = 0.0f; + u32 m_frac = 0; }; - MixerFifo m_dma_mixer; - MixerFifo m_streaming_mixer; - MixerFifo m_wiimote_speaker_mixer; + MixerFifo m_dma_mixer{this, 32000}; + MixerFifo m_streaming_mixer{this, 48000}; + MixerFifo m_wiimote_speaker_mixer{this, 3000}; unsigned int m_sampleRate; WaveFileWriter m_wave_writer_dtk; WaveFileWriter m_wave_writer_dsp; - bool m_log_dtk_audio; - bool m_log_dsp_audio; + bool m_log_dtk_audio = false; + bool m_log_dsp_audio = false; - std::atomic m_speed; // Current rate of the emulation (1.0 = 100% speed) + // Current rate of emulation (1.0 = 100% speed) + std::atomic m_speed{0.0f}; }; From c70487163f3e67633170e10a513d936e4f033f71 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 14 Jan 2016 03:00:47 -0500 Subject: [PATCH 3/3] Mixer: Convert defines into concrete variables Gets defines out of global scope. --- Source/Core/AudioCommon/Mixer.cpp | 2 +- Source/Core/AudioCommon/Mixer.h | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index 505a3b2551..f35a671094 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -44,7 +44,7 @@ unsigned int CMixer::MixerFifo::Mix(short* samples, unsigned int numSamples, boo u32 indexR = m_indexR.load(); u32 indexW = m_indexW.load(); - int low_waterwark = m_input_sample_rate * SConfig::GetInstance().iTimingVariance / 1000; + u32 low_waterwark = m_input_sample_rate * SConfig::GetInstance().iTimingVariance / 1000; low_waterwark = std::min(low_waterwark, MAX_SAMPLES / 2); float numLeft = (float)(((indexW - indexR) & INDEX_MASK) / 2); diff --git a/Source/Core/AudioCommon/Mixer.h b/Source/Core/AudioCommon/Mixer.h index be3d9f33c9..008e059e44 100644 --- a/Source/Core/AudioCommon/Mixer.h +++ b/Source/Core/AudioCommon/Mixer.h @@ -10,14 +10,6 @@ #include "AudioCommon/WaveFile.h" #include "Common/CommonTypes.h" -// 16 bit Stereo -#define MAX_SAMPLES (1024 * 4) // 128 ms -#define INDEX_MASK (MAX_SAMPLES * 2 - 1) - -#define MAX_FREQ_SHIFT 200 // per 32000 Hz -#define CONTROL_FACTOR 0.2f // in freq_shift per fifo size offset -#define CONTROL_AVG 32 - class CMixer final { public: @@ -48,6 +40,12 @@ public: void UpdateSpeed(float val) { m_speed.store(val); } private: + static constexpr u32 MAX_SAMPLES = 1024 * 4; // 128 ms + static constexpr u32 INDEX_MASK = MAX_SAMPLES * 2 - 1; + static constexpr int MAX_FREQ_SHIFT = 200; // Per 32000 Hz + static constexpr float CONTROL_FACTOR = 0.2f; + static constexpr u32 CONTROL_AVG = 32; // In freq_shift per FIFO size offset + class MixerFifo final { public: