File indexing completed on 2025-04-20 04:33:20
0001 /** 0002 * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "pausemusicplugin.h" 0008 0009 #include <KPluginFactory> 0010 #include <PulseAudioQt/Context> 0011 #include <PulseAudioQt/Sink> 0012 0013 #include "generated/systeminterfaces/mprisplayer.h" 0014 #include <dbushelper.h> 0015 0016 #include "plugin_pausemusic_debug.h" 0017 0018 K_PLUGIN_CLASS_WITH_JSON(PauseMusicPlugin, "kdeconnect_pausemusic.json") 0019 0020 PauseMusicPlugin::PauseMusicPlugin(QObject *parent, const QVariantList &args) 0021 : KdeConnectPlugin(parent, args) 0022 , mutedSinks() 0023 { 0024 } 0025 0026 void PauseMusicPlugin::receivePacket(const NetworkPacket &np) 0027 { 0028 bool pauseOnlyWhenTalking = config()->getBool(QStringLiteral("conditionTalking"), false); 0029 0030 if (pauseOnlyWhenTalking) { 0031 if (np.get<QString>(QStringLiteral("event")) != QLatin1String("talking")) { 0032 return; 0033 } 0034 } else { // Pause as soon as it rings 0035 if (np.get<QString>(QStringLiteral("event")) != QLatin1String("ringing") && np.get<QString>(QStringLiteral("event")) != QLatin1String("talking")) { 0036 return; 0037 } 0038 } 0039 0040 bool pauseConditionFulfilled = !np.get<bool>(QStringLiteral("isCancel")); 0041 0042 bool pause = config()->getBool(QStringLiteral("actionPause"), true); 0043 bool mute = config()->getBool(QStringLiteral("actionMute"), false); 0044 0045 const bool autoResume = config()->getBool(QStringLiteral("actionResume"), true); 0046 0047 if (pauseConditionFulfilled) { 0048 if (mute) { 0049 qCDebug(KDECONNECT_PLUGIN_PAUSEMUSIC) << "Muting system volume"; 0050 const auto sinks = PulseAudioQt::Context::instance()->sinks(); 0051 for (const auto sink : sinks) { 0052 if (!sink->isMuted()) { 0053 sink->setMuted(true); 0054 mutedSinks.insert(sink->name()); 0055 } 0056 } 0057 } 0058 0059 if (pause) { 0060 // Search for interfaces currently playing 0061 const QStringList interfaces = QDBusConnection::sessionBus().interface()->registeredServiceNames().value(); 0062 for (const QString &iface : interfaces) { 0063 if (iface.startsWith(QLatin1String("org.mpris.MediaPlayer2"))) { 0064 OrgMprisMediaPlayer2PlayerInterface mprisInterface(iface, QStringLiteral("/org/mpris/MediaPlayer2"), QDBusConnection::sessionBus()); 0065 QString status = mprisInterface.playbackStatus(); 0066 if (status == QLatin1String("Playing")) { 0067 if (!pausedSources.contains(iface)) { 0068 pausedSources.insert(iface); 0069 if (mprisInterface.canPause()) { 0070 mprisInterface.Pause(); 0071 } else { 0072 mprisInterface.Stop(); 0073 } 0074 } 0075 } 0076 } 0077 } 0078 } 0079 0080 } else { 0081 if (mute) { 0082 qCDebug(KDECONNECT_PLUGIN_PAUSEMUSIC) << "Unmuting system volume"; 0083 0084 if (autoResume) { 0085 const auto sinks = PulseAudioQt::Context::instance()->sinks(); 0086 for (const auto sink : sinks) { 0087 if (mutedSinks.contains(sink->name())) { 0088 sink->setMuted(false); 0089 } 0090 } 0091 } 0092 mutedSinks.clear(); 0093 } 0094 0095 if (pause && !pausedSources.empty()) { 0096 if (autoResume) { 0097 for (const QString &iface : qAsConst(pausedSources)) { 0098 OrgMprisMediaPlayer2PlayerInterface mprisInterface(iface, QStringLiteral("/org/mpris/MediaPlayer2"), QDBusConnection::sessionBus()); 0099 mprisInterface.Play(); 0100 } 0101 } 0102 pausedSources.clear(); 0103 } 0104 } 0105 } 0106 0107 #include "moc_pausemusicplugin.cpp" 0108 #include "pausemusicplugin.moc"