Implemented AudioStreamSegment
This commit is contained in:
parent
ce204c68de
commit
895b942df3
|
@ -103,6 +103,7 @@ set(SOURCE_FILES
|
||||||
src/platformTools.cpp src/platformTools.h
|
src/platformTools.cpp src/platformTools.h
|
||||||
src/tools.cpp src/tools.h
|
src/tools.cpp src/tools.h
|
||||||
src/audio/AudioStream.cpp src/audio/AudioStream.h
|
src/audio/AudioStream.cpp src/audio/AudioStream.h
|
||||||
|
src/audio/AudioStreamSegment.cpp src/audio/AudioStreamSegment.h
|
||||||
src/audio/DCOffset.cpp src/audio/DCOffset.h
|
src/audio/DCOffset.cpp src/audio/DCOffset.h
|
||||||
src/audio/SampleRateConverter.cpp src/audio/SampleRateConverter.h
|
src/audio/SampleRateConverter.cpp src/audio/SampleRateConverter.h
|
||||||
src/audio/UnboundedStream.cpp src/audio/UnboundedStream.h
|
src/audio/UnboundedStream.cpp src/audio/UnboundedStream.h
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
#include "AudioStreamSegment.h"
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
AudioStreamSegment::AudioStreamSegment(std::unique_ptr<AudioStream> audioStream, const TimeRange& range) :
|
||||||
|
audioStream(std::move(audioStream))
|
||||||
|
{
|
||||||
|
sampleOffset = range.getStart().count() * this->audioStream->getSampleRate() / 100;
|
||||||
|
sampleCount = range.getLength().count() * this->audioStream->getSampleRate() / 100;
|
||||||
|
seek(0);
|
||||||
|
|
||||||
|
if (sampleOffset < 0 || sampleOffset + sampleCount > this->audioStream->getSampleCount()) {
|
||||||
|
throw std::invalid_argument("Segment extends beyond input stream.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioStreamSegment::AudioStreamSegment(const AudioStreamSegment& rhs, bool reset) :
|
||||||
|
audioStream(rhs.audioStream->clone(false)),
|
||||||
|
sampleOffset(rhs.sampleOffset),
|
||||||
|
sampleCount(rhs.sampleCount)
|
||||||
|
{
|
||||||
|
if (reset) seek(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<AudioStream> AudioStreamSegment::clone(bool reset) const {
|
||||||
|
return std::make_unique<AudioStreamSegment>(*this, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AudioStreamSegment::getSampleRate() const {
|
||||||
|
return audioStream->getSampleRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
int AudioStreamSegment::getSampleCount() const {
|
||||||
|
return sampleCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
int AudioStreamSegment::getSampleIndex() const {
|
||||||
|
return audioStream->getSampleIndex() - sampleOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioStreamSegment::seek(int sampleIndex) {
|
||||||
|
audioStream->seek(sampleIndex + sampleOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
float AudioStreamSegment::readSample() {
|
||||||
|
return audioStream->readSample();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<AudioStream> createSegment(std::unique_ptr<AudioStream> audioStream, const TimeRange& range) {
|
||||||
|
return std::make_unique<AudioStreamSegment>(std::move(audioStream), range);
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
#pragma once
|
||||||
|
#include <audio/AudioStream.h>
|
||||||
|
#include <TimeRange.h>
|
||||||
|
|
||||||
|
class AudioStreamSegment : public AudioStream {
|
||||||
|
public:
|
||||||
|
AudioStreamSegment(std::unique_ptr<AudioStream> audioStream, const TimeRange& range);
|
||||||
|
AudioStreamSegment(const AudioStreamSegment& rhs, bool reset);
|
||||||
|
std::unique_ptr<AudioStream> clone(bool reset) const override;
|
||||||
|
int getSampleRate() const override;
|
||||||
|
int getSampleCount() const override;
|
||||||
|
int getSampleIndex() const override;
|
||||||
|
void seek(int sampleIndex) override;
|
||||||
|
float readSample() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<AudioStream> audioStream;
|
||||||
|
int sampleOffset, sampleCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::unique_ptr<AudioStream> createSegment(std::unique_ptr<AudioStream> audioStream, const TimeRange& range);
|
Loading…
Reference in New Issue