From 5fdd3ca5708c23803f0e752652e0be4da0d68e0a Mon Sep 17 00:00:00 2001 From: gvnnz Date: Wed, 20 Nov 2024 22:55:16 +0100 Subject: [PATCH] Fix ChannelShared objects not being deleted on Channel deletion (#695) --- src/core/channels/channelManager.cpp | 4 ++++ src/core/model/model.cpp | 6 ++++++ src/core/model/model.h | 1 + src/core/model/shared.cpp | 1 + src/core/model/shared.h | 1 + 5 files changed, 13 insertions(+) diff --git a/src/core/channels/channelManager.cpp b/src/core/channels/channelManager.cpp index 9e40699a0..c1a3998a4 100644 --- a/src/core/channels/channelManager.cpp +++ b/src/core/channels/channelManager.cpp @@ -128,6 +128,9 @@ void ChannelManager::removeTrack(std::size_t trackIndex) { assert(canRemoveTrack(trackIndex)); + const Channel& ch = m_model.get().tracks.get(trackIndex).getGroupChannel(); + + m_model.removeChannelShared(*ch.shared); m_model.get().tracks.remove(trackIndex); m_model.swap(model::SwapType::HARD); } @@ -278,6 +281,7 @@ void ChannelManager::deleteChannel(ID channelId) const Channel& ch = m_model.get().tracks.getChannel(channelId); const Wave* wave = ch.sampleChannel ? ch.sampleChannel->getWave() : nullptr; + m_model.removeChannelShared(*ch.shared); m_model.get().tracks.getByChannel(channelId).removeChannel(channelId); m_model.swap(model::SwapType::HARD); diff --git a/src/core/model/model.cpp b/src/core/model/model.cpp index 9c3497fbc..df1ac5bf4 100644 --- a/src/core/model/model.cpp +++ b/src/core/model/model.cpp @@ -208,6 +208,12 @@ void Model::removeWave(const Wave& w) m_shared.removeWave(w); } +void Model::removeChannelShared(const ChannelShared& c) +{ + const SharedLock lock = lockShared(SwapType::NONE); + m_shared.removeChannel(c); +} + /* -------------------------------------------------------------------------- */ void Model::clearPlugins() diff --git a/src/core/model/model.h b/src/core/model/model.h index e140f2122..2d5ce8b42 100644 --- a/src/core/model/model.h +++ b/src/core/model/model.h @@ -142,6 +142,7 @@ class Model void removePlugin(const Plugin&); void removeWave(const Wave&); + void removeChannelShared(const ChannelShared&); void clearPlugins(); void clearWaves(); diff --git a/src/core/model/shared.cpp b/src/core/model/shared.cpp index 814d42e05..92cafa762 100644 --- a/src/core/model/shared.cpp +++ b/src/core/model/shared.cpp @@ -188,6 +188,7 @@ ChannelShared& Shared::addChannel(std::unique_ptr cs) { return ad void Shared::removePlugin(const Plugin& p) { remove_(m_plugins, p); } void Shared::removeWave(const Wave& w) { remove_(m_waves, w); } +void Shared::removeChannel(const ChannelShared& c) { remove_(m_channels, c); } /* -------------------------------------------------------------------------- */ diff --git a/src/core/model/shared.h b/src/core/model/shared.h index 20dbf4121..e70dda52f 100644 --- a/src/core/model/shared.h +++ b/src/core/model/shared.h @@ -88,6 +88,7 @@ class Shared void removePlugin(const Plugin&); void removeWave(const Wave&); + void removeChannel(const ChannelShared&); void clearPlugins(); void clearWaves();