qt6-bb10/qtmultimedia/tests/manual/mediaframeinputs/previewrunner.cpp

68 lines
2.1 KiB
C++

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "previewrunner.h"
#include <QEvent>
PreviewRunner::PreviewRunner()
{
m_player.setVideoOutput(&m_preview);
m_player.setAudioOutput(&m_audioOutput);
connect(&m_player, &QMediaPlayer::playbackStateChanged, this,
&PreviewRunner::handlePlaybackStateChanged);
connect(&m_player, &QMediaPlayer::errorOccurred, this, &PreviewRunner::handleError);
connect(&m_player, &QMediaPlayer::positionChanged, this, &PreviewRunner::updateTitle);
m_preview.installEventFilter(this);
}
bool PreviewRunner::eventFilter(QObject *watched, QEvent *event)
{
if (watched == &m_preview && event->type() == QEvent::Close) {
emit finished();
m_player.stop();
}
return QObject::eventFilter(watched, event);
}
void PreviewRunner::run(const QUrl &mediaLocation)
{
m_preview.show();
m_player.setSource(mediaLocation);
m_player.play();
}
void PreviewRunner::handlePlaybackStateChanged(QMediaPlayer::PlaybackState state)
{
if (state == QMediaPlayer::StoppedState) {
m_preview.close();
const bool noError = m_player.error() == QMediaPlayer::NoError;
qInfo() << "Preview finished" << (noError ? "" : "with an error");
} else if (state == QMediaPlayer::PlayingState) {
qInfo() << "Running preview for media" << m_player.source();
updateTitle();
}
}
void PreviewRunner::handleError(QMediaPlayer::Error error, QString description)
{
qWarning() << "Playing error occurred:" << error << description;
if (m_player.playbackState() == QMediaPlayer::StoppedState)
m_preview.close();
}
void PreviewRunner::updateTitle()
{
m_preview.setWindowTitle(QStringLiteral("Playing %1; pos: %2; duration: %3")
.arg(m_player.source().toString(),
QString::number(m_player.position()),
QString::number(m_player.duration())));
}
#include "moc_previewrunner.cpp"