11namespace tracktion {
inline namespace engine
28 if (header == getFloatFileHeaderIntV1())
30 dataStartOffset = in->
readInt();
37 if (sampleRate < 32000 || sampleRate > 192000 || numChannels < 1 || numChannels > 16)
40 else if (header == getFloatFileHeaderIntV2())
42 dataStartOffset = in->
readInt();
49 if (sampleRate < 32000 || sampleRate > 192000 || numChannels < 1 || numChannels > 16)
54 bool readSamples (
int*
const* destSamples,
int numDestChannels,
int startOffsetInDestBuffer,
66 while (numSamples > 0)
68 const int tempBufSize = 480 * 3 * 4;
69 char tempBuffer [tempBufSize];
71 const int numThisTime =
std::min (tempBufSize / bytesPerFrame, numSamples);
72 const int bytesRead =
input->
read (tempBuffer, numThisTime * bytesPerFrame);
74 if (bytesRead < numThisTime * bytesPerFrame)
77 std::memset (tempBuffer + bytesRead, 0, (
size_t) (numThisTime * bytesPerFrame - bytesRead));
82 ::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (
int)
numChannels, numThisTime);
85 ::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (
int)
numChannels, numThisTime);
87 startOffsetInDestBuffer += numThisTime;
88 numSamples -= numThisTime;
95 bool bigEndian =
false;
106 TRANS(
"Tracktion audio file"),
123 bool write (
const int** data,
int numSamps)
125 lengthInSamples += numSamps;
127 for (
int j = 0; j < numSamps; ++j)
131 if (
const float* chan = (
float*) (data[i]))
152 const int headerSize = 512;
173 reader.dataStartOffset,
176 bigEndian (reader.bigEndian)
180 bool readSamples (
int*
const* destSamples,
int numDestChannels,
int startOffsetInDestBuffer,
181 juce::int64 startSampleInFile,
int numSamples)
override
186 if (map ==
nullptr || ! mappedSection.contains ({ startSampleInFile, startSampleInFile + numSamples }))
202 void getSample (
juce::int64 sample,
float* result)
const noexcept override
204 if (map ==
nullptr || ! mappedSection.contains (sample))
229 for (
int i = 0; i < numChannelsToRead; ++i)
235 if (map ==
nullptr || ! mappedSection.contains ({ startSampleInFile, startSampleInFile + numSamples }))
239 for (
int i = 0; i < numChannelsToRead; ++i)
247 case 8: scanMinAndMax<juce::AudioData::UInt8> (startSampleInFile, numSamples, results, numChannelsToRead);
break;
248 case 16: scanMinAndMax<juce::AudioData::Int16> (startSampleInFile, numSamples, results, numChannelsToRead);
break;
249 case 24: scanMinAndMax<juce::AudioData::Int24> (startSampleInFile, numSamples, results, numChannelsToRead);
break;
252 if (
usesFloatingPointData) scanMinAndMax<juce::AudioData::Float32> (startSampleInFile, numSamples, results, numChannelsToRead);
253 else scanMinAndMax<juce::AudioData::Int32> (startSampleInFile, numSamples, results, numChannelsToRead);
261 const bool bigEndian;
263 template <
typename SampleType>
268 for (
int i = 0; i < numChannelsToRead; ++i)
276FloatAudioFormat::FloatAudioFormat() : AudioFormat (
"Tracktion audio file",
".trkaudio") {}
277FloatAudioFormat::~FloatAudioFormat() {}
279juce::Array<int> FloatAudioFormat::getPossibleSampleRates() {
return { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; }
282bool FloatAudioFormat::canDoStereo() {
return true; }
283bool FloatAudioFormat::canDoMono() {
return true; }
285bool FloatAudioFormat::canHandleFile (
const juce::File& f)
298 if (r->sampleRate > 0)
301 if (! deleteStreamIfOpeningFails)
309 if (
auto fin = file.createInputStream())
311 FloatAudioFormatReader reader (fin.release());
313 if (reader.lengthInSamples > 0)
314 return new MemoryMappedFloatReader (file, reader);
322 unsigned int numChannels,
327 return new FloatAudioFormatWriter (out, sampleRate, numChannels);
static constexpr uint32 littleEndianInt(const void *bytes) noexcept
bool hasFileExtension(StringRef extensionToTest) const
virtual int64 getPosition()=0
virtual bool writeFloat(float value)
virtual bool writeByte(char byte)
virtual bool writeShort(short value)
virtual bool writeInt64(int64 value)
virtual bool setPosition(int64 newPosition)=0
virtual bool writeInt(int value)
static Range findMinAndMax(const ValueType *values, Integral numValues) noexcept
#define TRANS(stringLiteral)
#define JUCE_UNDENORMALISE(x)
int roundToInt(const FloatType value) noexcept