File indexing completed on 2024-05-05 04:50:35

0001 /***************************************************************************
0002    SPDX-FileCopyrightText: 2014 (c) Sujith Haridasan <sujith.haridasan@kdemail.net>
0003    SPDX-FileCopyrightText: 2014 (c) Ashish Madeti <ashishmadeti@gmail.com>
0004    SPDX-FileCopyrightText: 2016 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0005 
0006    SPDX-License-Identifier: GPL-3.0-or-later
0007  ***************************************************************************/
0008 
0009 #include "mpris2.h"
0010 #include "mediaplayer2.h"
0011 #include "mediaplayer2player.h"
0012 #include "mediaplaylistproxymodel.h"
0013 
0014 #include <QDBusConnection>
0015 
0016 
0017 #if defined Q_OS_WIN
0018 #include <Windows.h>
0019 #else
0020 #include <unistd.h>
0021 #endif
0022 
0023 Mpris2::Mpris2(QObject* parent)
0024     : QObject(parent)
0025 {
0026 }
0027 
0028 void Mpris2::initDBusService()
0029 {
0030     QString mspris2Name(QStringLiteral("org.mpris.MediaPlayer2.") + m_playerName);
0031 
0032     bool success = QDBusConnection::sessionBus().registerService(mspris2Name);
0033 
0034     // If the above failed, it's likely because we're not the first instance
0035     // or the name is already taken. In that event the MPRIS2 spec wants the
0036     // following:
0037     if (!success) {
0038 #if defined Q_OS_WIN
0039         success = QDBusConnection::sessionBus().registerService(mspris2Name + QLatin1String(".instance") + QString::number(GetCurrentProcessId()));
0040 #else
0041         success = QDBusConnection::sessionBus().registerService(mspris2Name + QLatin1String(".instance") + QString::number(getpid()));
0042 #endif
0043     }
0044 
0045     if (success) {
0046         m_mp2 = std::make_unique<MediaPlayer2>(this);
0047         m_mp2p = std::make_unique<MediaPlayer2Player>(m_playListModel, m_manageAudioPlayer, m_manageMediaPlayerControl, m_manageHeaderBar, m_audioPlayer, mShowProgressOnTaskBar, this);
0048 
0049         QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/mpris/MediaPlayer2"), this, QDBusConnection::ExportAdaptors);
0050 
0051         connect(m_mp2.get(), &MediaPlayer2::raisePlayer, this, &Mpris2::raisePlayer);
0052     }
0053 }
0054 
0055 Mpris2::~Mpris2()
0056 = default;
0057 
0058 QString Mpris2::playerName() const
0059 {
0060     return m_playerName;
0061 }
0062 
0063 MediaPlayListProxyModel *Mpris2::playListModel() const
0064 {
0065     return m_playListModel;
0066 }
0067 
0068 ManageAudioPlayer *Mpris2::audioPlayerManager() const
0069 {
0070     return m_manageAudioPlayer;
0071 }
0072 
0073 ManageMediaPlayerControl *Mpris2::manageMediaPlayerControl() const
0074 {
0075     return m_manageMediaPlayerControl;
0076 }
0077 
0078 ManageHeaderBar *Mpris2::headerBarManager() const
0079 {
0080     return m_manageHeaderBar;
0081 }
0082 
0083 AudioWrapper *Mpris2::audioPlayer() const
0084 {
0085     return m_audioPlayer;
0086 }
0087 
0088 bool Mpris2::showProgressOnTaskBar() const
0089 {
0090     return mShowProgressOnTaskBar;
0091 }
0092 
0093 void Mpris2::setPlayerName(const QString &playerName)
0094 {
0095     if (m_playerName == playerName) {
0096         return;
0097     }
0098 
0099     m_playerName = playerName;
0100 
0101     if (m_playListModel && m_manageAudioPlayer && m_manageMediaPlayerControl && m_manageHeaderBar && m_audioPlayer && !m_playerName.isEmpty()) {
0102         if (!m_mp2) {
0103             initDBusService();
0104         }
0105     }
0106 
0107     Q_EMIT playerNameChanged();
0108 }
0109 
0110 void Mpris2::setPlayListModel(MediaPlayListProxyModel *playListModel)
0111 {
0112     if (m_playListModel == playListModel) {
0113         return;
0114     }
0115 
0116     m_playListModel = playListModel;
0117 
0118     if (m_playListModel && m_manageAudioPlayer && m_manageMediaPlayerControl && m_manageHeaderBar && m_audioPlayer && !m_playerName.isEmpty()) {
0119         if (!m_mp2) {
0120             initDBusService();
0121         }
0122     }
0123 
0124     Q_EMIT playListModelChanged();
0125 }
0126 
0127 void Mpris2::setAudioPlayerManager(ManageAudioPlayer *manageAudioPlayer)
0128 {
0129     if (m_manageAudioPlayer == manageAudioPlayer) {
0130         return;
0131     }
0132 
0133     m_manageAudioPlayer = manageAudioPlayer;
0134 
0135     if (m_playListModel && m_manageAudioPlayer && m_manageMediaPlayerControl && m_manageHeaderBar && m_audioPlayer && !m_playerName.isEmpty()) {
0136         if (!m_mp2) {
0137             initDBusService();
0138         }
0139     }
0140 
0141     Q_EMIT audioPlayerManagerChanged();
0142 }
0143 
0144 void Mpris2::setManageMediaPlayerControl(ManageMediaPlayerControl *manageMediaPlayerControl)
0145 {
0146     if (m_manageMediaPlayerControl == manageMediaPlayerControl) {
0147         return;
0148     }
0149 
0150     m_manageMediaPlayerControl = manageMediaPlayerControl;
0151 
0152     if (m_playListModel && m_manageAudioPlayer && m_manageMediaPlayerControl && m_manageHeaderBar && m_audioPlayer && !m_playerName.isEmpty()) {
0153         if (!m_mp2) {
0154             initDBusService();
0155         }
0156     }
0157 
0158     Q_EMIT manageMediaPlayerControlChanged();
0159 }
0160 
0161 void Mpris2::setHeaderBarManager(ManageHeaderBar *manageHeaderBar)
0162 {
0163     if (m_manageHeaderBar == manageHeaderBar)
0164         return;
0165 
0166     m_manageHeaderBar = manageHeaderBar;
0167 
0168     if (m_playListModel && m_manageAudioPlayer && m_manageMediaPlayerControl && m_manageHeaderBar && m_audioPlayer && !m_playerName.isEmpty()) {
0169         if (!m_mp2) {
0170             initDBusService();
0171         }
0172     }
0173 
0174     Q_EMIT headerBarManagerChanged();
0175 }
0176 
0177 void Mpris2::setAudioPlayer(AudioWrapper *audioPlayer)
0178 {
0179     if (m_audioPlayer == audioPlayer)
0180         return;
0181 
0182     m_audioPlayer = audioPlayer;
0183 
0184     if (m_playListModel && m_manageAudioPlayer && m_manageMediaPlayerControl && m_manageHeaderBar && m_audioPlayer && !m_playerName.isEmpty()) {
0185         if (!m_mp2) {
0186             initDBusService();
0187         }
0188     }
0189 
0190     Q_EMIT audioPlayerChanged();
0191 }
0192 
0193 void Mpris2::setShowProgressOnTaskBar(bool value)
0194 {
0195     m_mp2p->setShowProgressOnTaskBar(value);
0196     mShowProgressOnTaskBar = value;
0197     Q_EMIT showProgressOnTaskBarChanged();
0198 }
0199 
0200 #include "moc_mpris2.cpp"