#pragma once
#include "BuildSettings.h"
#include "../common/Endianness.h"
#include "SampleFormatConverters.h"
OPENMPT_NAMESPACE_BEGIN
template <typename SampleConversion>
size_t CopySample(typename SampleConversion::output_t * MPT_RESTRICT outBuf, size_t numSamples, size_t incTarget, const typename SampleConversion::input_t * MPT_RESTRICT inBuf, size_t sourceSize, size_t incSource, SampleConversion conv = SampleConversion())
{
const size_t sampleSize = incSource * SampleConversion::input_inc * sizeof(typename SampleConversion::input_t);
LimitMax(numSamples, sourceSize / sampleSize);
const size_t copySize = numSamples * sampleSize;
SampleConversion sampleConv(conv);
while(numSamples--)
{
*outBuf = sampleConv(inBuf);
outBuf += incTarget;
inBuf += incSource * SampleConversion::input_inc;
}
return copySize;
}
template <typename SampleConversion>
void CopyInterleavedSampleStreams(typename SampleConversion::output_t * MPT_RESTRICT outBuf, const typename SampleConversion::input_t * MPT_RESTRICT inBuf, size_t numFrames, size_t numChannels, SampleConversion *conv)
{
while(numFrames--)
{
for(size_t channel = 0; channel < numChannels; ++channel)
{
*outBuf = conv[channel](*inBuf);
inBuf++;
outBuf++;
}
}
}
template <typename SampleConversion>
void CopyInterleavedSampleStreams(typename SampleConversion::output_t * MPT_RESTRICT outBuf, const typename SampleConversion::input_t * MPT_RESTRICT inBuf, size_t numFrames, size_t numChannels, std::vector<SampleConversion> &conv)
{
MPT_ASSERT(conv.size() >= numChannels);
CopyInterleavedSampleStreams(outBuf, inBuf, numFrames, numChannels, &(conv[0]));
}
template<int fractionalBits, bool clipOutput, typename Tsample, typename Tfixed>
void ConvertInterleavedFixedPointToInterleaved(Tsample * MPT_RESTRICT p, const Tfixed * MPT_RESTRICT mixbuffer, std::size_t channels, std::size_t count)
{
SC::ConvertFixedPoint<Tsample, int32, fractionalBits, clipOutput> conv;
count *= channels;
for(std::size_t i = 0; i < count; ++i)
{
p[i] = conv(mixbuffer[i]);
}
}
template<int fractionalBits, bool clipOutput, typename Tsample, typename Tfixed>
void ConvertInterleavedFixedPointToNonInterleaved(Tsample * const * const MPT_RESTRICT buffers, const Tfixed * MPT_RESTRICT mixbuffer, std::size_t channels, std::size_t count)
{
SC::ConvertFixedPoint<Tsample, int32, fractionalBits, clipOutput> conv;
for(std::size_t i = 0; i < count; ++i)
{
for(std::size_t channel = 0; channel < channels; ++channel)
{
buffers[channel][i] = conv(*mixbuffer);
mixbuffer++;
}
}
}
template <typename SampleConversion>
void CopyInterleavedToChannel(typename SampleConversion::output_t * MPT_RESTRICT dst, const typename SampleConversion::input_t * MPT_RESTRICT src, std::size_t channels, std::size_t countChunk, std::size_t channel, SampleConversion conv = SampleConversion())
{
SampleConversion sampleConv(conv);
src += channel;
for(std::size_t i = 0; i < countChunk; ++i)
{
*dst = sampleConv(*src);
src += channels;
dst++;
}
}
template <typename SampleConversion>
void CopyChannelToInterleaved(typename SampleConversion::output_t * MPT_RESTRICT dst, const typename SampleConversion::input_t * MPT_RESTRICT src, std::size_t channels, std::size_t countChunk, std::size_t channel, SampleConversion conv = SampleConversion())
{
SampleConversion sampleConv(conv);
dst += channel;
for(std::size_t i = 0; i < countChunk; ++i)
{
*dst = sampleConv(*src);
src++;
dst += channels;
}
}
OPENMPT_NAMESPACE_END