From 141ac8b12faca6f6a0eafa31059c7791191ddc0c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 22 Apr 2020 01:26:39 +1000 Subject: [PATCH] audiomonitor: implemented hardware acceleration Drawing is much smoother this way. --- app/audio/audiomanager.cpp | 2 + app/audio/audiomanager.h | 2 + app/widget/audiomonitor/audiomonitor.cpp | 74 ++++++++++++++++++------ app/widget/audiomonitor/audiomonitor.h | 16 +++-- 4 files changed, 70 insertions(+), 24 deletions(-) diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index d70d3a4e0..1a2a66551 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -65,6 +65,8 @@ bool AudioManager::IsRefreshingInputs() void AudioManager::PushToOutput(const QByteArray &samples) { output_manager_.Push(samples); + + emit OutputPushed(samples); } void AudioManager::StartOutput(const QString &filename, qint64 offset, int playback_speed) diff --git a/app/audio/audiomanager.h b/app/audio/audiomanager.h index 929374616..76a6b6be9 100644 --- a/app/audio/audiomanager.h +++ b/app/audio/audiomanager.h @@ -90,6 +90,8 @@ signals: void AudioParamsChanged(const AudioRenderingParams& params); + void OutputPushed(const QByteArray& data); + void Stopped(); private: diff --git a/app/widget/audiomonitor/audiomonitor.cpp b/app/widget/audiomonitor/audiomonitor.cpp index a7737d530..05a99dee9 100644 --- a/app/widget/audiomonitor/audiomonitor.cpp +++ b/app/widget/audiomonitor/audiomonitor.cpp @@ -31,19 +31,16 @@ OLIVE_NAMESPACE_ENTER const int kDecibelStep = 6; const int kDecibelMinimum = -200; -const int kMaximumSmoothness = 4; +const int kMaximumSmoothness = 8; AudioMonitor::AudioMonitor(QWidget *parent) : - QWidget(parent), + QOpenGLWidget(parent), cached_channels_(0) { - update_timer_.setInterval(1000 / 60); // Hardcoded to 60 FPS - connect(&update_timer_, &QTimer::timeout, this, static_cast(&AudioMonitor::update)); - update_timer_.start(); - values_.resize(kMaximumSmoothness); connect(AudioManager::instance(), &AudioManager::OutputDeviceStarted, this, &AudioMonitor::OutputDeviceSet); + connect(AudioManager::instance(), &AudioManager::OutputPushed, this, &AudioMonitor::OutputPushed); connect(AudioManager::instance(), &AudioManager::AudioParamsChanged, this, &AudioMonitor::SetParams); connect(AudioManager::instance(), &AudioManager::Stopped, this, &AudioMonitor::Stop); } @@ -81,10 +78,9 @@ void AudioMonitor::OutputDeviceSet(const QString &filename, qint64 offset, int p playback_speed_ = playback_speed; - update_timer_.start(); last_time_ = QDateTime::currentMSecsSinceEpoch(); - update(); + SetUpdateLoop(true); } void AudioMonitor::Stop() @@ -94,6 +90,28 @@ void AudioMonitor::Stop() } } +void AudioMonitor::OutputPushed(const QByteArray &data) +{ + QVector v(params_.channel_count(), 0); + + BytesToSampleSummary(data, v); + + PushValue(v); + + SetUpdateLoop(true); +} + +void AudioMonitor::SetUpdateLoop(bool e) +{ + if (e) { + connect(this, &AudioMonitor::frameSwapped, this, static_cast(&AudioMonitor::update)); + + update(); + } else { + disconnect(this, &AudioMonitor::frameSwapped, this, static_cast(&AudioMonitor::update)); + } +} + /* void AudioMonitor::SetValues(QVector values) { @@ -111,13 +129,15 @@ void AudioMonitor::SetValues(QVector values) } */ -void AudioMonitor::paintEvent(QPaintEvent *) +void AudioMonitor::paintGL() { + QPainter p(this); + p.fillRect(rect(), palette().window().color()); + if (!params_.channel_count()) { return; } - QPainter p(this); QFontMetrics fm = p.fontMetrics(); int peaks_y = 0; @@ -223,6 +243,8 @@ void AudioMonitor::paintEvent(QPaintEvent *) p.setBrush(QColor(0, 0, 0, 128)); p.setPen(Qt::NoPen); + bool all_zeroes = true; + for (int i=0;i& v) // Determine how many bytes this is int bytes_to_read = params_.time_to_bytes(static_cast(time_passed) * 0.001); - QByteArray b = file_.read(bytes_to_read); + QByteArray b = file_.read(bytes_to_read);; + BytesToSampleSummary(b, v); + + last_time_ = current_time; +} + +void AudioMonitor::PushValue(const QVector &v) +{ + values_.removeFirst(); + values_.append(v); +} + +void AudioMonitor::BytesToSampleSummary(const QByteArray &b, QVector &v) +{ const float* samples = reinterpret_cast(b.constData()); int nb_samples = b.size() / sizeof(float); @@ -279,14 +323,6 @@ void AudioMonitor::UpdateValuesFromFile(QVector& v) v.replace(channel, abs_sample); } } - - last_time_ = current_time; -} - -void AudioMonitor::PushValue(const QVector &v) -{ - values_.removeFirst(); - values_.append(v); } QVector AudioMonitor::GetAverages() const diff --git a/app/widget/audiomonitor/audiomonitor.h b/app/widget/audiomonitor/audiomonitor.h index 96d15c634..f220e0c04 100644 --- a/app/widget/audiomonitor/audiomonitor.h +++ b/app/widget/audiomonitor/audiomonitor.h @@ -22,15 +22,15 @@ #define AUDIOMONITORWIDGET_H #include +#include #include -#include #include "common/define.h" #include "render/audioparams.h" OLIVE_NAMESPACE_ENTER -class AudioMonitor : public QWidget +class AudioMonitor : public QOpenGLWidget { Q_OBJECT public: @@ -45,15 +45,23 @@ public slots: void Stop(); + void OutputPushed(const QByteArray& data); + protected: - virtual void paintEvent(QPaintEvent* event) override; + //virtual void paintEvent(QPaintEvent* event) override; + virtual void paintGL() override; + virtual void mousePressEvent(QMouseEvent* event) override; private: + void SetUpdateLoop(bool e); + void UpdateValuesFromFile(QVector &v); void PushValue(const QVector& v); + void BytesToSampleSummary(const QByteArray& bytes, QVector& v); + QVector GetAverages() const; AudioRenderingParams params_; @@ -69,8 +77,6 @@ private: QPixmap cached_background_; int cached_channels_; - QTimer update_timer_; - }; OLIVE_NAMESPACE_EXIT