diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 83c8149..be7e978 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -1,6 +1,6 @@ -find_package(Qt5) +find_package(Qt6) -find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Multimedia) +find_package(QT NAMES Qt6 REQUIRED COMPONENTS Widgets Multimedia) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Multimedia) find_package(FFMPEG 3.0 REQUIRED diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index d648770..5e89b33 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -127,17 +127,17 @@ void MainWindow::InitializeMenuBar() auto file_menu = menubar->addMenu(tr("&File")); - file_menu->addAction(tr("&New"), this, &MainWindow::NewFile, tr("Ctrl+N")); + file_menu->addAction(tr("&New"), tr("Ctrl+N"), this, &MainWindow::NewFile); - file_menu->addAction(tr("&Open"), this, &MainWindow::OpenFile, tr("Ctrl+O")); + file_menu->addAction(tr("&Open"), tr("Ctrl+O"), this, &MainWindow::OpenFile); - file_menu->addAction(tr("&Save"), this, &MainWindow::SaveFile, tr("Ctrl+S")); + file_menu->addAction(tr("&Save"), tr("Ctrl+S"), this, &MainWindow::SaveFile); - file_menu->addAction(tr("Save &As"), this, &MainWindow::SaveFileAs, tr("Ctrl+Shift+S")); + file_menu->addAction(tr("Save &As"), tr("Ctrl+Shift+S"), this, &MainWindow::SaveFileAs); file_menu->addSeparator(); - file_menu->addAction(tr("&View SI File"), this, &MainWindow::ViewSIFile, tr("Ctrl+I")); + file_menu->addAction(tr("&View SI File"), tr("Ctrl+I"), this, &MainWindow::ViewSIFile); file_menu->addSeparator(); diff --git a/app/viewer/mediapanel.cpp b/app/viewer/mediapanel.cpp index 03d6144..a0148a0 100644 --- a/app/viewer/mediapanel.cpp +++ b/app/viewer/mediapanel.cpp @@ -1,9 +1,12 @@ #include "mediapanel.h" #include + +#include #include #include #include +#include #include #include #include @@ -27,7 +30,7 @@ MediaPanel::MediaPanel(QWidget *parent) : preview_layout->addWidget(viewer_scroll, 1); m_viewerLayout = new QVBoxLayout(viewer_inner); - m_viewerLayout->setMargin(0); + m_viewerLayout->setContentsMargins(0, 0, 0, 0); auto ctrl_layout = new QHBoxLayout(); preview_layout->addLayout(ctrl_layout); @@ -370,7 +373,7 @@ void MediaPanel::Play(bool e) { { // No matter what, stop any current audio - std::vector copy = m_audioOutputs; + std::vector copy = m_audioSinks; for (auto it=copy.cbegin(); it!=copy.cend(); it++) { auto o = *it; o->stop(); @@ -388,7 +391,7 @@ void MediaPanel::Play(bool e) m_PlaybackOffset = GetSecondsFromSlider(); - auto output_dev = QAudioDeviceInfo::defaultOutputDevice(); + auto output_dev = QAudioDevice(QMediaDevices::defaultAudioOutput()); auto fmt = output_dev.preferredFormat(); for (auto it=m_mediaInstances.cbegin(); it!=m_mediaInstances.cend(); it++) { @@ -401,11 +404,11 @@ void MediaPanel::Play(bool e) } else if (m->codec_type() == AVMEDIA_TYPE_AUDIO) { if (m_PlaybackOffset < (m->GetDuration() + m->GetStartOffset())) { if (m->StartPlayingAudio(output_dev, fmt)) { - auto out = new QAudioOutput(output_dev, fmt, this); + auto out = new QAudioSink(output_dev, fmt, this); out->setVolume(m->GetVolume()); out->start(m); - connect(out, &QAudioOutput::stateChanged, this, &MediaPanel::AudioOutputEnded); - m_audioOutputs.push_back(out); + connect(out, &QAudioSink::stateChanged, this, &MediaPanel::AudioStateChanged); + m_audioSinks.push_back(out); has_audio = true; } } else { @@ -447,7 +450,7 @@ void MediaPanel::TimerUpdate() if (all_eof) { // Detach audio output so that it flushes itself - m_audioOutputs.clear(); + m_audioSinks.clear(); Play(false); m_PlayheadSlider->setValue(m_PlayheadSlider->maximum()); @@ -503,16 +506,18 @@ void MediaPanel::LabelContextMenuTriggered(const QPoint &pos) m.exec(static_cast(sender())->mapToGlobal(pos)); } -void MediaPanel::AudioOutputEnded() +void MediaPanel::AudioStateChanged(QAudio::State newState) { - auto out = static_cast(sender()); + if (newState == QAudio::IdleState) { + auto out = static_cast(sender()); - auto it = std::find(m_audioOutputs.begin(), m_audioOutputs.end(), out); - if (it != m_audioOutputs.end()) { - m_audioOutputs.erase(it); - } + auto it = std::find(m_audioSinks.begin(), m_audioSinks.end(), out); + if (it != m_audioSinks.end()) { + m_audioSinks.erase(it); + } - delete out; + delete out; + } } qint64 MediaInstance::readData(char *data, qint64 maxSize) @@ -679,7 +684,7 @@ void MediaInstance::Close() m_Data.Close(); } -bool MediaInstance::StartPlayingAudio(const QAudioDeviceInfo &output_dev, const QAudioFormat &fmt) +bool MediaInstance::StartPlayingAudio(const QAudioDevice &output_dev, const QAudioFormat &fmt) { if (m_SwrCtx) { swr_free(&m_SwrCtx); @@ -687,38 +692,21 @@ bool MediaInstance::StartPlayingAudio(const QAudioDeviceInfo &output_dev, const } AVSampleFormat smp_fmt = AV_SAMPLE_FMT_S16; - switch (fmt.sampleType()) { + switch (fmt.sampleFormat()) { + default: case QAudioFormat::Unknown: break; - case QAudioFormat::SignedInt: - switch (fmt.sampleSize()) { - case 16: - smp_fmt = AV_SAMPLE_FMT_S16; - break; - case 32: - smp_fmt = AV_SAMPLE_FMT_S32; - break; - case 64: - smp_fmt = AV_SAMPLE_FMT_S64; - break; - } + case QAudioFormat::Int16: + smp_fmt = AV_SAMPLE_FMT_S16; break; - case QAudioFormat::UnSignedInt: - switch (fmt.sampleSize()) { - case 8: - smp_fmt = AV_SAMPLE_FMT_U8; - break; - } + case QAudioFormat::Int32: + smp_fmt = AV_SAMPLE_FMT_S32; + break; + case QAudioFormat::UInt8: + smp_fmt = AV_SAMPLE_FMT_U8; break; case QAudioFormat::Float: - switch (fmt.sampleSize()) { - case 32: - smp_fmt = AV_SAMPLE_FMT_FLT; - break; - case 64: - smp_fmt = AV_SAMPLE_FMT_DBL; - break; - } + smp_fmt = AV_SAMPLE_FMT_FLT; break; } diff --git a/app/viewer/mediapanel.h b/app/viewer/mediapanel.h index 37ff335..9dfc5eb 100644 --- a/app/viewer/mediapanel.h +++ b/app/viewer/mediapanel.h @@ -10,13 +10,15 @@ extern "C" { #include #include + +#include #include +#include #include #include #include #include #include - #include "panel.h" class MediaInstance : public QIODevice @@ -34,7 +36,7 @@ class MediaInstance : public QIODevice return m_Stream ? m_Stream->codecpar->codec_type : AVMEDIA_TYPE_UNKNOWN; } - bool StartPlayingAudio(const QAudioDeviceInfo &output_dev, const QAudioFormat &fmt); + bool StartPlayingAudio(const QAudioDevice &output_dev, const QAudioFormat &fmt); void Seek(float seconds); @@ -156,7 +158,7 @@ class MediaPanel : public Panel std::vector m_imgViewers; std::vector m_mediaInstances; - std::vector m_audioOutputs; + std::vector m_audioSinks; QSlider *m_PlayheadSlider; QPushButton *m_PlayBtn; @@ -178,7 +180,7 @@ private slots: void LabelContextMenuTriggered(const QPoint &pos); - void AudioOutputEnded(); + void AudioStateChanged(QAudio::State newState); };