123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #include "Snd_defs.h"
- #include "ModChannel.h"
- OPENMPT_NAMESPACE_BEGIN
- class CResampler;
- template<int channelsOut, int channelsIn, typename out, typename in>
- struct MixerTraits
- {
- enum : int { numChannelsIn = channelsIn };
- enum : int { numChannelsOut = channelsOut };
- typedef out output_t;
- typedef in input_t;
- typedef out outbuf_t[channelsOut];
-
-
- };
- template<class Traits>
- struct NoInterpolation
- {
- MPT_FORCEINLINE NoInterpolation(const ModChannel &, const CResampler &, unsigned int) { }
- MPT_FORCEINLINE void operator() (typename Traits::outbuf_t &outSample, const typename Traits::input_t * const inBuffer, const int32)
- {
- static_assert(static_cast<int>(Traits::numChannelsIn) <= static_cast<int>(Traits::numChannelsOut), "Too many input channels");
- for(int i = 0; i < Traits::numChannelsIn; i++)
- {
- outSample[i] = Traits::Convert(inBuffer[i]);
- }
- }
- };
- template<class Traits, class InterpolationFunc, class FilterFunc, class MixFunc>
- static void SampleLoop(ModChannel &chn, const CResampler &resampler, typename Traits::output_t * MPT_RESTRICT outBuffer, unsigned int numSamples)
- {
- ModChannel &c = chn;
- const typename Traits::input_t * MPT_RESTRICT inSample = static_cast<const typename Traits::input_t *>(c.pCurrentSample);
- InterpolationFunc interpolate{c, resampler, numSamples};
- FilterFunc filter{c};
- MixFunc mix{c};
- unsigned int samples = numSamples;
- SamplePosition smpPos = c.position;
- const SamplePosition increment = c.increment;
- while(samples--)
- {
- typename Traits::outbuf_t outSample;
- interpolate(outSample, inSample + smpPos.GetInt() * Traits::numChannelsIn, smpPos.GetFract());
- filter(outSample, c);
- mix(outSample, c, outBuffer);
- outBuffer += Traits::numChannelsOut;
- smpPos += increment;
- }
- c.position = smpPos;
- }
- typedef void (*MixFuncInterface)(ModChannel &, const CResampler &, mixsample_t *, unsigned int);
- OPENMPT_NAMESPACE_END
|