File indexing completed on 2024-03-24 04:53:52
0001 /* 0002 SPDX-FileCopyrightText: 2019 Jean-Baptiste Mardelle 0003 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0004 */ 0005 0006 #pragma once 0007 0008 #include "definitions.h" 0009 #include "mlt++/MltService.h" 0010 0011 #include <QMutex> 0012 #include <QWidget> 0013 #include <memory> 0014 #include <unordered_map> 0015 0016 class KDualAction; 0017 class AudioLevelWidget; 0018 class QSlider; 0019 class QDial; 0020 class QSpinBox; 0021 class QDoubleSpinBox; 0022 class QLabel; 0023 class QToolButton; 0024 class MixerManager; 0025 class KSqueezedTextLabel; 0026 0027 namespace Mlt { 0028 class Tractor; 0029 class Event; 0030 } // namespace Mlt 0031 0032 class MixerWidget : public QWidget 0033 { 0034 Q_OBJECT 0035 0036 public: 0037 MixerWidget(int tid, Mlt::Tractor *service, QString trackTag, const QString &trackName, int sliderHandle, MixerManager *parent = nullptr); 0038 ~MixerWidget() override; 0039 void buildUI(Mlt::Tractor *service, const QString &trackName); 0040 /** @brief discard stored audio values and reset vu-meter to 0 if requested */ 0041 void reset(); 0042 /** @brief discard stored audio values */ 0043 void clear(); 0044 static void property_changed(mlt_service, MixerWidget *self, mlt_event_data data); 0045 static void property_changedV2(mlt_service, MixerWidget *widget, mlt_event_data data); 0046 void setTrackName(const QString &name); 0047 void setMute(bool mute); 0048 /** @brief Returns true if track is muted 0049 * */ 0050 bool isMute() const; 0051 /** @brief Uncheck the solo button 0052 * */ 0053 void unSolo(); 0054 /** @brief Connect the mixer widgets to the correspondent filters */ 0055 void connectMixer(bool doConnect); 0056 /** @brief Disable/enable monitoring by disabling/enabling filter */ 0057 void pauseMonitoring(bool pause); 0058 /** @brief Update widget to reflect state (monitor/record/none) */ 0059 void updateMonitorState(); 0060 /** @brief Enable/disable audio monitoring on this mixer */ 0061 void monitorAudio(bool monitor); 0062 0063 protected: 0064 void mousePressEvent(QMouseEvent *event) override; 0065 0066 public Q_SLOTS: 0067 void updateAudioLevel(int pos); 0068 void setRecordState(bool recording); 0069 0070 private Q_SLOTS: 0071 void gotRecLevels(QVector<qreal> levels); 0072 0073 protected: 0074 MixerManager *m_manager; 0075 int m_tid; 0076 std::shared_ptr<Mlt::Filter> m_levelFilter; 0077 std::shared_ptr<Mlt::Filter> m_monitorFilter; 0078 std::shared_ptr<Mlt::Filter> m_balanceFilter; 0079 QMap<int, QVector<double>> m_levels; 0080 int m_channels; 0081 KDualAction *m_muteAction; 0082 QSpinBox *m_balanceSpin; 0083 QSlider *m_balanceSlider; 0084 QDoubleSpinBox *m_volumeSpin; 0085 int m_maxLevels; 0086 0087 private: 0088 std::shared_ptr<AudioLevelWidget> m_audioMeterWidget; 0089 QSlider *m_volumeSlider; 0090 QToolButton *m_solo; 0091 QToolButton *m_collapse; 0092 QToolButton *m_monitor; 0093 KSqueezedTextLabel *m_trackLabel; 0094 QMutex m_storeMutex; 0095 double m_lastVolume; 0096 QVector<double> m_audioData; 0097 Mlt::Event *m_listener; 0098 bool m_recording; 0099 const QString m_trackTag; 0100 int m_sliderHandleSize; 0101 /** @Update track label to reflect state */ 0102 void updateLabel(); 0103 0104 Q_SIGNALS: 0105 void gotLevels(QPair<double, double>); 0106 void muteTrack(int tid, bool mute); 0107 void toggleSolo(int tid, bool toggled); 0108 };