diff --git a/spectrogram.cpp b/spectrogram.cpp index e303023..36cec75 100644 --- a/spectrogram.cpp +++ b/spectrogram.cpp @@ -133,6 +133,8 @@ void Spectrogram::paintEvent(QPaintEvent *event) painter.drawPixmap(QRect(0, rect.y(), fftSize, height), pixmap); free(line); + + paintTimeAxis(&painter, rect); } qDebug() << "Paint: " << timer.elapsed() << "ms"; @@ -162,6 +164,24 @@ void Spectrogram::getLine(float *dest, int y) } } +void Spectrogram::paintTimeAxis(QPainter *painter, QRect rect) +{ + // Round up for firstLine and round each to nearest linesPerGraduation + int firstLine = ((rect.y() + linesPerGraduation - 1) / linesPerGraduation) * linesPerGraduation; + int lastLine = ((rect.y() + rect.height()) / linesPerGraduation) * linesPerGraduation; + + painter->save(); + QPen pen(Qt::white, 1, Qt::SolidLine); + painter->setPen(pen); + QFontMetrics fm(painter->font()); + int textOffset = fm.ascent() / 2 - 1; + for (int line = firstLine; line <= lastLine; line += linesPerGraduation) { + painter->drawLine(0, line, 10, line); + painter->drawText(12, line + textOffset, sampleToTime(lineToSample(line))); + } + painter->restore(); +} + void Spectrogram::setSampleRate(int rate) { sampleRate = rate; @@ -212,3 +232,12 @@ int Spectrogram::getStride() { return fftSize / pow(2, zoomLevel); } + +off_t Spectrogram::lineToSample(int line) { + return line * getStride(); +} + +QString Spectrogram::sampleToTime(off_t sample) +{ + return QString::number((float)sample / sampleRate).append("s"); +} \ No newline at end of file diff --git a/spectrogram.h b/spectrogram.h index 335c11e..ee30405 100644 --- a/spectrogram.h +++ b/spectrogram.h @@ -29,6 +29,8 @@ protected: private: + const int linesPerGraduation = 50; + InputSource *inputSource = nullptr; FFT *fft = nullptr; std::unique_ptr window; @@ -41,4 +43,7 @@ private: float powerMin; void getLine(float *dest, int y); + void paintTimeAxis(QPainter *painter, QRect rect); + off_t lineToSample(int line); + QString sampleToTime(off_t sample); }; \ No newline at end of file