18#ifndef AUDIOMIXINGASSISTANTDIALOG_H
19#define AUDIOMIXINGASSISTANTDIALOG_H
21#include "models/multitrackmodel.h"
28class QTableWidgetItem;
29class QDialogButtonBox;
35class TrackAudioReader;
38struct TrackAnalysisResult
41 AudioTrackRole role = UnassignedAudioRole;
42 double integratedLoudness = -100.0;
43 QVector<float> frameLevels;
55enum class RecommendationKind {
61 BackgroundMusicDucking,
62 BackgroundMusicFrequencyCarving,
73struct MixRecommendation
76 RecommendationKind kind = RecommendationKind::Unknown;
81 QString shotcutFilterName;
82 QList<QPair<QString, double>> properties;
85class AudioMixingAssistantDialog :
public QDialog
89 explicit AudioMixingAssistantDialog(QString title, MultitrackModel *model, QWidget *parent = 0);
92 void reject()
override;
95 void onTrackNameChanged(QTableWidgetItem *item);
96 void onTrackRoleChanged(
int trackIndex,
int roleComboIndex);
97 void onTargetPresetChanged(
int index);
98 void onTargetLoudnessChanged(
double value);
99 void onActionButtonPressed();
100 void onTrackAnalysisProgress(
int trackIndex,
int percent);
101 void onTrackAnalysisFinished(
int trackIndex,
102 double integratedLoudness,
103 QVector<float> frameLevels);
106 enum Column { ColumnType = 0, ColumnName, ColumnRole };
107 enum RecommendationColumn {
108 RecommendationColumnEnabled = 0,
109 RecommendationColumnTrack,
110 RecommendationColumnDescription
112 enum TargetPreset { PresetWeb = 0, PresetBroadcast, PresetCustom };
113 enum Stage { StageConfigure = 0, StageProcessing, StageRecommendations };
115 QWidget *createConfigurePage();
116 QWidget *createProgressPage();
117 QWidget *createRecommendationsPage();
118 void populateTrackTable();
119 QString roleDisplayName(AudioTrackRole role)
const;
120 void updateTargetPresetFromLoudness(
double value);
121 void startProcessing();
122 void finishProcessing();
123 void generateRecommendations();
124 void addLoudnessRecommendation(
const TrackAnalysisResult &result);
125 void addHighPassRecommendation(
const TrackAnalysisResult &result);
126 void addCompressorRecommendation(
const TrackAnalysisResult &result);
127 void addBackgroundMusicGainRecommendation(
const TrackAnalysisResult &result,
128 double anchorLoudness);
129 void addDuckingRecommendation(
const TrackAnalysisResult &result);
130 void addFrequencyCarvingRecommendation(
const TrackAnalysisResult &result);
131 void addAmbienceGainRecommendation(
const TrackAnalysisResult &result,
double anchorLoudness);
132 void addAmbienceHighPassRecommendation(
const TrackAnalysisResult &result);
133 void addAmbienceLowPassRecommendation(
const TrackAnalysisResult &result);
134 void addSfxGainRecommendation(
const TrackAnalysisResult &result,
double anchorLoudness);
135 void addSfxHighPassRecommendation(
const TrackAnalysisResult &result);
136 void addSfxDuckingRecommendation(
const TrackAnalysisResult &result);
137 void addPremixedProgramGainRecommendation(
const TrackAnalysisResult &result);
138 double dialogueAnchorLoudness()
const;
139 double dialogueNormalizationGain(
const TrackAnalysisResult &result)
const;
140 void populateRecommendationsList();
141 void applyApprovedRecommendations();
142 QVector<QPair<int, int>> findDialogueEvents()
const;
143 QVector<DuckingKeyframe> generateDuckingKeyframes(
const QVector<QPair<int, int>> &events,
147 int fadeUpFrames)
const;
149 MultitrackModel *m_model;
150 QTableWidget *m_table;
151 QComboBox *m_targetPresetCombo;
152 QDoubleSpinBox *m_targetLoudnessSpinner;
153 QStackedWidget *m_stack;
154 QProgressBar *m_progressBar;
155 QTableWidget *m_recommendationsTable;
156 QDialogButtonBox *m_buttonBox;
157 QPushButton *m_actionButton;
160 bool m_processing =
false;
161 bool m_cancelRequested =
false;
162 QVector<TrackAnalysisResult> m_analysisResults;
163 QVector<MixRecommendation> m_recommendations;
164 QHash<int, int> m_trackProgressByIndex;
165 int m_pendingAnalysisCount;