osci-render/Source/wav/WavParser.cpp

90 wiersze
2.7 KiB
C++
Czysty Zwykły widok Historia

2024-08-22 15:59:21 +00:00
#include "WavParser.h"
#include "../CommonPluginProcessor.h"
2024-08-22 15:59:21 +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));
if (reader == nullptr) {
return;
}
afSource = new juce::AudioFormatReaderSource(reader, true);
totalSamples = afSource->getTotalLength();
2024-08-22 15:59:21 +00:00
afSource->setLooping(true);
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;
}
OsciPoint WavParser::getSample() {
2024-08-22 15:59:21 +00:00
if (currentSampleRate != audioProcessor.currentSampleRate) {
setSampleRate(audioProcessor.currentSampleRate);
}
if (source == nullptr || paused) {
return OsciPoint();
2024-08-22 15:59:21 +00:00
}
source->getNextAudioBlock(juce::AudioSourceChannelInfo(audioBuffer));
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) {
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 {
return OsciPoint();
2024-08-22 15:59:21 +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;
}