diff options
| author | Joshua de Reeper <joshua@dereeper.co.nz> | 2023-03-05 19:19:00 +1300 |
|---|---|---|
| committer | Joshua de Reeper <joshua@dereeper.co.nz> | 2023-03-13 13:01:48 +1300 |
| commit | f27e8216a57f5f8563e6316211daa2dfd8f27519 (patch) | |
| tree | 41ed78ff42c38477d081553459634cabd704c0c5 /Source/Core/AudioCommon | |
| parent | 019bde6afcca8ff10953421a9c52a68f3d9ca8aa (diff) | |
Skylander Portal: Play Trap Team Audio
Asserts and length handling
Diffstat (limited to 'Source/Core/AudioCommon')
| -rw-r--r-- | Source/Core/AudioCommon/Mixer.cpp | 28 | ||||
| -rw-r--r-- | Source/Core/AudioCommon/Mixer.h | 2 |
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}, |
