summaryrefslogtreecommitdiffstats
path: root/src/PulseAudioQt/server.cpp
diff options
context:
space:
mode:
authorSimon Rettberg2022-08-18 20:27:25 +0200
committerSimon Rettberg2022-08-18 20:27:25 +0200
commitc48cebd620d3f5330c104d85ac32f0aaffadaa14 (patch)
tree8fc74d8aa05fcdc75bfcdf93fdc89c0f071692eb /src/PulseAudioQt/server.cpp
parentWhen changing default output of card, also set default sink (diff)
downloadpavucontrol-slx-c48cebd620d3f5330c104d85ac32f0aaffadaa14.tar.gz
pavucontrol-slx-c48cebd620d3f5330c104d85ac32f0aaffadaa14.tar.xz
pavucontrol-slx-c48cebd620d3f5330c104d85ac32f0aaffadaa14.zip
Replace everything with new "slxmix" (work in progress)
Diffstat (limited to 'src/PulseAudioQt/server.cpp')
-rw-r--r--src/PulseAudioQt/server.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/PulseAudioQt/server.cpp b/src/PulseAudioQt/server.cpp
new file mode 100644
index 0000000..c0b464b
--- /dev/null
+++ b/src/PulseAudioQt/server.cpp
@@ -0,0 +1,137 @@
+/*
+ SPDX-FileCopyrightText: 2016 David Rosca <nowrep@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include "server.h"
+#include "server_p.h"
+
+#include "context.h"
+#include "context_p.h"
+#include "debug.h"
+#include "sink.h"
+#include "source.h"
+
+namespace PulseAudioQt
+{
+Server::Server(Context *context)
+ : QObject(context)
+ , d(new ServerPrivate(this))
+{
+ Q_ASSERT(context);
+
+ connect(&context->d->m_sinks, &MapBaseQObject::added, this, &Server::updateDefaultDevices);
+ connect(&context->d->m_sinks, &MapBaseQObject::removed, this, &Server::updateDefaultDevices);
+ connect(&context->d->m_sources, &MapBaseQObject::added, this, &Server::updateDefaultDevices);
+ connect(&context->d->m_sources, &MapBaseQObject::removed, this, &Server::updateDefaultDevices);
+}
+
+Server::~Server()
+{
+}
+
+ServerPrivate::ServerPrivate(Server *q)
+ : q(q)
+ , m_defaultSink(nullptr)
+ , m_defaultSource(nullptr)
+{
+}
+
+ServerPrivate::~ServerPrivate()
+{
+}
+
+Sink *Server::defaultSink() const
+{
+ return d->m_defaultSink;
+}
+
+void Server::setDefaultSink(Sink *sink)
+{
+ Q_ASSERT(sink);
+ Context::instance()->setDefaultSink(sink->name());
+}
+
+Source *Server::defaultSource() const
+{
+ return d->m_defaultSource;
+}
+
+void Server::setDefaultSource(Source *source)
+{
+ Q_ASSERT(source);
+ Context::instance()->setDefaultSource(source->name());
+}
+
+void Server::reset()
+{
+ if (d->m_defaultSink) {
+ d->m_defaultSink = nullptr;
+ Q_EMIT defaultSinkChanged(d->m_defaultSink);
+ }
+
+ if (d->m_defaultSource) {
+ d->m_defaultSource = nullptr;
+ Q_EMIT defaultSourceChanged(d->m_defaultSource);
+ }
+}
+
+void ServerPrivate::update(const pa_server_info *info)
+{
+ m_defaultSinkName = QString::fromUtf8(info->default_sink_name);
+ m_defaultSourceName = QString::fromUtf8(info->default_source_name);
+
+ const bool isPw = QString::fromUtf8(info->server_name).contains("PipeWire");
+
+ if (isPw != m_isPipeWire) {
+ m_isPipeWire = isPw;
+ Q_EMIT q->isPipeWireChanged();
+ }
+
+ q->updateDefaultDevices();
+}
+
+/** @private */
+template<typename Type, typename Vector>
+static Type *findByName(const Vector &vector, const QString &name)
+{
+ Type *out = nullptr;
+ if (name.isEmpty()) {
+ return out;
+ }
+ for (Type *t : vector) {
+ out = t;
+ if (out->name() == name) {
+ return out;
+ }
+ }
+ qWarning() << "No object for name" << name;
+ return out;
+}
+
+void Server::updateDefaultDevices()
+{
+ Sink *sink = findByName<Sink>(Context::instance()->d->m_sinks.data(), d->m_defaultSinkName);
+ Source *source = findByName<Source>(Context::instance()->d->m_sources.data(), d->m_defaultSourceName);
+
+ if (d->m_defaultSink != sink) {
+ qDebug() << "Default sink changed" << sink;
+ d->m_defaultSink = sink;
+ Q_EMIT defaultSinkChanged(d->m_defaultSink);
+ }
+
+ if (d->m_defaultSource != source) {
+ qDebug() << "Default source changed" << source;
+ d->m_defaultSource = source;
+ Q_EMIT defaultSourceChanged(d->m_defaultSource);
+ }
+}
+
+bool Server::isPipeWire() const
+{
+ return d->m_isPipeWire;
+}
+
+
+} // PulseAudioQt