You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libcutefish/audio/server.cpp

118 lines
2.9 KiB
C++

4 years ago
/*
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 "context.h"
#include "debug.h"
#include "sink.h"
#include "source.h"
namespace QPulseAudio
{
Server::Server(Context *context)
: QObject(context)
, m_defaultSink(nullptr)
, m_defaultSource(nullptr)
, m_isPipeWire(false)
{
Q_ASSERT(context);
connect(&context->sinks(), &MapBaseQObject::added, this, &Server::updateDefaultDevices);
connect(&context->sinks(), &MapBaseQObject::removed, this, &Server::updateDefaultDevices);
connect(&context->sources(), &MapBaseQObject::added, this, &Server::updateDefaultDevices);
connect(&context->sources(), &MapBaseQObject::removed, this, &Server::updateDefaultDevices);
}
Sink *Server::defaultSink() const
{
return m_defaultSink;
}
void Server::setDefaultSink(Sink *sink)
{
Q_ASSERT(sink);
Context::instance()->setDefaultSink(sink->name());
}
Source *Server::defaultSource() const
{
return m_defaultSource;
}
void Server::setDefaultSource(Source *source)
{
Q_ASSERT(source);
Context::instance()->setDefaultSource(source->name());
}
void Server::reset()
{
if (m_defaultSink) {
m_defaultSink = nullptr;
Q_EMIT defaultSinkChanged(m_defaultSink);
}
if (m_defaultSource) {
m_defaultSource = nullptr;
Q_EMIT defaultSourceChanged(m_defaultSource);
}
}
void Server::update(const pa_server_info *info)
{
m_defaultSinkName = QString::fromUtf8(info->default_sink_name);
m_defaultSourceName = QString::fromUtf8(info->default_source_name);
m_isPipeWire = QString::fromUtf8(info->server_name).contains("PipeWire");
updateDefaultDevices();
Q_EMIT updated();
}
template<typename Type, typename Map>
static Type *findByName(const Map &map, const QString &name)
{
Type *out = nullptr;
if (name.isEmpty()) {
return out;
}
QMapIterator<quint32, Type *> it(map);
while (it.hasNext()) {
it.next();
out = it.value();
if (out->name() == name) {
return out;
}
}
qCWarning(PLASMAPA) << "No object for name" << name;
return out;
}
void Server::updateDefaultDevices()
{
Sink *sink = findByName<Sink>(Context::instance()->sinks().data(), m_defaultSinkName);
Source *source = findByName<Source>(Context::instance()->sources().data(), m_defaultSourceName);
if (m_defaultSink != sink) {
qCDebug(PLASMAPA) << "Default sink changed" << sink;
m_defaultSink = sink;
Q_EMIT defaultSinkChanged(m_defaultSink);
}
if (m_defaultSource != source) {
qCDebug(PLASMAPA) << "Default source changed" << source;
m_defaultSource = source;
Q_EMIT defaultSourceChanged(m_defaultSource);
}
}
bool Server::isPipeWire() const
{
return m_isPipeWire;
}
} // QPulseAudio