From 3119692ba0291d64a8c4ac8e79f637db7e5b75a5 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sun, 6 Sep 2015 11:49:24 +0100 Subject: [PATCH] Index tiles by sample id and fft size --- spectrogram.cpp | 14 +++++++++----- spectrogram.h | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/spectrogram.cpp b/spectrogram.cpp index 775ad8c..0599186 100644 --- a/spectrogram.cpp +++ b/spectrogram.cpp @@ -69,11 +69,11 @@ void Spectrogram::paintEvent(QPaintEvent *event) for (int y = 0; y < height; y++) { if (tileLine >= linesPerTile()) { - int tileId = (rect.y() + y) / linesPerTile(); + off_t tileId = lineToSample(rect.y() + y); tile = getTile(tileId); // Handle case where we want to draw from part-way through the first tile - tileLine = (rect.y() + y) - (tileId * linesPerTile()); + tileLine = (rect.y() + y) - sampleToLine(tileId); } float *line = &tile[tileLine * fftSize]; @@ -98,19 +98,19 @@ void Spectrogram::paintEvent(QPaintEvent *event) float* Spectrogram::getTile(off_t tile) { - auto iter = fftCache.find(qMakePair(zoomLevel, tile)); + auto iter = fftCache.find(qMakePair(fftSize, tile)); if (iter != fftCache.end()) return iter.value(); float *dest = new float[tileSize]; float *ptr = dest; - off_t sample = tile * linesPerTile() * getStride(); + off_t sample = tile; while ((ptr - dest) < tileSize) { getLine(ptr, sample); sample += getStride(); ptr += fftSize; } - fftCache.insert(qMakePair(zoomLevel, tile), dest); + fftCache.insert(qMakePair(fftSize, tile), dest); return dest; } @@ -211,6 +211,10 @@ off_t Spectrogram::lineToSample(int line) { return line * getStride(); } +int Spectrogram::sampleToLine(off_t sample) { + return sample / getStride(); +} + QString Spectrogram::sampleToTime(off_t sample) { return QString::number((float)sample / sampleRate).append("s"); diff --git a/spectrogram.h b/spectrogram.h index 5805093..41c3902 100644 --- a/spectrogram.h +++ b/spectrogram.h @@ -51,6 +51,7 @@ private: void getLine(float *dest, off_t sample); void paintTimeAxis(QPainter *painter, QRect rect); off_t lineToSample(int line); + int sampleToLine(off_t sample); QString sampleToTime(off_t sample); int linesPerTile(); }; \ No newline at end of file