summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Mixer.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2021-07-21 02:36:43 -0400
committerGitHub <noreply@github.com>2021-07-21 02:36:43 -0400
commita1e806ed76e6746259a730a5db82052b53f084f1 (patch)
treee2246fc40dab5a0ae32bad834fbc96fe5533a8e5 /Source/Core/AudioCommon/Mixer.cpp
parentb515786c8dd94aac73e59003d9c232bd319ae1bd (diff)
parentb8f0e97c025dc7a50c7c729185195b3577321987 (diff)
Merge pull request #9600 from Bonta0/mgba-pr
Full GBA Controllers Integration with mGBA
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
-rw-r--r--Source/Core/AudioCommon/Mixer.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp
index ae8ba47d00..e50d90b32b 100644
--- a/Source/Core/AudioCommon/Mixer.cpp
+++ b/Source/Core/AudioCommon/Mixer.cpp
@@ -47,6 +47,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_gba_mixers)
+ mixer.DoState(p);
}
// Executed from sound stream thread
@@ -93,20 +95,24 @@ unsigned int Mixer::MixerFifo::Mix(short* samples, unsigned int numSamples,
s32 lvolume = m_LVolume.load();
s32 rvolume = m_RVolume.load();
+ const auto read_buffer = [this](auto index) {
+ return m_little_endian ? m_buffer[index] : Common::swap16(m_buffer[index]);
+ };
+
// TODO: consider a higher-quality resampling algorithm.
for (; currentSample < numSamples * 2 && ((indexW - indexR) & INDEX_MASK) > 2; currentSample += 2)
{
u32 indexR2 = indexR + 2; // next sample
- s16 l1 = Common::swap16(m_buffer[indexR & INDEX_MASK]); // current
- s16 l2 = Common::swap16(m_buffer[indexR2 & INDEX_MASK]); // next
+ s16 l1 = read_buffer(indexR & INDEX_MASK); // current
+ s16 l2 = read_buffer(indexR2 & INDEX_MASK); // next
int sampleL = ((l1 << 16) + (l2 - l1) * (u16)m_frac) >> 16;
sampleL = (sampleL * lvolume) >> 8;
sampleL += samples[currentSample + 1];
samples[currentSample + 1] = std::clamp(sampleL, -32767, 32767);
- s16 r1 = Common::swap16(m_buffer[(indexR + 1) & INDEX_MASK]); // current
- s16 r2 = Common::swap16(m_buffer[(indexR2 + 1) & INDEX_MASK]); // next
+ s16 r1 = read_buffer((indexR + 1) & INDEX_MASK); // current
+ s16 r2 = read_buffer((indexR2 + 1) & INDEX_MASK); // next
int sampleR = ((r1 << 16) + (r2 - r1) * (u16)m_frac) >> 16;
sampleR = (sampleR * rvolume) >> 8;
sampleR += samples[currentSample];
@@ -122,8 +128,8 @@ unsigned int Mixer::MixerFifo::Mix(short* samples, unsigned int numSamples,
// Padding
short s[2];
- s[0] = Common::swap16(m_buffer[(indexR - 1) & INDEX_MASK]);
- s[1] = Common::swap16(m_buffer[(indexR - 2) & INDEX_MASK]);
+ s[0] = read_buffer((indexR - 1) & INDEX_MASK);
+ s[1] = read_buffer((indexR - 2) & INDEX_MASK);
s[0] = (s[0] * rvolume) >> 8;
s[1] = (s[1] * lvolume) >> 8;
for (; currentSample < numSamples * 2; currentSample += 2)
@@ -158,6 +164,8 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
m_dma_mixer.Mix(m_scratch_buffer.data(), available_samples, false);
m_streaming_mixer.Mix(m_scratch_buffer.data(), available_samples, false);
m_wiimote_speaker_mixer.Mix(m_scratch_buffer.data(), available_samples, false);
+ for (auto& mixer : m_gba_mixers)
+ mixer.Mix(m_scratch_buffer.data(), available_samples, false);
if (!m_is_stretching)
{
@@ -172,6 +180,8 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
m_dma_mixer.Mix(samples, num_samples, true);
m_streaming_mixer.Mix(samples, num_samples, true);
m_wiimote_speaker_mixer.Mix(samples, num_samples, true);
+ for (auto& mixer : m_gba_mixers)
+ mixer.Mix(samples, num_samples, true);
m_is_stretching = false;
}
@@ -258,14 +268,19 @@ void Mixer::PushWiimoteSpeakerSamples(const short* samples, unsigned int num_sam
for (unsigned int i = 0; i < num_samples; ++i)
{
- samples_stereo[i * 2] = Common::swap16(samples[i]);
- samples_stereo[i * 2 + 1] = Common::swap16(samples[i]);
+ samples_stereo[i * 2] = samples[i];
+ samples_stereo[i * 2 + 1] = samples[i];
}
m_wiimote_speaker_mixer.PushSamples(samples_stereo, num_samples);
}
}
+void Mixer::PushGBASamples(int device_number, const short* samples, unsigned int num_samples)
+{
+ m_gba_mixers[device_number].PushSamples(samples, num_samples);
+}
+
void Mixer::SetDMAInputSampleRate(unsigned int rate)
{
m_dma_mixer.SetInputSampleRate(rate);
@@ -276,6 +291,11 @@ void Mixer::SetStreamInputSampleRate(unsigned int rate)
m_streaming_mixer.SetInputSampleRate(rate);
}
+void Mixer::SetGBAInputSampleRates(int device_number, unsigned int rate)
+{
+ m_gba_mixers[device_number].SetInputSampleRate(rate);
+}
+
void Mixer::SetStreamingVolume(unsigned int lvolume, unsigned int rvolume)
{
m_streaming_mixer.SetVolume(lvolume, rvolume);
@@ -286,6 +306,11 @@ void Mixer::SetWiimoteSpeakerVolume(unsigned int lvolume, unsigned int rvolume)
m_wiimote_speaker_mixer.SetVolume(lvolume, rvolume);
}
+void Mixer::SetGBAVolume(int device_number, unsigned int lvolume, unsigned int rvolume)
+{
+ m_gba_mixers[device_number].SetVolume(lvolume, rvolume);
+}
+
void Mixer::StartLogDTKAudio(const std::string& filename)
{
if (!m_log_dtk_audio)