-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmainwindow.cpp
More file actions
114 lines (99 loc) · 4.94 KB
/
Copy pathmainwindow.cpp
File metadata and controls
114 lines (99 loc) · 4.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "mainwindow.h"
#include <QtWidgets>
#include <QAudioOutput>
#include "audio.h"
#include "spectrograph.h"
/*
* File: mainwindow.cpp
* Description:
* This source file impl:ements the 'MainWindow' class, providing functionality for the main UI.
* It initializes the main window, sets up the main layout in a vertical layout, and creates two
* 'Audio' objects for dual audio playback functionality. The constructor creates the central widget,
* configures the vertical layout, and adds two 'Audio' widgets. The 'audio1' and 'audio2' widgets
* are integrated into the layout to enable independent audio playback and visualiztion within the
* UI layout.
*
* *Slots:
* - 'audio2ConnectAllowed(bool secondAudioExists)': emits a signal that the first audio
* can enable the align audio checkbox if there is a second audio available
* - 'audio2Connect(bool connectAudios)': connects or disconnects the controls for the first audio
* to the second
* - 'handleEndOfAudio2(bool disc)': connects/disconnects the second audio playing from the first incase the
* audios are two different sizes or are played simultaniously from different position and the second ends before
* the first.
* Notes:
* - The 'Audio' class is used for playback and visualization(*). See 'audio.h' and 'audio.cpp' for
* its implementation.
* -
*
* References:
* - scroll area: https://stackoverflow.com/questions/65554770/qscrollarea-how-do-i-make-my-central-widget-scrollable
*/
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), connected(false)
{
QScrollArea *scrollArea = new QScrollArea(this);
// create central widget
QWidget *center = new QWidget();
setCentralWidget(scrollArea);
scrollArea->setWidget(center);
scrollArea->show();
scrollArea->setWidgetResizable(true);
// create main layout for central widget
// this was V before
mainLayout = new QVBoxLayout(center);
audio1 = new Audio(nullptr, "Speaker Sound Wave");
mainLayout->addWidget(audio1);
// spectrograph 1
Spectrograph *spectrograph1 = new Spectrograph();
mainLayout->addWidget(spectrograph1, 0, Qt::AlignRight);
connect(audio1, &Audio::audioFileSelected, spectrograph1, &Spectrograph::loadAudioFile);
connect(audio1->alignAllAudioFocus, &QCheckBox::clicked, this, &MainWindow::audio2Connect);
connect(this, &MainWindow::canEnableAudioAlignment, audio1, &Audio::enableAudioAligning);
audio2 = new Audio(nullptr, "User Sound Wave", 1);
mainLayout->addWidget(audio2);
// spectrograph 2
Spectrograph *spectrograph2 = new Spectrograph();
mainLayout->addWidget(spectrograph2, 0, Qt::AlignRight);
connect(audio2, &Audio::audioFileSelected, spectrograph2, &Spectrograph::loadAudioFile);
connect(audio2, &Audio::secondAudioExists, this, &MainWindow::audio2ConnectAllowed);
connect(this, &MainWindow::disableAudio2, audio2, &Audio::disableAudioControls);
connect(audio2, &Audio::audioEnded, this, &MainWindow::handleEndOfAudio2);
connect(audio1, &Audio::audioEnded, this, &MainWindow::handleEndOfAudio2);
center->setLayout(mainLayout);
}
//all based on audio 0, the zoom, whenever one reaches the end, both stop, play pause affected, segment click stops allignment
void MainWindow::audio2ConnectAllowed(bool secondAudioExists){
emit canEnableAudioAlignment(secondAudioExists);
}
void MainWindow::audio2Connect(bool connectAudios){
if (connectAudios){
emit disableAudio2(true);
connected = true;
connect(audio1, &Audio::playPauseActivated, audio2, &Audio::handlePlayPause);
connect(audio1->zoomButtons, &Zoom::horizontalSliderChanged, audio2->zoomButtons, &Zoom::horizontalZoom);
connect(audio1->zoomButtons, &Zoom::verticalSliderChanged, audio2->zoomButtons, &Zoom::verticalZoom);
connect(audio1->zoomButtons, &Zoom::resetZoomActivated, audio2->zoomButtons, &Zoom::resetZoom);
connect(audio1, &Audio::scrubberUpdate, audio2, &Audio::updateTrackPositionFromScrubber);
}
else{
emit disableAudio2(false);
connected = false;
disconnect(audio1, &Audio::playPauseActivated, audio2, &Audio::handlePlayPause);
disconnect(audio1->zoomButtons, &Zoom::horizontalSliderChanged, audio2->zoomButtons, &Zoom::horizontalZoom);
disconnect(audio1->zoomButtons, &Zoom::verticalSliderChanged, audio2->zoomButtons, &Zoom::verticalZoom);
disconnect(audio1->zoomButtons, &Zoom::resetZoomActivated, audio2->zoomButtons, &Zoom::resetZoom);
disconnect(audio1, &Audio::scrubberUpdate, audio2, &Audio::updateTrackPositionFromScrubber);
}
}
void MainWindow::handleEndOfAudio2(bool disc){
if (disc && connected){
connected = false;
disconnect(audio1, &Audio::playPauseActivated, audio2, &Audio::handlePlayPause);
}else if (!connected && !disc){
connected = true;
connect(audio1, &Audio::playPauseActivated, audio2, &Audio::handlePlayPause);
}
}
MainWindow::~MainWindow() {
}