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/clients/audio/audio_model.cpp

51 lines
1.6 KiB
C++

// SPDX-FileCopyrightText: 2026 Reion Wong <reionwong@gmail.com>
// SPDX-License-Identifier: BSD-3-Clause
#include "cutefish/audio/audio_model.h"
#include <algorithm>
#include "cutefish/audio/backend.h"
namespace cutefish::audio {
AudioModel::AudioModel(AudioObject::Kind kind, std::shared_ptr<Backend> backend)
: m_backend(std::move(backend))
, m_kind(kind)
{
m_subscriptions.push_back(
m_backend->objectAdded.connect([this](std::shared_ptr<AudioObject> object) { addObject(object); }));
m_subscriptions.push_back(
m_backend->objectRemoved.connect([this](std::shared_ptr<AudioObject> object) { removeObject(object); }));
m_subscriptions.push_back(m_backend->defaultsChanged.connect([this] { defaultNodeChanged.emit(); }));
for (const auto& object : m_backend->objects())
addObject(object);
}
std::shared_ptr<AudioObject> AudioModel::defaultNode() const
{
return m_backend->defaultNode(m_kind);
}
void AudioModel::addObject(const std::shared_ptr<AudioObject>& object)
{
if (object->kind() != m_kind)
return;
m_objects.push_back(object);
m_objectSubscriptions.push_back(object->changed.connect([this] { dataChanged.emit(); }));
rowsChanged.emit();
}
void AudioModel::removeObject(const std::shared_ptr<AudioObject>& object)
{
const auto found = std::find(m_objects.begin(), m_objects.end(), object);
if (found == m_objects.end())
return;
const auto row = found - m_objects.begin();
m_objects.erase(found);
m_objectSubscriptions.erase(m_objectSubscriptions.begin() + row);
rowsChanged.emit();
}
} // namespace cutefish::audio