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 }