2024-08-22 15:59:21 +00:00
|
|
|
#include "WavParser.h"
|
2025-01-05 15:55:53 +00:00
|
|
|
#include "../CommonPluginProcessor.h"
|
2024-08-22 15:59:21 +00:00
|
|
|
|
|
|
|
|
2025-01-05 15:55:53 +00:00
|
|
|
WavParser::WavParser(CommonAudioProcessor& p, std::unique_ptr<juce::InputStream> stream) : audioProcessor(p) {
|
2024-08-22 15:59:21 +00:00
|
|
|
juce::AudioFormatManager formatManager;
|
|
|
|
formatManager.registerBasicFormats();
|
|
|
|
juce::AudioFormatReader* reader = formatManager.createReaderFor(std::move(stream));
|
2025-01-06 11:17:42 +00:00
|
|
|
if (reader == nullptr) {
|
|
|
|
return;
|
|
|
|
}
|
2025-01-06 18:27:23 +00:00
|
|
|
afSource = new juce::AudioFormatReaderSource(reader, true);
|
|
|
|
totalSamples = afSource->getTotalLength();
|
2024-08-22 15:59:21 +00:00
|
|
|
afSource->setLooping(true);
|
2025-01-07 12:17:38 +00:00
|
|
|
source = std::make_unique<juce::ResamplingAudioSource>(afSource, true, reader->numChannels);
|
2024-08-22 15:59:21 +00:00
|
|
|
fileSampleRate = reader->sampleRate;
|
|
|
|
audioBuffer.setSize(reader->numChannels, 1);
|
|
|
|
setSampleRate(audioProcessor.currentSampleRate);
|
|
|
|
source->prepareToPlay(1, audioProcessor.currentSampleRate);
|
|
|
|
}
|
|
|
|
|
|
|
|
WavParser::~WavParser() {
|
|
|
|
}
|
|
|
|
|
|
|
|
void WavParser::setSampleRate(double sampleRate) {
|
|
|
|
double ratio = fileSampleRate / sampleRate;
|
|
|
|
source->setResamplingRatio(ratio);
|
|
|
|
source->prepareToPlay(1, sampleRate);
|
|
|
|
currentSampleRate = sampleRate;
|
|
|
|
}
|
|
|
|
|
2024-10-23 11:44:31 +00:00
|
|
|
OsciPoint WavParser::getSample() {
|
2024-08-22 15:59:21 +00:00
|
|
|
if (currentSampleRate != audioProcessor.currentSampleRate) {
|
|
|
|
setSampleRate(audioProcessor.currentSampleRate);
|
|
|
|
}
|
2025-01-06 18:27:23 +00:00
|
|
|
if (source == nullptr || paused) {
|
2024-10-23 11:44:31 +00:00
|
|
|
return OsciPoint();
|
2024-08-22 15:59:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
source->getNextAudioBlock(juce::AudioSourceChannelInfo(audioBuffer));
|
2025-01-06 18:27:23 +00:00
|
|
|
currentSample += source->getResamplingRatio();
|
|
|
|
counter++;
|
|
|
|
if (currentSample >= totalSamples && afSource->isLooping()) {
|
|
|
|
currentSample = 0;
|
|
|
|
counter = 0;
|
|
|
|
afSource->setNextReadPosition(0);
|
|
|
|
}
|
|
|
|
if (counter % currentSampleRate == 0) {
|
|
|
|
if (onProgress != nullptr) {
|
|
|
|
onProgress((double)currentSample / totalSamples);
|
|
|
|
}
|
|
|
|
}
|
2024-08-22 15:59:21 +00:00
|
|
|
|
|
|
|
if (audioBuffer.getNumChannels() == 1) {
|
2025-01-07 12:17:38 +00:00
|
|
|
return OsciPoint(audioBuffer.getSample(0, 0), audioBuffer.getSample(0, 0), 1.0);
|
|
|
|
} else if (audioBuffer.getNumChannels() == 2) {
|
|
|
|
return OsciPoint(audioBuffer.getSample(0, 0), audioBuffer.getSample(1, 0), 1.0);
|
|
|
|
} else if (audioBuffer.getNumChannels() >= 3) {
|
|
|
|
return OsciPoint(audioBuffer.getSample(0, 0), audioBuffer.getSample(1, 0), audioBuffer.getSample(2, 0));
|
2024-08-22 15:59:21 +00:00
|
|
|
} else {
|
2025-01-07 12:17:38 +00:00
|
|
|
return OsciPoint();
|
2024-08-22 15:59:21 +00:00
|
|
|
}
|
|
|
|
}
|
2025-01-06 18:27:23 +00:00
|
|
|
|
|
|
|
void WavParser::setProgress(double progress) {
|
|
|
|
if (source == nullptr) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
afSource->setNextReadPosition(progress * totalSamples);
|
|
|
|
currentSample = progress * totalSamples;
|
|
|
|
}
|
|
|
|
|
|
|
|
void WavParser::setLooping(bool looping) {
|
|
|
|
afSource->setLooping(looping);
|
|
|
|
this->looping = looping;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool WavParser::isLooping() {
|
|
|
|
return looping;
|
|
|
|
}
|
|
|
|
|
|
|
|
void WavParser::setPaused(bool paused) {
|
|
|
|
this->paused = paused;
|
|
|
|
counter = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool WavParser::isPaused() {
|
|
|
|
return paused;
|
|
|
|
}
|