diff --git a/inputsource.cpp b/inputsource.cpp index 2cb1c31..9761612 100644 --- a/inputsource.cpp +++ b/inputsource.cpp @@ -48,14 +48,15 @@ InputSource::~InputSource() { fclose(m_file); } -bool InputSource::getSamples(std::complex *dest, off_t start, off_t length) +std::unique_ptr[]> InputSource::getSamples(off_t start, off_t length) { if(start < 0 || length < 0) - return false; + return nullptr; if (start + length >= sampleCount) - return false; + return nullptr; - memcpy(dest, &m_data[start], length * sizeof(std::complex)); - return true; + std::unique_ptr[]> dest(new std::complex[length]); + memcpy(dest.get(), &m_data[start], length * sizeof(std::complex)); + return dest; } diff --git a/inputsource.h b/inputsource.h index d3e3bd6..d2ea3b1 100644 --- a/inputsource.h +++ b/inputsource.h @@ -34,6 +34,6 @@ public: InputSource(const char *filename); ~InputSource(); - bool getSamples(std::complex *dest, off_t start, off_t length); + std::unique_ptr[]> getSamples(off_t start, off_t length); off_t count() { return sampleCount; }; }; diff --git a/samplebuffer.cpp b/samplebuffer.cpp index 29607b3..47f92e5 100644 --- a/samplebuffer.cpp +++ b/samplebuffer.cpp @@ -19,10 +19,10 @@ #include "samplebuffer.h" -bool SampleBuffer::getSamples(std::complex *dest, off_t start, off_t length) +std::unique_ptr[]> SampleBuffer::getSamples(off_t start, off_t length) { - std::complex buf[length]; - src->getSamples(buf, start, length); - work(buf, dest, length); - return true; + auto samples = src->getSamples(start, length); + std::unique_ptr[]> dest(new std::complex[length]); + work(samples.get(), dest.get(), length); + return dest; } \ No newline at end of file diff --git a/samplebuffer.h b/samplebuffer.h index f2bc9cd..76a8160 100644 --- a/samplebuffer.h +++ b/samplebuffer.h @@ -30,7 +30,7 @@ private: public: SampleBuffer(SampleSource *src) : src(src) {}; - virtual bool getSamples(std::complex *dest, off_t start, off_t length); + virtual std::unique_ptr[]> getSamples(off_t start, off_t length); virtual void work(void *input, void *output, int count) = 0; virtual off_t count() { return src->count(); }; }; diff --git a/samplesource.h b/samplesource.h index 523a43f..5ff629a 100644 --- a/samplesource.h +++ b/samplesource.h @@ -20,6 +20,7 @@ #pragma once #include +#include class SampleSource { @@ -27,6 +28,6 @@ class SampleSource public: virtual ~SampleSource() {}; - virtual bool getSamples(std::complex *dest, off_t start, off_t length) = 0; + virtual std::unique_ptr[]> getSamples(off_t start, off_t length) = 0; virtual off_t count() = 0; }; diff --git a/spectrogram.cpp b/spectrogram.cpp index f756473..c23afe5 100644 --- a/spectrogram.cpp +++ b/spectrogram.cpp @@ -143,15 +143,14 @@ float* Spectrogram::getFFTTile(off_t tile) void Spectrogram::getLine(float *dest, off_t sample) { if (inputSource && fft) { - std::complex buffer[fftSize]; - inputSource->getSamples(buffer, sample, fftSize); + auto buffer = inputSource->getSamples(sample, fftSize); for (int i = 0; i < fftSize; i++) { buffer[i].real(buffer[i].real() * window[i]); buffer[i].imag(buffer[i].imag() * window[i]); } - fft->process(buffer, buffer); + fft->process(buffer.get(), buffer.get()); for (int i = 0; i < fftSize; i++) { int k = (i + fftSize / 2) % fftSize; float re = buffer[k].real(); diff --git a/waveformview.cpp b/waveformview.cpp index 7ae8d18..e65a726 100644 --- a/waveformview.cpp +++ b/waveformview.cpp @@ -66,15 +66,12 @@ void WaveformView::paintEvent(QPaintEvent *event) painter.fillRect(rect, Qt::black); off_t length = lastSample - firstSample; - std::complex *samples = new std::complex[length]; - sampleSource->getSamples(samples, firstSample, length); + auto samples = sampleSource->getSamples(firstSample, length); painter.setPen(Qt::red); - plot(&painter, reinterpret_cast(samples), length, 2); + plot(&painter, reinterpret_cast(samples.get()), length, 2); painter.setPen(Qt::blue); - plot(&painter, reinterpret_cast(samples)+1, length, 2); - - delete[] samples; + plot(&painter, reinterpret_cast(samples.get())+1, length, 2); } void WaveformView::plot(QPainter *painter, float *samples, off_t count, int step = 1)