bool AudioFormatWriter::writeFromAudioReader (AudioFormatReader& reader, int64 startSample, int64 numSamplesToRead) { const int bufferSize = 16384; AudioSampleBuffer tempBuffer ((int) numChannels, bufferSize); int* buffers [128] = { 0 }; for (int i = tempBuffer.getNumChannels(); --i >= 0;) buffers[i] = reinterpret_cast<int*> (tempBuffer.getSampleData (i, 0)); if (numSamplesToRead < 0) numSamplesToRead = reader.lengthInSamples; while (numSamplesToRead > 0) { const int numToDo = (int) jmin (numSamplesToRead, (int64) bufferSize); if (! reader.read (buffers, (int) numChannels, startSample, numToDo, false)) return false; if (reader.usesFloatingPointData != isFloatingPoint()) { int** bufferChan = buffers; while (*bufferChan != nullptr) { void* const b = *bufferChan++; if (isFloatingPoint()) FloatVectorOperations::convertFixedToFloat ((float*) b, (int*) b, 1.0f / 0x7fffffff, numToDo); else convertFloatsToInts ((int*) b, (float*) b, numToDo); } } if (! write (const_cast <const int**> (buffers), numToDo)) return false; numSamplesToRead -= numToDo; startSample += numToDo; } return true; }
bool AudioFormatWriter::writeFromFloatArrays (const float* const* channels, int numSourceChannels, int numSamples) { if (numSamples <= 0) return true; if (isFloatingPoint()) return write ((const int**) channels, numSamples); int* chans[256]; int scratch[4096]; jassert (numSourceChannels < numElementsInArray (chans)); const int maxSamples = (int) (numElementsInArray (scratch) / numSourceChannels); for (int i = 0; i < numSourceChannels; ++i) chans[i] = scratch + (i * maxSamples); chans[numSourceChannels] = nullptr; int startSample = 0; while (numSamples > 0) { auto numToDo = jmin (numSamples, maxSamples); for (int i = 0; i < numSourceChannels; ++i) convertFloatsToInts (chans[i], channels[i] + startSample, numToDo); if (! write ((const int**) chans, numToDo)) return false; startSample += numToDo; numSamples -= numToDo; } return true; }