File indexing completed on 2024-04-21 04:51:04

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 <memory>
0010 #include <unordered_map>
0011 
0012 #include <QSlider>
0013 #include <QWidget>
0014 
0015 namespace Mlt {
0016 class Tractor;
0017 }
0018 
0019 class MixerWidget;
0020 class QHBoxLayout;
0021 class TimelineItemModel;
0022 class QScrollArea;
0023 
0024 /** MySlider class is only here to get the slider handle size used when painting the audio level scale */
0025 class MySlider : public QSlider
0026 {
0027 public:
0028     explicit MySlider(QWidget *parent = nullptr);
0029     int getHandleHeight();
0030 };
0031 
0032 class MixerManager : public QWidget
0033 {
0034     Q_OBJECT
0035 
0036 public:
0037     MixerManager(QWidget *parent);
0038     /** @brief Shows the parameters of the given transition model */
0039     void registerTrack(int tid, Mlt::Tractor *service, const QString &trackTag, const QString &trackName);
0040     void deregisterTrack(int tid);
0041     void setModel(std::shared_ptr<TimelineItemModel> model);
0042     void cleanup();
0043     /** @brief Connect the mixer widgets to the correspondent filters */
0044     void connectMixer(bool doConnect);
0045     void collapseMixers();
0046     /** @brief Pause/unpause audio monitoring */
0047     void pauseMonitoring(bool pause);
0048     /** @brief Release the timeline model ownership */
0049     void unsetModel();
0050     /** @brief Some features rely on a specific version of MLT's audiolevel filter, so check it */
0051     void checkAudioLevelVersion();
0052     /** @brief Enable/disable audio monitoring on a track */
0053     void monitorAudio(int tid, bool monitor);
0054     /** @brief Track currently monitored that will be used for recording */
0055     int recordTrack() const;
0056     /** @brief Return true if we have MLT's audiolevel filter version 2 or above (fixes reading track audio level) */
0057     bool audioLevelV2() const;
0058 
0059 public Q_SLOTS:
0060     void recordStateChanged(int tid, bool recording);
0061 
0062 private Q_SLOTS:
0063     void resetSizePolicy();
0064 
0065 Q_SIGNALS:
0066     void updateLevels(int);
0067     void purgeCache();
0068     void clearMixers();
0069     void updateRecVolume();
0070     void showEffectStack(int tid);
0071 
0072 protected:
0073     std::unordered_map<int, std::shared_ptr<MixerWidget>> m_mixers;
0074     std::shared_ptr<MixerWidget> m_masterMixer;
0075     QSize sizeHint() const override;
0076 
0077 private:
0078     std::shared_ptr<Mlt::Tractor> m_masterService;
0079     std::shared_ptr<TimelineItemModel> m_model;
0080     QHBoxLayout *m_box;
0081     QHBoxLayout *m_masterBox;
0082     QHBoxLayout *m_channelsLayout;
0083     QScrollArea *m_channelsBox;
0084     bool m_visibleMixerManager;
0085     int m_expandedWidth;
0086     QVector<int> m_soloMuted;
0087     int m_recommendedWidth;
0088     int m_monitorTrack;
0089     bool m_filterIsV2;
0090     int m_sliderHandle;
0091 };