diff options
Diffstat (limited to 'src/PulseAudioQt/card.cpp')
-rw-r--r-- | src/PulseAudioQt/card.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/PulseAudioQt/card.cpp b/src/PulseAudioQt/card.cpp new file mode 100644 index 0000000..122ce33 --- /dev/null +++ b/src/PulseAudioQt/card.cpp @@ -0,0 +1,168 @@ +/* + SPDX-FileCopyrightText: 2014-2015 Harald Sitter <sitter@kde.org> + + SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL +*/ + +#include "card.h" +#include "card_p.h" +#include "debug.h" + +#include "context.h" +#include "indexedpulseobject_p.h" +#include "port_p.h" +#include "profile_p.h" + +namespace PulseAudioQt +{ +Card::Card(QObject *parent) + : IndexedPulseObject(parent) + , d(new CardPrivate(this)) +{ + connect(Context::instance(), &Context::sinkAdded, this, &Card::sinksChanged); + connect(Context::instance(), &Context::sinkRemoved, this, &Card::sinksChanged); + + connect(Context::instance(), &Context::sourceAdded, this, &Card::sourcesChanged); + connect(Context::instance(), &Context::sourceRemoved, this, &Card::sourcesChanged); +} + +Card::~Card() +{ + delete d; +} + +CardPrivate::CardPrivate(Card *q) + : q(q) +{ +} + +CardPrivate::~CardPrivate() +{ +} + +void CardPrivate::update(const pa_card_info *info) +{ + q->IndexedPulseObject::d->updatePulseObject(info); + q->PulseObject::d->updateProperties(info); + m_description = q->PulseObject::d->m_properties.value(QLatin1String(PA_PROP_DEVICE_DESCRIPTION), QString()).toString(); + + QStringList newProfiles; + QStringList existingProfiles; + + for (const Profile *profile : qAsConst(m_profiles)) { + existingProfiles << profile->name(); + } + + for (auto **it = info->profiles2; it && *it != nullptr; ++it) { + const QString name = QString::fromUtf8((*it)->name); + newProfiles << name; + Profile *profile = nullptr; + if (existingProfiles.contains(name)) { + profile = m_profiles[existingProfiles.indexOf(name)]; + } else { + profile = new Profile(q); + m_profiles << profile; + } + profile->d->setInfo(*it); + } + + for (Profile *profile : qAsConst(m_profiles)) { + if (!newProfiles.contains(profile->name())) { + m_profiles.removeOne(profile); + delete profile; + } + } + + for (Profile *profile : qAsConst(m_profiles)) { + if (info->active_profile2->name == profile->name()) { + m_activeProfileIndex = m_profiles.indexOf(profile); + } + } + + Q_EMIT q->profilesChanged(); + Q_EMIT q->activeProfileIndexChanged(); + + QStringList newPorts; + QStringList existingPorts; + + for (const Port *port : qAsConst(m_ports)) { + existingPorts << port->name(); + } + for (auto **it = info->ports; it && *it != nullptr; ++it) { + const QString name = QString::fromUtf8((*it)->name); + newPorts << name; + CardPort *port = nullptr; + if (existingPorts.contains(name)) { + port = m_ports[existingPorts.indexOf(name)]; + } else { + port = new CardPort(q); + m_ports << port; + } + port->d->setInfo(*it); + } + + for (CardPort *port : qAsConst(m_ports)) { + if (!newPorts.contains(port->name())) { + m_ports.removeOne(port); + delete port; + } + } + + Q_EMIT q->portsChanged(); +} + +QString Card::description() const +{ + return d->m_description; +} + +QList<Profile *> Card::profiles() const +{ + return d->m_profiles; +} + +quint32 Card::activeProfileIndex() const +{ + return d->m_activeProfileIndex; +} + +void Card::setActiveProfileIndex(quint32 profileIndex) +{ + const Profile *profile = qobject_cast<Profile *>(profiles().at(profileIndex)); + Context::instance()->setCardProfile(index(), profile->name()); +} + +QList<CardPort *> Card::ports() const +{ + return d->m_ports; +} + +QList<Sink *> Card::sinks() const +{ + QList<Sink *> ret; + + const auto allSinks = Context::instance()->sinks(); + for (Sink *sink : allSinks) { + if (sink->cardIndex() == IndexedPulseObject::d->m_index) { + ret << sink; + } + } + + return ret; +} + +QList<Source *> Card::sources() const +{ + QList<Source *> ret; + + const auto allSources = Context::instance()->sources(); + for (Source *source : allSources) { + if (source->cardIndex() == IndexedPulseObject::d->m_index) { + ret << source; + } + } + + return ret; +} + +} // PulseAudioQt |