Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion muse
Submodule muse updated 47 files
+141 −52 framework/audio/common/audiotypes.h
+7 −17 framework/audio/common/audioutils.h
+2 −2 framework/audio/common/rpc/rpcpacker.h
+1 −2 framework/audio/engine/internal/audioengineconfiguration.cpp
+1 −3 framework/audio/engine/internal/enginerpccontroller.cpp
+2 −4 framework/audio/engine/internal/synthesizers/fluidsynth/fluidresolver.cpp
+1 −0 framework/audio/tests/CMakeLists.txt
+124 −0 framework/audio/tests/audioresourcetypes_tests.cpp
+5 −6 framework/audio/tests/rpcpacker_tests.cpp
+3 −1 framework/audioplugins/CMakeLists.txt
+3 −1 framework/audioplugins/audiopluginsmodule.cpp
+138 −7 framework/audioplugins/audiopluginstypes.h
+3 −3 framework/audioplugins/iaudiopluginmetareader.h
+9 −0 framework/audioplugins/iaudiopluginsconfiguration.h
+46 −0 framework/audioplugins/iknownaudiopluginsmigrationregister.h
+11 −3 framework/audioplugins/iknownaudiopluginsregister.h
+10 −0 framework/audioplugins/internal/audiopluginsconfiguration.cpp
+6 −0 framework/audioplugins/internal/audiopluginsconfiguration.h
+104 −0 framework/audioplugins/internal/knownaudiopluginsmigrationregister.cpp
+12 −14 framework/audioplugins/internal/knownaudiopluginsmigrationregister.h
+132 −35 framework/audioplugins/internal/knownaudiopluginsregister.cpp
+10 −4 framework/audioplugins/internal/knownaudiopluginsregister.h
+141 −35 framework/audioplugins/internal/registeraudiopluginsscenario.cpp
+5 −5 framework/audioplugins/internal/registeraudiopluginsscenario.h
+14 −6 framework/audioplugins/iregisteraudiopluginsscenario.h
+2 −1 framework/audioplugins/tests/CMakeLists.txt
+0 −52 framework/audioplugins/tests/audiopluginsutilstest.cpp
+312 −0 framework/audioplugins/tests/knownaudiopluginsmigrationregistertest.cpp
+205 −39 framework/audioplugins/tests/knownaudiopluginsregistertest.cpp
+2 −2 framework/audioplugins/tests/mocks/audiopluginmetareadermock.h
+3 −0 framework/audioplugins/tests/mocks/audiopluginsconfigurationmock.h
+35 −0 framework/audioplugins/tests/mocks/knownaudiopluginsmigrationregistermock.h
+7 −3 framework/audioplugins/tests/mocks/knownaudiopluginsregistermock.h
+324 −130 framework/audioplugins/tests/registeraudiopluginsscenariotest.cpp
+1 −1 framework/musesampler/internal/musesamplerresolver.cpp
+4 −0 framework/musesampler/musesamplertypes.h
+1 −0 framework/vst/CMakeLists.txt
+1 −1 framework/vst/internal/fx/vstfxprocessor.cpp
+1 −1 framework/vst/internal/synth/vstsynthesiser.cpp
+4 −4 framework/vst/internal/vstaudioclient.cpp
+2 −4 framework/vst/internal/vstaudioclient.h
+19 −5 framework/vst/internal/vstmodulesrepository.cpp
+1 −2 framework/vst/internal/vstmodulesrepository.h
+13 −10 framework/vst/internal/vstpluginmetareader.cpp
+2 −2 framework/vst/internal/vstpluginmetareader.h
+40 −0 framework/vst/vstpluginattrs.h
+8 −0 framework/vst/vsttypes.h
4 changes: 2 additions & 2 deletions src/converter/internal/compat/notationmeta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,9 +378,9 @@ QJsonArray NotationMeta::tracksJsonArray(notation::INotationPtr notation)
QJsonObject jsonTrack;
jsonTrack.insert("instrumentId", trackId.instrumentId.toQString());
jsonTrack.insert("partId", trackId.partId.toQString());
jsonTrack.insert("type", audioResourceTypeToString(inputParams.resourceMeta.type).toQString());
jsonTrack.insert("type", audio::audioResourceTypeToString(inputParams.resourceMeta.type).toQString());

