diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2022-09-08 22:01:18 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-08 22:01:18 +0200 |
| commit | 200c9dd0c510b2e41f61f1c267deb799aec81b36 (patch) | |
| tree | b13f9050722566a54ace79ce6b8bf1c7299ef27d /Source/Core/AudioCommon/Mixer.cpp | |
| parent | d4fe54147e65eb41ba85eb6a3bcfa252c0530be9 (diff) | |
| parent | 72de74d4fc81bf5cc2ed0b3a9a3c6c43856c0c5e (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.cpp | 25 |
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); } } |
