diff --git a/src/engraving/libmscore/edit.cpp b/src/engraving/libmscore/edit.cpp index 5083561629be..3cea486476b8 100644 --- a/src/engraving/libmscore/edit.cpp +++ b/src/engraving/libmscore/edit.cpp @@ -5144,6 +5144,8 @@ void Score::undoRemoveStaff(Staff* staff) staff->undoUnlink(); + mu::remove_if(systemObjectStaves, [staff](Staff* s){ return s == staff; }); + undo(new RemoveStaff(staff)); } diff --git a/src/framework/vst/internal/vstaudioclient.cpp b/src/framework/vst/internal/vstaudioclient.cpp index 6e07517a5877..36d4a74a4f4b 100644 --- a/src/framework/vst/internal/vstaudioclient.cpp +++ b/src/framework/vst/internal/vstaudioclient.cpp @@ -316,9 +316,11 @@ void VstAudioClient::extractInputSamples(const audio::samples_t& sampleCount, co return; } + Steinberg::Vst::AudioBusBuffers& bus = m_processData.inputs[0]; + for (unsigned int i = 0; i < sampleCount; ++i) { - for (audio::audioch_t s = 0; s < m_audioChannelsCount; ++s) { - m_processData.inputs[0].channelBuffers32[s][i] = sourceBuffer[i * m_audioChannelsCount + s]; + for (audio::audioch_t s = 0; s < bus.numChannels; ++s) { + bus.channelBuffers32[s][i] = sourceBuffer[i * m_audioChannelsCount + s]; } } } diff --git a/src/framework/vst/internal/vstmodulesrepository.cpp b/src/framework/vst/internal/vstmodulesrepository.cpp index 474283aa2150..4867e591541b 100644 --- a/src/framework/vst/internal/vstmodulesrepository.cpp +++ b/src/framework/vst/internal/vstmodulesrepository.cpp @@ -110,7 +110,7 @@ void VstModulesRepository::removePluginModule(const audio::AudioResourceId& reso std::lock_guard lock(m_mutex); auto search = m_modules.find(resourceId); - if (search != m_modules.end()) { + if (search == m_modules.end()) { return; } diff --git a/src/framework/vst/internal/vstplugin.cpp b/src/framework/vst/internal/vstplugin.cpp index bbe2d2e18733..a7eb11cbede3 100644 --- a/src/framework/vst/internal/vstplugin.cpp +++ b/src/framework/vst/internal/vstplugin.cpp @@ -125,7 +125,6 @@ void VstPlugin::unload() m_module = nullptr; m_pluginProvider = nullptr; m_classInfo = ClassInfo(); - m_pluginView = nullptr; m_isLoaded = false; m_unloadingCompleted.notify(); }, threadSecurer()->mainThreadId()); @@ -176,25 +175,18 @@ void VstPlugin::stateBufferFromString(VstMemoryStream& buffer, char* strData, co buffer.seek(0, Steinberg::IBStream::kIBSeekSet, nullptr); } -PluginViewPtr VstPlugin::view() const +PluginViewPtr VstPlugin::createView() const { ONLY_MAIN_THREAD(threadSecurer); std::lock_guard lock(m_mutex); - if (m_pluginView) { - return m_pluginView; - } - auto controller = m_pluginProvider->getController(); - if (!controller) { return nullptr; } - m_pluginView = owned(controller->createView(PluginEditorViewType::kEditor)); - - return m_pluginView; + return owned(controller->createView(PluginEditorViewType::kEditor)); } PluginProviderPtr VstPlugin::provider() const diff --git a/src/framework/vst/internal/vstplugin.h b/src/framework/vst/internal/vstplugin.h index 91eba46d51d3..d9c2a2f70f0d 100644 --- a/src/framework/vst/internal/vstplugin.h +++ b/src/framework/vst/internal/vstplugin.h @@ -51,7 +51,7 @@ class VstPlugin : public async::Asyncable const audio::AudioResourceId& resourceId() const; const std::string& name() const; - PluginViewPtr view() const; + PluginViewPtr createView() const; PluginProviderPtr provider() const; bool isAbleForInput() const; @@ -77,7 +77,6 @@ class VstPlugin : public async::Asyncable PluginModulePtr m_module = nullptr; PluginProviderPtr m_pluginProvider = nullptr; - mutable PluginViewPtr m_pluginView = nullptr; ClassInfo m_classInfo; Steinberg::FUnknownPtr m_componentHandlerPtr = nullptr; diff --git a/src/framework/vst/view/abstractvsteditorview.cpp b/src/framework/vst/view/abstractvsteditorview.cpp index fa7d88af757a..74b5f88ba945 100644 --- a/src/framework/vst/view/abstractvsteditorview.cpp +++ b/src/framework/vst/view/abstractvsteditorview.cpp @@ -58,15 +58,22 @@ AbstractVstEditorView::AbstractVstEditorView(QWidget* parent) } AbstractVstEditorView::~AbstractVstEditorView() +{ + deinit(); +} + +void AbstractVstEditorView::deinit() { if (m_view) { m_view->setFrame(nullptr); m_view->removed(); + m_view = nullptr; } if (m_pluginPtr) { m_pluginPtr->loadingCompleted().resetOnNotify(this); m_pluginPtr->refreshConfig(); + m_pluginPtr = nullptr; } } @@ -108,11 +115,14 @@ void AbstractVstEditorView::wrapPluginView() void AbstractVstEditorView::attachView(VstPluginPtr pluginPtr) { - if (!pluginPtr || !pluginPtr->view()) { + if (!pluginPtr) { return; } - m_view = pluginPtr->view(); + m_view = pluginPtr->createView(); + if (!m_view) { + return; + } if (m_view->isPlatformTypeSupported(currentPlatformUiType()) != Steinberg::kResultTrue) { return; @@ -165,6 +175,13 @@ void AbstractVstEditorView::showEvent(QShowEvent* ev) TopLevelDialog::showEvent(ev); } +void AbstractVstEditorView::closeEvent(QCloseEvent* ev) +{ + deinit(); + + TopLevelDialog::closeEvent(ev); +} + bool AbstractVstEditorView::event(QEvent* ev) { if (ev && ev->spontaneous() && ev->type() == QEvent::ShortcutOverride) { diff --git a/src/framework/vst/view/abstractvsteditorview.h b/src/framework/vst/view/abstractvsteditorview.h index 583733525a91..56263cf651d1 100644 --- a/src/framework/vst/view/abstractvsteditorview.h +++ b/src/framework/vst/view/abstractvsteditorview.h @@ -74,8 +74,11 @@ class AbstractVstEditorView : public uicomponents::TopLevelDialog, public Steinb void moveViewToMainWindowCenter(); void showEvent(QShowEvent* ev) override; + void closeEvent(QCloseEvent* ev) override; bool event(QEvent* ev) override; + void deinit(); + FIDString currentPlatformUiType() const; VstPluginPtr m_pluginPtr = nullptr;