audio::AudioSourceType sourceType = sourceTypeFromResourceType(inputParams.resourceMeta.type);
audio::AudioSourceType sourceType = audio::sourceTypeFromResourceType(inputParams.resourceMeta.type);
if (sourceType != audio::AudioSourceType::Fluid) {
if (sourceType == audio::AudioSourceType::MuseSampler) {
jsonTrack.insert("vendor", QString::fromStdString(inputParams.resourceMeta.attributeVal(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,8 @@ void PercussionPanelModel::resetLayout()
}

const muse::audio::AudioResourceMeta& resourceMeta = audioSettings()->trackInputParams(currentTrackId()).resourceMeta;
const bool isMuseSamplerDrumset = resourceMeta.type == muse::audio::AudioResourceType::MuseSamplerSoundPack;
const bool isMuseSamplerDrumset = muse::audio::isResourceType(resourceMeta,
muse::audio::AudioResourceType::MuseSamplerSoundPack);

Drumset defaultDrumset = isMuseSamplerDrumset ? museSamplerDefaultDrumset() : standardDefaultDrumset();

Expand Down Expand Up @@ -593,7 +594,7 @@ Drumset PercussionPanelModel::museSamplerDefaultDrumset() const

const muse::audio::AudioResourceMeta& resourceMeta = audioSettings()->trackInputParams(currentTrackId()).resourceMeta;

const int instrumentId = resourceMeta.attributeVal(u"museUID").toInt();
const int instrumentId = muse::audio::intAttribute(resourceMeta, u"museUID");

const muse::ByteArray drumMapping = museSampler()->drumMapping(instrumentId);
IF_ASSERT_FAILED(!drumMapping.empty()) {
Expand Down
4 changes: 4 additions & 0 deletions src/playback/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ target_sources(playback PRIVATE
internal/soundprofilesrepository.h
internal/drumsetloader.cpp
internal/drumsetloader.h
internal/audiometabridge.cpp
internal/audiometabridge.h
internal/knownaudiopluginsconfigurator.cpp
internal/knownaudiopluginsconfigurator.h
)

if (MUE_BUILD_PLAYBACK_TESTS)
Expand Down
65 changes: 65 additions & 0 deletions src/playback/internal/audiometabridge.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-Studio-CLA-applies
*
* MuseScore Studio
* Music Composition & Notation
*
* Copyright (C) 2026 MuseScore Limited and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

#include "audiometabridge.h"

namespace mu::playback {
muse::audio::AudioResourceMeta toAudioMeta(const muse::audioplugins::PluginMeta& meta)
{
muse::audio::AudioResourceMeta out;
out.id = meta.id;
out.vendor = meta.vendor;
out.attributes = meta.attributes;
out.type = meta.type;
return out;
}

muse::audioplugins::PluginMeta toPluginMeta(const muse::audio::AudioResourceMeta& meta)
{
muse::audioplugins::PluginMeta out;
out.id = meta.id;
out.vendor = meta.vendor;
out.attributes = meta.attributes;
out.type = meta.type;
return out;
}

muse::audio::AudioResourceMetaList toAudioMetaList(const muse::audioplugins::PluginMetaList& metas)
{
muse::audio::AudioResourceMetaList out;
out.reserve(metas.size());
for (const auto& meta : metas) {
out.push_back(toAudioMeta(meta));
}
return out;
}

muse::audioplugins::PluginMetaList toPluginMetaList(const muse::audio::AudioResourceMetaList& metas)
{
muse::audioplugins::PluginMetaList out;
out.reserve(metas.size());
for (const auto& meta : metas) {
out.push_back(toPluginMeta(meta));
}
return out;
}
}
39 changes: 39 additions & 0 deletions src/playback/internal/audiometabridge.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-Studio-CLA-applies
*
* MuseScore Studio
* Music Composition & Notation
*
* Copyright (C) 2026 MuseScore Limited and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

#pragma once

#include "audio/common/audiotypes.h"
#include "audioplugins/audiopluginstypes.h"

// App-side bridge between audio::AudioResourceMeta (engine-domain) and
// audioplugins::PluginMeta (cache-domain). The framework keeps the two
// modules independent at the type/interface level; this is where MuseScore
// converts between them at the natural seam - the playback controller, the
// project audio settings, the sound profiles repository, etc.
namespace mu::playback {
muse::audio::AudioResourceMeta toAudioMeta(const muse::audioplugins::PluginMeta& meta);
muse::audioplugins::PluginMeta toPluginMeta(const muse::audio::AudioResourceMeta& meta);

muse::audio::AudioResourceMetaList toAudioMetaList(const muse::audioplugins::PluginMetaList& metas);
muse::audioplugins::PluginMetaList toPluginMetaList(const muse::audio::AudioResourceMetaList& metas);
}
4 changes: 2 additions & 2 deletions src/playback/internal/drumsetloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ void DrumsetLoader::loadDrumset(INotationPtr notation, const InstrumentTrackId&
}

// restore the default drumset when changing from MuseSounds to MS Basic / VST
if (resourceMeta.type != AudioResourceType::MuseSamplerSoundPack) {
if (!isResourceType(resourceMeta, AudioResourceType::MuseSamplerSoundPack)) {
const InstrumentTemplate& templ = instrumentsRepository()->instrumentTemplate(trackId.instrumentId);
if (!templ.useDrumset) {
return;
Expand All @@ -56,7 +56,7 @@ void DrumsetLoader::loadDrumset(INotationPtr notation, const InstrumentTrackId&
return;
}

int instrumentId = resourceMeta.attributeVal(u"museUID").toInt();
int instrumentId = muse::audio::intAttribute(resourceMeta, u"museUID");

auto it = m_drumsetCache.find(instrumentId);
if (it != m_drumsetCache.end()) {
Expand Down
81 changes: 81 additions & 0 deletions src/playback/internal/knownaudiopluginsconfigurator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-Studio-CLA-applies
*
* MuseScore Studio
* Music Composition & Notation
*
* Copyright (C) 2026 MuseScore Limited and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "knownaudiopluginsconfigurator.h"

#include "global/serialization/json.h"

#include "audio/common/audiotypes.h"
#include "mpe/playbacksetupdata.h"

using namespace mu::playback;
using namespace muse::audioplugins;

void KnownAudioPluginsConfigurator::init()
{
if (m_audioPluginConfiguration()) {
// MuseScore's audio engine routes synthesis via the playbackSetupData
// attribute. It is runtime-only — the engine re-injects the generic
// default at every load, so the cache file should not persist it.
PluginAttributes runtimeDefaults;
runtimeDefaults.emplace(muse::audio::PLAYBACK_SETUP_DATA_ATTRIBUTE,
muse::mpe::GENERIC_SETUP_DATA_STRING);
m_audioPluginConfiguration()->setRuntimeAttributeDefaults(runtimeDefaults);
}

// MuseScore-specific audioplugins migrations only — framework-owned
// steps (v0->v1 structural, v1->v2 enabled->state) are pre-registered
// by the framework's AudioPluginsModule.
if (m_migrationRegister()) {
// v2 → v3: hasNativeEditorSupport moved from a top-level meta field
// into meta.attributes (string "true"/"false"). MuseScore-specific:
// audacity has no native-editor concept.
m_migrationRegister()->registerMigration(2, [](const muse::JsonArray& plugins) {
const std::string nativeEditorKey = muse::audio::HAS_NATIVE_EDITOR_SUPPORT_ATTRIBUTE.toStdString();
muse::JsonArray out;
for (size_t i = 0; i < plugins.size(); ++i) {
muse::JsonObject obj = plugins.at(i).toObject();
muse::JsonObject meta = obj.value("meta").toObject();
if (meta.contains(nativeEditorKey)) {
muse::JsonObject attrs;
if (meta.contains("attributes")) {
attrs = meta.value("attributes").toObject();
}
const bool b = meta.value(nativeEditorKey).toBool();
attrs.set(nativeEditorKey, b ? std::string("true") : std::string("false"));
meta.set("attributes", attrs);

// JsonObject has no remove(); rebuild without the legacy key.
muse::JsonObject metaWithoutLegacy;
for (const std::string& k : meta.keys()) {
if (k == nativeEditorKey) {
continue;
}
metaWithoutLegacy.set(k, meta.value(k));
}
obj.set("meta", metaWithoutLegacy);
}
out << obj;
}
return out;
});
}
}
42 changes: 42 additions & 0 deletions src/playback/internal/knownaudiopluginsconfigurator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-Studio-CLA-applies
*
* MuseScore Studio
* Music Composition & Notation
*
* Copyright (C) 2026 MuseScore Limited and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once

#include "modularity/ioc.h"

#include "audioplugins/iaudiopluginsconfiguration.h"
#include "audioplugins/iknownaudiopluginsmigrationregister.h"

namespace mu::playback {
// MuseScore-specific configuration of the framework's shared known-audio-plugins
// cache: marks runtime-only attributes and registers the app's cache migration.
// Not a module — it's one-shot setup invoked from PlaybackModule::resolveImports()
// (before the cache is loaded in the audioplugins context onInit).
class KnownAudioPluginsConfigurator
{
muse::GlobalInject<muse::audioplugins::IAudioPluginsConfiguration> m_audioPluginConfiguration;
muse::GlobalInject<muse::audioplugins::IKnownAudioPluginsMigrationRegister> m_migrationRegister;

public:
void init();
};
}
3 changes: 2 additions & 1 deletion src/playback/internal/playbackcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,8 @@ bool PlaybackController::shouldLoadDrumset(const engraving::InstrumentTrackId& i
return false;
}

return oldMeta.type == AudioResourceType::MuseSamplerSoundPack || newMeta.type == AudioResourceType::MuseSamplerSoundPack;
return isResourceType(oldMeta, AudioResourceType::MuseSamplerSoundPack)
|| isResourceType(newMeta, AudioResourceType::MuseSamplerSoundPack);
}

void PlaybackController::addSoundFlagsIfNeed(const std::vector<EngravingItem*>& selection)
Expand Down
4 changes: 2 additions & 2 deletions src/playback/internal/soundprofilesrepository.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,11 @@ void SoundProfilesRepository::refresh()
continue;
}

if (resource.type == AudioResourceType::FluidSoundfont) {
if (isResourceType(resource, AudioResourceType::FluidSoundfont)) {
basicProfile.data.emplace(mpe::PlaybackSetupData::fromString(setup->second), resource);
}

if (resource.type == AudioResourceType::MuseSamplerSoundPack) {
if (isResourceType(resource, AudioResourceType::MuseSamplerSoundPack)) {
museProfile.data.emplace(mpe::PlaybackSetupData::fromString(setup->second), resource);
}
}
Expand Down
6 changes: 6 additions & 0 deletions src/playback/playbackmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "internal/playbackcommands.h"
#include "internal/playbackconfiguration.h"
#include "internal/soundprofilesrepository.h"
#include "internal/knownaudiopluginsconfigurator.h"

using namespace mu::playback;
using namespace muse;
Expand Down Expand Up @@ -64,6 +65,11 @@ void PlaybackModule::resolveImports()
if (cr) {
cr->reg(std::make_shared<PlaybackCommands>());
}

// MuseScore-specific setup of the shared known-audio-plugins cache. Must run
// before the cache is loaded in the audioplugins context onInit — resolveImports
// of every module precedes any onInit, so this is the right phase.
KnownAudioPluginsConfigurator().init();
}

void PlaybackModule::onInit(const IApplication::RunMode&)
Expand Down
Loading
Loading