mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-06 06:05:40 +12:00
50 lines
No EOL
1.5 KiB
C++
50 lines
No EOL
1.5 KiB
C++
#pragma once
|
|
#include <array>
|
|
|
|
#include "audio/dsp_shared_mem.hpp"
|
|
#include "helpers.hpp"
|
|
|
|
namespace Audio {
|
|
using SampleFormat = HLE::SourceConfiguration::Configuration::Format;
|
|
using SourceType = HLE::SourceConfiguration::Configuration::MonoOrStereo;
|
|
|
|
class DSPMixer {
|
|
public:
|
|
template <typename T, usize channelCount = 1>
|
|
using Sample = std::array<T, channelCount>;
|
|
|
|
template <typename T, usize channelCount>
|
|
using Frame = std::array<Sample<T, channelCount>, 160>;
|
|
|
|
template <typename T>
|
|
using MonoFrame = Frame<T, 1>;
|
|
|
|
template <typename T>
|
|
using StereoFrame = Frame<T, 2>;
|
|
|
|
template <typename T>
|
|
using QuadFrame = Frame<T, 4>;
|
|
|
|
// Internally the DSP uses four channels when mixing.
|
|
// Neatly, QuadFrame<s32> means that every sample is a uint32x4 value, which is particularly nice for SIMD mixing
|
|
using IntermediateMix = QuadFrame<s32>;
|
|
|
|
private:
|
|
using ChannelFormat = HLE::DspConfiguration::OutputFormat;
|
|
// The audio from each DSP voice is converted to quadraphonic and then fed into 3 intermediate mixing stages
|
|
// Two of these intermediate mixers (second and third) are used for effects, including custom effects done on the CPU
|
|
static constexpr usize mixerStageCount = 3;
|
|
|
|
public:
|
|
ChannelFormat channelFormat = ChannelFormat::Stereo;
|
|
std::array<float, mixerStageCount> volumes;
|
|
std::array<bool, 2> enableAuxStages;
|
|
|
|
void reset() {
|
|
channelFormat = ChannelFormat::Stereo;
|
|
|
|
volumes.fill(0.0);
|
|
enableAuxStages.fill(false);
|
|
}
|
|
};
|
|
} // namespace Audio
|