File indexing completed on 2024-04-28 08:43:21

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 };