aboutsummaryrefslogtreecommitdiff
path: root/externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp
diff options
context:
space:
mode:
authorswurl <swurl@swurl.xyz>2025-05-31 02:33:02 -0400
committerswurl <swurl@swurl.xyz>2025-05-31 02:33:02 -0400
commit6c655321e6b04b8648802e296bb5ca11d290ae68 (patch)
tree5c906511e4a2910ce8b806bb9d763b524c28619e /externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp
parentc0cceff365f754f8859f4c9a0362ebdba7ea388b (diff)
Move dead submodules in-tree
Signed-off-by: swurl <swurl@swurl.xyz>
Diffstat (limited to 'externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp')
-rw-r--r--externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp b/externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp
new file mode 100644
index 0000000000..f3694b3c00
--- /dev/null
+++ b/externals/oboe/samples/iolib/src/main/cpp/player/SampleBuffer.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "SampleBuffer.h"
+
+// Resampler Includes
+#include <resampler/MultiChannelResampler.h>
+
+#include "wav/WavStreamReader.h"
+
+using namespace RESAMPLER_OUTER_NAMESPACE::resampler;
+
+namespace iolib {
+
+void SampleBuffer::loadSampleData(parselib::WavStreamReader* reader) {
+ mAudioProperties.channelCount = reader->getNumChannels();
+ mAudioProperties.sampleRate = reader->getSampleRate();
+
+ reader->positionToAudio();
+
+ mNumSamples = reader->getNumSampleFrames() * reader->getNumChannels();
+ mSampleData = new float[mNumSamples];
+
+ reader->getDataFloat(mSampleData, reader->getNumSampleFrames());
+}
+
+void SampleBuffer::unloadSampleData() {
+ if (mSampleData != nullptr) {
+ delete[] mSampleData;
+ mSampleData = nullptr;
+ }
+ mNumSamples = 0;
+}
+
+class ResampleBlock {
+public:
+ int32_t mSampleRate;
+ float* mBuffer;
+ int32_t mNumSamples;
+};
+
+void resampleData(const ResampleBlock& input, ResampleBlock* output, int numChannels) {
+ // Calculate output buffer size
+ double temp =
+ ((double)input.mNumSamples * (double)output->mSampleRate) / (double)input.mSampleRate;
+
+ // round up
+ int32_t numOutFramesAllocated = (int32_t)(temp + 0.5);
+ // We iterate thousands of times through the loop. Roundoff error could accumulate
+ // so add a few more frames for padding
+ numOutFramesAllocated += 8;
+
+ MultiChannelResampler *resampler = MultiChannelResampler::make(
+ numChannels, // channel count
+ input.mSampleRate, // input sampleRate
+ output->mSampleRate, // output sampleRate
+ MultiChannelResampler::Quality::Medium); // conversion quality
+
+ float *inputBuffer = input.mBuffer;; // multi-channel buffer to be consumed
+ float *outputBuffer = new float[numOutFramesAllocated]; // multi-channel buffer to be filled
+ output->mBuffer = outputBuffer;
+
+ int numOutputSamples = 0;
+ int inputSamplesLeft = input.mNumSamples;
+ while ((inputSamplesLeft > 0) && (numOutputSamples < numOutFramesAllocated)) {
+ if(resampler->isWriteNeeded()) {
+ resampler->writeNextFrame(inputBuffer);
+ inputBuffer += numChannels;
+ inputSamplesLeft -= numChannels;
+ } else {
+ resampler->readNextFrame(outputBuffer);
+ outputBuffer += numChannels;
+ numOutputSamples += numChannels;
+ }
+ }
+ output->mNumSamples = numOutputSamples;
+
+ delete resampler;
+}
+
+void SampleBuffer::resampleData(int sampleRate) {
+ if (mAudioProperties.sampleRate == sampleRate) {
+ // nothing to do
+ return;
+ }
+
+ ResampleBlock inputBlock;
+ inputBlock.mBuffer = mSampleData;
+ inputBlock.mNumSamples = mNumSamples;
+ inputBlock.mSampleRate = mAudioProperties.sampleRate;
+
+ ResampleBlock outputBlock;
+ outputBlock.mSampleRate = sampleRate;
+ iolib::resampleData(inputBlock, &outputBlock, mAudioProperties.channelCount);
+
+ // delete previous samples
+ delete[] mSampleData;
+
+ // install the resampled data
+ mSampleData = outputBlock.mBuffer;
+ mNumSamples = outputBlock.mNumSamples;
+ mAudioProperties.sampleRate = outputBlock.mSampleRate;
+}
+
+} // namespace iolib