diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,6 @@ endif() find_package(KF5Kirigami2 ${REQUIRED_KF5_VERSION} CONFIG QUIET) - set_package_properties(KF5Kirigami2 PROPERTIES DESCRIPTION "KF5 Kirigami 2 is needed to provide the mobile UI components." TYPE REQUIRED) @@ -60,6 +59,12 @@ DESCRIPTION "KF5 text internationalization library." TYPE REQUIRED) +find_package(LIBVLC QUIET) +set_package_properties(LIBVLC PROPERTIES + DESCRIPTION "libvlc is requried to play music in Elisa" + URL "https://www.videolan.org/vlc/libvlc.html" + TYPE REQUIRED) + find_package(KF5Declarative ${REQUIRED_KF5_VERSION} CONFIG QUIET) set_package_properties(KF5Declarative PROPERTIES DESCRIPTION "Integration of QML and KDE work spaces." @@ -139,12 +144,6 @@ message(WARNING "UPnP support is experimental and may not work.") endif() -find_package(LIBVLC QUIET) -set_package_properties(LIBVLC PROPERTIES - DESCRIPTION "libvlc allows to play music in Elisa (otherwise it will use QtMultimedia)" - URL "https://www.videolan.org/vlc/libvlc.html" - TYPE RECOMMENDED) - include(FeatureSummary) include(GenerateExportHeader) include(ECMSetupVersion) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,31 +51,17 @@ DEFAULT_SEVERITY Info ) -if (LIBVLC_FOUND) - ecm_qt_declare_logging_category(elisaLib_SOURCES - HEADER "vlcLogging.h" - IDENTIFIER "orgKdeElisaPlayerVlc" - CATEGORY_NAME "org.kde.elisa.player.vlc" - DEFAULT_SEVERITY Info - ) - - set(elisaLib_SOURCES - ${elisaLib_SOURCES} - audiowrapper_libvlc.cpp - ) -else() - ecm_qt_declare_logging_category(elisaLib_SOURCES - HEADER "qtMultimediaLogging.h" - IDENTIFIER "orgKdeElisaPlayerQtMultimedia" - CATEGORY_NAME "org.kde.elisa.player.qtMultimedia" - DEFAULT_SEVERITY Info - ) +ecm_qt_declare_logging_category(elisaLib_SOURCES + HEADER "vlcLogging.h" + IDENTIFIER "orgKdeElisaPlayerVlc" + CATEGORY_NAME "org.kde.elisa.player.vlc" + DEFAULT_SEVERITY Info + ) - set(elisaLib_SOURCES - ${elisaLib_SOURCES} - audiowrapper_qtmultimedia.cpp - ) -endif() +set(elisaLib_SOURCES + ${elisaLib_SOURCES} + audiowrapper.cpp + ) if (ANDROID) set(elisaLib_SOURCES diff --git a/src/audiowrapper.h b/src/audiowrapper.h --- a/src/audiowrapper.h +++ b/src/audiowrapper.h @@ -73,11 +73,6 @@ READ seekable NOTIFY seekableChanged) - Q_PROPERTY(QAudio::Role audioRole - READ audioRole - WRITE setAudioRole - NOTIFY audioRoleChanged) - public: explicit AudioWrapper(QObject *parent = nullptr); @@ -102,8 +97,6 @@ bool seekable() const; - QAudio::Role audioRole() const; - Q_SIGNALS: void mutedChanged(bool muted); @@ -132,8 +125,6 @@ void stopped(); - void audioRoleChanged(); - public Q_SLOTS: void setMuted(bool muted); @@ -156,8 +147,6 @@ void seek(qint64 position); - void setAudioRole(QAudio::Role audioRole); - private Q_SLOTS: void mediaStatusChanged(); diff --git a/src/audiowrapper_libvlc.cpp b/src/audiowrapper.cpp rename from src/audiowrapper_libvlc.cpp rename to src/audiowrapper.cpp --- a/src/audiowrapper_libvlc.cpp +++ b/src/audiowrapper.cpp @@ -193,15 +193,6 @@ return d->mIsSeekable; } -QAudio::Role AudioWrapper::audioRole() const -{ - if (!d->mPlayer) { - return {}; - } - - return {}/*d->mPlayer.audioRole()*/; -} - QMediaPlayer::State AudioWrapper::playbackState() const { return d->mPreviousPlayerState; @@ -335,11 +326,6 @@ setPosition(position); } -void AudioWrapper::setAudioRole(QAudio::Role audioRole) -{ - // d->mPlayer.setAudioRole(audioRole); -} - void AudioWrapper::mediaStatusChanged() { } diff --git a/src/audiowrapper_qtmultimedia.cpp b/src/audiowrapper_qtmultimedia.cpp deleted file mode 100644 --- a/src/audiowrapper_qtmultimedia.cpp +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright 2017 Matthieu Gallien - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -#include "audiowrapper.h" -#include "powermanagementinterface.h" - -#include "qtMultimediaLogging.h" - -#include -#include - -#include "config-upnp-qt.h" - -class AudioWrapperPrivate -{ - -public: - - PowerManagementInterface mPowerInterface; - - QMediaPlayer mPlayer; - - qint64 mSavedPosition = 0.0; - - qint64 mUndoSavedPosition = 0.0; - - bool mHasSavedPosition = false; - -}; - -AudioWrapper::AudioWrapper(QObject *parent) : QObject(parent), d(std::make_unique()) -{ - connect(&d->mPlayer, &QMediaPlayer::mutedChanged, this, &AudioWrapper::playerMutedChanged); - connect(&d->mPlayer, &QMediaPlayer::volumeChanged, this, &AudioWrapper::playerVolumeChanged); - connect(&d->mPlayer, &QMediaPlayer::mediaChanged, this, &AudioWrapper::sourceChanged); - connect(&d->mPlayer, &QMediaPlayer::mediaStatusChanged, this, &AudioWrapper::statusChanged); - connect(&d->mPlayer, &QMediaPlayer::mediaStatusChanged, this, &AudioWrapper::mediaStatusChanged); - connect(&d->mPlayer, &QMediaPlayer::stateChanged, this, &AudioWrapper::playbackStateChanged); - connect(&d->mPlayer, &QMediaPlayer::stateChanged, this, &AudioWrapper::playerStateChanged); - connect(&d->mPlayer, QOverload::of(&QMediaPlayer::error), this, &AudioWrapper::errorChanged); - connect(&d->mPlayer, &QMediaPlayer::durationChanged, this, &AudioWrapper::durationChanged); - connect(&d->mPlayer, &QMediaPlayer::positionChanged, this, &AudioWrapper::positionChanged); - connect(&d->mPlayer, &QMediaPlayer::seekableChanged, this, &AudioWrapper::seekableChanged); -} - -AudioWrapper::~AudioWrapper() -= default; - -bool AudioWrapper::muted() const -{ - return d->mPlayer.isMuted(); -} - -qreal AudioWrapper::volume() const -{ - auto realVolume = static_cast(d->mPlayer.volume() / 100.0); - auto userVolume = static_cast(QAudio::convertVolume(realVolume, QAudio::LinearVolumeScale, QAudio::LogarithmicVolumeScale)); - - return userVolume * 100.0; -} - -QUrl AudioWrapper::source() const -{ - return d->mPlayer.media().canonicalUrl(); -} - -QMediaPlayer::Error AudioWrapper::error() const -{ - if (d->mPlayer.error() != QMediaPlayer::NoError) { - qDebug() << "AudioWrapper::error" << d->mPlayer.errorString(); - } - - return d->mPlayer.error(); -} - -qint64 AudioWrapper::duration() const -{ - return d->mPlayer.duration(); -} - -qint64 AudioWrapper::position() const -{ - return d->mPlayer.position(); -} - -bool AudioWrapper::seekable() const -{ - return d->mPlayer.isSeekable(); -} - -QAudio::Role AudioWrapper::audioRole() const -{ - return d->mPlayer.audioRole(); -} - -QMediaPlayer::State AudioWrapper::playbackState() const -{ - return d->mPlayer.state(); -} - -QMediaPlayer::MediaStatus AudioWrapper::status() const -{ - return d->mPlayer.mediaStatus(); -} - -void AudioWrapper::setMuted(bool muted) -{ - d->mPlayer.setMuted(muted); -} - -void AudioWrapper::setVolume(qreal volume) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::setVolume" << volume; - - auto realVolume = static_cast(QAudio::convertVolume(volume / 100.0, QAudio::LogarithmicVolumeScale, QAudio::LinearVolumeScale)); - d->mPlayer.setVolume(qRound(realVolume * 100)); -} - -void AudioWrapper::setSource(const QUrl &source) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::setSource" << source; - - d->mPlayer.setMedia({source}); -} - -void AudioWrapper::setPosition(qint64 position) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::setPosition" << position; - - if (d->mPlayer.duration() <= 0) { - savePosition(position); - return; - } - - d->mPlayer.setPosition(position); -} - -void AudioWrapper::play() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::play"; - - d->mPlayer.play(); - - if (d->mHasSavedPosition) { - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::playerDurationSignalChanges" << "restore old position" << d->mSavedPosition; - - setPosition(d->mSavedPosition); - d->mHasSavedPosition = false; - } -} - -void AudioWrapper::pause() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::pause"; - - d->mPlayer.pause(); -} - -void AudioWrapper::stop() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::stop"; - - d->mPlayer.stop(); -} - -void AudioWrapper::seek(qint64 position) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::seek" << position; - - d->mPlayer.setPosition(position); -} - -void AudioWrapper::setAudioRole(QAudio::Role audioRole) -{ - d->mPlayer.setAudioRole(audioRole); -} - -void AudioWrapper::mediaStatusChanged() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::mediaStatusChanged"; -} - -void AudioWrapper::playerStateChanged() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::playerStateChanged"; - - switch(d->mPlayer.state()) - { - case QMediaPlayer::State::StoppedState: - Q_EMIT stopped(); - d->mPowerInterface.setPreventSleep(false); - break; - case QMediaPlayer::State::PlayingState: - Q_EMIT playing(); - d->mPowerInterface.setPreventSleep(true); - break; - case QMediaPlayer::State::PausedState: - Q_EMIT paused(); - d->mPowerInterface.setPreventSleep(false); - break; - } -} - -void AudioWrapper::playerVolumeChanged() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::playerVolumeChanged"; - - QTimer::singleShot(0, [this]() {Q_EMIT volumeChanged();}); -} - -void AudioWrapper::playerMutedChanged() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::playerMutedChanged"; - - QTimer::singleShot(0, [this]() {Q_EMIT mutedChanged(muted());}); -} - -void AudioWrapper::playerStateSignalChanges(QMediaPlayer::State newState) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::playerStateSignalChanges" << newState; - - QMetaObject::invokeMethod(this, [this, newState]() {Q_EMIT playbackStateChanged(newState);}, Qt::QueuedConnection); -} - -void AudioWrapper::mediaStatusSignalChanges(QMediaPlayer::MediaStatus newStatus) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::mediaStatusSignalChanges" << newStatus; - - QMetaObject::invokeMethod(this, [this, newStatus]() {Q_EMIT statusChanged(newStatus);}, Qt::QueuedConnection); -} - -void AudioWrapper::playerDurationSignalChanges(qint64 newDuration) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::playerDurationSignalChanges" << newDuration; - - QMetaObject::invokeMethod(this, [this, newDuration]() {Q_EMIT durationChanged(newDuration);}, Qt::QueuedConnection); -} - -void AudioWrapper::playerPositionSignalChanges(qint64 newPosition) -{ - QMetaObject::invokeMethod(this, [this, newPosition]() {Q_EMIT positionChanged(newPosition);}, Qt::QueuedConnection); -} - -void AudioWrapper::playerVolumeSignalChanges() -{ - QMetaObject::invokeMethod(this, [this]() {Q_EMIT volumeChanged();}, Qt::QueuedConnection); -} - -void AudioWrapper::playerMutedSignalChanges(bool isMuted) -{ - QMetaObject::invokeMethod(this, [this, isMuted]() {Q_EMIT mutedChanged(isMuted);}, Qt::QueuedConnection); -} - -void AudioWrapper::playerSeekableSignalChanges(bool isSeekable) -{ - QMetaObject::invokeMethod(this, [this, isSeekable]() {Q_EMIT seekableChanged(isSeekable);}, Qt::QueuedConnection); -} - -void AudioWrapper::saveUndoPosition(qint64 position) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::saveUndoPosition" << position; - - d->mUndoSavedPosition = position; -} - -void AudioWrapper::restoreUndoPosition() -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::restoreUndoPosition"; - - d->mHasSavedPosition = true; - d->mSavedPosition = d->mUndoSavedPosition; -} - -void AudioWrapper::savePosition(qint64 position) -{ - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::savePosition" << position; - - if (!d->mHasSavedPosition) { - d->mHasSavedPosition = true; - d->mSavedPosition = position; - qCDebug(orgKdeElisaPlayerQtMultimedia) << "AudioWrapper::savePosition" << "restore old position" << d->mSavedPosition; - } -} - - -#include "moc_audiowrapper.cpp"