summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon
diff options
context:
space:
mode:
authorJoshua de Reeper <joshua@dereeper.co.nz>2023-03-05 19:19:00 +1300
committerJoshua de Reeper <joshua@dereeper.co.nz>2023-03-13 13:01:48 +1300
commitf27e8216a57f5f8563e6316211daa2dfd8f27519 (patch)
tree41ed78ff42c38477d081553459634cabd704c0c5 /Source/Core/AudioCommon
parent019bde6afcca8ff10953421a9c52a68f3d9ca8aa (diff)
Skylander Portal: Play Trap Team Audio
Asserts and length handling
Diffstat (limited to 'Source/Core/AudioCommon')
-rw-r--r--Source/Core/AudioCommon/Mixer.cpp28
-rw-r--r--Source/Core/AudioCommon/Mixer.h2
2 files changed, 30 insertions, 0 deletions
diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp
index ae52dc7bb2..18d899e3cd 100644
--- a/Source/Core/AudioCommon/Mixer.cpp
+++ b/Source/Core/AudioCommon/Mixer.cpp
@@ -52,6 +52,7 @@ void Mixer::DoState(PointerWrap& p)
m_dma_mixer.DoState(p);
m_streaming_mixer.DoState(p);
m_wiimote_speaker_mixer.DoState(p);
+ m_skylander_portal_mixer.DoState(p);
for (auto& mixer : m_gba_mixers)
mixer.DoState(p);
}
@@ -183,6 +184,8 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
timing_variance);
m_wiimote_speaker_mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
timing_variance);
+ m_skylander_portal_mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
+ timing_variance);
for (auto& mixer : m_gba_mixers)
{
mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
@@ -202,6 +205,7 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
m_dma_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
m_streaming_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
m_wiimote_speaker_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
+ m_skylander_portal_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
for (auto& mixer : m_gba_mixers)
mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
m_is_stretching = false;
@@ -316,6 +320,30 @@ void Mixer::PushWiimoteSpeakerSamples(const short* samples, unsigned int num_sam
}
}
+void Mixer::PushSkylanderPortalSamples(const u8* samples, unsigned int num_samples)
+{
+ // Skylander samples are always supplied as 64 bytes, 32 x 16 bit samples
+ // The portal speaker is 1 channel, so duplicate and play as stereo audio
+ static constexpr u32 MAX_PORTAL_SPEAKER_SAMPLES = 32;
+ std::array<short, MAX_PORTAL_SPEAKER_SAMPLES * 2> samples_stereo;
+
+ ASSERT_MSG(AUDIO, num_samples <= MAX_PORTAL_SPEAKER_SAMPLES,
+ "num_samples is not less or equal to 32: {} > {}", num_samples,
+ MAX_PORTAL_SPEAKER_SAMPLES);
+
+ if (num_samples <= MAX_PORTAL_SPEAKER_SAMPLES)
+ {
+ for (unsigned int i = 0; i < num_samples; ++i)
+ {
+ s16 sample = static_cast<u16>(samples[i * 2 + 1]) << 8 | static_cast<u16>(samples[i * 2]);
+ samples_stereo[i * 2] = sample;
+ samples_stereo[i * 2 + 1] = sample;
+ }
+
+ m_skylander_portal_mixer.PushSamples(samples_stereo.data(), num_samples);
+ }
+}
+
void Mixer::PushGBASamples(int device_number, const short* samples, unsigned int num_samples)
{
m_gba_mixers[device_number].PushSamples(samples, num_samples);
diff --git a/Source/Core/AudioCommon/Mixer.h b/Source/Core/AudioCommon/Mixer.h
index 11039443ca..c27ff311c3 100644
--- a/Source/Core/AudioCommon/Mixer.h
+++ b/Source/Core/AudioCommon/Mixer.h
@@ -30,6 +30,7 @@ public:
void PushStreamingSamples(const short* samples, unsigned int num_samples);
void PushWiimoteSpeakerSamples(const short* samples, unsigned int num_samples,
unsigned int sample_rate_divisor);
+ void PushSkylanderPortalSamples(const u8* samples, unsigned int num_samples);
void PushGBASamples(int device_number, const short* samples, unsigned int num_samples);
unsigned int GetSampleRate() const { return m_sampleRate; }
@@ -97,6 +98,7 @@ private:
MixerFifo m_dma_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 32000, false};
MixerFifo m_streaming_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, false};
MixerFifo m_wiimote_speaker_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 3000, true};
+ MixerFifo m_skylander_portal_mixer{this, FIXED_SAMPLE_RATE_DIVIDEND / 8000, true};
std::array<MixerFifo, 4> m_gba_mixers{MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true},
MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true},
MixerFifo{this, FIXED_SAMPLE_RATE_DIVIDEND / 48000, true},