diff --git a/mainwindow.cpp b/mainwindow.cpp index 117d27d..5b983d6 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -64,6 +64,7 @@ void MainWindow::openFile(QString fileName) void MainWindow::setSampleRate(QString rate) { input->setSampleRate(rate.toInt()); + plots->setSampleRate(rate.toInt()); } void MainWindow::setSampleRate(int rate) diff --git a/plotview.cpp b/plotview.cpp index 75789ec..05171cf 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -333,3 +333,9 @@ void PlotView::updateView(bool reCenter) // Re-paint viewport()->update(); } + +void PlotView::setSampleRate(off_t rate) +{ + spectrogramPlot->setSampleRate(rate); +} + diff --git a/plotview.h b/plotview.h index 2e19b3d..783a826 100644 --- a/plotview.h +++ b/plotview.h @@ -35,6 +35,7 @@ class PlotView : public QAbstractScrollArea, Subscriber public: PlotView(InputSource *input); + void setSampleRate(off_t rate); signals: void timeSelectionChanged(float time); @@ -79,4 +80,4 @@ private: int plotsHeight(); off_t samplesPerLine(); void updateView(bool reCenter = false); -}; \ No newline at end of file +}; diff --git a/spectrogramplot.cpp b/spectrogramplot.cpp index fd8ce88..ee71c23 100644 --- a/spectrogramplot.cpp +++ b/spectrogramplot.cpp @@ -52,6 +52,53 @@ void SpectrogramPlot::paintFront(QPainter &painter, QRect &rect, range_t { if (tunerEnabled()) tuner.paintFront(painter, rect, sampleRange); + + float startTime = (float)sampleRange.minimum / sampleRate; + float stopTime = (float)sampleRange.maximum / sampleRate; + float duration = stopTime - startTime; + + painter.save(); + + QPen pen(Qt::white, 1, Qt::SolidLine); + painter.setPen(pen); + QFontMetrics fm(painter.font()); + + int tickWidth = 80; + int maxTicks = rect.width() / tickWidth; + + double durationPerTick = 10 * pow(10, floor(log(duration / maxTicks) / log(10))); + + double firstTick = int(startTime / durationPerTick) * durationPerTick; + + double tick = firstTick; + + while (tick <= stopTime) { + + off_t tickSample = tick * sampleRate; + int tickLine = (tickSample - sampleRange.minimum) / getStride(); + + char buf[128]; + snprintf(buf, sizeof(buf), "%.06f", tick); + painter.drawLine(tickLine, 0, tickLine, 30); + painter.drawText(tickLine + 2, 25, buf); + + tick += durationPerTick; + } + + // Draw small ticks + durationPerTick /= 10; + firstTick = int(startTime / durationPerTick) * durationPerTick; + tick = firstTick; + while (tick <= stopTime) { + + off_t tickSample = tick * sampleRate; + int tickLine = (tickSample - sampleRange.minimum) / getStride(); + + painter.drawLine(tickLine, 0, tickLine, 10); + tick += durationPerTick; + } + + painter.restore(); } void SpectrogramPlot::paintMid(QPainter &painter, QRect &rect, range_t sampleRange) @@ -239,3 +286,10 @@ uint qHash(const TileCacheKey &key, uint seed) { return key.fftSize ^ key.zoomLevel ^ key.sample ^ seed; } + +void SpectrogramPlot::setSampleRate(off_t rate) +{ + sampleRate = rate; + emit repaint(); +} + diff --git a/spectrogramplot.h b/spectrogramplot.h index 44d7ee0..52a56f6 100644 --- a/spectrogramplot.h +++ b/spectrogramplot.h @@ -42,6 +42,7 @@ public: void paintFront(QPainter &painter, QRect &rect, range_t sampleRange) override; void paintMid(QPainter &painter, QRect &rect, range_t sampleRange) override; bool mouseEvent(QEvent::Type type, QMouseEvent event) override; + void setSampleRate(off_t rate); public slots: void setFFTSize(int size); @@ -65,6 +66,7 @@ private: int zoomLevel; float powerMax; float powerMin; + off_t sampleRate = 0; Tuner tuner; std::shared_ptr tunerTransform;