summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Mixer.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2022-09-08 22:01:18 +0200
committerGitHub <noreply@github.com>2022-09-08 22:01:18 +0200
commit200c9dd0c510b2e41f61f1c267deb799aec81b36 (patch)
treeb13f9050722566a54ace79ce6b8bf1c7299ef27d /Source/Core/AudioCommon/Mixer.cpp
parentd4fe54147e65eb41ba85eb6a3bcfa252c0530be9 (diff)
parent72de74d4fc81bf5cc2ed0b3a9a3c6c43856c0c5e (diff)
Merge pull request #11011 from Pokechu22/audio-mixer-assertions
Mixer: Add assertions regarding num_samples versus buffer length
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
-rw-r--r--Source/Core/AudioCommon/Mixer.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp
index 5baa02d25e..ccec2db5c9 100644
--- a/Source/Core/AudioCommon/Mixer.cpp
+++ b/Source/Core/AudioCommon/Mixer.cpp
@@ -167,6 +167,11 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
unsigned int available_samples =
std::min(m_dma_mixer.AvailableSamples(), m_streaming_mixer.AvailableSamples());
+ ASSERT_MSG(AUDIO, available_samples <= MAX_SAMPLES,
+ "Audio stretching would overflow m_scratch_buffer: min({}, {}) -> {} > {} ({})",
+ m_dma_mixer.AvailableSamples(), m_streaming_mixer.AvailableSamples(),
+ available_samples, MAX_SAMPLES, num_samples);
+
m_scratch_buffer.fill(0);
m_dma_mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
@@ -213,10 +218,15 @@ unsigned int Mixer::MixSurround(float* samples, unsigned int num_samples)
// Mix() may also use m_scratch_buffer internally, but is safe because it alternates reads
// and writes.
+ ASSERT_MSG(AUDIO, needed_frames <= MAX_SAMPLES,
+ "needed_frames would overflow m_scratch_buffer: {} -> {} > {}", num_samples,
+ needed_frames, MAX_SAMPLES);
size_t available_frames = Mix(m_scratch_buffer.data(), static_cast<u32>(needed_frames));
if (available_frames != needed_frames)
{
- ERROR_LOG_FMT(AUDIO, "Error decoding surround frames.");
+ ERROR_LOG_FMT(AUDIO,
+ "Error decoding surround frames: needed {} frames for {} samples but got {}",
+ needed_frames, num_samples, available_frames);
return 0;
}
@@ -282,9 +292,14 @@ void Mixer::PushStreamingSamples(const short* samples, unsigned int num_samples)
void Mixer::PushWiimoteSpeakerSamples(const short* samples, unsigned int num_samples,
unsigned int sample_rate_divisor)
{
- short samples_stereo[MAX_SAMPLES * 2];
-
- if (num_samples < MAX_SAMPLES)
+ // Max 20 bytes/speaker report, may be 4-bit ADPCM so multiply by 2
+ static constexpr u32 MAX_SPEAKER_SAMPLES = 20 * 2;
+ std::array<short, MAX_SPEAKER_SAMPLES * 2> samples_stereo;
+
+ ASSERT_MSG(AUDIO, num_samples <= MAX_SPEAKER_SAMPLES,
+ "num_samples would overflow samples_stereo: {} > {}", num_samples,
+ MAX_SPEAKER_SAMPLES);
+ if (num_samples <= MAX_SPEAKER_SAMPLES)
{
m_wiimote_speaker_mixer.SetInputSampleRateDivisor(sample_rate_divisor);
@@ -294,7 +309,7 @@ void Mixer::PushWiimoteSpeakerSamples(const short* samples, unsigned int num_sam
samples_stereo[i * 2 + 1] = samples[i];
}
- m_wiimote_speaker_mixer.PushSamples(samples_stereo, num_samples);
+ m_wiimote_speaker_mixer.PushSamples(samples_stereo.data(), num_samples);
}
}