File indexing completed on 2024-04-28 04:52:04

0001 /*
0002     SPDX-FileCopyrightText: 2015 Meltytech LLC
0003     SPDX-FileCopyrightText: 2015 Brian Matherly <code@brianmatherly.com>
0004 
0005     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #include "scopewidget.h"
0009 #include "core.h"
0010 #include "kdenlive_debug.h"
0011 #include <QtConcurrent>
0012 
0013 ScopeWidget::ScopeWidget(QWidget *parent)
0014     : QWidget(parent)
0015     , m_queue(3, DataQueue<SharedFrame>::OverflowModeDiscardOldest)
0016     , m_future()
0017     , m_mutex()
0018     , m_size(0, 0)
0019 {
0020     // qCDebug(KDENLIVE_LOG) << "begin" << m_future.isFinished();
0021     // qCDebug(KDENLIVE_LOG) << "end";
0022 }
0023 
0024 ScopeWidget::~ScopeWidget() = default;
0025 
0026 void ScopeWidget::onNewFrame(const SharedFrame &frame)
0027 {
0028     m_queue.push(frame);
0029     requestRefresh();
0030 }
0031 
0032 void ScopeWidget::requestRefresh()
0033 {
0034     if (m_future.isFinished()) {
0035 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0036         m_future = QtConcurrent::run(this, &ScopeWidget::refreshInThread);
0037 #else
0038         m_future = QtConcurrent::run(&ScopeWidget::refreshInThread, this);
0039 #endif
0040     } else {
0041         m_refreshPending = true;
0042     }
0043 }
0044 
0045 void ScopeWidget::refreshInThread()
0046 {
0047     if (m_size.isEmpty() && !pCore->audioMixerVisible) {
0048         return;
0049     }
0050 
0051     m_mutex.lock();
0052     QSize size = m_size;
0053     bool full = m_forceRefresh;
0054     m_forceRefresh = false;
0055     m_mutex.unlock();
0056 
0057     m_refreshPending = false;
0058     refreshScope(size, full);
0059     // Tell the GUI thread that the refresh is complete.
0060     QMetaObject::invokeMethod(this, "onRefreshThreadComplete", Qt::QueuedConnection);
0061 }
0062 
0063 void ScopeWidget::onRefreshThreadComplete()
0064 {
0065     update();
0066     if (m_refreshPending) {
0067         requestRefresh();
0068     }
0069 }
0070 
0071 void ScopeWidget::resizeEvent(QResizeEvent *)
0072 {
0073     m_mutex.lock();
0074     m_size = size();
0075     m_mutex.unlock();
0076     requestRefresh();
0077 }
0078 
0079 void ScopeWidget::changeEvent(QEvent *)
0080 {
0081     m_mutex.lock();
0082     m_forceRefresh = true;
0083     m_mutex.unlock();
0084     requestRefresh();
0085 }