From 68d195f9fb220da2697a7e1b6850c72fd0d29a82 Mon Sep 17 00:00:00 2001 From: "Robin E.R. Davies" Date: Sun, 31 May 2026 02:45:50 -0400 Subject: [PATCH] Default Bank/Factory Preset install --- src/CapturePresetsMain.cpp | 2 +- src/PiPedalModel.cpp | 2 +- src/Storage.cpp | 181 +++++++++++++++++++++++++++++-------- src/Storage.hpp | 14 ++- 4 files changed, 154 insertions(+), 45 deletions(-) diff --git a/src/CapturePresetsMain.cpp b/src/CapturePresetsMain.cpp index 01d28a2..e3488d9 100644 --- a/src/CapturePresetsMain.cpp +++ b/src/CapturePresetsMain.cpp @@ -289,7 +289,7 @@ int main(int argc, const char *argv[]) storage->SetConfigRoot("/etc/pipedal/config"); storage->SetDataRoot("/var/pipedal"); - storage->Initialize(); + storage->Initialize(nullptr); const PluginPresetIndex &index = storage->GetPluginPresetIndex(); diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index 8ef5fd7..9d02874 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -220,7 +220,7 @@ void PiPedalModel::Init(const PiPedalConfiguration &configuration) pluginHost.SetConfiguration(configuration); storage.SetConfigRoot(configuration.GetDocRoot()); storage.SetDataRoot(configuration.GetLocalStoragePath()); - storage.Initialize(); + storage.Initialize(this); pluginHost.SetPluginStoragePath(storage.GetPluginUploadDirectory()); this->systemMidiBindings = storage.GetSystemMidiBindings(); diff --git a/src/Storage.cpp b/src/Storage.cpp index f47c097..8e02044 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -47,6 +47,7 @@ #include "util.hpp" using namespace pipedal; +using namespace ::pipedal::implementation; namespace fs = std::filesystem; const char* BANK_EXTENSION = ".bank"; @@ -227,17 +228,6 @@ static void CopyDirectory(const std::filesystem::path& source, const std::filesy } } -void Storage::MaybeCopyDefaultPresets() -{ - auto presetsDirectory = this->GetPresetsDirectory(); - auto presetsConfigDirectory = this->configRoot / "default_presets" / "presets"; - - if (!std::filesystem::exists(presetsDirectory / "index.banks")) - { - fs::copy(presetsConfigDirectory / "index.banks", presetsDirectory / "index.banks"); - fs::copy(presetsConfigDirectory / "Default+Bank.bank", presetsDirectory / "Default+Bank.bank"); - } -} static void removeFileNoThrow(const std::filesystem::path& path) { @@ -250,38 +240,149 @@ static void removeFileNoThrow(const std::filesystem::path& path) } } -void Storage::UpgradeFactoryPresets() +int32_t Storage::GetInstallerPresetVersion() { - UpgradeV1FactoryPresets(); - UpgradeV2FactoryPresets(); + auto installerConfiDirectory = this->configRoot / "default_presets" / "presets"; + BrowserFilesVersionInfo versionInfo; + if (!versionInfo.Load(installerConfiDirectory / "banks.versionInfo")) + { + throw std::runtime_error("Can't open Installer banks.versionInfo file."); + } + return versionInfo.Version(); +} +int32_t Storage::GetVarPresetVersion() +{ + auto presetsDirectory = this->GetPresetsDirectory(); + BrowserFilesVersionInfo versionInfo; + versionInfo.Load(presetsDirectory / "banks.versionInfo"); + return versionInfo.Version(); + +} + +void Storage::SetVarPresetVersion(int32_t version) +{ + auto presetsDirectory = this->GetPresetsDirectory(); + BrowserFilesVersionInfo versionInfo; + versionInfo.Load(presetsDirectory / "banks.versionInfo"); + versionInfo.Version(version); + versionInfo.Save(presetsDirectory / "banks.versionInfo"); + } -void Storage::UpgradeV2FactoryPresets() +void Storage::MoveExistingFactoryPresetsBank() { - auto presetsDirectory = this->GetPresetsDirectory(); - auto presetsConfigDirectory = this->configRoot / "default_presets" / "presets"; - - using namespace ::pipedal::implementation; - - BrowserFilesVersionInfo defaultConfigPresetsVersion; - fs::path defaultConfigPresetsVersionFile = presetsConfigDirectory / "banks.versionInfo"; - defaultConfigPresetsVersion.Load(defaultConfigPresetsVersionFile); - - BrowserFilesVersionInfo presetsVersion; - fs::path defaultPresetsVersionFile = presetsDirectory / "banks.versionInfo"; - presetsVersion.Load(defaultPresetsVersionFile); - - constexpr uint32_t V2_VERSION_NUMBER = 2; - - // set the default banks.versionInfo value to 0 to force complete upgrade path - - bool testUpgrade = (defaultConfigPresetsVersion.Version() == 0); - // Maybe install or upgrade Version 1 factory presets. - if ((V2_VERSION_NUMBER > presetsVersion.Version() && presetsVersion.Version() != 0) || testUpgrade) + BankIndexEntry* entry = bankIndex.getEntryByName("Factory Presets"); + if (entry) { + std::string newName = "Old Factory Presets"; + int32_t nextVersionNumber = 2; + while (true) + { + if (bankIndex.getEntryByName(newName) == nullptr) + { + break; + } + newName = SS("Old Factory Presets (" << nextVersionNumber << ")"); + } + + RenameBank(entry->instanceId(), newName); } +} + + +namespace pipedal::implementation { + extern int64_t ImportBankFile(PiPedalModel &model, const std::filesystem::path& filePath,uint64_t uploadAfter = -1); +} + +void Storage::InstallFactoryPresets() +{ + fs::path defaultBankFilePath = this->configRoot / "default_presets" / "presets" / "Factory Presets.piBank"; + try { + ImportBankFile(*this->model,defaultBankFilePath, -1); + } catch (const std::exception &e) + { + throw std::runtime_error(SS("Failed to install Factory Presets. " << e.what())); + } + +} + +void Storage::CopyFactoryPresetsToDefaultBank() +{ + + Lv2Log::info("Creating Default Bank"); + auto defaultBankEntry = bankIndex.getEntryByName("Default Bank"); + if (defaultBankEntry != nullptr) + { + throw std::runtime_error("Internal error: CopyFactoryPresetsToDefaultBank: Default Bank already exists."); + } + fs::path factoryPresetPath = GetBankFileName("Factory Presets"); + fs::path defaultBankPath = GetBankFileName("Default Bank"); + if (!fs::exists(factoryPresetPath)) { + throw std::runtime_error("Internal error: CopyFactoryPresetsToDefaultBank: Factory Presets file does not exist."); + } + auto instanceId = bankIndex.addBank(-2,"Default Bank"); + + + fs::copy(factoryPresetPath, defaultBankPath); + + bankIndex.selectedBank(instanceId); + SaveBankIndex(); +} + + +void Storage::ProvisionDefaultBanks() +{ + fs::path indexFilename = this->GetIndexFileName(); + + + this->bankIndex = BankIndex(); + + + bool freshInstall = false; + bool installFactoryPresets = false; + + int32_t etcVersion = GetInstallerPresetVersion(); + int32_t varPresetVersion = GetVarPresetVersion(); + + if (!std::filesystem::exists(indexFilename)) + { + freshInstall = true; + installFactoryPresets = true; + + } else { + freshInstall = false; + std::ifstream s; + s.open(indexFilename); + json_reader reader(s); + reader.read(&(this->bankIndex)); + } + + // Compare the Factory Preset verion in the /var directory with the one in the /etc directory, + // to decide whether the Factory bank needs to be provisions. + + auto varPresetsDirectory = this->GetPresetsDirectory(); + auto etcPresetsDirector = this->configRoot / "default_presets" / "presets"; + + constexpr uint32_t V2_VERSION_NUMBER = 2; // first to have a Factory Presets + constexpr uint32_t V3_VERSION_NUMBER = 3; // New A2 Presets, completely replacing the previons version. + + if (varPresetVersion < V3_VERSION_NUMBER) { + Lv2Log::info("Installing Factory Presets"); + + // Move the old factory presets bank out of the way. + MoveExistingFactoryPresetsBank(); + InstallFactoryPresets(); + SetVarPresetVersion(V3_VERSION_NUMBER); + SaveBankIndex(); // checkpoint. + } + // Next time we will have to MERGE factor presets. + if (freshInstall) + { + CopyFactoryPresetsToDefaultBank(); + SetVarPresetVersion(V3_VERSION_NUMBER); + } } @@ -308,7 +409,7 @@ void Storage::UpgradeV1FactoryPresets() // Maybe install or upgrade Version 1 factory presets. if ((V1_VERSION_NUMBER > presetsVersion.Version() && presetsVersion.Version() != 0) || testUpgrade) { - // remove TooB ML README.md + // Forces TooBMl to re-install V1 factory models (?) removeFileNoThrow("/usr/lib/lv2/ToobAmp.lv2/models/tones/README.md"); removeFileNoThrow("/var/pipedal/audio_uploads/ToobMlModels/model.index"); @@ -403,19 +504,22 @@ void Storage::UpgradeV1FactoryPresets() presetsVersion.Save(defaultPresetsVersionFile); } } -void Storage::Initialize() +void Storage::Initialize(PiPedalModel *model) { + this->model = model; try { std::filesystem::create_directories(this->GetPresetsDirectory()); std::filesystem::create_directories(this->GetPluginPresetsDirectory()); - MaybeCopyDefaultPresets(); } catch (const std::exception& e) { throw PiPedalStateException("Can't create presets directory. (" + (std::string)this->GetPresetsDirectory() + ") (" + e.what() + ")"); } + + ProvisionDefaultBanks(); + LoadPluginPresetIndex(); LoadBankIndex(); LoadCurrentBank(); @@ -432,7 +536,6 @@ void Storage::Initialize() LoadWifiDirectConfigSettings(); this->channelRouterSettings = LoadChannelRouterSettings(); LoadUserSettings(); - UpgradeFactoryPresets(); UpgradeChannelRouterSettings(); } diff --git a/src/Storage.hpp b/src/Storage.hpp index f8bb8d0..aef38bd 100644 --- a/src/Storage.hpp +++ b/src/Storage.hpp @@ -41,6 +41,7 @@ namespace pipedal { class UiFileProperty; class Lv2PluginInfo; class UiFileProperty; +class PiPedalModel; class CurrentPreset { public: @@ -80,10 +81,14 @@ private: private: void FillSampleDirectoryTree(FilePropertyDirectoryTree*node, const std::filesystem::path&directory) const; + int32_t GetInstallerPresetVersion(); + int32_t GetVarPresetVersion(); + void SetVarPresetVersion(int32_t version); void UpgradeV1FactoryPresets(); - void UpgradeV2FactoryPresets(); - void UpgradeFactoryPresets(); - void MaybeCopyDefaultPresets(); + void MoveExistingFactoryPresetsBank(); + void InstallFactoryPresets(); + void CopyFactoryPresetsToDefaultBank(); + void ProvisionDefaultBanks(); static std::string SafeEncodeName(const std::string& name); static std::string SafeDecodeName(const std::string& name); std::filesystem::path GetPresetsDirectory() const; @@ -130,7 +135,7 @@ private: public: Storage(); - void Initialize(); + void Initialize(PiPedalModel *model); void CreateBank(const std::string & name); void SetDataRoot(const std::filesystem::path& path); @@ -288,6 +293,7 @@ public: int64_t ImportPresetsFromBank(int64_t bankInstanceId, const std::vector &presets); int64_t CopyPresetsToBank(int64_t bankInstanceId, const std::vector &presets); + PiPedalModel *model = nullptr; };