in pedalboard/io/WriteableAudioFile.h [621:680]
bool writeConvertingTo(const InputType **channels, int numChannels,
unsigned int numSamples) {
std::vector<std::vector<TargetType>> targetTypeBuffers;
targetTypeBuffers.resize(numChannels);
const TargetType **channelPointers =
(const TargetType **)alloca(numChannels * sizeof(TargetType *));
for (unsigned int startSample = 0; startSample < numSamples;
startSample += bufferSize) {
int samplesToWrite = std::min(numSamples - startSample, bufferSize);
for (int c = 0; c < numChannels; c++) {
targetTypeBuffers[c].resize(samplesToWrite);
channelPointers[c] = targetTypeBuffers[c].data();
if constexpr (std::is_integral<InputType>::value) {
if constexpr (std::is_integral<TargetType>::value) {
for (unsigned int i = 0; i < samplesToWrite; i++) {
// Left-align the samples to use all 32 bits, as JUCE requires:
targetTypeBuffers[c][i] =
((int)channels[c][startSample + i])
<< (std::numeric_limits<int>::digits -
std::numeric_limits<InputType>::digits);
}
} else if constexpr (std::is_same<TargetType, float>::value) {
constexpr auto scaleFactor =
1.0f / static_cast<float>(std::numeric_limits<int>::max());
juce::FloatVectorOperations::convertFixedToFloat(
targetTypeBuffers[c].data(), channels[c] + startSample,
scaleFactor, samplesToWrite);
} else {
// We should never get here - this would only be true
// if converting to double, which no formats require:
static_assert(std::is_integral<InputType>::value &&
std::is_same<TargetType, double>::value,
"Can't convert to double");
}
} else {
if constexpr (std::is_integral<TargetType>::value) {
// We should never get here - this would only be true
// if converting float to int, which JUCE handles for us:
static_assert(std::is_integral<TargetType>::value &&
!std::is_integral<InputType>::value,
"Can't convert float to int");
} else {
// Converting double to float:
for (unsigned int i = 0; i < samplesToWrite; i++) {
targetTypeBuffers[c][i] = channels[c][startSample + i];
}
}
}
}
if (!write(channelPointers, numChannels, samplesToWrite)) {
return false;
}
}
return true;
}