From a52a7a2a9ad84bbbcf88be0114d62d9bed9650af Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 14 Nov 2024 11:19:38 -0500 Subject: [PATCH 01/17] Incorrect permissioningo on first install. --- src/ConfigMain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ConfigMain.cpp b/src/ConfigMain.cpp index 84e8834..ffb809e 100644 --- a/src/ConfigMain.cpp +++ b/src/ConfigMain.cpp @@ -1161,8 +1161,8 @@ void Install(const fs::path &programPrefix, const std::string endpointAddress) sysExec(SYSTEMCTL_BIN " daemon-reload"); - FixPermissions(); ModFileTypes::CreateDefaultDirectories("/var/pipedal/audio_uploads"); + FixPermissions(); StopService(false); AvahiInstall(); From c01f0351f01d3029ff0e55605238aaac57685e26 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 14 Nov 2024 16:15:32 -0500 Subject: [PATCH 02/17] Thred priorities on no-PREEMPT_RT (Ubunutu) --- .vscode/c_cpp_properties.json | 19 ++++ PiPedalCommon/src/CMakeLists.txt | 12 +-- src/AlsaDriver.cpp | 28 +----- src/AudioHost.cpp | 27 +----- src/CMakeLists.txt | 17 ++-- src/ConfigMain.cpp | 20 +++-- src/DummyAudioDriver.cpp | 27 +----- src/JackDriver.cpp | 14 ++- src/PiPedalModel.cpp | 5 -- src/RtInversionGuard.hpp | 6 +- src/SchedulerPriority.cpp | 147 +++++++++++++++++++++++++++++++ src/SchedulerPriority.hpp | 33 +++++++ src/Worker.cpp | 9 +- src/main.cpp | 6 +- 14 files changed, 261 insertions(+), 109 deletions(-) create mode 100644 src/SchedulerPriority.cpp create mode 100644 src/SchedulerPriority.hpp diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 033e617..d7afa68 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -7,6 +7,7 @@ "${workspaceFolder}", "${workspaceFolder}/src", "/usr/include/lilv-0", + "/usr/include/x86_64-linux-gnu", "/usr/lib", "~/src/vst3sdk" ], @@ -16,6 +17,24 @@ "intelliSenseMode": "linux-gcc-arm64", "compileCommands": "${workspaceFolder}/build/compile_commands.json", "configurationProvider": "ms-vscode.cmake-tools" + }, + { + "name": "Linux x86_64", + "includePath": [ + "${default}", + "${workspaceFolder}", + "${workspaceFolder}/src", + "/usr/include/x86_64-linux-gnu", + "/usr/include/lilv-0", + "/usr/lib" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c17", + "cppStandard": "c++20", + "intelliSenseMode": "linux-gcc-x64", + "compileCommands": "${workspaceFolder}/build/compile_commands.json", + "configurationProvider": "ms-vscode.cmake-tools", + "mergeConfigurations": true } ], "version": 4 diff --git a/PiPedalCommon/src/CMakeLists.txt b/PiPedalCommon/src/CMakeLists.txt index 80e2108..3926a61 100644 --- a/PiPedalCommon/src/CMakeLists.txt +++ b/PiPedalCommon/src/CMakeLists.txt @@ -27,12 +27,12 @@ endif() # endif() # nlgenl-3 library. -execute_process(COMMAND ls /usr/include/libnl3/netlink/netlink.h RESULT_VARIABLE LNL3_MISSING OUTPUT_QUIET ERROR_QUIET) -if(LNL3_MISSING) - message(ERROR " Need to: sudo apt install libnl-3-dev libnl-genl-3-dev ") -endif() -set(LIBNL3_INCLUDE_DIRS /usr/include/libnl3) -set(LIBNL3_LIBRARIES nl-3 nl-genl-3) +# execute_process(COMMAND ls /usr/include/libnl3/netlink/netlink.h RESULT_VARIABLE LNL3_MISSING OUTPUT_QUIET ERROR_QUIET) +# if(LNL3_MISSING) +# message(ERROR " Need to: sudo apt install libnl-3-dev libnl-genl-3-dev ") +# endif() +# set(LIBNL3_INCLUDE_DIRS /usr/include/libnl3) +# set(LIBNL3_LIBRARIES nl-3 nl-genl-3) diff --git a/src/AlsaDriver.cpp b/src/AlsaDriver.cpp index e92382a..726c9b9 100644 --- a/src/AlsaDriver.cpp +++ b/src/AlsaDriver.cpp @@ -34,6 +34,7 @@ #include "RtInversionGuard.hpp" #include "PiPedalException.hpp" #include "DummyAudioDriver.hpp" +#include "SchedulerPriority.hpp" #include "CpuUse.hpp" @@ -1565,32 +1566,7 @@ namespace pipedal SetThreadName("alsaDriver"); try { -#if defined(__WIN32) - // bump thread prioriy two levels to - // ensure that the service thread doesn't - // get bogged down by UIwork. Doesn't have to be realtime, but it - // MUST run at higher priority than UI threads. - xxx; // TO DO. -#elif defined(__linux__) - int min = sched_get_priority_min(SCHED_RR); - int max = sched_get_priority_max(SCHED_RR); - - struct sched_param param; - memset(¶m, 0, sizeof(param)); - param.sched_priority = RT_THREAD_PRIORITY; - - int result = sched_setscheduler(0, SCHED_RR, ¶m); - if (result == 0) - { - Lv2Log::debug("Service thread priority successfully boosted."); - } - else - { - Lv2Log::error(SS("Failed to set ALSA AudioThread priority. (" << strerror(result) << ")")); - } -#else - xxx; // TODO! -#endif + SetThreadPriority(SchedulerPriority::RealtimeAudio); bool ok = true; diff --git a/src/AudioHost.cpp b/src/AudioHost.cpp index 3f5cce8..5c238aa 100644 --- a/src/AudioHost.cpp +++ b/src/AudioHost.cpp @@ -20,9 +20,11 @@ #include "AudioHost.hpp" #include "util.hpp" #include +#include "SchedulerPriority.hpp" #include "Lv2Log.hpp" +#include "SchedulerPriority.hpp" #include "JackDriver.hpp" #include "AlsaDriver.hpp" #include "DummyAudioDriver.hpp" @@ -1263,30 +1265,9 @@ public: bool terminateThread; void ThreadProc() { - -#if defined(__WIN32) - // bump thread prioriy two levels to - // ensure that the service thread doesn't - // get bogged down by UIwork. Doesn't have to be realtime, but it - // MUST run at higher _ than UI threads. - xxx; // TO DO. -#elif defined(__linux__) - int min = sched_get_priority_min(SCHED_RR); - int max = sched_get_priority_max(SCHED_RR); - - struct sched_param param; - memset(¶m, 0, sizeof(param)); - param.sched_priority = min; - - int result = sched_setscheduler(0, SCHED_RR, ¶m); - if (result == 0) - { - Lv2Log::debug("Service thread priority successfully boosted."); - } SetThreadName("rtsvc"); -#else - xxx; // TODO! -#endif + SetThreadPriority(SchedulerPriority::AudioService); + int underrunMessagesGiven = 0; try { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2ccb744..ff6b328 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -87,13 +87,14 @@ set (LV2DEV_INCLUDE_DIRS ) # use lvt headers fro /usr/include set (WEBSOCKETPP_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/modules/websocketpp) message(STATUS "WEBSOCKETPP_INCLUDE_DIRS ${WEBSOCKETPP_INCLUDE_DIRS}" ) -pkg_check_modules(JACK "jack") -if(!JACK_FOUND) - message(ERROR "jack package not installed.") -else() - message(STATUS "JACK_LIBRARIES: ${JACK_LIBRARIES}") - message(STATUS "JACK_INCLUDE_DIRS: ${JACK_INCLUDE_DIRS}") -endif() + +# pkg_check_modules(JACK "jack") +# if(!JACK_FOUND) +# message(ERROR "jack package not installed.") +# else() +# message(STATUS "JACK_LIBRARIES: ${JACK_LIBRARIES}") +# message(STATUS "JACK_INCLUDE_DIRS: ${JACK_INCLUDE_DIRS}") +# endif() # specify the C++ standard @@ -157,6 +158,7 @@ else() endif() set (PIPEDAL_SOURCES + SchedulerPriority.hpp SchedulerPriority.cpp ModFileTypes.cpp ModFileTypes.hpp PatchPropertyWriter.hpp PresetBundle.cpp PresetBundle.hpp @@ -659,6 +661,7 @@ add_executable(pipedal_latency_test PiPedalAlsa.hpp PiPedalAlsa.cpp asan_options.cpp AlsaDriver.cpp AlsaDriver.hpp + SchedulerPriority.cpp SchedulerPriority.hpp DummyAudioDriver.cpp DummyAudioDriver.hpp JackConfiguration.hpp JackConfiguration.cpp JackServerSettings.hpp JackServerSettings.cpp diff --git a/src/ConfigMain.cpp b/src/ConfigMain.cpp index ffb809e..12d6bf9 100644 --- a/src/ConfigMain.cpp +++ b/src/ConfigMain.cpp @@ -483,17 +483,25 @@ void InstallLimits() throw std::runtime_error("Failed to create audio service group."); } - fs::path limitsConfig = "/etc/security/limits.d/audio.conf"; + // old limits config file bumped limits for members of the audio group, and didn't have a proper priority. + // remove it + fs::path oldLimitsConfig = "/etc/security/limits.d/audio.conf"; + if (fs::exists(oldLimitsConfig)) + { + fs::remove(oldLimitsConfig); + } + + // bump limits for members of the pipedal_d group. + fs::path limitsConfig = "/etc/security/limits.d/90-pipedal.conf"; if (!fs::exists(limitsConfig)) { ofstream output(limitsConfig); - output << "# Realtime priority group used by pipedal audio (and also by jack)" - << "\n"; - output << "@audio - rtprio 95" - << "\n"; - output << "@audio - memlock unlimited" + output << "# Realtime priority limits for the pipedal services" << "\n"; + output << "@pipedal_d - rtprio 95" << "\n"; + output << "@pipedal_d - nice -20" << "\n"; + output << "@pipedal_d - memlock unlimited" << "\n"; } } diff --git a/src/DummyAudioDriver.cpp b/src/DummyAudioDriver.cpp index 8353c8b..a4b58c5 100644 --- a/src/DummyAudioDriver.cpp +++ b/src/DummyAudioDriver.cpp @@ -37,6 +37,7 @@ #include #include #include "ss.hpp" +#include "SchedulerPriority.hpp" #include "CpuUse.hpp" @@ -223,32 +224,8 @@ namespace pipedal SetThreadName("dummyAudioDriver"); try { -#if defined(__WIN32) - // bump thread prioriy two levels to - // ensure that the service thread doesn't - // get bogged down by UIwork. Doesn't have to be realtime, but it - // MUST run at higher priority than UI threads. - xxx; // TO DO. -#elif defined(__linux__) - int min = sched_get_priority_min(SCHED_RR); - int max = sched_get_priority_max(SCHED_RR); - struct sched_param param; - memset(¶m, 0, sizeof(param)); - param.sched_priority = RT_THREAD_PRIORITY; - - int result = sched_setscheduler(0, SCHED_RR, ¶m); - if (result == 0) - { - Lv2Log::debug("Service thread priority successfully boosted."); - } - else - { - Lv2Log::error(SS("Failed to set ALSA AudioThread priority. (" << strerror(result) << ")")); - } -#else - xxx; // TODO for your platform. -#endif + SetThreadPriority(SchedulerPriority::RealtimeAudio); bool ok = true; diff --git a/src/JackDriver.cpp b/src/JackDriver.cpp index d0b4764..e26880f 100644 --- a/src/JackDriver.cpp +++ b/src/JackDriver.cpp @@ -25,13 +25,23 @@ /* Status of Jack support. PiPedal was originally written for Jack, but subsequently ported to Alsa because running -Jack as a systemd daemon proved to be unsupportable,. +Jack as a systemd daemon proved to be unsupportable. (Completely broken when pipewire is +installed). +This was all functional code at one point, but is no longer in sync with the current +codebase. It won't work as is. It probably implemenets the driver interface properly. +You would have to go through AudioHost.cpp and substitute JackDriver for AlsaDriver +as appropriate. */ + + +#if JACK_HOST + #include "pch.h" + #include "JackDriver.hpp" #include @@ -40,8 +50,6 @@ Jack as a systemd daemon proved to be unsupportable,. #include #include "Lv2Log.hpp" -#if JACK_HOST - namespace pipedal { diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index ace8873..5c95a4e 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -299,11 +299,6 @@ void PiPedalModel::Load() #endif } - struct sched_param scheduler_params; - scheduler_params.sched_priority = 10; - memset(&scheduler_params, 0, sizeof(sched_param)); - sched_setscheduler(0, SCHED_RR, &scheduler_params); - RestartAudio(); } diff --git a/src/RtInversionGuard.hpp b/src/RtInversionGuard.hpp index 295b9eb..74e0a29 100644 --- a/src/RtInversionGuard.hpp +++ b/src/RtInversionGuard.hpp @@ -24,6 +24,8 @@ #pragma once +#ifdef JUNK //yyx delete me. + #include "ss.hpp" #include "Lv2Log.hpp" @@ -66,4 +68,6 @@ namespace pipedal sched_setscheduler(0, currentScheduler, ¤tPriority); } }; -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/SchedulerPriority.cpp b/src/SchedulerPriority.cpp new file mode 100644 index 0000000..5b64d44 --- /dev/null +++ b/src/SchedulerPriority.cpp @@ -0,0 +1,147 @@ +// Copyright (c) 2024 Robin E. R. Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#include "SchedulerPriority.hpp" +#include "Lv2Log.hpp" +#include "memory.h" +#include "sched.h" +#include "ss.hpp" +#include + +#ifdef __linux__ +#include "unistd.h" // for nice()` +#endif + +using namespace pipedal; + +static constexpr int EXPECTED_RT_THREAD_PRIORITY_MAX = 81; + +static constexpr int RT_AUDIO_THREAD_PRIORITY = 80; +static constexpr int NICE_AUDIO_THREAD_PRIORITY = -19; + +static constexpr int RT_AUDIOSERVICE_THREAD_PRIORITY = 10; +static constexpr int NICE_AUDIOSERVICE_THREAD_PRIORITY = -17; + +static constexpr int RT_LV2SCHEDULER_THREAD_PRIORITY = -1; +static constexpr int NICE_LV2SCHEDULER_THREAD_PRIORITY = 2; // nice(2): don't let plugins screw things up by pinning the CPU + +static constexpr int RT_WEBSERVER_THREAD_PRIORITY = -1; +static constexpr int NICE_WEBSERVER_THREAD_PRIORITY = -2; // don't get bogged down by UI threads. + +bool pipedal::IsRtPreemptKernel(SchedulerPriority priority) +{ + #ifdef __linux__ + struct oldPolicy; + struct sched_param oldParam = {0}; + + struct sched_param param = {0}; + + auto oldPolicy = sched_getscheduler(0); + if (sched_getparam(0,&oldParam) == -1) + { + return false; + } + auto priorityMin = sched_get_priority_min(SCHED_RR); + param.sched_priority = priorityMin; + if (sched_setscheduler(0,SCHED_RR,¶m) == -1) + { + return false; + } + sched_setscheduler(0,oldPolicy,&oldParam); + return true; + + #else + return true; // let SetPrority sort out whether it can or can't. + #endif +} + +static void SetPriority(int realtimePriority, int nicePriority, const char *priorityName) +{ + + if (realtimePriority != -1) + { + int initialPriority = realtimePriority; + int min = sched_get_priority_min(SCHED_RR); + int max = sched_get_priority_max(SCHED_RR); + if (realtimePriority > max) { + realtimePriority = max + EXPECTED_RT_THREAD_PRIORITY_MAX-realtimePriority; + } + if (realtimePriority < min) { + realtimePriority = min; + } + if (initialPriority != realtimePriority) + { + Lv2Log::warning( + SS("Realtime priority adjusted from " << initialPriority << " to " << realtimePriority << ". (" << priorityName << ")") + ); + } + + struct sched_param param; + memset(¶m, 0, sizeof(param)); + param.sched_priority = realtimePriority; + + int result = sched_setscheduler(0, SCHED_RR, ¶m); + if (result == 0) + { + Lv2Log::debug("Service thread priority successfully boosted."); + return; + } + else + { + Lv2Log::debug(SS("Failed to set RT thread priority for " << priorityName << " (" << strerror(result) << ")")); + } + } + // If the RT scheduler isn't working, fall back to using NICE priority. + int result = nice(nicePriority); + if (result == -1) + { + Lv2Log::error(SS("Failed Failed to set thread priority. (" << priorityName << ")")); + } +} + +void pipedal::SetThreadPriority(SchedulerPriority priority) +{ + +#if defined(__linux__) + switch (priority) + { + case SchedulerPriority::RealtimeAudio: + SetPriority(RT_AUDIO_THREAD_PRIORITY, NICE_AUDIO_THREAD_PRIORITY, "RealtimeAudio"); + break; + case SchedulerPriority::AudioService: + SetPriority(RT_AUDIOSERVICE_THREAD_PRIORITY, NICE_AUDIOSERVICE_THREAD_PRIORITY, "AudioService"); + break; + case SchedulerPriority::Lv2Scheduler: + SetPriority(RT_LV2SCHEDULER_THREAD_PRIORITY, NICE_LV2SCHEDULER_THREAD_PRIORITY, "Lv2Scheduler"); + break; + case SchedulerPriority::WebServerThread: + SetPriority(RT_WEBSERVER_THREAD_PRIORITY, NICE_WEBSERVER_THREAD_PRIORITY, "Lv2Scheduler"); + break; + default: + Lv2Log::error("Invalid scheduler priority."); + throw std::runtime_error("Invalid value."); + } +#elif defined(__WIN32) +// Realtime thread priority must be set using MM scheduler. +// Others must run with elevated priority, but not realtime priority (MUST run with higher priority than UI threads). +#error "Realtime scheduling not implmented for WIN32" +#else +#error "Realtime scheduling not implmented for your platform" +#endif +} diff --git a/src/SchedulerPriority.hpp b/src/SchedulerPriority.hpp new file mode 100644 index 0000000..2309eeb --- /dev/null +++ b/src/SchedulerPriority.hpp @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Robin E. R. Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#pragma once + +namespace pipedal { + enum class SchedulerPriority { + RealtimeAudio, // the audio service thread. + AudioService, // non-realtime servicing of AudioThread responses. + Lv2Scheduler, // LV2 Scheduler service thread. + WebServerThread, // Web server threads. + }; + + bool IsRtPreemptKernel(SchedulerPriority priority); + + void SetThreadPriority(SchedulerPriority priority); +} \ No newline at end of file diff --git a/src/Worker.cpp b/src/Worker.cpp index 6f14779..1f0361d 100644 --- a/src/Worker.cpp +++ b/src/Worker.cpp @@ -42,6 +42,7 @@ #include // for nice( #include #include "util.hpp" +#include "SchedulerPriority.hpp" using namespace pipedal; @@ -190,12 +191,8 @@ void HostWorkerThread::ThreadProc() noexcept { // run nice +2 (priority -2 on Windows) SetThreadName("lv2_worker"); - errno = 0; - std::ignore = nice(2); - if (errno != 0) - { - std::cout << "Warning: Unable to run Lv2 schedule thread at nice +1" << std::endl; - } + SetThreadPriority(SchedulerPriority::Lv2Scheduler); + try { diff --git a/src/main.cpp b/src/main.cpp index e211bde..2f22fb9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,10 +44,11 @@ #include #include +#include "SchedulerPriority.hpp" #include -using namespace pipedal; +using namespace pipedal; #ifdef __ARM_ARCH_ISA_A64 #define AARCH64 @@ -244,6 +245,9 @@ int main(int argc, char *argv[]) std::shared_ptr server; try { + // (web server threads inherit the main thread priority) + SetThreadPriority(SchedulerPriority::WebServerThread); + auto const address = boost::asio::ip::make_address(configuration.GetSocketServerAddress()); port = static_cast(configuration.GetSocketServerPort()); From 316c660d46bf7060cb72e0fa79001b7e684f0019 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 14 Nov 2024 18:51:24 -0500 Subject: [PATCH 03/17] WifiConfigDialog: update channels when country code changes. --- react/src/WifiConfigDialog.tsx | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/react/src/WifiConfigDialog.tsx b/react/src/WifiConfigDialog.tsx index 886af57..45bb665 100644 --- a/react/src/WifiConfigDialog.tsx +++ b/react/src/WifiConfigDialog.tsx @@ -526,23 +526,11 @@ const WifiConfigDialog = withStyles(styles, { withTheme: true })( { if (value) { this.setState({ countryCode: value.id }) } }} + onChange={(event, value) => { if (value) { this.handleCountryChanged({ countryCode: value.id }) } }} options={this.getCountryCodeOptions()} renderInput={(params) => ()} disabled={!enabled} /> - {/* - - */} -
From 04181958a1c0cb17e4c496596b27a7f11910d6e5 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 14 Nov 2024 20:51:55 -0500 Subject: [PATCH 04/17] Oddities w/ country code selection. --- react/src/WifiConfigDialog.tsx | 85 ++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 24 deletions(-) diff --git a/react/src/WifiConfigDialog.tsx b/react/src/WifiConfigDialog.tsx index 45bb665..7e35386 100644 --- a/react/src/WifiConfigDialog.tsx +++ b/react/src/WifiConfigDialog.tsx @@ -78,6 +78,10 @@ export interface WifiConfigState { homeNetworkSsid: string; homeNetworkError: boolean; homeNetworkErrorMessage: string; + countryCodeError: boolean; + countryCodeErrorMessage: string; + channelError: boolean; + channelErrorMessage: string; countryCode: string; channel: string; knownWifiNetworks: string[]; @@ -112,6 +116,10 @@ const WifiConfigDialog = withStyles(styles, { withTheme: true })( homeNetworkSsid: this.props.wifiConfigSettings.homeNetwork, homeNetworkError: false, homeNetworkErrorMessage: NBSP, + countryCodeError: false, + countryCodeErrorMessage: NBSP, + channelError: false, + channelErrorMessage: NBSP, showWifiWarningDialog: false, showHelpDialog: false, wifiWarningGiven: this.props.wifiConfigSettings.wifiWarningGiven, @@ -257,7 +265,19 @@ const WifiConfigDialog = withStyles(styles, { withTheme: true })( this.setState({ homeNetworkError: true, homeNetworkErrorMessage: "* Required" }); hasError = true; } + if (this.state.countryCode === "") + { + this.setState({ countryCodeError: true, countryCodeErrorMessage: "* Required" }); + hasError = true; + } + if (this.validChannelSelection() === "") + { + this.setState({ channelError: true, channelErrorMessage: "* Required" }); + hasError = true; + + } } + if (this.state.autoStartMode !== 0 && (!this.props.wifiConfigSettings.hasSavedPassword) && this.state.newPassword.length === 0) { this.setState({ passwordError: true, passwordErrorMessage: "* Required" }); hasError = true; @@ -291,12 +311,14 @@ const WifiConfigDialog = withStyles(styles, { withTheme: true })( handleChannelChange(e: any) { let value = e.target.value as string; - this.setState({ channel: value }); + this.setState({ channel: value, channelError: false, channelErrorMessage: NBSP }); } - handleCountryChanged(e: any) { - let value = e.target.value as string; + handleCountryChanged(value: string) { - this.setState({ countryCode: value }); + this.setState({ countryCode: value, + countryCodeError: false, countryCodeErrorMessage: NBSP, + channelError: false, channelErrorMessage: NBSP + }); this.requestWifiChannels(value); } handleTogglePasswordVisibility() { @@ -334,6 +356,20 @@ const WifiConfigDialog = withStyles(styles, { withTheme: true })( this.handleOk(true); } + validChannelSelection() { + if (!this.state.wifiChannels) + { + return ''; // null selector. + } + for (let wifiChannel of this.state.wifiChannels) + { + if (wifiChannel.channelId === this.state.channel) + { + return this.state.channel; // yes, it's a valid selection. + } + } + return ''; // null selector value. + } render() { let props = this.props; @@ -522,34 +558,35 @@ const WifiConfigDialog = withStyles(styles, { withTheme: true })( ? { display: "flex", flexFlow: "row nowrap", gap: 24, alignItems: "start" } : { display: "block" } }> -
+ { if (value) { this.handleCountryChanged({ countryCode: value.id }) } }} + onChange={(event, value) => { if (value) { this.handleCountryChanged(value.id as string ) } }} options={this.getCountryCodeOptions()} renderInput={(params) => ()} disabled={!enabled} /> -
-
- - Channel - - + {this.state.countryCodeErrorMessage} + + + Channel + + {this.state.channelErrorMessage} -
+
From 301cd6a60a3c4d334a1f5cbf1f6561987cb000ef Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 14 Nov 2024 21:05:11 -0500 Subject: [PATCH 05/17] Don't show Hotspot config on devices without wifi. --- react/public/var/config.json | 3 +- react/src/PiPedalModel.tsx | 3 +- react/src/SettingsDialog.tsx | 116 ++++++++++++++++++++--------------- src/HotspotManager.cpp | 31 ++++++++++ src/HotspotManager.hpp | 2 + src/WebServerConfig.cpp | 2 + todo.txt | 23 +------ 7 files changed, 106 insertions(+), 74 deletions(-) diff --git a/react/public/var/config.json b/react/public/var/config.json index 5711fff..ff7662c 100644 --- a/react/public/var/config.json +++ b/react/public/var/config.json @@ -5,5 +5,6 @@ "max_upload_size": 536870912, "fakeAndroid": false, "ui_plugins": [], - "enable_auto_update": true + "enable_auto_update": true, + "has_wifi_device": false } \ No newline at end of file diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index 5b188c8..cb37bb8 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -394,7 +394,7 @@ export class PiPedalModel //implements PiPedalModel webSocket?: PiPedalSocket; - + hasWifiDevice: ObservableProperty = new ObservableProperty(false); onSnapshotModified: ObservableEvent = new ObservableEvent(); ui_plugins: ObservableProperty @@ -1036,6 +1036,7 @@ export class PiPedalModel //implements PiPedalModel ) .then(data => { this.enableAutoUpdate = !!data.enable_auto_update; + this.hasWifiDevice.set(!!data.has_wifi_device); if (data.max_upload_size) { this.maxPresetUploadSize = data.max_upload_size; } diff --git a/react/src/SettingsDialog.tsx b/react/src/SettingsDialog.tsx index 0009618..fce513f 100644 --- a/react/src/SettingsDialog.tsx +++ b/react/src/SettingsDialog.tsx @@ -92,6 +92,8 @@ interface SettingsDialogState { showRestartOkDialog: boolean; showShutdownOkDialog: boolean; showSystemMidiBindingsDialog: boolean; + + hasWifiDevice: boolean; }; @@ -199,10 +201,8 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( showShutdownOkDialog: false, showRestartOkDialog: false, showSystemMidiBindingsDialog: false, - isAndroidHosted: this.model.isAndroidHosted() - - - + isAndroidHosted: this.model.isAndroidHosted(), + hasWifiDevice: this.model.hasWifiDevice.get() }; this.handleJackConfigurationChanged = this.handleJackConfigurationChanged.bind(this); this.handleJackSettingsChanged = this.handleJackSettingsChanged.bind(this); @@ -213,7 +213,6 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( this.handleConnectionStateChanged = this.handleConnectionStateChanged.bind(this); this.handleShowStatusMonitorChanged = this.handleShowStatusMonitorChanged.bind(this); - } @@ -542,7 +541,7 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( { this.props.onClose() }} TransitionComponent={Transition} style={{ userSelect: "none" }} - onEnterKey={()=>{}} + onEnterKey={() => { }} >
@@ -651,7 +650,7 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( - this.handleInputSelection()} + this.handleInputSelection()} disabled={!isConfigValid || this.state.jackConfiguration.outputAudioPorts.length <= 1} style={{ opacity: !isConfigValid ? 0.6 : 1.0 }} @@ -662,7 +661,7 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( {this.state.jackSettings.getAudioInputDisplayValue(this.state.jackConfiguration)}
- this.handleOutputSelection()} + this.handleOutputSelection()} disabled={!isConfigValid || this.state.jackConfiguration.outputAudioPorts.length <= 1} style={{ opacity: !isConfigValid ? 0.6 : 1.0 }} > @@ -766,43 +765,52 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( ) } - -
- CONNECTION + {(this.state.hasWifiDevice || this.state.isAndroidHosted) && + ( +
+ +
+ CONNECTION - this.handleShowWifiConfigDialog()} > - -
- - Wi-Fi auto-hotspot - - {this.state.wifiConfigSettings.getSummaryText()} - + {this.state.hasWifiDevice && ( + this.handleShowWifiConfigDialog()} > + +
+ + Wi-Fi auto-hotspot + + {this.state.wifiConfigSettings.getSummaryText()} + + +
+
+ + )} + + { + this.state.isAndroidHosted && + ( + this.model.chooseNewDevice()} > + +
+ + Connect to a different device + + + + +
+
+ ) + } + +
- - - { - this.state.isAndroidHosted && - ( - this.model.chooseNewDevice()} > - -
- - Connect to a different device - - - - -
-
- ) - } - -
+ )} {(!this.props.onboarding) ? (
@@ -942,10 +950,15 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( ) } - this.setState({ showWifiDirectConfigDialog: false })} - onOk={(wifiDirectConfigSettings: WifiDirectConfigSettings) => this.handleApplyWifiDirectConfig(wifiDirectConfigSettings)} - /> + { + this.state.showWifiDirectConfigDialog && ( + this.setState({ showWifiDirectConfigDialog: false })} + onOk={(wifiDirectConfigSettings: WifiDirectConfigSettings) => this.handleApplyWifiDirectConfig(wifiDirectConfigSettings)} + /> + + ) + } { this.setState({ showRestartOkDialog: false }); this.handleRestartOk(); }} @@ -956,10 +969,13 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( onOk={() => { this.setState({ showShutdownOkDialog: false }); this.handleShutdownOk(); }} onClose={() => { this.setState({ showShutdownOkDialog: false }); }} /> - { this.setState({ showSystemMidiBindingsDialog: false }); }} - /> + {this.state.showSystemMidiBindingsDialog && ( + { this.setState({ showSystemMidiBindingsDialog: false }); }} + /> + + )} {this.state.showWindowScaleDialog && ( this.setState({ showWindowScaleDialog: false }))} diff --git a/src/HotspotManager.cpp b/src/HotspotManager.cpp index 8d9de21..9bb8134 100644 --- a/src/HotspotManager.cpp +++ b/src/HotspotManager.cpp @@ -33,6 +33,7 @@ using namespace pipedal; using namespace dbus::networkmanager; +namespace fs = std::filesystem; namespace pipedal::impl { @@ -1032,3 +1033,33 @@ std::vector HotspotManagerImpl::GetKnownWifiNetworks() std::lock_guard lock(knownWifiNetworksMutex); // pushed off the service thread. return this->knownWifiNetworks; } + + +static bool is_wireless_sysfs(const std::string& ifname) { + return fs::exists("/sys/class/net/" + ifname + "/wireless"); +} + +static std::vector get_wireless_interfaces_sysfs() { + std::vector wireless_interfaces; + const std::string net_path = "/sys/class/net"; + + try { + for (const auto& entry : fs::directory_iterator(net_path)) { + std::string ifname = entry.path().filename(); + if (is_wireless_sysfs(ifname)) { + wireless_interfaces.push_back(ifname); + } + } + } catch (const fs::filesystem_error& e) { + std::cerr << "Error accessing " << net_path << ": " << e.what() << std::endl; + } + + return wireless_interfaces; +} + +bool HotspotManager::HasWifiDevice() +{ + // use procfs to decide this, as NetworkManager may not be available yet. + + return !(get_wireless_interfaces_sysfs().empty()); +} diff --git a/src/HotspotManager.hpp b/src/HotspotManager.hpp index cd4958e..1e66f01 100644 --- a/src/HotspotManager.hpp +++ b/src/HotspotManager.hpp @@ -38,6 +38,8 @@ namespace pipedal { using ptr = std::unique_ptr; + static bool HasWifiDevice(); + static ptr Create(); virtual ~HotspotManager() noexcept { } diff --git a/src/WebServerConfig.cpp b/src/WebServerConfig.cpp index 4097268..59c8337 100644 --- a/src/WebServerConfig.cpp +++ b/src/WebServerConfig.cpp @@ -33,6 +33,7 @@ #include "TemporaryFile.hpp" #include "PresetBundle.hpp" #include "json.hpp" +#include "HotspotManager.hpp" #define OLD_PRESET_EXTENSION ".piPreset" #define PRESET_EXTENSION ".piPreset" @@ -701,6 +702,7 @@ public: << ", \"socket_server_address\": \"" << webSocketAddress << "\", \"ui_plugins\": [ ], \"max_upload_size\": " << maxUploadSize << ", \"enable_auto_update\": " << (ENABLE_AUTO_UPDATE ? " true" : "false") + << ", \"has_wifi_device\": " << (HotspotManager::HasWifiDevice() ? " true": "false") << " }"; return s.str(); diff --git a/todo.txt b/todo.txt index ffdaf18..3d52fb7 100644 --- a/todo.txt +++ b/todo.txt @@ -1,28 +1,7 @@ -Loading shields need to be of Modal type. - -MOD fileTypes - - - audioloop: Audio Loops, meant to be used for looper-style plugins - - audiorecording: Audio Recordings, triggered by plugins and stored in the unit - - audiosample: One-shot Audio Samples, meant to be used for sampler-style plugins - - audiotrack: Audio Tracks, meant to be used as full-performance/song or backtrack - - cabsim: Speaker Cabinets, meant as small IR audio files - - h2drumkit: Hydrogen Drumkits, must use h2drumkit file extension - - ir: Impulse Responses - - midiclip: MIDI Clips, to be used in sync with host tempo, must have mid or midi file extension - - midisong: MIDI Songs, meant to be used as full-performance/song or backtrack - - sf2: SF2 Instruments, must have sf2 or sf3 file extension - - sfz: SFZ Instruments, must have sfz file extension +Not all country codes are valid (e.g. Antarctica) -Main menu on Pixel 5 client. -x1 bank menu (landscape pixel 5) should show current bank. - -Restart discover on network change? - - --verify clean removal of dhcpcd and nm_p2p2d X Review docs changes once we go live. From 20cb63ad09894aa43af69dae4831703cab76d8e6 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 15 Nov 2024 13:57:57 -0500 Subject: [PATCH 06/17] Ahavi service recovery after a name collision --- src/AvahiService.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AvahiService.cpp b/src/AvahiService.cpp index b56d432..ca7c6fd 100644 --- a/src/AvahiService.cpp +++ b/src/AvahiService.cpp @@ -301,6 +301,7 @@ collision: n = avahi_alternative_service_name(avahiNameString); avahi_free(avahiNameString); avahiNameString = n; + serviceName = avahiNameString; Lv2Log::warning(SS("Service name collision, renaming service to '" << avahiNameString << "'")); avahi_entry_group_reset(group); create_group(c); From 4c0cd2acb827108fb9abc4a5715a6dc61820636c Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 15 Nov 2024 14:00:44 -0500 Subject: [PATCH 07/17] SEGV when plugin not created. --- src/PiPedalModel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index 5c95a4e..010930b 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -351,6 +351,9 @@ void PiPedalModel::RemoveNotificationSubsription(std::shared_ptrGetEffect(pedalItemId); + if (!effect) { + return; + } if (effect->IsVst3()) { int index = lv2Pedalboard->GetControlIndex(pedalItemId, symbol); From ca87658f901663d7302b650840fa9ddfc5eb7674 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 15 Nov 2024 14:01:13 -0500 Subject: [PATCH 08/17] Deb package dependencies --- debian/control | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/debian/control b/debian/control index 20ceffd..d8385fd 100644 --- a/debian/control +++ b/debian/control @@ -1,12 +1,10 @@ -Architecture: arm64 -Depends: libstdc++6 (>= 9), libasound2 (>= 1.0.17), libc6 (>= 2.34), libgcc-s1 (>= 4.0), libjack-jackd2-0 (>= 1.9.10+20150825) | libjack-0.125, liblilv-0-0 (>= 0.22.0~dfsg0), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libstdc++6 (>= 11), libsystemd0, dnsmasq(>= 2.85),lv2-dev(>=1.14) +Depends: dnsmasq(>= 2.85),lv2-dev(>=1.14), iw Description: IoT guitar effect for Raspberry Pi IoT guitar effect pedal for Raspberry Pi, with phone-friendly web interface. Homepage: https://github.com/rerdavies/pipedal Maintainer: Robin E. R. Davies Source: pipedal Package: pipedal -Pre-Depends: hostapd;authbind;dnsmasq Priority: optional Section: sound Version: 1.2.32 From 0dfe7b80807e5316060c87d38e1fe7a5f07c084c Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Wed, 20 Nov 2024 14:50:05 -0500 Subject: [PATCH 09/17] Use DBUS to detect presence of Wi-Fi devices. --- react/src/PiPedalModel.tsx | 402 +++++++++++++---------------------- react/src/SettingsDialog.tsx | 9 +- src/HotspotManager.cpp | 66 +++++- src/HotspotManager.hpp | 5 + src/PiPedalModel.cpp | 126 ++++++----- src/PiPedalModel.hpp | 7 + src/PiPedalSocket.cpp | 11 + todo.txt | 3 + 8 files changed, 316 insertions(+), 313 deletions(-) diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index cb37bb8..17facf1 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -56,6 +56,18 @@ export enum State { HotspotChanging, }; +function getErrorMessage(error: any) +{ + if (error instanceof Error) + { + return (error as Error).message; + } + if (!error) + { + return ""; + } + return error.toString(); +} class UpdatedError extends Error { }; export function wantsReloadingScreen(state: State) { @@ -742,6 +754,10 @@ export class PiPedalModel //implements PiPedalModel } else if (message === "onNetworkChanging") { this.onNetworkChanging(body as boolean); } + else if (message === "onHasWifiChanged") { + let hasWifi = body as boolean; + this.hasWifiDevice.set(hasWifi); + } } @@ -912,7 +928,7 @@ export class PiPedalModel //implements PiPedalModel } } } - onSocketReconnected() { + async onSocketReconnected(): Promise { this.cancelOnNetworkChanging(); this.cancelAndroidReconnectTimer(); @@ -920,97 +936,20 @@ export class PiPedalModel //implements PiPedalModel this.androidHost?.setDisconnected(false); } - this.expectDisconnect(ReconnectReason.Disconnected); // the next expected disconnect will be an actual disconnect. if (this.visibilityState.get() === VisibilityState.Hidden) return; - + // reload state, but not configuration. - this.getWebSocket().request("hello") - .then(clientId => { - this.clientId = clientId; - return this.getUpdateStatus(); // detects whether server has been upgraded. - }) - .then((updateStatus) => { + this.clientId = await this.getWebSocket().request("hello"); - return this.getWebSocket().request("plugins"); - }) - .then(data => { - this.ui_plugins.set(UiPlugin.deserialize_array(data)); - return this.getWebSocket().request("currentPedalboard"); - }) - .then(data => { - this.setModelPedalboard(new Pedalboard().deserialize(data)); + let newServerVersion = this.serverVersion = await this.getWebSocket().request("version"); + if (newServerVersion.serverVersion !== this.serverVersion.serverVersion) + { + this.reloadPage(); + return; + } - return this.getWebSocket().request("getShowStatusMonitor"); - }) - .then(data => { - this.showStatusMonitor.set(data); - - return this.getWebSocket().request("getWifiConfigSettings"); - }) - .then(data => { - this.wifiConfigSettings.set(new WifiConfigSettings().deserialize(data)); - - - return this.getWebSocket().request("getWifiDirectConfigSettings"); - }) - .then(data => { - this.wifiDirectConfigSettings.set(new WifiDirectConfigSettings().deserialize(data)); - - - return this.getWebSocket().request("getGovernorSettings"); - }) - .then(data => { - this.governorSettings.set(new GovernorSettings().deserialize(data)); - - - return this.getWebSocket().request("getJackServerSettings"); - }) - .then(data => { - this.jackServerSettings.set(new JackServerSettings().deserialize(data)); - - return this.getWebSocket().request("getPresets"); - }) - .then((data) => { - this.presets.set(new PresetIndex().deserialize(data)); - - return this.getWebSocket().request("getJackConfiguration"); - }) - .then((data) => { - // data.isValid = false; - // data.errorState = "Jack Audio server not running." - - this.jackConfiguration.set(new JackConfiguration().deserialize(data)); - - return this.getWebSocket().request("getJackSettings"); - }) - .then((data) => { - this.jackSettings.set(new JackChannelSelection().deserialize(data)); - - return this.getWebSocket().request("getBankIndex"); - }) - .then((data) => { - this.banks.set(new BankIndex().deserialize(data)); - - return this.getWebSocket().request("getFavorites"); - }) - .then((data) => { - this.favorites.set(data); - - return this.getWebSocket().request("getSystemMidiBindings"); - }) - .then((data) => { - let bindings = MidiBinding.deserialize_array(data); - this.systemMidiBindings.set(bindings); - - this.setState(State.Ready); - }) - .catch((what) => { - if (what instanceof UpdatedError) { - // do nothing. a page reload is imminent and unavoidable as soon as we return to the dispatcher. - } else { - this.onError(what.toString()); - } - }) + // anything could have changed while we were disconnected. + await this.loadServerState(); } makeSocketServerUrl(hostName: string, port: number): string { return "ws://" + hostName + ":" + port + "/pipedal"; @@ -1026,179 +965,142 @@ export class PiPedalModel //implements PiPedalModel debug: boolean = false; enableAutoUpdate: boolean = false; - requestConfig(): Promise { - const myRequest = new Request(this.varRequest('config.json')); - return fetch(myRequest) - .then( - (response) => { - return response.json(); - } - ) - .then(data => { - this.enableAutoUpdate = !!data.enable_auto_update; - this.hasWifiDevice.set(!!data.has_wifi_device); - if (data.max_upload_size) { - this.maxPresetUploadSize = data.max_upload_size; - } - if (data.fakeAndroid) { - this.androidHost = new FakeAndroidHost(); - } - this.debug = !!data.debug; - let { socket_server_port, socket_server_address, max_upload_size } = data; - if ((!socket_server_address) || socket_server_address === "*") { - socket_server_address = window.location.hostname; - } - if (!socket_server_port) socket_server_port = 8080; - let socket_server = this.makeSocketServerUrl(socket_server_address, socket_server_port); - let var_server_url = this.makeVarServerUrl("http", socket_server_address, socket_server_port); + + async requestConfig(): Promise { + + try { + const myRequest = new Request(this.varRequest('config.json')); + let response: Response = await fetch(myRequest); + let data = await response.json(); + + this.enableAutoUpdate = !!data.enable_auto_update; + this.hasWifiDevice.set(!!data.has_wifi_device); + if (data.max_upload_size) { + this.maxPresetUploadSize = data.max_upload_size; + } + if (data.fakeAndroid) { + this.androidHost = new FakeAndroidHost(); + } + this.debug = !!data.debug; + let { socket_server_port, socket_server_address, max_upload_size } = data; + if ((!socket_server_address) || socket_server_address === "*") { + socket_server_address = window.location.hostname; + } + if (!socket_server_port) socket_server_port = 8080; + let socket_server = this.makeSocketServerUrl(socket_server_address, socket_server_port); + let var_server_url = this.makeVarServerUrl("http", socket_server_address, socket_server_port); + + this.socketServerUrl = socket_server; + this.varServerUrl = var_server_url; + this.maxFileUploadSize = parseInt(max_upload_size); + } catch (error: any) + { + this.setError("Can't connect to server. " + getErrorMessage(error)); + return false; + } + + this.webSocket = new PiPedalSocket( + this.socketServerUrl, + { + onMessageReceived: this.onSocketMessage, + onError: this.onSocketError, + onConnectionLost: this.onSocketConnectionLost, + onReconnect: this.onSocketReconnected, + onReconnecting: this.onSocketReconnecting + } + ); + + try { + await this.webSocket.connect(); + } catch (error) { + this.setError("Failed to connect to server. (" + getErrorMessage(error)); + return false; + + } + try { + let isoFetch = await fetch(new Request('iso_codes.json')); + this.countryCodes = (await isoFetch.json()) as { [Name: string]: string }; - this.socketServerUrl = socket_server; - this.varServerUrl = var_server_url; - this.maxFileUploadSize = parseInt(max_upload_size); - this.webSocket = new PiPedalSocket( - this.socketServerUrl, - { - onMessageReceived: this.onSocketMessage, - onError: this.onSocketError, - onConnectionLost: this.onSocketConnectionLost, - onReconnect: this.onSocketReconnected, - onReconnecting: this.onSocketReconnecting - } - ); - return this.webSocket.connect(); - }) - .catch((error) => { - this.setError("Failed to connect to server. (" + this.socketServerUrl + ")"); - return false; - }) - .then(() => { - return this.getUpdateStatus(); - }) - .then((updateStatus) => { - const isoRequest = new Request('iso_codes.json'); - return fetch(isoRequest); - }) - .then((response) => { - return response.json(); - }) - .then((countryCodes) => { - this.countryCodes = countryCodes as { [Name: string]: string }; + this.clientId = (await this.getWebSocket().request("hello")) as number; - return this.getWebSocket().request("hello"); - }) - .then((clientId) => { - this.clientId = clientId; + this.preloadImages( (await this.getWebSocket().request("imageList"))); + } catch (error) { + this.setError("Failed to establish connection. " + getErrorMessage(error)); + return false; + } + return await this.loadServerState(); + } + async loadServerState() : Promise + { + try + { + this.serverVersion = await this.getWebSocket().request("version"); - return this.getWebSocket().request("imageList"); - }) - .then((data) => { - this.preloadImages(data); - return true; - }) - .catch((error) => { - this.setError("Failed to connect to server. " + error.toString()); - return false; - }) - .then((succeeded) => { - if (!succeeded) return false; - return this.getWebSocket().request("version").then(data => { - this.serverVersion = data; - return this.getWebSocket().request("plugins"); - }) - .then(data => { - this.ui_plugins.set(UiPlugin.deserialize_array(data)); + this.updateStatus.set(new UpdateStatus().deserialize(await this.getUpdateStatus())); - return this.getWebSocket().request("currentPedalboard"); - }) - .then(data => { - this.setModelPedalboard(new Pedalboard().deserialize(data)); + this.hasWifiDevice.set(await this.getWebSocket().request("getHasWifi")); + + this.ui_plugins.set( + UiPlugin.deserialize_array(await this.getWebSocket().request("plugins")) + ); + this.setModelPedalboard( + new Pedalboard().deserialize( + await this.getWebSocket().request("currentPedalboard") + ) + ); + this.plugin_classes.set(new PluginClass().deserialize( + await this.getWebSocket().request("pluginClasses") + )); + this.validatePluginClasses(this.plugin_classes.get()); - return this.getWebSocket().request("pluginClasses"); - }) - .then((data) => { + this.presets.set( + new PresetIndex().deserialize( + await this.getWebSocket().request("getPresets") + ) + ); + this.wifiConfigSettings.set( + new WifiConfigSettings().deserialize( + await this.getWebSocket().request("getWifiConfigSettings") + )); + this.wifiDirectConfigSettings.set( + new WifiDirectConfigSettings().deserialize( + await this.getWebSocket().request("getWifiDirectConfigSettings") + )); + this.governorSettings.set(new GovernorSettings().deserialize( + await this.getWebSocket().request("getGovernorSettings") + )); + this.showStatusMonitor.set( + await this.getWebSocket().request("getShowStatusMonitor") + ); + this.jackServerSettings.set( + new JackServerSettings().deserialize( + await this.getWebSocket().request("getJackServerSettings") + ) + ); + this.jackConfiguration.set(new JackConfiguration().deserialize( + await this.getWebSocket().request("getJackConfiguration") + )); + this.jackSettings.set(new JackChannelSelection().deserialize( + await this.getWebSocket().request("getJackSettings") + )); + this.banks.set(new BankIndex().deserialize(await this.getWebSocket().request("getBankIndex"))); - this.plugin_classes.set(new PluginClass().deserialize(data)); - this.validatePluginClasses(this.plugin_classes.get()); + this.favorites.set(await this.getWebSocket().request("getFavorites")); - return this.getWebSocket().request("getPresets"); - }) - .then((data) => { - this.presets.set(new PresetIndex().deserialize(data)); + this.systemMidiBindings.set(MidiBinding.deserialize_array(await this.getWebSocket().request("getSystemMidiBindings"))); - return this.getWebSocket().request("getWifiConfigSettings"); - }) - .then(data => { - this.wifiConfigSettings.set(new WifiConfigSettings().deserialize(data)); + // load at lest once before we allow a reconnect. + this.getWebSocket().canReconnect = true; - return this.getWebSocket().request("getWifiDirectConfigSettings"); - }) - .then(data => { - this.wifiDirectConfigSettings.set(new WifiDirectConfigSettings().deserialize(data)); - - return this.getWebSocket().request("getGovernorSettings"); - }) - .then(data => { - this.governorSettings.set(new GovernorSettings().deserialize(data)); - - return this.getWebSocket().request("getShowStatusMonitor"); - }) - .then(data => { - this.showStatusMonitor.set(data); - - return this.getWebSocket().request("getJackServerSettings"); - }) - .then(data => { - this.jackServerSettings.set(new JackServerSettings().deserialize(data)); - - return this.getWebSocket().request("getJackConfiguration"); - }) - .then((data) => { - // data.isValid = false; - // data.errorState = "Jack Audio server not running." - - this.jackConfiguration.set(new JackConfiguration().deserialize(data)); - - return this.getWebSocket().request("getJackSettings"); - }) - .then((data) => { - this.jackSettings.set(new JackChannelSelection().deserialize(data)); - - return this.getWebSocket().request("getBankIndex"); - }) - .then((data) => { - this.banks.set(new BankIndex().deserialize(data)); - if (this.webSocket) { - // MUST not allow reconnect until at least one complete load has finished. - this.webSocket.canReconnect = true; - } - - return this.getWebSocket().request("getFavorites"); - }) - .then((data) => { - this.favorites.set(data); - - return this.getWebSocket().request("getSystemMidiBindings"); - }) - .then((data) => { - let bindings = MidiBinding.deserialize_array(data); - this.systemMidiBindings.set(bindings); - - if (this.webSocket) { - // MUST not allow reconnect until at least one complete load has finished. - this.webSocket.canReconnect = true; - } - this.setState(State.Ready); - return true; - }) - .catch((error) => { - this.setError("Failed to fetch server state.\n\n" + error.toString()); - return false; - }); - - }) - ; + this.setState(State.Ready); + return true; + } + catch(error) { + this.setError("Failed to fetch server state.\n\n" + getErrorMessage(error)); + return false; + } } diff --git a/react/src/SettingsDialog.tsx b/react/src/SettingsDialog.tsx index fce513f..a08b7b5 100644 --- a/react/src/SettingsDialog.tsx +++ b/react/src/SettingsDialog.tsx @@ -212,9 +212,13 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( this.handleGovernorSettingsChanged = this.handleGovernorSettingsChanged.bind(this); this.handleConnectionStateChanged = this.handleConnectionStateChanged.bind(this); this.handleShowStatusMonitorChanged = this.handleShowStatusMonitorChanged.bind(this); + this.handleHasWifiChanged = this.handleHasWifiChanged.bind(this); } + handleHasWifiChanged(newValue: boolean) { + this.setState({hasWifiDevice: newValue}); + } handleShowStatusMonitorChanged(): void { this.setState({ showStatusMonitor: this.model.showStatusMonitor.get() }); @@ -322,6 +326,7 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( if (active !== this.active) { this.active = active; if (active) { + this.model.hasWifiDevice.addOnChangedHandler(this.handleHasWifiChanged); this.model.state.addOnChangedHandler(this.handleConnectionStateChanged); this.model.showStatusMonitor.addOnChangedHandler(this.handleShowStatusMonitorChanged); this.model.jackSettings.addOnChangedHandler(this.handleJackSettingsChanged); @@ -350,6 +355,8 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( this.handleJackServerSettingsChanged(); this.handleWifiConfigSettingsChanged(); this.handleWifiDirectConfigSettingsChanged(); + this.setState({hasWifiDevice: this.model.hasWifiDevice.get()}); + this.timerHandle = setInterval(() => this.tick(), 1000); } else { if (this.timerHandle) { @@ -364,7 +371,7 @@ const SettingsDialog = withStyles(styles, { withTheme: true })( this.model.wifiConfigSettings.removeOnChangedHandler(this.handleWifiConfigSettingsChanged); this.model.wifiDirectConfigSettings.removeOnChangedHandler(this.handleWifiDirectConfigSettingsChanged); this.model.governorSettings.removeOnChangedHandler(this.handleGovernorSettingsChanged); - + this.model.hasWifiDevice.removeOnChangedHandler(this.handleHasWifiChanged); } } diff --git a/src/HotspotManager.cpp b/src/HotspotManager.cpp index 9bb8134..a6ba8db 100644 --- a/src/HotspotManager.cpp +++ b/src/HotspotManager.cpp @@ -60,6 +60,7 @@ namespace pipedal::impl virtual bool CancelPost(PostHandle handle) override; virtual void SetNetworkChangingListener(NetworkChangingListener &&listener) override; + virtual void SetHasWifiListener(HasWifiListener &&listener) override; private: enum class State @@ -75,6 +76,11 @@ namespace pipedal::impl void SetState(State state); State state = State::Initial; + bool hasWifi = false; + HasWifiListener hasWifiListener; + void SetHasWifi(bool hasWifi); + virtual bool GetHasWifi() override ; + void onClose(); void onError(const std::string &message); void onInitialize(); @@ -224,6 +230,7 @@ void HotspotManagerImpl::onInitialize() } void HotspotManagerImpl::onDisconnect() { + SetHasWifi(false); if (state != State::Initial && state != State::WaitingForNetworkManager) { WaitForNetworkManager(); @@ -242,6 +249,8 @@ void HotspotManagerImpl::UpdateNetworkManagerStatus() auto ethernetDevice = GetDevice(NM_DEVICE_TYPE_ETHERNET); auto wlanDevice = GetDevice(NM_DEVICE_TYPE_WIFI); + SetHasWifi(!!wlanDevice); + if (ethernetDevice && wlanDevice) { if (state == State::Initial || state == State::WaitingForNetworkManager) @@ -291,6 +300,7 @@ void HotspotManagerImpl::ReleaseNetworkManager() this->onDeviceRemovedHandle = INVALID_DBUS_EVENT_HANDLE; this->onDeviceAddedHandle = INVALID_DBUS_EVENT_HANDLE; + SetHasWifi(false); } void HotspotManagerImpl::onDevicesChanged() @@ -401,6 +411,8 @@ void HotspotManagerImpl::onStartMonitoring() OnEthernetStateChanged(ethernetDevice->State()); OnWlanStateChanged(wlanDevice->State()); + SetHasWifi(true); + StartScanTimer(); onAccessPointChanged(); } @@ -863,11 +875,11 @@ void HotspotManagerImpl::StartHotspot() settings["ipv4"]["method"] = "shared"; settings["ipv6"]["method"] = "shared"; settings["ipv6"]["addr-gen-mode"] = 1; // "stable-privacy"; - - //////////////////////////////////////////////////////////////// - // Create connection - settings["ipv4"]["method"] = sdbus::Variant(std::string("shared")); + //////////////////////////////////////////////////////////////// + + // Create connection + settings["ipv4"]["method"] = sdbus::Variant(std::string("shared")); // settings["ipv6"]["method"] = sdbus::Variant(std::string("ignore")); settings["ipv4"]["address-data"] = sdbus::Variant(std::vector>{{{"address", sdbus::Variant("192.168.60.1")}, @@ -1014,6 +1026,32 @@ bool HotspotManagerImpl::CancelPost(PostHandle handle) return dbusDispatcher.CancelPost(handle); } +void HotspotManagerImpl::SetHasWifiListener(HasWifiListener &&listener) +{ + std::lock_guard lock{this->networkChangingListenerMutex}; + this->hasWifiListener = listener; + if (!this->closed && this->hasWifiListener) + { + this->hasWifiListener(this->hasWifi); + } +} +bool HotspotManagerImpl::GetHasWifi() { + std::lock_guard lock{this->networkChangingListenerMutex}; + return hasWifi; +} +void HotspotManagerImpl::SetHasWifi(bool hasWifi) +{ + std::lock_guard lock{this->networkChangingListenerMutex}; + if (hasWifi != this->hasWifi) + { + this->hasWifi = hasWifi; + if (this->hasWifiListener) + { + this->hasWifiListener(this->hasWifi); + } + } +} + void HotspotManagerImpl::SetNetworkChangingListener(NetworkChangingListener &&listener) { std::lock_guard lock{this->networkChangingListenerMutex}; @@ -1034,23 +1072,29 @@ std::vector HotspotManagerImpl::GetKnownWifiNetworks() return this->knownWifiNetworks; } - -static bool is_wireless_sysfs(const std::string& ifname) { +static bool is_wireless_sysfs(const std::string &ifname) +{ return fs::exists("/sys/class/net/" + ifname + "/wireless"); } -static std::vector get_wireless_interfaces_sysfs() { +static std::vector get_wireless_interfaces_sysfs() +{ std::vector wireless_interfaces; const std::string net_path = "/sys/class/net"; - try { - for (const auto& entry : fs::directory_iterator(net_path)) { + try + { + for (const auto &entry : fs::directory_iterator(net_path)) + { std::string ifname = entry.path().filename(); - if (is_wireless_sysfs(ifname)) { + if (is_wireless_sysfs(ifname)) + { wireless_interfaces.push_back(ifname); } } - } catch (const fs::filesystem_error& e) { + } + catch (const fs::filesystem_error &e) + { std::cerr << "Error accessing " << net_path << ": " << e.what() << std::endl; } diff --git a/src/HotspotManager.hpp b/src/HotspotManager.hpp index 1e66f01..7c0d1e3 100644 --- a/src/HotspotManager.hpp +++ b/src/HotspotManager.hpp @@ -55,6 +55,11 @@ namespace pipedal { virtual void SetNetworkChangingListener(NetworkChangingListener &&listener) = 0; + using HasWifiListener = std::function; + virtual void SetHasWifiListener(HasWifiListener &&listener) = 0; + virtual bool GetHasWifi() = 0; + + using PostHandle = uint64_t; using PostCallback = std::function; diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index 010930b..2c307ca 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -99,29 +99,33 @@ PiPedalModel::PiPedalModel() { OnNetworkChanging(ethernetConnected, hotspotEnabling); }); + hotspotManager->SetHasWifiListener( + [this](bool hasWifi) + { + this->SetHasWifi(hasWifi); + }); // don't actuall start the hotspotManager until after LV2 is initialized (in order to avoid logging oddities) } -void PrepareSnapshostsForSave(Pedalboard&pedalboard) +void PrepareSnapshostsForSave(Pedalboard &pedalboard) { - if (pedalboard.selectedSnapshot() != -1) { - auto¤tSnapshot = pedalboard.snapshots()[pedalboard.selectedSnapshot()]; - if (!currentSnapshot || currentSnapshot->isModified_) + if (pedalboard.selectedSnapshot() != -1) + { + auto ¤tSnapshot = pedalboard.snapshots()[pedalboard.selectedSnapshot()]; + if (!currentSnapshot || currentSnapshot->isModified_) { pedalboard.selectedSnapshot(-1); - } } - for (auto &snapshot: pedalboard.snapshots()) + for (auto &snapshot : pedalboard.snapshots()) { - if (snapshot) { + if (snapshot) + { snapshot->isModified_ = false; } } } - - void PiPedalModel::Close() { std::unique_ptr oldAudioHost; @@ -139,8 +143,8 @@ void PiPedalModel::Close() } // take a snapshot incase a client unsusbscribes in the notification handler (in which case the mutex won't protect us) - std::vector t {subscribers.begin(),subscribers.end()}; - for (auto&subscriber: t) + std::vector t{subscribers.begin(), subscribers.end()}; + for (auto &subscriber : t) { subscriber->Close(); } @@ -351,7 +355,8 @@ void PiPedalModel::RemoveNotificationSubsription(std::shared_ptrGetEffect(pedalItemId); - if (!effect) { + if (!effect) + { return; } if (effect->IsVst3()) @@ -384,7 +389,8 @@ void PiPedalModel::OnNotifyMaybeLv2StateChanged(uint64_t instanceId) PedalboardItem *item = pedalboard.GetItem(instanceId); if (item != nullptr) { - if (!audioHost) { + if (!audioHost) + { return; } bool changed = this->audioHost->UpdatePluginState(*item); @@ -395,7 +401,7 @@ void PiPedalModel::OnNotifyMaybeLv2StateChanged(uint64_t instanceId) Lv2PluginState newState = item->lv2State(); - FireLv2StateChanged(instanceId,newState); + FireLv2StateChanged(instanceId, newState); } } } @@ -481,7 +487,6 @@ void PiPedalModel::FireJackConfigurationChanged(const JackConfiguration &jackCon { // noify subscribers. - std::vector t{subscribers.begin(), subscribers.end()}; for (auto &subscriber : t) { @@ -531,15 +536,13 @@ void PiPedalModel::SetPedalboard(int64_t clientId, Pedalboard &pedalboard) } } - - void PiPedalModel::SetSnapshot(int64_t selectedSnapshot) { std::lock_guard lock(mutex); if (this->pedalboard.ApplySnapshot(selectedSnapshot, pluginHost)) { this->pedalboard.selectedSnapshot(selectedSnapshot); - for (auto snapshot: this->pedalboard.snapshots()) + for (auto snapshot : this->pedalboard.snapshots()) { if (snapshot) { @@ -554,7 +557,6 @@ void PiPedalModel::SetSnapshots(std::vector> &snapshot { std::lock_guard lock(mutex); - UpdateVst3Settings(pedalboard); this->pedalboard.snapshots(std::move(snapshots)); @@ -562,7 +564,7 @@ void PiPedalModel::SetSnapshots(std::vector> &snapshot if (selectedSnapshot != -1) { this->pedalboard.selectedSnapshot(selectedSnapshot); - for (auto &snapshot: pedalboard.snapshots()) + for (auto &snapshot : pedalboard.snapshots()) { if (snapshot) { @@ -570,12 +572,11 @@ void PiPedalModel::SetSnapshots(std::vector> &snapshot } } } - + this->FirePedalboardChanged(-1, false); // notify clients (but don't change the running pedalboard, because it's still the same) // this means that all clients get an up-to-date copy of the snapshots AND the currently selected snapshot if that applies // (and a fresh copy of the pedalboard settings as well, which is harmless, since they have not changed) - this->SetPresetChanged(-1, true,false); - + this->SetPresetChanged(-1, true, false); } void PiPedalModel::UpdateCurrentPedalboard(int64_t clientId, Pedalboard &pedalboard) @@ -638,12 +639,13 @@ void PiPedalModel::SetPresetChanged(int64_t clientId, bool value, bool changeSna { if (changeSnapshotSelect && value && this->pedalboard.selectedSnapshot() != -1) { - auto & snapshot = this->pedalboard.snapshots()[pedalboard.selectedSnapshot()]; - if (snapshot) { + auto &snapshot = this->pedalboard.snapshots()[pedalboard.selectedSnapshot()]; + if (snapshot) + { if (!snapshot->isModified_) { - snapshot->isModified_ = true; - FireSnapshotModified(pedalboard.selectedSnapshot(),true); + snapshot->isModified_ = true; + FireSnapshotModified(pedalboard.selectedSnapshot(), true); } } @@ -664,10 +666,9 @@ void PiPedalModel::FireSnapshotModified(int64_t snapshotIndex, bool modified) std::vector t{subscribers.begin(), subscribers.end()}; for (auto &subscriber : t) { - subscriber->OnSnapshotModified(snapshotIndex,modified); + subscriber->OnSnapshotModified(snapshotIndex, modified); } } - } void PiPedalModel::FireSelectedSnapshotChanged(int64_t selectedSnapshot) @@ -752,15 +753,15 @@ void PiPedalModel::UpdateVst3Settings(Pedalboard &pedalboard) #endif } -void PiPedalModel::FireLv2StateChanged(int64_t instanceId, const Lv2PluginState &lv2State) { +void PiPedalModel::FireLv2StateChanged(int64_t instanceId, const Lv2PluginState &lv2State) +{ std::lock_guard guard{mutex}; std::vector t{subscribers.begin(), subscribers.end()}; for (auto &subscriber : t) { - subscriber->OnLv2StateChanged(instanceId,lv2State); + subscriber->OnLv2StateChanged(instanceId, lv2State); } - } // referesh the plugin state for all plugins. @@ -774,13 +775,12 @@ bool PiPedalModel::SyncLv2State() { if (audioHost->UpdatePluginState(*item)) { - FireLv2StateChanged(item->instanceId(),item->lv2State()); + FireLv2StateChanged(item->instanceId(), item->lv2State()); changed = true; } } } return changed; - } void PiPedalModel::SaveCurrentPreset(int64_t clientId) { @@ -790,7 +790,6 @@ void PiPedalModel::SaveCurrentPreset(int64_t clientId) SyncLv2State(); PrepareSnapshostsForSave(pedalboard); - storage.SaveCurrentPreset(this->pedalboard); this->SetPresetChanged(clientId, false); } @@ -819,15 +818,14 @@ int64_t PiPedalModel::SavePluginPresetAs(int64_t instanceId, const std::string & return presetId; } - int64_t PiPedalModel::SaveCurrentPresetAs(int64_t clientId, const std::string &name, int64_t saveAfterInstanceId) { std::lock_guard guard{mutex}; SyncLv2State(); auto pedalboard = this->pedalboard.DeepCopy(); - PrepareSnapshostsForSave(pedalboard); - + PrepareSnapshostsForSave(pedalboard); + UpdateVst3Settings(pedalboard); pedalboard.name(name); int64_t result = storage.SaveCurrentPresetAs(pedalboard, name, saveAfterInstanceId); @@ -873,8 +871,8 @@ void PiPedalModel::NextBank(Direction direction) } size_t index = 0; for (size_t i = 0; i < bankIndex.entries().size(); ++i) - { - auto&entry = bankIndex.entries()[i]; + { + auto &entry = bankIndex.entries()[i]; if (entry.instanceId() == bankIndex.selectedBank()) { index = i; @@ -888,15 +886,19 @@ void PiPedalModel::NextBank(Direction direction) { index = 0; } - } else { + } + else + { if (index == 0) { - index = bankIndex.entries().size()-1; - } else { + index = bankIndex.entries().size() - 1; + } + else + { --index; } } - this->OpenBank(-1,bankIndex.entries()[index].instanceId()); + this->OpenBank(-1, bankIndex.entries()[index].instanceId()); } void PiPedalModel::NextPreset(Direction direction) { @@ -966,11 +968,13 @@ void PiPedalModel::OnNotifyNextMidiProgram(const RealtimeNextMidiProgramRequest } } -void PiPedalModel::OnNotifyMidiRealtimeSnapshotRequest(int32_t snapshotIndex,int64_t snapshotRequestId) +void PiPedalModel::OnNotifyMidiRealtimeSnapshotRequest(int32_t snapshotIndex, int64_t snapshotRequestId) { - try { + try + { SetSnapshot((int64_t)snapshotIndex); - } catch (const std::exception&e) + } + catch (const std::exception &e) { Lv2Log::error(SS("SetSnapshot failed. " << e.what())); } @@ -1006,7 +1010,6 @@ void PiPedalModel::OnNotifyNextMidiBank(const RealtimeNextMidiProgramRequest &re } } - void PiPedalModel::OnNotifyMidiProgramChange(RealtimeMidiProgramRequest &midiProgramRequest) { std::lock_guard guard{mutex}; @@ -2054,7 +2057,9 @@ void PiPedalModel::OnPatchSetReply(uint64_t instanceId, LV2_URID patchSetPropert if (properties.contains(propertyUri) && properties[propertyUri] == atomObject) { // do noting. - } else { + } + else + { properties[propertyUri] = std::move(atomObject); } @@ -2234,7 +2239,6 @@ std::vector PiPedalModel::GetAlsaDevices() result.push_back(MakeDummyDeviceInfo(8)); #endif return result; - } const std::filesystem::path &PiPedalModel::GetWebRoot() const @@ -2617,7 +2621,6 @@ void PiPedalModel::OnNetworkChanged(bool ethernetConnected, bool hotspotConnecte FireNetworkChanged(); } - void PiPedalModel::OnNotifyMidiRealtimeEvent(RealtimeMidiEventType eventType) { try @@ -2698,3 +2701,24 @@ void PiPedalModel::RequestShutdown(bool restart) } } } + +void PiPedalModel::SetHasWifi(bool hasWifi) +{ + std::lock_guard lock(mutex); + if (this->hasWifi != hasWifi) + { + this->hasWifi = hasWifi; + + std::vector t{subscribers.begin(), subscribers.end()}; + + for (auto &subscriber : t) + { + subscriber->OnHasWifiChanged(hasWifi); + } + } +} +bool PiPedalModel::GetHasWifi() +{ + std::lock_guard lock(mutex); + return hasWifi; +} \ No newline at end of file diff --git a/src/PiPedalModel.hpp b/src/PiPedalModel.hpp index e8963d7..14bd646 100644 --- a/src/PiPedalModel.hpp +++ b/src/PiPedalModel.hpp @@ -92,6 +92,7 @@ namespace pipedal virtual void OnErrorMessage(const std::string &message) = 0; virtual void OnLv2PluginsChanging() = 0; virtual void OnNetworkChanging(bool hotspotConnected) = 0; + virtual void OnHasWifiChanged(bool hasWifi) = 0; virtual void Close() = 0; }; @@ -107,6 +108,9 @@ namespace pipedal using NetworkChangedListener = std::function; private: + bool hasWifi = false; + + void SetHasWifi(bool hasWifi); std::unique_ptr hotspotManager; std::unique_ptr updater; @@ -257,6 +261,9 @@ namespace pipedal Increase, Decrease }; + + bool GetHasWifi(); + void NextBank(Direction direction = Direction::Increase); void PreviousBank() { NextBank(Direction::Decrease); } void NextPreset(Direction direction = Direction::Increase); diff --git a/src/PiPedalSocket.cpp b/src/PiPedalSocket.cpp index 612ee1c..6e3b028 100644 --- a/src/PiPedalSocket.cpp +++ b/src/PiPedalSocket.cpp @@ -1080,6 +1080,11 @@ public: UpdateStatus updateStatus = model.GetUpdateStatus(); this->Reply(replyTo, "getUpdateStatus", updateStatus); } + else if (message == "getHasWifi") + { + bool result = model.GetHasWifi(); + this->Reply(replyTo, "getHasWifi",result); + } else if (message == "updateNow") { std::string updateUrl; @@ -1727,6 +1732,12 @@ private: Send("onLv2PluginsChanging", true); Flush(); } + virtual void OnHasWifiChanged(bool hasWifi){ + Send("onHasWifiChanged", hasWifi); + Flush(); + + } + virtual void OnNetworkChanging(bool hotspotConnected) override { try diff --git a/todo.txt b/todo.txt index 3d52fb7..cb32218 100644 --- a/todo.txt +++ b/todo.txt @@ -1,3 +1,6 @@ + +Hotspot monitoring - fails when WiFi network is disabled. + Not all country codes are valid (e.g. Antarctica) From 0ca7545b3fbfdb7c36c131df9062d65eb345c9e0 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Wed, 20 Nov 2024 23:40:04 -0500 Subject: [PATCH 10/17] Use actual list of regulatory domains for wifi dialog. --- .vscode/launch.json | 3 +- PiPedalCommon/src/RegDb.cpp | 431 +++++++++++++++------------- PiPedalCommon/src/include/RegDb.hpp | 1 + config/iso_codes.json | 248 ++++++++++++++++ react/src/PiPedalModel.tsx | 5 +- src/PiPedalAlsaTest.cpp | 6 - src/PiPedalModel.cpp | 14 + src/PiPedalModel.hpp | 2 + src/PiPedalSocket.cpp | 5 + src/Storage.cpp | 260 +++++++++-------- src/Storage.hpp | 2 + src/WifiChannelsTest.cpp | 16 ++ 12 files changed, 661 insertions(+), 332 deletions(-) create mode 100644 config/iso_codes.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 3c12bd4..6e6cf77 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -137,7 +137,8 @@ //"[json_variants]" // subtest of your choice, or none to run all of the tests. //"[inverting_mutex_test]" // "[utf8_to_utf32]" - "[pipedal_alsa_test]" + //"[pipedal_alsa_test]" + "[wifi_channels_test]" ], "stopAtEntry": false, diff --git a/PiPedalCommon/src/RegDb.cpp b/PiPedalCommon/src/RegDb.cpp index 4bf9d81..3b08a40 100644 --- a/PiPedalCommon/src/RegDb.cpp +++ b/PiPedalCommon/src/RegDb.cpp @@ -18,6 +18,7 @@ // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "RegDb.hpp" + #include "ss.hpp" #include #include @@ -30,8 +31,12 @@ #include #include #include +#include "json_variant.hpp" +#include "json.hpp" #include +#include + #define REGDB_MAGIC 0x52474442 #define REGDB_VERSION 19 // pre-bookwork #define REGDB_VERSION_2 20 // bookworm and later. @@ -40,7 +45,7 @@ using namespace pipedal; using namespace std; static std::unique_ptr g_Instance; -RegDb&RegDb::GetInstance() +RegDb &RegDb::GetInstance() { if (!g_Instance) { @@ -49,9 +54,9 @@ RegDb&RegDb::GetInstance() return *g_Instance; } -const WifiRegulations& RegDb::getWifiRegulations(const std::string&countryIso3661) const +const WifiRegulations &RegDb::getWifiRegulations(const std::string &countryIso3661) const { - for (const auto ®ulation: this->regulations) + for (const auto ®ulation : this->regulations) { if (regulation.reg_alpha2 == countryIso3661) { @@ -61,28 +66,31 @@ const WifiRegulations& RegDb::getWifiRegulations(const std::string&countryIso366 throw std::runtime_error("Invalid country code."); } - template T NlSwap(T value) { if constexpr (std::endian::native == std::endian::big) { return value; - } else { - auto value_rep = std::bit_cast,T >(value); + } + else + { + auto value_rep = std::bit_cast, T>(value); std::ranges::reverse(value_rep); return std::bit_cast(value_rep); } } template -class BigEndian { +class BigEndian +{ public: - BigEndian(): m_value(0) { } - explicit BigEndian(T value): m_value(NlSwap(value)) {} - T value() const { return NlSwap(m_value);} - bool operator==(const BigEndian&other) const { return m_value == other.m_value; } + BigEndian() : m_value(0) {} + explicit BigEndian(T value) : m_value(NlSwap(value)) {} + T value() const { return NlSwap(m_value); } + bool operator==(const BigEndian &other) const { return m_value == other.m_value; } explicit operator bool() const { return m_value != 0; } + private: T m_value; }; @@ -141,17 +149,15 @@ struct RulesCollection19 { this->ruleCount = NlSwap(this->ruleCount); } - Rule*getRule( + Rule *getRule( uint32_t nRule, - char *pData - ) + char *pData) { uint32_t ruleOffset = NlSwap(ruleOffsets[nRule]); - return (Rule*)(pData+ruleOffset); - } + return (Rule *)(pData + ruleOffset); + } }; - struct FrequencyRange { uint32_t startFrequency; // in khz. @@ -203,7 +209,7 @@ RegDb::RegDb() { } RegDb::RegDb(const std::filesystem::path &path) -: pData(nullptr) + : pData(nullptr) { ifstream f(path); if (!f.is_open()) @@ -255,23 +261,22 @@ void RegDb::Load19() { WifiRegulations wifiRegulations; - CountryHeader countryHeader = pCountryHeader[i]; countryHeader.toNs(); - wifiRegulations.reg_alpha2 = SS(countryHeader.alpha2[0] << countryHeader.alpha2[1]); + wifiRegulations.reg_alpha2 = SS(countryHeader.alpha2[0] << countryHeader.alpha2[1]); wifiRegulations.dfs_region = (DfsRegion)(countryHeader.dfsRegion & 0x03); RulesCollection19 *pRules = (RulesCollection19 *)(pData + countryHeader.rulesOffset); uint32_t ruleCount = NlSwap(pRules->ruleCount); for (uint32_t nRule = 0; nRule < ruleCount; ++nRule) - { - Rule *pRule = pRules->getRule(nRule,pData); + { + Rule *pRule = pRules->getRule(nRule, pData); Rule rule = *pRule; rule.toNs(); FrequencyRange fr = *(FrequencyRange *)(pData + rule.frequencyRangeOffset); fr.toNs(); - + PowerRule pr = *(PowerRule *)(pData + rule.powerRuleOffset); pr.toNs(); @@ -291,7 +296,7 @@ void RegDb::Load19() //////////////////////////////////////////////////////////////////////////////// // glue -#define IEEE80211_NUM_ACS 4 // linux/ieee80211.h Number of hardware queues? +#define IEEE80211_NUM_ACS 4 // linux/ieee80211.h Number of hardware queues? #define __aligned(n) #define __packed @@ -305,16 +310,14 @@ using __be16 = BigEndian; #define BIT(n) (1 << n) template -T ALIGN(T value,int bits) +T ALIGN(T value, int bits) { intptr_t v = (intptr_t)value; - intptr_t mask = (1 << bits)-1; + intptr_t mask = (1 << bits) - 1; v = (v + mask) & (~mask); return (T)v; - } - inline BigEndian cpu_to_be32(uint32_t value) { @@ -326,196 +329,203 @@ inline BigEndian cpu_to_be16(uint16_t value) return BigEndian(value); } - -inline uint16_t be16_to_cpu(const BigEndian&value) +inline uint16_t be16_to_cpu(const BigEndian &value) { return value.value(); } -inline uint32_t be32_to_cpu(const BigEndian&value) +inline uint32_t be32_to_cpu(const BigEndian &value) { return value.value(); } bool regdb_has_valid_signature(const u8 *data, unsigned int size) { return true; } -#define offsetofend(TYPE,FIELD) ((uint32_t)(offsetof(TYPE,FIELD)+sizeof(((TYPE*)0)->FIELD))) +#define offsetofend(TYPE, FIELD) ((uint32_t)(offsetof(TYPE, FIELD) + sizeof(((TYPE *)0)->FIELD))) #define ASSERT_RTNL() // in the original, assert that rtnl is not locked. -///////////////////////// +///////////////////////// // shamelessly lifted from linux net/wireless/reg.c -struct fwdb_country { - u8 alpha2[2]; - __be16 coll_ptr; - /* this struct cannot be extended */ +struct fwdb_country +{ + u8 alpha2[2]; + __be16 coll_ptr; + /* this struct cannot be extended */ } __packed __aligned(4); -struct fwdb_collection { - u8 len; - u8 n_rules; - u8 dfs_region; - /* no optional data yet */ - /* aligned to 2, then followed by __be16 array of rule pointers */ +struct fwdb_collection +{ + u8 len; + u8 n_rules; + u8 dfs_region; + /* no optional data yet */ + /* aligned to 2, then followed by __be16 array of rule pointers */ } __packed __aligned(4); -struct fwdb_header { - __be32 magic; - __be32 version; - struct fwdb_country country[]; +struct fwdb_header +{ + __be32 magic; + __be32 version; + struct fwdb_country country[]; } __packed __aligned(4); - -enum fwdb_flags { - FWDB_FLAG_NO_OFDM = BIT(0), - FWDB_FLAG_NO_OUTDOOR = BIT(1), - FWDB_FLAG_DFS = BIT(2), - FWDB_FLAG_NO_IR = BIT(3), - FWDB_FLAG_AUTO_BW = BIT(4), +enum fwdb_flags +{ + FWDB_FLAG_NO_OFDM = BIT(0), + FWDB_FLAG_NO_OUTDOOR = BIT(1), + FWDB_FLAG_DFS = BIT(2), + FWDB_FLAG_NO_IR = BIT(3), + FWDB_FLAG_AUTO_BW = BIT(4), }; -struct fwdb_wmm_ac { - u8 ecw; - u8 aifsn; - __be16 cot; +struct fwdb_wmm_ac +{ + u8 ecw; + u8 aifsn; + __be16 cot; } __packed; -struct fwdb_wmm_rule { - struct fwdb_wmm_ac client[IEEE80211_NUM_ACS]; - struct fwdb_wmm_ac ap[IEEE80211_NUM_ACS]; +struct fwdb_wmm_rule +{ + struct fwdb_wmm_ac client[IEEE80211_NUM_ACS]; + struct fwdb_wmm_ac ap[IEEE80211_NUM_ACS]; } __packed; -struct fwdb_rule { - u8 len; - u8 flags; - __be16 max_eirp; - __be32 start, end, max_bw; - /* start of optional data */ - __be16 cac_timeout; - __be16 wmm_ptr; +struct fwdb_rule +{ + u8 len; + u8 flags; + __be16 max_eirp; + __be32 start, end, max_bw; + /* start of optional data */ + __be16 cac_timeout; + __be16 wmm_ptr; } __packed __aligned(4); #define FWDB_MAGIC 0x52474442 #define FWDB_VERSION 20 - static int ecw2cw(int ecw) { - return (1 << ecw) - 1; + return (1 << ecw) - 1; } static bool valid_wmm(struct fwdb_wmm_rule *rule) { - struct fwdb_wmm_ac *ac = (struct fwdb_wmm_ac *)rule; - int i; + struct fwdb_wmm_ac *ac = (struct fwdb_wmm_ac *)rule; + int i; - for (i = 0; i < IEEE80211_NUM_ACS * 2; i++) { - u16 cw_min = ecw2cw((ac[i].ecw & 0xf0) >> 4); - u16 cw_max = ecw2cw(ac[i].ecw & 0x0f); - u8 aifsn = ac[i].aifsn; + for (i = 0; i < IEEE80211_NUM_ACS * 2; i++) + { + u16 cw_min = ecw2cw((ac[i].ecw & 0xf0) >> 4); + u16 cw_max = ecw2cw(ac[i].ecw & 0x0f); + u8 aifsn = ac[i].aifsn; - if (cw_min >= cw_max) - return false; + if (cw_min >= cw_max) + return false; - if (aifsn < 1) - return false; - } + if (aifsn < 1) + return false; + } - return true; + return true; } static bool valid_rule(const u8 *data, unsigned int size, u16 rule_ptr) { - struct fwdb_rule *rule = (fwdb_rule *)(data + (rule_ptr << 2)); + struct fwdb_rule *rule = (fwdb_rule *)(data + (rule_ptr << 2)); - if ((u8 *)rule + sizeof(rule->len) > data + size) - return false; + if ((u8 *)rule + sizeof(rule->len) > data + size) + return false; - /* mandatory fields */ - if (rule->len < offsetofend(struct fwdb_rule, max_bw)) - return false; - if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) { - u32 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2; - struct fwdb_wmm_rule *wmm; + /* mandatory fields */ + if (rule->len < offsetofend(struct fwdb_rule, max_bw)) + return false; + if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) + { + u32 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2; + struct fwdb_wmm_rule *wmm; - if (wmm_ptr + sizeof(struct fwdb_wmm_rule) > size) - return false; + if (wmm_ptr + sizeof(struct fwdb_wmm_rule) > size) + return false; - wmm = (fwdb_wmm_rule *)(data + wmm_ptr); + wmm = (fwdb_wmm_rule *)(data + wmm_ptr); - if (!valid_wmm(wmm)) - return false; - } - return true; + if (!valid_wmm(wmm)) + return false; + } + return true; } - static bool valid_country(const u8 *data, unsigned int size, - const struct fwdb_country *country) + const struct fwdb_country *country) { - unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2; - struct fwdb_collection *coll = (struct fwdb_collection *)(data + ptr); - __be16 *rules_ptr; - unsigned int i; + unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2; + struct fwdb_collection *coll = (struct fwdb_collection *)(data + ptr); + __be16 *rules_ptr; + unsigned int i; - /* make sure we can read len/n_rules */ - if ((u8 *)coll + offsetofend(typeof(*coll), n_rules) > data + size) - return false; + /* make sure we can read len/n_rules */ + if ((u8 *)coll + offsetofend(typeof(*coll), n_rules) > data + size) + return false; - /* make sure base struct and all rules fit */ - if ((u8 *)coll + ALIGN(coll->len, 2) + - (coll->n_rules * 2) > data + size) - return false; + /* make sure base struct and all rules fit */ + if ((u8 *)coll + ALIGN(coll->len, 2) + + (coll->n_rules * 2) > + data + size) + return false; - /* mandatory fields must exist */ - if (coll->len < offsetofend(struct fwdb_collection, dfs_region)) - return false; + /* mandatory fields must exist */ + if (coll->len < offsetofend(struct fwdb_collection, dfs_region)) + return false; - rules_ptr = (__be16 *)((u8 *)coll + ALIGN(coll->len, 2)); + rules_ptr = (__be16 *)((u8 *)coll + ALIGN(coll->len, 2)); - for (i = 0; i < coll->n_rules; i++) { - u16 rule_ptr = be16_to_cpu(rules_ptr[i]); + for (i = 0; i < coll->n_rules; i++) + { + u16 rule_ptr = be16_to_cpu(rules_ptr[i]); - if (!valid_rule(data, size, rule_ptr)) - return false; - } + if (!valid_rule(data, size, rule_ptr)) + return false; + } - return true; + return true; } - static bool valid_regdb(const u8 *data, unsigned int size) { - const struct fwdb_header *hdr = (fwdb_header *)data; - const struct fwdb_country *country; + const struct fwdb_header *hdr = (fwdb_header *)data; + const struct fwdb_country *country; - if (size < sizeof(*hdr)) - return false; + if (size < sizeof(*hdr)) + return false; - if (hdr->magic != cpu_to_be32(FWDB_MAGIC)) - return false; + if (hdr->magic != cpu_to_be32(FWDB_MAGIC)) + return false; - if (hdr->version != cpu_to_be32(FWDB_VERSION)) - return false; + if (hdr->version != cpu_to_be32(FWDB_VERSION)) + return false; - if (!regdb_has_valid_signature(data, size)) - return false; + if (!regdb_has_valid_signature(data, size)) + return false; - country = &hdr->country[0]; - while ((u8 *)(country + 1) <= data + size) { - if (!country->coll_ptr) - break; - if (!valid_country(data, size, country)) - return false; - country++; - } + country = &hdr->country[0]; + while ((u8 *)(country + 1) <= data + size) + { + if (!country->coll_ptr) + break; + if (!valid_country(data, size, country)) + return false; + country++; + } - return true; + return true; } static void set_wmm_rule(const struct fwdb_header *db, - const struct fwdb_country *country, - const struct fwdb_rule *rule, - WifiRule*rrule) + const struct fwdb_country *country, + const struct fwdb_rule *rule, + WifiRule *rrule) { // not implemented. return; @@ -528,11 +538,11 @@ static void set_wmm_rule(const struct fwdb_header *db, // wmm = (fwdb_wmm_rule *)((u8 *)db + wmm_ptr); // if (!valid_wmm(wmm)) { -// std::cout +// std::cout // << "Invalid regulatory WMM rule " -// << be32_to_cpu(rule->start) +// << be32_to_cpu(rule->start) // << "-" << be32_to_cpu(rule->end) -// << " in domain " << country->alpha2[0] << country->alpha2[1] +// << " in domain " << country->alpha2[0] << country->alpha2[1] // << std::endl; // return; // } @@ -553,90 +563,115 @@ static void set_wmm_rule(const struct fwdb_header *db, // rrule->has_wmm = true; // } - static WifiRegulations regdb_load_country(const struct fwdb_header *db, - const struct fwdb_country *country) + const struct fwdb_country *country) { - unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2; - struct fwdb_collection *coll = (fwdb_collection *)((u8 *)db + ptr); - unsigned int i; + unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2; + struct fwdb_collection *coll = (fwdb_collection *)((u8 *)db + ptr); + unsigned int i; WifiRegulations wifiRegulations; - wifiRegulations.reg_alpha2 = SS(country->alpha2[0] << country->alpha2[1]); - wifiRegulations.dfs_region = (DfsRegion)(coll->dfs_region); - unsigned int nRules = coll->n_rules; + wifiRegulations.reg_alpha2 = SS(country->alpha2[0] << country->alpha2[1]); + wifiRegulations.dfs_region = (DfsRegion)(coll->dfs_region); + unsigned int nRules = coll->n_rules; - for (i = 0; i < nRules; i++) { - const __be16 *rules_ptr = (const __be16 *)((u8 *)coll + ALIGN(coll->len, 2)); - unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2; - struct fwdb_rule *rule = (fwdb_rule *)((u8 *)db + rule_ptr); + for (i = 0; i < nRules; i++) + { + const __be16 *rules_ptr = (const __be16 *)((u8 *)coll + ALIGN(coll->len, 2)); + unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2; + struct fwdb_rule *rule = (fwdb_rule *)((u8 *)db + rule_ptr); WifiRule wifiRule; wifiRule.start_freq_khz = be32_to_cpu(rule->start); - wifiRule.end_freq_khz = be32_to_cpu(rule->end); - wifiRule.max_bandwidth_khz = be32_to_cpu(rule->max_bw); + wifiRule.end_freq_khz = be32_to_cpu(rule->end); + wifiRule.max_bandwidth_khz = be32_to_cpu(rule->max_bw); wifiRule.max_antenna_gain = 0; wifiRule.max_eirp = be16_to_cpu(rule->max_eirp); wifiRule.flags = RegRuleFlags::NONE; - if (rule->flags & FWDB_FLAG_NO_OFDM) - wifiRule.flags |= RegRuleFlags::NO_OFDM; - if (rule->flags & FWDB_FLAG_NO_OUTDOOR) - wifiRule.flags |= RegRuleFlags::NO_OUTDOOR; - if (rule->flags & FWDB_FLAG_DFS) - wifiRule.flags |= RegRuleFlags::DFS; - if (rule->flags & FWDB_FLAG_NO_IR) - wifiRule.flags |= RegRuleFlags::NO_IR; - if (rule->flags & FWDB_FLAG_AUTO_BW) - wifiRule.flags |= RegRuleFlags::AUTO_BW; + if (rule->flags & FWDB_FLAG_NO_OFDM) + wifiRule.flags |= RegRuleFlags::NO_OFDM; + if (rule->flags & FWDB_FLAG_NO_OUTDOOR) + wifiRule.flags |= RegRuleFlags::NO_OUTDOOR; + if (rule->flags & FWDB_FLAG_DFS) + wifiRule.flags |= RegRuleFlags::DFS; + if (rule->flags & FWDB_FLAG_NO_IR) + wifiRule.flags |= RegRuleFlags::NO_IR; + if (rule->flags & FWDB_FLAG_AUTO_BW) + wifiRule.flags |= RegRuleFlags::AUTO_BW; - wifiRule.dfs_cac_ms = 0; + wifiRule.dfs_cac_ms = 0; - /* handle optional data */ - if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout)) - wifiRule.dfs_cac_ms = - 1000 * be16_to_cpu(rule->cac_timeout); - // if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) - // set_wmm_rule(db, country, rule, &wifiRule); + /* handle optional data */ + if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout)) + wifiRule.dfs_cac_ms = + 1000 * be16_to_cpu(rule->cac_timeout); + // if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) + // set_wmm_rule(db, country, rule, &wifiRule); wifiRegulations.rules.push_back(std::move(wifiRule)); - } + } - return wifiRegulations; + return wifiRegulations; } - -static std::vector load_regdb(u8*pData) +static std::vector load_regdb(u8 *pData) { - const struct fwdb_header *hdr = (const fwdb_header*)pData; - const struct fwdb_country *country; + const struct fwdb_header *hdr = (const fwdb_header *)pData; + const struct fwdb_country *country; - ASSERT_RTNL(); - if (!pData) + ASSERT_RTNL(); + if (!pData) { throw std::runtime_error("Regdb not loaded."); } std::vector result; - country = &hdr->country[0]; - while (country->coll_ptr) { + country = &hdr->country[0]; + while (country->coll_ptr) + { result.push_back(regdb_load_country(hdr, country)); - country++; - } + country++; + } return result; - } - void RegDb::Load20() { - u8*data = (u8*)ptr(); + u8 *data = (u8 *)ptr(); unsigned int size = (unsigned int)this->data.size(); - if (!valid_regdb(data,size)) + if (!valid_regdb(data, size)) { throw std::runtime_error("Invalid file format."); - } - this->regulations = load_regdb(data); + this->regulations = load_regdb(data); this->isValid = true; -} \ No newline at end of file +} + + +static std::map getIsoNamesDict(const std::filesystem::path&filename) +{ + std::map result; + std::ifstream f(filename); + if (!f.is_open()) + { + throw std::runtime_error("Can't open WiFi regulatory domain names file."); + } + json_reader reader(f); + reader.read(&result); + return result; +} +std::map RegDb::getRegulatoryDomains(const std::filesystem::path&isoFilenamesfile) const +{ + std::map keyToNameDict = getIsoNamesDict(isoFilenamesfile); + std::map result; + + for (const auto ®ulation : this->regulations) + { + if (keyToNameDict.contains(regulation.reg_alpha2)) + { + result[regulation.reg_alpha2] = keyToNameDict[regulation.reg_alpha2]; + } + } + return result; +} diff --git a/PiPedalCommon/src/include/RegDb.hpp b/PiPedalCommon/src/include/RegDb.hpp index 6a27b02..01a45ba 100644 --- a/PiPedalCommon/src/include/RegDb.hpp +++ b/PiPedalCommon/src/include/RegDb.hpp @@ -61,6 +61,7 @@ namespace pipedal const WifiRegulations&getWifiRegulations(const std::string&countryIso3661) const; + std::map getRegulatoryDomains(const std::filesystem::path&namesFile="/etc/pipedal/config/iso_codes.json") const; private: bool isValid = false; diff --git a/config/iso_codes.json b/config/iso_codes.json new file mode 100644 index 0000000..0e970af --- /dev/null +++ b/config/iso_codes.json @@ -0,0 +1,248 @@ +{ +"AF": "Afghanistan", +"AX": "Aland Islands", +"AL": "Albania", +"DZ": "Algeria", +"AS": "American Samoa", +"AD": "Andorra", +"AO": "Angola", +"AI": "Anguilla", +"AQ": "Antarctica", +"AG": "Antigua And Barbuda", +"AR": "Argentina", +"AM": "Armenia", +"AW": "Aruba", +"AU": "Australia", +"AT": "Austria", +"AZ": "Azerbaijan", +"BS": "Bahamas", +"BH": "Bahrain", +"BD": "Bangladesh", +"BB": "Barbados", +"BY": "Belarus", +"BE": "Belgium", +"BZ": "Belize", +"BJ": "Benin", +"BM": "Bermuda", +"BT": "Bhutan", +"BO": "Bolivia", +"BA": "Bosnia And Herzegovina", +"BW": "Botswana", +"BV": "Bouvet Island", +"BR": "Brazil", +"IO": "British Indian Ocean Territory", +"BN": "Brunei Darussalam", +"BG": "Bulgaria", +"BF": "Burkina Faso", +"BI": "Burundi", +"KH": "Cambodia", +"CM": "Cameroon", +"CA": "Canada", +"CV": "Cape Verde", +"KY": "Cayman Islands", +"CF": "Central African Republic", +"TD": "Chad", +"CL": "Chile", +"CN": "China", +"CX": "Christmas Island", +"CC": "Cocos (Keeling) Islands", +"CO": "Colombia", +"KM": "Comoros", +"CG": "Congo", +"CD": "Congo, Democratic Republic", +"CK": "Cook Islands", +"CR": "Costa Rica", +"CI": "Cote D\"Ivoire", +"HR": "Croatia", +"CU": "Cuba", +"CY": "Cyprus", +"CZ": "Czech Republic", +"DK": "Denmark", +"DJ": "Djibouti", +"DM": "Dominica", +"DO": "Dominican Republic", +"EC": "Ecuador", +"EG": "Egypt", +"SV": "El Salvador", +"GQ": "Equatorial Guinea", +"ER": "Eritrea", +"EE": "Estonia", +"ET": "Ethiopia", +"FK": "Falkland Islands (Malvinas)", +"FO": "Faroe Islands", +"FJ": "Fiji", +"FI": "Finland", +"FR": "France", +"GF": "French Guiana", +"PF": "French Polynesia", +"TF": "French Southern Territories", +"GA": "Gabon", +"GM": "Gambia", +"GE": "Georgia", +"DE": "Germany", +"GH": "Ghana", +"GI": "Gibraltar", +"GR": "Greece", +"GL": "Greenland", +"GD": "Grenada", +"GP": "Guadeloupe", +"GU": "Guam", +"GT": "Guatemala", +"GG": "Guernsey", +"GN": "Guinea", +"GW": "Guinea-Bissau", +"GY": "Guyana", +"HT": "Haiti", +"HM": "Heard Island & Mcdonald Islands", +"VA": "Holy See (Vatican City State)", +"HN": "Honduras", +"HK": "Hong Kong", +"HU": "Hungary", +"IS": "Iceland", +"IN": "India", +"ID": "Indonesia", +"IR": "Iran, Islamic Republic Of", +"IQ": "Iraq", +"IE": "Ireland", +"IM": "Isle Of Man", +"IL": "Israel", +"IT": "Italy", +"JM": "Jamaica", +"JP": "Japan", +"JE": "Jersey", +"JO": "Jordan", +"KZ": "Kazakhstan", +"KE": "Kenya", +"KI": "Kiribati", +"KR": "Korea", +"KP": "North Korea", +"KW": "Kuwait", +"KG": "Kyrgyzstan", +"LA": "Lao People\"s Democratic Republic", +"LV": "Latvia", +"LB": "Lebanon", +"LS": "Lesotho", +"LR": "Liberia", +"LY": "Libyan Arab Jamahiriya", +"LI": "Liechtenstein", +"LT": "Lithuania", +"LU": "Luxembourg", +"MO": "Macao", +"MK": "Macedonia", +"MG": "Madagascar", +"MW": "Malawi", +"MY": "Malaysia", +"MV": "Maldives", +"ML": "Mali", +"MT": "Malta", +"MH": "Marshall Islands", +"MQ": "Martinique", +"MR": "Mauritania", +"MU": "Mauritius", +"YT": "Mayotte", +"MX": "Mexico", +"FM": "Micronesia, Federated States Of", +"MD": "Moldova", +"MC": "Monaco", +"MN": "Mongolia", +"ME": "Montenegro", +"MS": "Montserrat", +"MA": "Morocco", +"MZ": "Mozambique", +"MM": "Myanmar", +"NA": "Namibia", +"NR": "Nauru", +"NP": "Nepal", +"NL": "Netherlands", +"AN": "Netherlands Antilles", +"NC": "New Caledonia", +"NZ": "New Zealand", +"NI": "Nicaragua", +"NE": "Niger", +"NG": "Nigeria", +"NU": "Niue", +"NF": "Norfolk Island", +"MP": "Northern Mariana Islands", +"NO": "Norway", +"OM": "Oman", +"PK": "Pakistan", +"PW": "Palau", +"PS": "Palestinian Territory, Occupied", +"PA": "Panama", +"PG": "Papua New Guinea", +"PY": "Paraguay", +"PE": "Peru", +"PH": "Philippines", +"PN": "Pitcairn", +"PL": "Poland", +"PT": "Portugal", +"PR": "Puerto Rico", +"QA": "Qatar", +"RE": "Reunion", +"RO": "Romania", +"RU": "Russian Federation", +"RW": "Rwanda", +"BL": "Saint Barthelemy", +"SH": "Saint Helena", +"KN": "Saint Kitts And Nevis", +"LC": "Saint Lucia", +"MF": "Saint Martin", +"PM": "Saint Pierre And Miquelon", +"VC": "Saint Vincent And Grenadines", +"WS": "Samoa", +"SM": "San Marino", +"ST": "Sao Tome And Principe", +"SA": "Saudi Arabia", +"SN": "Senegal", +"RS": "Serbia", +"SC": "Seychelles", +"SL": "Sierra Leone", +"SG": "Singapore", +"SK": "Slovakia", +"SI": "Slovenia", +"SB": "Solomon Islands", +"SO": "Somalia", +"ZA": "South Africa", +"GS": "South Georgia And Sandwich Isl.", +"ES": "Spain", +"LK": "Sri Lanka", +"SD": "Sudan", +"SR": "Suriname", +"SJ": "Svalbard And Jan Mayen", +"SZ": "Swaziland", +"SE": "Sweden", +"CH": "Switzerland", +"SY": "Syrian Arab Republic", +"TW": "Taiwan", +"TJ": "Tajikistan", +"TZ": "Tanzania", +"TH": "Thailand", +"TL": "Timor-Leste", +"TG": "Togo", +"TK": "Tokelau", +"TO": "Tonga", +"TT": "Trinidad And Tobago", +"TN": "Tunisia", +"TR": "Turkey", +"TM": "Turkmenistan", +"TC": "Turks And Caicos Islands", +"TV": "Tuvalu", +"UG": "Uganda", +"UA": "Ukraine", +"AE": "United Arab Emirates", +"GB": "United Kingdom", +"US": "United States", +"UM": "United States Outlying Islands", +"UY": "Uruguay", +"UZ": "Uzbekistan", +"VU": "Vanuatu", +"VE": "Venezuela", +"VN": "Vietnam", +"VG": "Virgin Islands, British", +"VI": "Virgin Islands, U.S.", +"WF": "Wallis And Futuna", +"EH": "Western Sahara", +"YE": "Yemen", +"ZM": "Zambia", +"ZW": "Zimbabwe" +} \ No newline at end of file diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index 17facf1..2ed7ac1 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -1018,10 +1018,7 @@ export class PiPedalModel //implements PiPedalModel } try { - let isoFetch = await fetch(new Request('iso_codes.json')); - this.countryCodes = (await isoFetch.json()) as { [Name: string]: string }; - - + this.countryCodes = await this.getWebSocket().request<{ [Name: string]: string }>("getWifiRegulatoryDomains"); this.clientId = (await this.getWebSocket().request("hello")) as number; diff --git a/src/PiPedalAlsaTest.cpp b/src/PiPedalAlsaTest.cpp index e7cf5d9..4b6e3c0 100644 --- a/src/PiPedalAlsaTest.cpp +++ b/src/PiPedalAlsaTest.cpp @@ -44,16 +44,10 @@ static void DiscoveryTest() } -void ChannelConfigtest() -{ - cout << "--- Channel Config Test" << endl; - -} TEST_CASE( "ALSA Test", "[pipedal_alsa_test][Build][Dev]" ) { DiscoveryTest(); - ChannelConfigTest(); } diff --git a/src/PiPedalModel.cpp b/src/PiPedalModel.cpp index 2c307ca..260e7ea 100644 --- a/src/PiPedalModel.cpp +++ b/src/PiPedalModel.cpp @@ -31,6 +31,7 @@ #include "AdminClient.hpp" #include "SplitEffect.hpp" #include "CpuGovernor.hpp" +#include "RegDb.hpp" #include "RingBufferReader.hpp" #include "PiPedalUI.hpp" #include "atom_object.hpp" @@ -2721,4 +2722,17 @@ bool PiPedalModel::GetHasWifi() { std::lock_guard lock(mutex); return hasWifi; +} + +std::map PiPedalModel::GetWifiRegulatoryDomains() +{ + std::map result; + try { + auto& regDb = RegDb::GetInstance(); + result = regDb.getRegulatoryDomains(storage.GetConfigRoot() / "iso_codes.json"); + } catch (const std::exception&e) + { + Lv2Log::warning(SS("Unable to query Wifi Regulatory domains. " << e.what())); + } + return result; } \ No newline at end of file diff --git a/src/PiPedalModel.hpp b/src/PiPedalModel.hpp index 14bd646..ac5428c 100644 --- a/src/PiPedalModel.hpp +++ b/src/PiPedalModel.hpp @@ -91,6 +91,7 @@ namespace pipedal // virtual void OnPatchPropertyChanged(int64_t clientId, int64_t instanceId,const std::string& propertyUri,const json_variant& value) = 0; virtual void OnErrorMessage(const std::string &message) = 0; virtual void OnLv2PluginsChanging() = 0; + virtual void OnNetworkChanging(bool hotspotConnected) = 0; virtual void OnHasWifiChanged(bool hasWifi) = 0; virtual void Close() = 0; @@ -304,6 +305,7 @@ namespace pipedal void SetRestartListener(std::function &&listener); void OnLv2PluginsChanged(); void SetOnboarding(bool value); + std::map GetWifiRegulatoryDomains(); void UpdateDnsSd(); diff --git a/src/PiPedalSocket.cpp b/src/PiPedalSocket.cpp index 6e3b028..f1358cb 100644 --- a/src/PiPedalSocket.cpp +++ b/src/PiPedalSocket.cpp @@ -1640,6 +1640,11 @@ public: pReader->read(&value); this->model.SetOnboarding(value); } + else if (message == "getWifiRegulatoryDomains") + { + auto regulatoryDomains = this->model.GetWifiRegulatoryDomains(); + this->Reply(replyTo, "getWifiRegulatoryDomains", regulatoryDomains); + } else { Lv2Log::error("Unknown message received: %s", message.c_str()); diff --git a/src/Storage.cpp b/src/Storage.cpp index 9f1a96c..a25e4d7 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -43,8 +43,7 @@ const char *BANKS_FILENAME = "index.banks"; #define USER_SETTINGS_FILENAME "userSettings.json"; - -static bool isSubdirectory(const fs::path&path, const fs::path&basePath) +static bool isSubdirectory(const fs::path &path, const fs::path &basePath) { auto iPath = path.begin(); for (auto i = basePath.begin(); i != basePath.end(); ++i) @@ -53,7 +52,7 @@ static bool isSubdirectory(const fs::path&path, const fs::path&basePath) { return false; } - + if ((*i) != (*iPath)) { return false; @@ -74,7 +73,6 @@ static bool isSubdirectory(const fs::path&path, const fs::path&basePath) static bool hasSyntheticModRoot(const UiFileProperty &fileProperty) { return (fileProperty.modDirectories().size() > 1 || (fileProperty.modDirectories().size() == 1 && fileProperty.useLegacyModDirectory())); - } Storage::Storage() @@ -165,7 +163,7 @@ std::string Storage::SafeEncodeName(const std::string &name) } else { - s << '%' << hex[(c >> 4) & 0x0F] << hex[(c)&0x0F]; + s << '%' << hex[(c >> 4) & 0x0F] << hex[(c) & 0x0F]; } } return s.str(); @@ -187,7 +185,8 @@ std::filesystem::path ResolveHomePath(const std::filesystem::path &path) { homeDirectory = getenv("USERPROFILE"); } - if (homeDirectory == nullptr) { + if (homeDirectory == nullptr) + { return path; } std::filesystem::path result = homeDirectory; @@ -213,6 +212,15 @@ void Storage::SetDataRoot(const std::filesystem::path &path) this->dataRoot = ResolveHomePath(path); } +const std::filesystem::path &Storage::GetConfigRoot() +{ + return this->configRoot; +} +const std::filesystem::path &Storage::GetDataRoot() +{ + return this->dataRoot; +} + static void CopyDirectory(const std::filesystem::path &source, const std::filesystem::path &destination) { for (auto &directoryEntry : std::filesystem::directory_iterator(source)) @@ -1001,7 +1009,9 @@ bool Storage::SetWifiConfigSettings(const WifiConfigSettings &wifiConfigSettings copyToSave.hasPassword_ = previousValue.hasPassword_; copyToSave.password_ = previousValue.password_; copyToSave.hasSavedPassword_ = previousValue.hasPassword_; - } else { + } + else + { if (copyToSave.IsEnabled()) { copyToSave.hasSavedPassword_ = copyToSave.hasPassword_; @@ -1012,7 +1022,7 @@ bool Storage::SetWifiConfigSettings(const WifiConfigSettings &wifiConfigSettings this->wifiConfigSettings = copyToSave; this->wifiConfigSettings.hasPassword_ = false; this->wifiConfigSettings.password_ = ""; - + return configChanged; } @@ -1160,19 +1170,21 @@ void Storage::MergePluginPresets(const std::string &pluginUri, const PluginPrese else { path = GetPluginPresetPath(pluginUri); - try { + try + { std::ifstream f(path); if (f.is_open()) { json_reader reader(f); reader.read(&existingPresets); } - } catch (const std::exception &e) + } + catch (const std::exception &e) { Lv2Log::error(SS("Storage::MergePluginPresets: Can't reading existing plugin presets." << e.what())); } } - for (const PluginPreset &preset: presets.presets_) + for (const PluginPreset &preset : presets.presets_) { existingPresets.MergePreset(preset); @@ -1518,9 +1530,9 @@ void Storage::SetSystemMidiBindings(const std::vector &bindings) writer.write(bindings); } } -static bool hasBinding(std::vector &bindings, const std::string&name) +static bool hasBinding(std::vector &bindings, const std::string &name) { - for (auto&binding: bindings) + for (auto &binding : bindings) { if (binding.symbol() == name) { @@ -1534,7 +1546,8 @@ std::vector Storage::GetSystemMidiBindings() std::vector result; std::filesystem::path fileName = this->dataRoot / "config" / "SystemMidiBindings.json"; - if (!std::filesystem::exists(fileName)) { + if (!std::filesystem::exists(fileName)) + { // pick up from legacy location? fileName = this->configRoot / "config" / "SystemMidiBindings.json"; } @@ -1542,7 +1555,8 @@ std::vector Storage::GetSystemMidiBindings() f.open(fileName); if (f.is_open()) { - try { + try + { json_reader reader(f); reader.read(&result); if (result.size() == 2) @@ -1552,23 +1566,23 @@ std::vector Storage::GetSystemMidiBindings() result.push_back(MidiBinding::SystemBinding("shutdown")); result.push_back(MidiBinding::SystemBinding("reboot")); } - if (!hasBinding(result,"prevBank")) + if (!hasBinding(result, "prevBank")) { - result.insert(result.begin(),MidiBinding::SystemBinding("nextBank")); // reverse order. - result.insert(result.begin(),MidiBinding::SystemBinding("prevBank")); + result.insert(result.begin(), MidiBinding::SystemBinding("nextBank")); // reverse order. + result.insert(result.begin(), MidiBinding::SystemBinding("prevBank")); } - if (!hasBinding(result,"snapshot1")) + if (!hasBinding(result, "snapshot1")) { auto position = 4; for (int i = 0; i < 6; ++i) { - result.insert(result.begin()+position,MidiBinding::SystemBinding(SS("snapshot" << (i+1)))); + result.insert(result.begin() + position, MidiBinding::SystemBinding(SS("snapshot" << (i + 1)))); ++position; } } return result; } - catch (const std::exception&e) + catch (const std::exception &e) { Lv2Log::warning(SS("Can't read file " << fileName << ". " << e.what())); } @@ -1604,13 +1618,11 @@ static bool containsDirectorySeparator(const std::string &value) return false; } - static void ThrowPermissionDeniedError() { throw std::logic_error("Permission denied."); } - std::vector Storage::GetFileList(const UiFileProperty &fileProperty) { if (!UiFileProperty::IsDirectoryNameValid(fileProperty.directory())) @@ -1652,22 +1664,21 @@ std::vector Storage::GetFileList(const UiFileProperty &fileProperty // sort lexicographically auto collator = Locale::GetInstance()->GetCollator(); - std::sort(result.begin(), result.end(), [&collator](const std::string&left,const std::string&right) { - return collator->Compare(left,right) < 0; - }); + std::sort(result.begin(), result.end(), [&collator](const std::string &left, const std::string &right) + { return collator->Compare(left, right) < 0; }); return result; } -static bool ensureNoDotDot(const std::filesystem::path&path) +static bool ensureNoDotDot(const std::filesystem::path &path) { - for (auto segment_: path) + for (auto segment_ : path) { std::string segment = segment_.string(); if (segment.starts_with(".")) { // the linux rule: any path that consists of all '.'s. bool valid = false; - for (auto c: segment) + for (auto c : segment) { if (c != '.') { @@ -1679,22 +1690,21 @@ static bool ensureNoDotDot(const std::filesystem::path&path) { return false; } - } } return true; } static void AddFilesToResult( - FileRequestResult&result, + FileRequestResult &result, const UiFileProperty &fileProperty, - const fs::path&rootPath) + const fs::path &rootPath) { if (!fs::exists(rootPath)) { return; // silently without error. } - auto & resultFiles = result.files_; + auto &resultFiles = result.files_; try { for (auto const &dir_entry : std::filesystem::directory_iterator(rootPath)) @@ -1708,12 +1718,13 @@ static void AddFilesToResult( if (fileProperty.IsValidExtension(path.extension().string())) { resultFiles.push_back( - FileEntry(path,name,false,false) - ); + FileEntry(path, name, false, false)); } } - } else if (dir_entry.is_directory()) { - resultFiles.push_back(FileEntry{path,name,true,fs::is_symlink(path)}); + } + else if (dir_entry.is_directory()) + { + resultFiles.push_back(FileEntry{path, name, true, fs::is_symlink(path)}); } } } @@ -1726,61 +1737,57 @@ static void AddFilesToResult( auto collator = Locale::GetInstance()->GetCollator(); - std::sort(resultFiles.begin(), resultFiles.end(),[&collator](const FileEntry&l, const FileEntry&r) { + std::sort(resultFiles.begin(), resultFiles.end(), [&collator](const FileEntry &l, const FileEntry &r) + { if (l.isDirectory_ != r.isDirectory_) { return l.isDirectory_ > r.isDirectory_; } - return collator->Compare(l.displayName_,r.displayName_) < 0; - }); + return collator->Compare(l.displayName_,r.displayName_) < 0; }); } -FileRequestResult Storage::GetModFileList2(const std::string &relativePath,const UiFileProperty &fileProperty) +FileRequestResult Storage::GetModFileList2(const std::string &relativePath, const UiFileProperty &fileProperty) { FileRequestResult result; fs::path uploadsDirectory = GetPluginUploadDirectory(); if (relativePath.empty()) { - // return the synthetic root. + // return the synthetic root. result.isProtected_ = true; - for (const auto&modDirectory: fileProperty.modDirectories()) + for (const auto &modDirectory : fileProperty.modDirectories()) { const auto directoryInfo = ModFileTypes::GetModDirectory(modDirectory); if (directoryInfo) { result.files_.push_back( - FileEntry(uploadsDirectory / directoryInfo->pipedalPath,directoryInfo->displayName,true,true) - ); + FileEntry(uploadsDirectory / directoryInfo->pipedalPath, directoryInfo->displayName, true, true)); } - } if (fileProperty.useLegacyModDirectory()) { result.files_.push_back( - FileEntry(uploadsDirectory / fileProperty.directory(),fs::path(fileProperty.directory()).filename().string(),true,true) - ); + FileEntry(uploadsDirectory / fileProperty.directory(), fs::path(fileProperty.directory()).filename().string(), true, true)); } - result.breadcrumbs_.push_back({"","Home"}); + result.breadcrumbs_.push_back({"", "Home"}); return result; } fs::path modDirectoryPath; - result.breadcrumbs_.push_back({"","Home"}); - fs::path fsRelativePath { relativePath}; + result.breadcrumbs_.push_back({"", "Home"}); + fs::path fsRelativePath{relativePath}; - for (const auto &modDirectory: fileProperty.modDirectories()) + for (const auto &modDirectory : fileProperty.modDirectories()) { - const ModFileTypes::ModDirectory*modDirectoryInfo = ModFileTypes::GetModDirectory(modDirectory); + const ModFileTypes::ModDirectory *modDirectoryInfo = ModFileTypes::GetModDirectory(modDirectory); if (modDirectoryInfo) { if (isSubdirectory(fsRelativePath, uploadsDirectory / modDirectoryInfo->pipedalPath)) { modDirectoryPath = uploadsDirectory / modDirectoryInfo->pipedalPath; - result.breadcrumbs_.push_back({modDirectoryPath.string(),modDirectoryInfo->displayName}); + result.breadcrumbs_.push_back({modDirectoryPath.string(), modDirectoryInfo->displayName}); break; } - } } if (modDirectoryPath.empty() && fileProperty.useLegacyModDirectory()) @@ -1788,37 +1795,39 @@ FileRequestResult Storage::GetModFileList2(const std::string &relativePath,const if (isSubdirectory(fsRelativePath, uploadsDirectory / fileProperty.directory())) { modDirectoryPath = uploadsDirectory / fileProperty.directory(); - result.breadcrumbs_.push_back({modDirectoryPath.string(),fs::path(fileProperty.directory()).filename().string()}); - } else { + result.breadcrumbs_.push_back({modDirectoryPath.string(), fs::path(fileProperty.directory()).filename().string()}); + } + else + { ThrowPermissionDeniedError(); } } // add remaing path segements as breadcrumbs. { - fs::path modPath {modDirectoryPath}; - fs::path rp { relativePath}; + fs::path modPath{modDirectoryPath}; + fs::path rp{relativePath}; auto iRp = rp.begin(); // skip past one or more segments in the modDiretoryPath. for (auto iModPath = modPath.begin(); iModPath != modPath.end(); ++iModPath) { - if (iRp != rp.end()) { + if (iRp != rp.end()) + { ++iRp; } } while (iRp != rp.end()) { - result.breadcrumbs_.push_back({*iRp,*iRp}); + result.breadcrumbs_.push_back({*iRp, *iRp}); ++iRp; } } - AddFilesToResult(result,fileProperty,relativePath); + AddFilesToResult(result, fileProperty, relativePath); return result; } - -FileRequestResult Storage::GetFileList2(const std::string &relativePath_,const UiFileProperty &fileProperty) +FileRequestResult Storage::GetFileList2(const std::string &relativePath_, const UiFileProperty &fileProperty) { std::string absolutePath = relativePath_; if (!ensureNoDotDot(absolutePath)) @@ -1827,12 +1836,12 @@ FileRequestResult Storage::GetFileList2(const std::string &relativePath_,const U } if (hasSyntheticModRoot(fileProperty)) { - return Storage::GetModFileList2(absolutePath,fileProperty); + return Storage::GetModFileList2(absolutePath, fileProperty); } FileRequestResult result; - if (fileProperty.directory().empty()) + if (fileProperty.directory().empty()) { throw std::runtime_error("fileProperty.directory() not specified."); } @@ -1842,10 +1851,9 @@ FileRequestResult Storage::GetFileList2(const std::string &relativePath_,const U absolutePath = pluginRootDirectory.string(); } - { - result.breadcrumbs_.push_back({"","Home"}); - fs::path fsAbsolutePath {absolutePath}; + result.breadcrumbs_.push_back({"", "Home"}); + fs::path fsAbsolutePath{absolutePath}; auto iAbsolutePath = fsAbsolutePath.begin(); for (auto i = pluginRootDirectory.begin(); i != pluginRootDirectory.end(); ++i) { @@ -1860,26 +1868,25 @@ FileRequestResult Storage::GetFileList2(const std::string &relativePath_,const U while (iAbsolutePath != fsAbsolutePath.end()) { cumulativePath /= (*iAbsolutePath); - result.breadcrumbs_.push_back({cumulativePath.string(),iAbsolutePath->string()}); + result.breadcrumbs_.push_back({cumulativePath.string(), iAbsolutePath->string()}); ++iAbsolutePath; } } - if (!isSubdirectory(absolutePath,pluginRootDirectory)) + if (!isSubdirectory(absolutePath, pluginRootDirectory)) { throw std::runtime_error(SS("Improper location. " << absolutePath)); } - AddFilesToResult(result,fileProperty,absolutePath); + AddFilesToResult(result, fileProperty, absolutePath); return result; } - bool Storage::IsValidSampleFileName(const std::filesystem::path &fileName) { if (!fileName.is_absolute()) { return false; } - + std::filesystem::path audioFilePath = this->GetPluginUploadDirectory(); std::filesystem::path parentDirectory = fileName.parent_path(); @@ -1888,10 +1895,12 @@ bool Storage::IsValidSampleFileName(const std::filesystem::path &fileName) for (auto i = audioFilePath.begin(); i != audioFilePath.end(); ++i) { - if (iTarget == parentDirectory.end()) { + if (iTarget == parentDirectory.end()) + { return false; } - if (*i != *iTarget) { + if (*i != *iTarget) + { return false; } ++iTarget; @@ -1927,14 +1936,17 @@ void Storage::DeleteSampleFile(const std::filesystem::path &fileName) if (std::filesystem::is_symlink(fileName)) { std::filesystem::remove(fileName); - } else { + } + else + { if (fileName.string().length() > 1) // guard against rm -rf / (bitter experience) { std::filesystem::remove_all(fileName); } } } - else { + else + { std::filesystem::remove(fileName); } } @@ -1958,7 +1970,7 @@ std::filesystem::path Storage::MakeUserFilePath(const std::string &directory, co } return result; } -std::string Storage::UploadUserFile(const std::string &directory, const std::string &patchProperty, const std::string &filename, std::istream&stream, size_t contentLength) +std::string Storage::UploadUserFile(const std::string &directory, const std::string &patchProperty, const std::string &filename, std::istream &stream, size_t contentLength) { std::filesystem::path path; if (directory.length() != 0) @@ -1966,7 +1978,7 @@ std::string Storage::UploadUserFile(const std::string &directory, const std::str path = this->MakeUserFilePath(directory, filename); } else - + { if (patchProperty.length() == 0) { @@ -1975,7 +1987,8 @@ std::string Storage::UploadUserFile(const std::string &directory, const std::str throw std::logic_error("patchProperty directory not implemented."); } { - try { + try + { std::filesystem::create_directories(path.parent_path()); pipedal::ofstream_synced f(path, std::ios_base::trunc | std::ios_base::binary); @@ -1984,23 +1997,26 @@ std::string Storage::UploadUserFile(const std::string &directory, const std::str throw std::logic_error(SS("Can't create file " << path << ".")); } std::vector buffer; - size_t BUFFER_SIZE = 64*1024; + size_t BUFFER_SIZE = 64 * 1024; buffer.resize(BUFFER_SIZE); - char *pBuffer= (char*)&(buffer[0]); + char *pBuffer = (char *)&(buffer[0]); while (contentLength != 0) { - size_t thisTime = std::min(BUFFER_SIZE,contentLength); - stream.read(pBuffer,(std::streamsize)thisTime); - if (!stream) { + size_t thisTime = std::min(BUFFER_SIZE, contentLength); + stream.read(pBuffer, (std::streamsize)thisTime); + if (!stream) + { throw std::runtime_error("Unable to read body input stream."); } - f.write(pBuffer,(std::streamsize)thisTime); - if (!f) { + f.write(pBuffer, (std::streamsize)thisTime); + if (!f) + { throw std::runtime_error("Failed to write to upload file."); } contentLength -= thisTime; } - } catch (const std::exception &e) + } + catch (const std::exception &e) { Lv2Log::error(SS("Upload failed. " << e.what())); std::filesystem::remove(path); @@ -2010,7 +2026,7 @@ std::string Storage::UploadUserFile(const std::string &directory, const std::str return path.string(); } -std::string Storage::CreateNewSampleDirectory(const std::string&relativePath, const UiFileProperty&uiFileProperty) +std::string Storage::CreateNewSampleDirectory(const std::string &relativePath, const UiFileProperty &uiFileProperty) { if (uiFileProperty.directory().empty()) { @@ -2027,12 +2043,11 @@ std::string Storage::CreateNewSampleDirectory(const std::string&relativePath, co } std::filesystem::create_directories(path); return path; - } std::string Storage::RenameFilePropertyFile( - const std::string&oldRelativePath, - const std::string&newRelativePath, - const UiFileProperty&uiFileProperty) + const std::string &oldRelativePath, + const std::string &newRelativePath, + const UiFileProperty &uiFileProperty) { if (uiFileProperty.directory().empty()) { @@ -2058,67 +2073,68 @@ std::string Storage::RenameFilePropertyFile( if (std::filesystem::is_directory(newPath)) { throw std::runtime_error("A directory with that name already exists."); - } else { + } + else + { throw std::runtime_error("A file with that name already exists."); } } - std::filesystem::rename(oldPath,newPath); + std::filesystem::rename(oldPath, newPath); return newPath; - } -void Storage::FillSampleDirectoryTree(FilePropertyDirectoryTree*node, const std::filesystem::path&directory) const +void Storage::FillSampleDirectoryTree(FilePropertyDirectoryTree *node, const std::filesystem::path &directory) const { - for (auto child: std::filesystem::directory_iterator(directory)) + for (auto child : std::filesystem::directory_iterator(directory)) { if (child.is_directory()) { - const auto& childPath = child.path(); + const auto &childPath = child.path(); FilePropertyDirectoryTree::ptr childTree = std::make_unique(childPath); - FillSampleDirectoryTree(childTree.get(),childPath); + FillSampleDirectoryTree(childTree.get(), childPath); node->children_.push_back(std::move(childTree)); } } auto collator = Locale::GetInstance()->GetCollator(); - std::sort(node->children_.begin(),node->children_.end(), - [&collator](const FilePropertyDirectoryTree::ptr&left,const FilePropertyDirectoryTree::ptr&right) - { - return collator->Compare(left->directoryName_,right->directoryName_) < 0; - }); + std::sort(node->children_.begin(), node->children_.end(), + [&collator](const FilePropertyDirectoryTree::ptr &left, const FilePropertyDirectoryTree::ptr &right) + { + return collator->Compare(left->directoryName_, right->directoryName_) < 0; + }); } -FilePropertyDirectoryTree::ptr Storage::GetFilePropertydirectoryTree(const UiFileProperty&uiFileProperty) +FilePropertyDirectoryTree::ptr Storage::GetFilePropertydirectoryTree(const UiFileProperty &uiFileProperty) { - fs::path uploadDirectory = this->GetPluginUploadDirectory(); + fs::path uploadDirectory = this->GetPluginUploadDirectory(); if (hasSyntheticModRoot(uiFileProperty)) { - FilePropertyDirectoryTree::ptr result = std::make_unique("","Home"); + FilePropertyDirectoryTree::ptr result = std::make_unique("", "Home"); result->isProtected_ = true; - for (const auto& modDirectory: uiFileProperty.modDirectories()) + for (const auto &modDirectory : uiFileProperty.modDirectories()) { auto modDirectoryInfo = ModFileTypes::GetModDirectory(modDirectory); if (modDirectoryInfo) { auto childPath = uploadDirectory / modDirectoryInfo->pipedalPath; FilePropertyDirectoryTree::ptr child = std::make_unique( - childPath,modDirectoryInfo->displayName - ); - FillSampleDirectoryTree(child.get(),childPath); + childPath, modDirectoryInfo->displayName); + FillSampleDirectoryTree(child.get(), childPath); result->children_.push_back(std::move(child)); } } - if (uiFileProperty.useLegacyModDirectory()) { + if (uiFileProperty.useLegacyModDirectory()) + { auto childPath = uploadDirectory / uiFileProperty.directory(); FilePropertyDirectoryTree::ptr child = std::make_unique( - childPath - ); - FillSampleDirectoryTree(child.get(),childPath); + childPath); + FillSampleDirectoryTree(child.get(), childPath); result->children_.push_back(std::move(child)); } return result; - - } else { + } + else + { if (uiFileProperty.directory().empty()) { throw std::runtime_error("Invalid uiFileProperty"); @@ -2128,15 +2144,13 @@ FilePropertyDirectoryTree::ptr Storage::GetFilePropertydirectoryTree(const UiFil throw std::runtime_error("Invalid uiFileProperty"); } std::filesystem::path rootDirectory = uploadDirectory / uiFileProperty.directory(); - FilePropertyDirectoryTree::ptr result = std::make_unique(rootDirectory.string(),"Home"); + FilePropertyDirectoryTree::ptr result = std::make_unique(rootDirectory.string(), "Home"); - FillSampleDirectoryTree(result.get(),rootDirectory); + FillSampleDirectoryTree(result.get(), rootDirectory); return result; } - } - const PluginPresetIndex &Storage::GetPluginPresetIndex() { return pluginPresetIndex; diff --git a/src/Storage.hpp b/src/Storage.hpp index 15df9e9..810e128 100644 --- a/src/Storage.hpp +++ b/src/Storage.hpp @@ -109,6 +109,8 @@ public: void SetDataRoot(const std::filesystem::path& path); void SetConfigRoot(const std::filesystem::path& path); + const std::filesystem::path&GetConfigRoot(); + const std::filesystem::path&GetDataRoot(); std::filesystem::path GetPluginUploadDirectory() const; diff --git a/src/WifiChannelsTest.cpp b/src/WifiChannelsTest.cpp index 7ba602c..3c40c7f 100644 --- a/src/WifiChannelsTest.cpp +++ b/src/WifiChannelsTest.cpp @@ -230,8 +230,24 @@ static void DisplayRegulations(const std::string& country) } } +void DisplayRegDomains() +{ + std::cout << "==== Regulatory domains === " << std::endl; + std::filesystem::path dbPath = "test_data/debian_bookworm_regulatory.db"; + RegDb regdb{dbPath}; + REQUIRE(regdb.IsValid()); + + auto regDomains = regdb.getRegulatoryDomains("config/iso_codes.json"); + for (const auto®Domain: regDomains) + { + std::cout << " " << regDomain.first << ": " << regDomain.second << std::endl; + } + +} + TEST_CASE("Wifi Channel Test", "[wifi_channels_test]") { + DisplayRegDomains(); DisplayRegulations("CA"); DisplayRegulations("US"); DisplayRegulations("JP"); From aca96317a82d80d14999c928a937d10e3aff81f9 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 21 Nov 2024 00:46:48 -0500 Subject: [PATCH 11/17] Revised pipedal_latency_text documentation The example needs to say "hw:M2" --- src/PiLatencyMain.cpp | 25 ++++++++++++++++--------- todo.txt | 7 +------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/PiLatencyMain.cpp b/src/PiLatencyMain.cpp index 75857c8..b6f12e6 100644 --- a/src/PiLatencyMain.cpp +++ b/src/PiLatencyMain.cpp @@ -50,13 +50,15 @@ struct TestResult void PrintHelp() { PrettyPrinter pp; - pp.width(160); + pp.width(78); pp << "PiPedal Latency Tester\n"; pp << "Copyright (c) 2022 Robin Davies\n"; pp << "\n"; pp << Indent(0) << "Syntax\n\n"; - pp << Indent(4) << "pipedal_latency_test [] \n\n"; + pp << Indent(2) << "pipedal_latency_test [] \n\n"; + pp << "where is the name of an ALSA device. Typically this should be the name of a hardware " + "device (a device name starting with 'hw:').\n\n"; pp << Indent(0) << "Options\n\n"; pp << Indent(15); @@ -73,21 +75,26 @@ void PrintHelp() << "Display this message.\n\n"; pp << Indent(0) << "Remarks\n\n"; - pp << Indent(4); - pp << "PiPedal Latency Tester measure actual audio latency from output to input of an ALSA device. " + pp << Indent(2); + + pp << "PiPedal Latency Tester measures actual audio latency from output to input of an ALSA device.\n\n" << "To run a latency test, you must connect an audio cable from left (first) output of the device " "under test to the left (first) input of the device under test.\n\n" - << "PiPedal Latency Tester will measure the time it takes for a signal to propagate from output to input.\n\n" - + << "PiPedal Latency Tester measures internal buffer delays as well as operating system and " + << "signal delays in hardware peripherals. Latency figures will therefore be somewhat higher than " + << "most reported latency figures which typically only include internal buffer delays.\n\n"; + + pp << "The tests run over a variety of buffer sizes. A nominal compute load is provided in order to put some " "stress on the audio system.\n\n" << "You may need to stop the pipedald audio service in order to access the ALSA device:\n\n" - << Indent(8) << "sudo systemctl stop pipedald\n\n"; + << Indent(6) << "sudo systemctl stop pipedald\n\n"; + pp << Indent(0) << "Examples\n\n"; - pp << Indent(4) << "pipedal_latency_test --list\n\n"; - pp << Indent(4) << "pipedal_latency_test M2\n\n"; + pp << Indent(2) << "pipedal_latency_test --list\n\n"; + pp << Indent(2) << "pipedal_latency_test hw:M2\n\n"; } void ListDevices() diff --git a/todo.txt b/todo.txt index cb32218..4fd65aa 100644 --- a/todo.txt +++ b/todo.txt @@ -1,10 +1,5 @@ -Hotspot monitoring - fails when WiFi network is disabled. - -Not all country codes are valid (e.g. Antarctica) - - - +- Start and end connectors are missing in PedalboardView when no device selected (Do they have zero outputs?) X Review docs changes once we go live. From 33dc523ae3ff1fafd0bd3ff77b3cb8c6a7cf0f1f Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Thu, 21 Nov 2024 01:40:26 -0500 Subject: [PATCH 12/17] Add --fix-permission and --list-wifi-country-codes options to PiPedalConfig. --- src/CMakeLists.txt | 5 ++++ src/ConfigMain.cpp | 64 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff6b328..36fc86f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -647,11 +647,16 @@ add_executable(pipedalconfig JackServerSettings.hpp JackServerSettings.cpp SystemConfigFile.hpp SystemConfigFile.cpp WifiChannelSelectors.cpp WifiChannelSelectors.hpp + Locale.cpp Locale.hpp asan_options.cpp ) target_link_libraries(pipedalconfig PRIVATE PiPedalCommon pthread atomic uuid stdc++fs asound + icui18n + icuuc + icudata + ) add_executable(pipedal_latency_test diff --git a/src/ConfigMain.cpp b/src/ConfigMain.cpp index 12d6bf9..de5b78a 100644 --- a/src/ConfigMain.cpp +++ b/src/ConfigMain.cpp @@ -25,6 +25,8 @@ #include "SystemConfigFile.hpp" #include "ModFileTypes.hpp" #include "alsaCheck.hpp" +#include "RegDb.hpp" +#include "Locale.hpp" #include #include @@ -1296,6 +1298,11 @@ static void PrintHelp() << "\n\n" << HangingIndent() << " --list-wifi-channels [] \tList valid Wifi channels for the current/specified country." << "\n\n" + << HangingIndent() << " --list-wifi-country-codes\tList valid country codes." + << "\n\n" + + << HangingIndent() << " --fix-permissions\t" + << "Set correct permissions on /var/pipedal directories and sub-directories\n\n" << Indent(0) << "Country codes:" << "\n\n" @@ -1307,11 +1314,10 @@ static void PrintHelp() << "Without a country code, Wi-Fi must be restricted to channels 1 through 11 " << "with reduced amplitude and feature sets." << "\n\n" - << "For the most part, Wi-Fi country codes are taken from the list of ISO 3661 " - << "2-letter country codes; although there are a handful of exceptions for small " - << "countries and islands. See the Alpha-2 code column of " - << "\n\n" - << Indent(8) << "https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes." + << " Wi-Fi country codes are taken from the list of ISO 3661 " + << "2-letter country codes.\n\n" + << "To see a list of countries and their country codes, run: \n\n" + << Indent(8) << "pipedalconfig --list-wifi-country-codes" << "\n\n"; } @@ -1361,6 +1367,41 @@ void RequireNetworkManager() } } +void ListValidCountryCodes() +{ + RegDb regdb; + + auto ccs = regdb.getRegulatoryDomains(); + + if (ccs.size() == 0) + { + cout << "No regulatory domains found." << endl; + } else { + using pair = std::pair; + std::vector list; + for (auto &cc: ccs) + { + list.push_back(pair(cc.first,cc.second)); + } + + auto collator = Locale::GetInstance()->GetCollator(); + auto compare = [&collator]( + pair &left, + pair &right) + { + return collator->Compare( + left.second, right.second) < 0; + }; + std::sort(list.begin(), list.end(), compare); + + for (const auto &entry: list) + { + cout << entry.first << " - " << entry.second << endl; + } + } +} + + int main(int argc, char **argv) { CommandLineParser parser; @@ -1383,9 +1424,11 @@ int main(int argc, char **argv) std::string portOption; std::string homeNetwork; bool noEthernet = false; + bool list_wifi_country_codes = false; bool noWifi = false; parser.AddOption("--nosudo", &nosudo); // strictly a debugging aid. Run without sudo, until we fail because of permissions. + parser.AddOption("--list-wifi-country-codes",&list_wifi_country_codes); parser.AddOption("--install", &install); parser.AddOption("--uninstall", &uninstall); parser.AddOption("--stop", &stop); @@ -1404,12 +1447,16 @@ int main(int argc, char **argv) parser.AddOption("--no-wifi", &noWifi); parser.AddOption("--alsa-devices", &alsaDevices); parser.AddOption("--alsa-device", &alsaDevice); + parser.AddOption("--fix-permissions", &fix_permissions); try { parser.Parse(argc, (const char **)argv); int actionCount = - (!alsaDevice.empty()) + alsaDevices + help + get_current_port + install + uninstall + stop + start + enable + disable + enable_hotspot + disable_hotspot + restart + enable_p2p + disable_p2p + list_p2p_channels + fix_permissions; + (!alsaDevice.empty()) + alsaDevices + help + get_current_port + install + + uninstall + stop + start + enable + disable + enable_hotspot + + disable_hotspot + restart + enable_p2p + disable_p2p + list_p2p_channels + + fix_permissions + list_wifi_country_codes; if (actionCount > 1) { throw std::runtime_error("Please provide only one action."); @@ -1466,6 +1513,11 @@ int main(int argc, char **argv) PrintHelp(); return EXIT_SUCCESS; } + if (list_wifi_country_codes) + { + ListValidCountryCodes(); + return EXIT_SUCCESS; + } if (get_current_port) { std::cout << "current port: " << GetCurrentWebServicePort() << std::endl; From 1c071ba7f3ab7ec26ec108be98e036a3bc7524d1 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 22 Nov 2024 15:58:08 -0500 Subject: [PATCH 13/17] Fix fiile uploads for Toob ML and Toob Convolution Reversbs. --- react/src/FilePropertyDialog.tsx | 26 +++++++++----- react/src/PiPedalModel.tsx | 1 + react/src/PluginControlView.tsx | 61 +++++++++++++++++--------------- src/FileEntry.cpp | 1 + src/FileEntry.hpp | 1 + src/Lv2Effect.cpp | 38 +++++++++++++++++++- src/Lv2Effect.hpp | 3 +- src/MapPathFeature.cpp | 3 +- src/MapPathFeature.hpp | 14 +++++++- src/PluginHost.cpp | 11 ++---- src/PluginHost.hpp | 2 +- src/Storage.cpp | 37 ++++++++++++++++++- src/main.cpp | 5 +++ 13 files changed, 150 insertions(+), 53 deletions(-) diff --git a/react/src/FilePropertyDialog.tsx b/react/src/FilePropertyDialog.tsx index 5d79c9a..cd4bb90 100644 --- a/react/src/FilePropertyDialog.tsx +++ b/react/src/FilePropertyDialog.tsx @@ -32,7 +32,7 @@ import Button from '@mui/material/Button'; import FileUploadIcon from '@mui/icons-material/FileUpload'; import AudioFileIcon from '@mui/icons-material/AudioFile'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; -import FolderIcon from '@mui/icons-material/Folder'; +import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined'; import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; import DialogActions from '@mui/material/DialogActions'; @@ -105,6 +105,7 @@ export interface FilePropertyDialogState { canDelete: boolean; fileResult: FileRequestResult; navDirectory: string; + uploadDirectory: string; isProtectedDirectory: boolean; columns: number; columnWidth: number; @@ -187,12 +188,14 @@ export default withStyles(styles, { withTheme: true })( this.model = PiPedalModelFactory.getInstance(); + let selectedFile = props.selectedFile; this.state = { fullScreen: this.getFullScreen(), - selectedFile: props.selectedFile, + selectedFile: selectedFile, selectedFileProtected: true, selectedFileIsDirectory: false, - navDirectory: this.getNavDirectoryFromFile(props.selectedFile, props.fileProperty), + navDirectory: this.getNavDirectoryFromFile(selectedFile, props.fileProperty), + uploadDirectory: "", hasSelection: false, canDelete: false, columns: 0, @@ -256,7 +259,8 @@ export default withStyles(styles, { withTheme: true })( fileResult: filesResult, hasSelection: !!fileEntry, selectedFileProtected: fileEntry ? fileEntry.isProtected: true, - navDirectory: navPath + navDirectory: navPath, + uploadDirectory: filesResult.currentDirectory }); } }).catch((error) => { @@ -300,6 +304,8 @@ export default withStyles(styles, { withTheme: true })( componentDidMount() { super.componentDidMount(); this.mounted = true; + this.requestFiles(this.state.navDirectory) + this.requestScroll = true; } componentWillUnmount() { super.componentWillUnmount(); @@ -310,14 +316,16 @@ export default withStyles(styles, { withTheme: true })( super.componentDidUpdate?.(prevProps, prevState, snapshot); if (prevProps.open !== this.props.open || prevProps.fileProperty !== this.props.fileProperty || prevProps.selectedFile !== this.props.selectedFile) { if (this.props.open) { - let navDirectory = this.getNavDirectoryFromFile(this.props.selectedFile, this.props.fileProperty); + let selectedFile = this.props.selectedFile; + let navDirectory = this.getNavDirectoryFromFile(selectedFile, this.props.fileProperty); this.setState({ - selectedFile: this.props.selectedFile, + selectedFile: selectedFile, selectedFileIsDirectory: false, selectedFileProtected: true, newFolderDialogOpen: false, renameDialogOpen: false, - moveDialogOpen: false + moveDialogOpen: false, + navDirectory: navDirectory }); this.requestFiles(navDirectory) this.requestScroll = true; @@ -549,7 +557,7 @@ export default withStyles(styles, { withTheme: true })( } if (fileEntry.isDirectory) { return ( - + ); } if (isAudioFile(fileEntry.pathname)) { @@ -741,7 +749,7 @@ export default withStyles(styles, { withTheme: true })( } } uploadPage={ - "uploadUserFile?directory=" + encodeURIComponent(this.state.navDirectory) + "uploadUserFile?directory=" + encodeURIComponent(this.state.uploadDirectory) + "&ext=" + encodeURIComponent(this.getFileExtensionList(this.props.fileProperty)) } diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index 2ed7ac1..e001630 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -99,6 +99,7 @@ export class FileRequestResult { files: FileEntry[] = []; isProtected: boolean = false; breadcrumbs: BreadcrumbEntry[] = []; + currentDirectory: string = ""; }; export type PluginPresetsChangedHandler = (pluginUri: string) => void; diff --git a/react/src/PluginControlView.tsx b/react/src/PluginControlView.tsx index 5620021..9027588 100644 --- a/react/src/PluginControlView.tsx +++ b/react/src/PluginControlView.tsx @@ -23,7 +23,7 @@ import { WithStyles } from '@mui/styles'; import createStyles from '@mui/styles/createStyles'; import withStyles from '@mui/styles/withStyles'; import { PiPedalModel, PiPedalModelFactory } from './PiPedalModel'; -import { UiPlugin, UiControl, UiFileProperty,UiFrequencyPlot, ScalePoint } from './Lv2Plugin'; +import { UiPlugin, UiControl, UiFileProperty, UiFrequencyPlot, ScalePoint } from './Lv2Plugin'; import { Pedalboard, PedalboardItem, ControlValue } from './Pedalboard'; @@ -247,8 +247,7 @@ type PluginControlViewState = { const PluginControlView = withStyles(styles, { withTheme: true })( - class extends ResizeResponsiveComponent - { + class extends ResizeResponsiveComponent { model: PiPedalModel; constructor(props: PluginControlViewProps) { @@ -526,7 +525,7 @@ const PluginControlView = return false; } - controlKeyIndex : number = 0; + controlKeyIndex: number = 0; controlNodesToNodes(nodes: (ReactNode | ControlGroup)[]): ReactNode[] { let classes = this.props.classes; let isLandscapeGrid = this.state.landscapeGrid; @@ -543,7 +542,7 @@ const PluginControlView = let item = controlGroup.controls[j]; controls.push( ( -
+
{item}
@@ -552,7 +551,7 @@ const PluginControlView = } result.push(( -
+
{controlGroup.name}
@@ -566,7 +565,7 @@ const PluginControlView = } else { result.push(( -
+
{node as ReactNode}
)); @@ -584,7 +583,7 @@ const PluginControlView = render(): ReactNode { - this.controlKeyIndex = 0; + this.controlKeyIndex = 0; let classes = this.props.classes; let pedalboardItem: PedalboardItem; let pedalboard = this.model.pedalboard.get(); @@ -650,29 +649,33 @@ const PluginControlView = ) }
- { - this.setState({ showFileDialog: false }); - }} - onOk={(fileProperty, selectedFile) => { + {this.state.showFileDialog && ( - this.model.setPatchProperty( - this.props.instanceId, - fileProperty.patchProperty, - JsonAtom.Path(selectedFile) - ) - .then(() => { + { + this.setState({ showFileDialog: false }); + }} + onOk={(fileProperty, selectedFile) => { + + this.model.setPatchProperty( + this.props.instanceId, + fileProperty.patchProperty, + JsonAtom.Path(selectedFile) + ) + .then(() => { + + }) + .catch((error) => { + this.model.showAlert("Unable to complete the operation. Audio is not running." + error); + }); + this.setState({ showFileDialog: false }); + } + } + /> + )} - }) - .catch((error) => { - this.model.showAlert("Unable to complete the operation. Audio is not running." + error); - }); - this.setState({ showFileDialog: false }); - } - } - /> this.onImeValueChange(key, value)} diff --git a/src/FileEntry.cpp b/src/FileEntry.cpp index 2a6da62..3c77073 100644 --- a/src/FileEntry.cpp +++ b/src/FileEntry.cpp @@ -38,4 +38,5 @@ JSON_MAP_BEGIN(FileRequestResult) JSON_MAP_REFERENCE(FileRequestResult,files) JSON_MAP_REFERENCE(FileRequestResult,isProtected) JSON_MAP_REFERENCE(FileRequestResult,breadcrumbs) + JSON_MAP_REFERENCE(FileRequestResult,currentDirectory) JSON_MAP_END() diff --git a/src/FileEntry.hpp b/src/FileEntry.hpp index f1dc3ff..c040955 100644 --- a/src/FileEntry.hpp +++ b/src/FileEntry.hpp @@ -52,6 +52,7 @@ namespace pipedal { std::vector files_; bool isProtected_ = false; std::vector breadcrumbs_; + std::string currentDirectory_; DECLARE_JSON_MAP(FileRequestResult); }; diff --git a/src/Lv2Effect.cpp b/src/Lv2Effect.cpp index 9df333e..3f4863d 100644 --- a/src/Lv2Effect.cpp +++ b/src/Lv2Effect.cpp @@ -43,9 +43,21 @@ #include "RingBufferReader.hpp" using namespace pipedal; +namespace fs = std::filesystem; const float BYPASS_TIME_S = 0.1f; + +static fs::path makeAbsolutePath(const std::filesystem::path &path, const std::filesystem::path &parentPath) +{ + if (path.is_absolute()) + { + return path; + } + return parentPath / path; +} + + Lv2Effect::Lv2Effect( IHost *pHost_, const std::shared_ptr &info_, @@ -69,7 +81,6 @@ Lv2Effect::Lv2Effect( this->pathProperties.push_back(filePropertyUrid); this->pathPropertyWriters.push_back(PatchPropertyWriter(instanceId, filePropertyUrid)); - std::vector pathPropertyWriters; } } for (auto &pathProperty: pedalboardItem.pathProperties_) @@ -84,8 +95,10 @@ Lv2Effect::Lv2Effect( const LilvPlugins *plugins = lilv_world_get_all_plugins(pWorld); + // xxx: could we not stash the pPlugin in the plugin info? auto uriNode = lilv_new_uri(pWorld, pedalboardItem.uri().c_str()); const LilvPlugin *pPlugin = lilv_plugins_get_by_uri(plugins, uriNode); + lilv_node_free(uriNode); { AutoLilvNode bundleUri = lilv_plugin_get_bundle_uri(pPlugin); @@ -98,6 +111,25 @@ Lv2Effect::Lv2Effect( logFeature.GetLog(), bundleUriString, storagePath); + + + mapPathFeature.Prepare(&(pHost_->GetMapFeature())); + mapPathFeature.SetPluginStoragePath(pHost_->GetPluginStoragePath()); + if (info->piPedalUI()) + { + const auto &fileProperties = info_->piPedalUI()->fileProperties(); + for (const auto &fileProperty : fileProperties) + { + if (!fileProperty->resourceDirectory().empty()) + { + mapPathFeature.AddResourceFileMapping({ + makeAbsolutePath(fileProperty->resourceDirectory(),bundleUriString), + makeAbsolutePath(fileProperty->directory(),pHost_->GetPluginStoragePath()) + }); + } + } + } + lilv_free(bundleUriString); } @@ -109,6 +141,10 @@ Lv2Effect::Lv2Effect( { this->features.push_back(*p); } + this->features.push_back(mapPathFeature.GetMapPathFeature()); + this->features.push_back(mapPathFeature.GetMakePathFeature()); + this->features.push_back(mapPathFeature.GetFreePathFeature()); + this->features.push_back(this->fileBrowserFilesFeature.GetFeature()); diff --git a/src/Lv2Effect.hpp b/src/Lv2Effect.hpp index a85e5ae..a6d5417 100644 --- a/src/Lv2Effect.hpp +++ b/src/Lv2Effect.hpp @@ -27,6 +27,7 @@ #include "FileBrowserFilesFeature.hpp" #include "PatchPropertyWriter.hpp" #include +#include "MapPathFeature.hpp" #include "IEffect.hpp" #include "Worker.hpp" @@ -90,7 +91,7 @@ namespace pipedal std::vector outputAtomBuffers; std::vector features; LV2_Feature *work_schedule_feature = nullptr; - + MapPathFeature mapPathFeature; uint64_t maxInputControlPort = 0; std::vector isInputControlPort; diff --git a/src/MapPathFeature.cpp b/src/MapPathFeature.cpp index 85040cd..aedd4e7 100644 --- a/src/MapPathFeature.cpp +++ b/src/MapPathFeature.cpp @@ -26,8 +26,7 @@ using namespace pipedal; -MapPathFeature::MapPathFeature(const std::filesystem::path &storagePath) -:storagePath(storagePath) +MapPathFeature::MapPathFeature() { lv2_state_map_path.handle = (LV2_State_Map_Path_Handle *)this; lv2_state_map_path.absolute_path = FnAbsolutePath; diff --git a/src/MapPathFeature.hpp b/src/MapPathFeature.hpp index ab227a4..655c42f 100644 --- a/src/MapPathFeature.hpp +++ b/src/MapPathFeature.hpp @@ -24,12 +24,23 @@ namespace pipedal { + struct ResourceFileMapping { + std::string resourcePath; // absolute path of the resource directory. + std::string storagePath; // absolute path of where resource directory files get placed. + }; class MapPathFeature { public: - MapPathFeature(const std::filesystem::path &storagePath); + MapPathFeature(); void Prepare(MapFeature* map); void SetPluginStoragePath(const std::string&path) { storagePath = path;} + + void AddResourceFileMapping(const ResourceFileMapping &resourceFileMapping) + { + this->resourceFileMappings.push_back(resourceFileMapping); + } + + const std::vector &GetResourceFileMappings() const { return resourceFileMappings; } const std::string&GetPluginStoragePath() const { return storagePath; } const LV2_Feature*GetMapPathFeature() { return &mapPathFeature;} const LV2_Feature*GetMakePathFeature() { return &makePathFeature;} @@ -60,5 +71,6 @@ namespace pipedal private: std::string storagePath; + std::vector resourceFileMappings; }; } \ No newline at end of file diff --git a/src/PluginHost.cpp b/src/PluginHost.cpp index d987f67..1d0ae47 100644 --- a/src/PluginHost.cpp +++ b/src/PluginHost.cpp @@ -243,16 +243,15 @@ static float nodeAsFloat(const LilvNode *node, float default_ = 0) void PluginHost::SetPluginStoragePath(const std::filesystem::path &path) { - mapPathFeature.SetPluginStoragePath(path); + pluginStoragePath = path; } std::string PluginHost::GetPluginStoragePath() const { - return mapPathFeature.GetPluginStoragePath(); + return pluginStoragePath; } PluginHost::PluginHost() - : mapPathFeature("") { pWorld = nullptr; @@ -260,13 +259,9 @@ PluginHost::PluginHost() lv2Features.push_back(mapFeature.GetUnmapFeature()); optionsFeature.Prepare(mapFeature, 44100, this->GetMaxAudioBufferSize(), this->GetAtomBufferSize()); - - mapPathFeature.Prepare(&mapFeature); - lv2Features.push_back(mapPathFeature.GetMapPathFeature()); - lv2Features.push_back(mapPathFeature.GetMakePathFeature()); - lv2Features.push_back(mapPathFeature.GetFreePathFeature()); lv2Features.push_back(optionsFeature.GetFeature()); + lv2Features.push_back(nullptr); this->urids = new Urids(mapFeature); diff --git a/src/PluginHost.hpp b/src/PluginHost.hpp index 2638207..5fa685d 100644 --- a/src/PluginHost.hpp +++ b/src/PluginHost.hpp @@ -757,7 +757,7 @@ namespace pipedal std::vector lv2Features; MapFeature mapFeature; OptionsFeature optionsFeature; - MapPathFeature mapPathFeature; + std::string pluginStoragePath; static void fn_LilvSetPortValueFunc(const char *port_symbol, void *user_data, diff --git a/src/Storage.cpp b/src/Storage.cpp index a25e4d7..f60201f 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -1770,6 +1770,7 @@ FileRequestResult Storage::GetModFileList2(const std::string &relativePath, cons FileEntry(uploadsDirectory / fileProperty.directory(), fs::path(fileProperty.directory()).filename().string(), true, true)); } result.breadcrumbs_.push_back({"", "Home"}); + result.currentDirectory_ = relativePath; return result; } fs::path modDirectoryPath; @@ -1824,9 +1825,23 @@ FileRequestResult Storage::GetModFileList2(const std::string &relativePath, cons } AddFilesToResult(result, fileProperty, relativePath); + result.currentDirectory_ = relativePath; return result; } +static bool IsChildDirectory(const fs::path& child, const fs::path&parent) { + auto iChild = child.begin(); + for (auto i = parent.begin(); i != parent.end(); ++i) + { + if (iChild == child.end() || (*i) != *iChild) + { + return false; + } + ++iChild; + } + return true; +} + FileRequestResult Storage::GetFileList2(const std::string &relativePath_, const UiFileProperty &fileProperty) { std::string absolutePath = relativePath_; @@ -1843,15 +1858,35 @@ FileRequestResult Storage::GetFileList2(const std::string &relativePath_, const if (fileProperty.directory().empty()) { + throw std::runtime_error("fileProperty.directory() not specified."); } std::filesystem::path pluginRootDirectory = this->GetPluginUploadDirectory() / fileProperty.directory(); - if (absolutePath == "") + if (absolutePath.empty()) { absolutePath = pluginRootDirectory.string(); } + // handle resource directories. + if (!fileProperty.resourceDirectory().empty()) { + if (fileProperty.resourceDirectory() == absolutePath) + { + absolutePath = pluginRootDirectory; + } + } + + if (!IsChildDirectory(absolutePath,pluginRootDirectory)) + { + absolutePath = pluginRootDirectory; + } + + + result.currentDirectory_ = absolutePath; + + + { + // watch out for resource files!!! result.breadcrumbs_.push_back({"", "Home"}); fs::path fsAbsolutePath{absolutePath}; auto iAbsolutePath = fsAbsolutePath.begin(); diff --git a/src/main.cpp b/src/main.cpp index 2f22fb9..c1d4e97 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -398,6 +398,11 @@ int main(int argc, char *argv[]) } Lv2Log::info("Shutdown complete."); + if (systemd) + { + sd_notify(0, "STOPPING=1"); + } + if (g_restart) return EXIT_FAILURE; // indicate to systemd that we want a restart. } From 6c0622abf81b029b5fc5edfd3350c78afd418d7f Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 22 Nov 2024 16:17:46 -0500 Subject: [PATCH 14/17] Avoid double-close of Web Server socket on shutdown. --- src/WebServer.cpp | 22 ++-------------------- src/main.cpp | 7 ------- src/templates/pipedald.service.template | 4 +--- 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/WebServer.cpp b/src/WebServer.cpp index 5563a4e..d0f2b04 100644 --- a/src/WebServer.cpp +++ b/src/WebServer.cpp @@ -1340,30 +1340,12 @@ namespace pipedal StopListening(); //linger bit to see of connections will shut down normally - if(WaitForAllEndpointsClosed(timeoutMs/2)) - { - return; - } - Lv2Log::warning("WebServer: forcibly closing connections"); - - { - std::lock_guard lock{m_sessionsMutex}; - for (auto it = m_connections.begin(); it != m_connections.end(); ++it) - { - try - { - m_endpoint.close(*it, websocketpp::close::status::abnormal_close, "Shutting down"); - } - catch (const std::exception &ignored) - { - } - } - } - if(WaitForAllEndpointsClosed(timeoutMs/2)) + if(WaitForAllEndpointsClosed(timeoutMs)) { return; } Lv2Log::warning("WebServer: failed to close all connections."); + return; } virtual void Join() diff --git a/src/main.cpp b/src/main.cpp index c1d4e97..cb2dfc7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -80,13 +80,6 @@ static bool isJackServiceRunning() return std::filesystem::exists(path); } -static void AsanCheck() -{ - char *t = new char[5]; - t[5] = 'x'; - delete t; - exit(EXIT_FAILURE); -} #if ENABLE_BACKTRACE void segvHandler(int sig) { diff --git a/src/templates/pipedald.service.template b/src/templates/pipedald.service.template index 968b5b2..8b93a57 100644 --- a/src/templates/pipedald.service.template +++ b/src/templates/pipedald.service.template @@ -16,12 +16,10 @@ User=pipedal_d Group=pipedal_d Restart=always TimeoutStartSec=60 +NotifyAccess=all RestartSec=5 TimeoutStopSec=15 WorkingDirectory=/var/pipedal -Environment=JACK_PROMISCUOUS_SERVER=audio -Environment=JACK_NO_AUDIO_RESERVATION=1 - [Install] From ac74ee8711dd7ef73aeb36c7cfdc928639ad927a Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 22 Nov 2024 16:49:46 -0500 Subject: [PATCH 15/17] 1.3.69-Release versioning. --- CMakeLists.txt | 4 ++-- README.md | 4 ++-- docs/Installing.md | 6 +++--- docs/ReleaseNotes.md | 15 +++++++++++++++ docs/download.md | 4 ++-- docs/index.md | 4 ++-- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49f7bb7..ef6e67b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,13 @@ cmake_minimum_required(VERSION 3.16.0) project(pipedal - VERSION 1.3.67 + VERSION 1.3.69 DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi" HOMEPAGE_URL "https://rerdavies.github.io/pipedal" ) EXECUTE_PROCESS( COMMAND dpkg --print-architecture COMMAND tr -d '\n' OUTPUT_VARIABLE DEBIAN_ARCHITECTURE ) -set (DISPLAY_VERSION "PiPedal v1.3.67-Experimetnal") +set (DISPLAY_VERSION "PiPedal v1.3.69-Release") set (PACKAGE_ARCHITECTURE ${DEBIAN_ARCHITECTURE}) set (CMAKE_INSTALL_PREFIX "/usr/") diff --git a/README.md b/README.md index ac613fc..558c9af 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ -Download: v1.3.66 +Download: v1.3.69 Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal). Documentation: [https://rerdavies.github.io/pipedal/Documentation.html](https://rerdavies.github.io/pipedal/Documentation.html). @@ -15,7 +15,7 @@ Documentation: [https://rerdavies.github.io/pipedal/Documentation.html](htt #### Important notice: PiPedal has a submitted a request to support sharing of Pipedal presets at [PatchStorage.com](https:///patchstorage.com). We need your support! Please vote for PiPedal [here](https://patchstorage.com/requests/pipedal/). -#### NEW version 1.3.66 Release, providing [snapshots](https://rerdavies.github.io/pipedal/Snaphots.html), and a new Performance View. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. +#### NEW version 1.3.69 Release, providing [snapshots](https://rerdavies.github.io/pipedal/Snaphots.html), and a new Performance View. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details.   diff --git a/docs/Installing.md b/docs/Installing.md index f036a80..05c7088 100644 --- a/docs/Installing.md +++ b/docs/Installing.md @@ -13,17 +13,17 @@ page_icon: img/Install4.jpg Download the most recent Debian (.deb) package for your platform: -- [Raspberry Pi OS bookworm (64-bit) v1.3.66](https://github.com/rerdavies/pipedal/releases/download/) +- [Raspberry Pi OS bookworm (64-bit) v1.3.69](https://github.com/rerdavies/pipedal/releases/download/) - [Ubuntu/Raspberry Pi OS bullseyeye (64-bit) v1.2.31](https://github.com/rerdavies/pipedal/releases/download/v1.1.31/pipedal_1.1.31_arm64.deb) -Version 1.3.66 has not yet been tested on Ubuntu or Raspberry Pi OS bullseye. On these platforms, we recommend that you use version 1.1.31. +Version 1.3.69 has not yet been tested on Ubuntu or Raspberry Pi OS bullseye. On these platforms, we recommend that you use version 1.1.31. Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install pipedal_1.3.66_arm64.deb + sudo apt-get install pipedal_1.3.69_arm64.deb ``` Adjust accordingly if you have downloaded v1.1.31. diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md index d3e1703..1b6421c 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -1,5 +1,20 @@ # Release Notes +## PiPedal 1.3.69 + +Bug fixes: +- Fix file uploads for Toob NAM and TooB Convolution Reverb. +- Load actual list of Wi-Fi regulatory domains from regulatory database. +- Reload channel list after selecting a new Wi-Fi regulatory domain. +- Hotspot configuration dialog: validate country code and channel selection. +- Add `--fix-permissions` and `-list-wifi-country-codes options` to `pipedalconfig` +- Correct error in `wifi_latency_test` help text. +- Cleaned up Debian package dependencies. +- Correct mDNS service announcements after a name collision. +- Cleaned up build pre-requisite documentation for PiPedal and ToobAmp projects. +- Clean service shutdown: avoid double-close of web server sockets. +- Numerous fixes for Ubutunu 24.04 LTS builds (experimental) + ## PiPedal 1.3.66 Release Bug fixes: diff --git a/docs/download.md b/docs/download.md index 719359e..71fc8fe 100644 --- a/docs/download.md +++ b/docs/download.md @@ -4,7 +4,7 @@ Download the most recent Debian (.deb) package for your platform: -- Raspberry Pi OS Bookworm (64-bit) v1.3.66 +- Raspberry Pi OS Bookworm (64-bit) v1.3.69 Install the package by running @@ -12,7 +12,7 @@ Install the package by running ``` sudo apt update cd ~/Downloads - sudo apt-get install ./pipedal_1.3.66_arm64.deb + sudo apt-get install ./pipedal_1.3.69_arm64.deb ``` Follow the instructions in [_Configuring PiPedal After Installation_](https://rerdavies.github.io/pipedal/Configuring.html) to complete the installation. diff --git a/docs/index.md b/docs/index.md index 8adc641..d6a143b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,7 @@ -v1.3.66 +v1.3.69   @@ -10,7 +10,7 @@ To view PiPedal documentation, click [here](Documentation.md). #### Important notice: PiPedal has a submitted a request to support sharing of Pipedal presets at [PatchStorage.com](https:///patchstorage.com). We urgently need your support! Please vote for PiPedal [here](https://patchstorage.com/requests/pipedal/). -#### NEW version 1.3.66 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details. +#### NEW version 1.3.69 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details.   From 13e77dc35854826dd3fe87d4f6eda5dc967b0606 Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 22 Nov 2024 19:17:00 -0500 Subject: [PATCH 16/17] Sync ToobAmp --- CMakeLists.txt | 2 +- lv2/aarch64/ToobAmp.lv2/CabIR.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/CabSim.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl | 2 +- .../ToobAmp.lv2/ConvolutionReverbStereo.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/InputStage.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/PowerStage2l.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToneStack.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobAmp.so | Bin 1052504 -> 1052504 bytes lv2/aarch64/ToobAmp.lv2/ToobAmpUI.so | Bin 1970832 -> 1970832 bytes lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobML.ttl | 2 +- .../ToobAmp.lv2/ToobNeuralAmpModeler.ttl | 2 +- lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl | 2 +- 20 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ef6e67b..e493246 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,7 +104,7 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "IoT guitar effect pedal for Raspberry Pi" set(CPACK_DEBIAN_PACKAGE_SECTION sound) set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE) -set(CPACK_DEBIAN_PACKAGE_DEPENDS "lv2-dev, authbind, gpg" ) +set(CPACK_DEBIAN_PACKAGE_DEPENDS "lv2-dev, authbind, curl, gpg" ) set(CPACK_PACKAGING_INSTALL_PREFIX /usr) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) diff --git a/lv2/aarch64/ToobAmp.lv2/CabIR.ttl b/lv2/aarch64/ToobAmp.lv2/CabIR.ttl index b4f1999..4566a8e 100644 --- a/lv2/aarch64/ToobAmp.lv2/CabIR.ttl +++ b/lv2/aarch64/ToobAmp.lv2/CabIR.ttl @@ -93,7 +93,7 @@ cabir:impulseFile3 doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ TooB Cab IR is a convolution-based guitar cabinet impulse response simulator. diff --git a/lv2/aarch64/ToobAmp.lv2/CabSim.ttl b/lv2/aarch64/ToobAmp.lv2/CabSim.ttl index f773249..2c1acf8 100644 --- a/lv2/aarch64/ToobAmp.lv2/CabSim.ttl +++ b/lv2/aarch64/ToobAmp.lv2/CabSim.ttl @@ -49,7 +49,7 @@ toob:frequencyResponseVector doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; mod:brand "TooB"; mod:label "TooB CabSim"; diff --git a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl index 8743ff1..bdac290 100644 --- a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverb.ttl @@ -53,7 +53,7 @@ toobimpulse:impulseFile doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ Convolution reverb is a notoriously compute-intensive effect. If you are having performance issues, use the Max T control to constrain the length of the impulse file to diff --git a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl index cfdc3fa..b92ebdc 100644 --- a/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ConvolutionReverbStereo.ttl @@ -51,7 +51,7 @@ toobimpulse:impulseFile doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ diff --git a/lv2/aarch64/ToobAmp.lv2/InputStage.ttl b/lv2/aarch64/ToobAmp.lv2/InputStage.ttl index 81db695..22f5cec 100644 --- a/lv2/aarch64/ToobAmp.lv2/InputStage.ttl +++ b/lv2/aarch64/ToobAmp.lv2/InputStage.ttl @@ -65,7 +65,7 @@ inputStage:filterGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; mod:brand "TooB"; mod:label "TooB Input"; diff --git a/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl b/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl index c50570a..ab5a4b0 100644 --- a/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl +++ b/lv2/aarch64/ToobAmp.lv2/PowerStage2.ttl @@ -67,7 +67,7 @@ pstage:stage3 doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 47 ; + lv2:microVersion 53 ; mod:brand "TooB"; mod:label "Power Stage"; diff --git a/lv2/aarch64/ToobAmp.lv2/PowerStage2l.ttl b/lv2/aarch64/ToobAmp.lv2/PowerStage2l.ttl index cfd715a..ab5a4b0 100644 --- a/lv2/aarch64/ToobAmp.lv2/PowerStage2l.ttl +++ b/lv2/aarch64/ToobAmp.lv2/PowerStage2l.ttl @@ -67,7 +67,7 @@ pstage:stage3 doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; mod:brand "TooB"; mod:label "Power Stage"; diff --git a/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl b/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl index d55d6f2..d809dba 100644 --- a/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl +++ b/lv2/aarch64/ToobAmp.lv2/SpectrumAnalyzer.ttl @@ -58,7 +58,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment "TooB spectrum analyzer" ; mod:brand "TooB"; diff --git a/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl b/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl index 451e884..296fb9b 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToneStack.ttl @@ -55,7 +55,7 @@ tonestack:eqGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; uiext:ui ; diff --git a/lv2/aarch64/ToobAmp.lv2/ToobAmp.so b/lv2/aarch64/ToobAmp.lv2/ToobAmp.so index a7aa33301ff92f8bbdf4ddaba59d4fe832ae3499..964e6ccd24e4dbfe66b0600ccb866a3a6299a7b7 100644 GIT binary patch delta 204720 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 cG<^Avf#`DCpwUggo375@wDsWV@vr#&KaH-997 z*nh3I`G3at18Z`n_|L$K%U+&iU6B0l;s1Hxk%>pL4!J_Cy!!O3R<3E1ZoBFim;b$Z z|I3!#Hki0`Fp+2*Or(vUkWiepC#D^osCMR@1h%szrpvh|CUhQ+(VTZ<%ACYfu$@C< zJm3q%RYdgMv z##aVk+w-*pUq9z7ldm25+KI27`I7mX!`Cithab1=DFeISl6KsR@LFm5@^w-}c&#?Q z_M&6k?pv5Odsa536=6!6ZXV!GN}H}ulf1;T?b@E+KkNRnT`!FLogq!Heu}qeXw!*h z$F`lf=iGVnF8-b?yeFiFwFxN*XXUP(ugr2%2hBZn7weD}k5C_8$|Ss-Z=|=aIcV;I zm(PBlr&pYb#{likEL-?4{cDqw(0`b}L@wdF>yUJ{iu+TKN_A_uVF( z@YL_$OFvuj&$#{3-#=?VTk$l{^Al3^UCh=FZMO~2eOt?ZG)@8|Tz{$5P|Zx%tv-Y-hBf0dBz3r~<%giEFA?MnX})!MY<+7{e2@9=%o z!UNiV_4vGp<|mZ4O`Y@ZlM|M6*9Y_3I1I;sIPcPg+qUwYT-+ngl(z%Z>ULhXOJF@5K|1R5jb=HdcR@?Ar^L9-n(w(#~ z<{i9;bnJ?+cAh=`<+VGko?f>9ku@|8kI<&$80IU^>0iuyI`O!(?TdK}5?b5dAsy#r zEZJ)8Ev;Dl_ztUS70j2Mlh)4Li(7EX+IhdC)vIfXCz-iqtM>AL*YjQL7k?hNj>p{L zD+1J6+;_sE5DleG6|8|uK0T13;Qt2zCX`in#NtaYRBvsX}$kW*>T?f zv{Uv4X=!0v+nAhvYZfWFexK|ksF>wEy)gUv#I4RHi?T0B+}if~qU>d93E$cOfb19d zke6)zDq)?aUDt9}oaQ*i_9f0wEXOa%(H)f_A)x$lb^jYk>%WcVD^2abeDs& zH_XjhvNbKuI%_t^HoQ$bH10~bT@I$3?;Le7-K4g^9Gu-Yhj7kal6_wW(XT%_`?idP z-*(kmL_eqY)ng>i%U27QOi%wTF)h`#9aWlr!gguloVL{Y*>|v|ZQGS+@0?DDc}Dh@ zIV^OS-)29uYofmG+1s;^`&nAJi!)ZAeH39HbT@gB+8($&``ZL*x%uAg`15Dez1bfT z%zy0cv(v)8+ZL>d2hDR<{waH5Qd_X%tHXZ2`pabp9(n&xY%bShtt8p=4QKtIvd>H0 z<{W(VT_%XCHKwcGQZmmhHIu%LRuYIlkk6&&Mkg zSul=TA-U3ujd9(A>=pB8@o{m5G`%5yzT&%&3+LYZvkzsCSMSe0Zy!Hzh4pyaicVgC zN_T6)tQ8k>LVcd&h^#f7PTx89f$ZNWjiXn5_4}Pxe|g(cNB%h;jXV6^jF$7>1KDRY z;J!}w*>k@iu#y(mvRNy>TbAP7<78jK-fecW592x<)R>)3YEEkWuG>Q}|NCw`(=DDq zjwAEOF-Xo%4`!di1^LZ`*+NsY*xk*|*~caDsJ~_JzDHWP@XqtrWVfBSCTHEU-OgKbu5!s` zl^0+8-QT^EbW+KZ6aHJ#cK*WT8M`^}E=guPElZM%oZbVH^V_yRKG~F!W?ts3JSBPN z^QR{NvVG#vwns{nso8D&o}avac1pQ+ohWROq*62kNov9N_a$it%YT`W)T(ttzd9k+ zVRU~&>cf`D5>ml+>%`PE38@jgKTb%4xO^xfExLZ4PTg&lny*ch7FVwml~rj{ zJC(y8EYC*e22zRD)sm#wF!Apt$-{0- zlH{8R{Ew1kVyP`j0V)qll6o`Gk4Tb_&5ucvl3FL+R-Uoz8J;Z`v|5rZY+RF)q>w`4 z>yo71vQCV@Ng(LHO(3_f6FvWtBmBIoCcbT*==hR}v3Qh;v0|KwYuAaYO|-}I zX(q(n*$GLxeVrKCE+JXiuzf-bv1Cy~((YjV)By>}rOo{)U( zI*I}6)(QV~-v5F6vw4q;*pd))u3@0NnBY3b!7l!03b5lAK7am525zT+J%Qdu0N8pD z<6>14^>?omsa*EbqEPu)2E=mqRJmuJs9Vinak%O~2}!dnUMu!Gu{fk3 z_I$}inEq`-(pNC?tTah$A|rdJNjjDu$n(RDcU+p}V$PB@$$pLb(0y%PN-R2_2Coz0 zDIAI}1~@%U3bE%B>fc-^W-8JoAC=3}B;(&?=qlcS#38~62d?H&^{x{cf8qHHo>2*T zeuVy*ej!_hIp|?NN^3a-D6i#EEWVgS@g;{0Rjfx1(=VanAkS!}uNQr2&t5P18(vbj zUoV!UoVi|9Fpz>ZsG^M;HlvR1Xka&*7@~#aXs0M-T*RTnT=Y=I0E;lhGL&{)FDg++ z3sr1D4O`H_4m2@93;WT=DReP&8HW-Tly+i#Oeqw~C>Yp?A^I3$4@x_)7Xv8c3@Ruu zXFya@lGlq;RIvg*tdF1PtQW0lV}KEkqrM9nB*P)P7jyrOU1>mtltqe3sfD=}bVL<{ zx$8wWD)ZKhCe+Z2>$3?cuFqjbm(ee|UQ}U(%_#4&UX)zUxce~i6|`SS2Kk(k4j|+7 zld=2??!TQ+3TYr8#EUD59CJ}e6)h}97c0=mX4F(NaTOCD!o;W?N+4IWGAu=@V7;hA z`4?mqmBZNz)Q(`~e9-9{XC}o!1_c{U96%3eFv7Zc;N#f})K4HFI{Hfq1l1A(xP}2S z57pDwi^BN%bXJZwR$_oQDmsCnaVFzogsF_*(&4Q2A|G8WL*;BDLmyp~OV^98`28v#Qx~mIiE0LlF5=Ljw2TQ+ z#Z@RTCnKn!%tQeeqjfPUN27x4h1wPC#b7+aHS2}Jz-l$)pnEgdEq=b8e*9gcVR`Hw z+#=K)Qd|=Xej^?DOGbN;dx{oLp^vRMQvdLJvG{ikh!yBz4Tk8V{ufe;@+0d-7Jo@8 zxCjlG2~mEG>&G~DGtVeL!J&`ar6}}M&~XYa%&cJoR4~K>lv`K<>R668n(=#VK=ny7 zffjaSfFUX?IsIs2#!Za#6!#u|EW?!CN-E+CY{wA0QT{svpo-GX1cWO3ScD-iN8O_z z8rY2{hG^k9+L*yD^D#I6+ZI*Sp5d&dxc}}yITTb_s~FIt;c5oN2-8vT;E9;Te z=Aec7Xrp~ATZ7H$VLOJ{hY?07{fmCLv7ncj7$u+Ea2pfr6#A)fF{76HS2;u|y~ZiN zo%dZ_uRBQTTik*>iM*SYVSq{<6JY^HZ*w+KdWWsLi@@GxVhlgwb`WTUr6_$$JCv~| zMM0rpqlV3>V>_DI9Y6Q61*|~*jEPYGoB>e5nz$a*S%8L(sADS{*uX+uY{3vaFv0-! zFS!5X6buR(tW*w(6n(5lWi7@l$7Zy?q$3(%bIRjP3~-20*}wu&8s;{T0d*s(M+2ol zuq7jWFrhrop+zZkgII-X=7yB$rJz$Wh&IZk%)>m4uo~rk=z!WW8-&4s^XXWH9yVf# z9jF|;K?G=GKL(gyPrbH5l%ls}gJ?zTgbiW}^`g`UQFu2EmTnNWsA3~}*p5c=1`(l! z@;%g}irUE=L>byx6MHHPK>3^vqTyaLShhiA@*kzfZ#IZNo&(fY5GdB8a=`}SqM4!) z#f1x5@t;V|MMR1=)}p>_gXl&BOYWoNawb3(TTr`{{-|HRLFf&%!{umVHCkAY_7wzz zE=K58ZV*NHbN_t`WfX!dNezbRqjA*+F^(o?JU~4z#t3yZuO>jWurYqVW`oFac*cCR zQ9~Ck3~!*mk-&eqLG)ns2m#vMf5|06QYE8{Dy~8eyW$jLADS4Ujp<~}#T@i7AAKyv z5Gzo5lyOkSF4V9ObqvXz+v4|9!SW2YE;~PXLN-Z3ccm=H-HX@duCS?!t zzMX*4Tg_oZAN%9y4$j7(dH)iJ6!llgC`xPC+9t;7CLj!YneQ+3`-E{*6x1&m2=%oa zMDc?RfaPeSi5Avkh%G36&DO;An8U;Y_A!zA%?2UG6Jf=}v>PA*wAQl~kB~X6Mi=W* z-LOHVIw@$woK}|rMhE~ctVDa1YlSWb=#6a<%A-V%1sGy6Mp%y0I02)AwWwkv>e!10 z4x)+DW6U$o{m-IcQ?UqLT#O#-Xk-kERyru#4~pn-tTb~_1WzzA_Q&oxD2iH`AZt(z zV3Zsb=96rxGAIVo+GkKyt|VZzQQvn^bfAd=TKlFLh=ROuP$*CF0*lba3iRXpR-RP` zialgdbj1N;ANm+!fa#AD5awWn`6wMaC^VF@6y3uZ7sG-43NQx^%tsS7w6GLitiTZK(K}*L_!wXh%7ues3RTSfEBD`|pi;202m`D@ z?MMbd{is3Fi$2bvbu<}aE7ZljN9h>)p^p`4A3G>kp>Z4wh~I0B&sM1?4GKBlA}nHS z%%${yiu-S$Ob1e}o-!!HcneAfMcLm8v+Qj}}SSc-x{q5gR$KsWYw z_6h^cXd~h~i5O+9L`rltQ7N zf{HF`xC(X5h%c@C3(I4V7!vIm71HiC+8sS44Ad46iAFS!84>|{ z#}0|~*J*bg?@`i*L8WQ8EVg>_;sG+@dNK~SE%8>9-KaGj#Z=FLw^nX1h^8d}@ML$Ks zykJN~Z!v&D;gG0D9X*sUV!*fQu#CuQAEJg4mc|1uXJE80W+KK>FCkErFC%jp zT`?pE8Aq*RV#cv*SPZ9ONh|t5D|Ipy3A<=^R&7>6lTbK~l+u4G5380R>dyn?@ zL!$S6>hB&BnLP}M1sGx(TK5bI8>4%NL=UPfhJ^e9?;F|L*hhv^V)2Kp;PD~RjMftj zh|=GO#1s?CnE4JFK?PMTK>r`C6eW*=P(u@4ti=dh(0qn7fEEU5V?Vk$h2AqMCI}di z3Izi!K<`;1kDsv_<$sbgRIv|D)Z$Fwa+IFqJ(@U(>hr9W424(|XR3{H(QGF(sI6vP zlv6JZiSD=oDx@;hF`k$} z2o&x0oQYmmw1M^*p^5I`kZ3}Eh|HiGk!b>#$M_t;XoAD}G50^1;_y+S&mI;kD+uQd zi$(&7uod-PhDCt#uERq5oM+5JGiO-Tptr}c=tphuVPSp2#0!T-PRK&`8y004p@sVX z!(tU`hcfP3JZxADu8r?Mg@P~f_+e3v(pkeI<0~e_TvRYX4~>2@fEGsRqI&kQ=tUc6 zFhu!l>Pv@39$MIn^7+GJ;2XyKH4FWg&lfC9Q3xs2VuX#T{AO5mplq<>0V2gbj8I4A z!eOyIuD@tlw4k({cI%iB^H9S=)UgB&G|;?wSa@h*C(4%&i&W8i2CNts4X9!ZYS@7R z4q}9v8|ZM^uuxFJ0#vaWJ*>qLThP2>SoEQVQT!gW2HBd*VNr@6R-j)woDww@j4PQC zrK^X`$2bknd%A0hR34vQ{y?`NV>R_+Xo zkgYUu98FZ&LJNz~#j)0{K@Da0SjRjxuno?$`gy)Z0HGU8(`hS-co2Zs?;=F6mJjL5MFBcIg9&u?)X&k{Y!4Nx8Dq=!Za0U&OH!~sTp}%ya zs6_L$jbatL*c-pcK@2c+3-@0+eWOsf5E&MsbjC(ejWX6_gyX2_8%4$p?JyTLR8hww zG_VYnGsytD*pAX!8%2mArf;SGZ2F;xMJWnCg))>&H;S701-77Z4w;Cbf4xyG+D0H) zg8FZ0hla6HbfSGB0SN|16+#u_*jEJHe|4nw^$JW6l;8&Vuidgzva-NKES|e;3|~Y5fJ*A zLq~UTqbNsf<3`aPKMPjIK*7$DSoHG*dl-qusG^QKmS)l(<+-%SJk;kzq7tnXg?b7e zs@bdvi%{An62@)>fK{kq9je%bI(lef-tG*H?F8asH~JXHf#EoYn6U$y!dwh?B|uDt z6qZx)vm((Lzra@X<}yHBkK^dhqa7=XupYJSNUTB|`!K|GRvKXrN;#3pM;SF#u^Kh3 zM;+bF1oxl9Dk@CuLJ#{e!U)wQ1MkRt%s~tDF+?5Z-3Sa7tVU^f#z6xI(Z{Tvc%RGG zpoPmZ#QL3547^7qdZ>{0BsDv;B3zEjUSt9#B@#2Jqb!pN%tH?gQJv3TqJ|dQ*nlCn zpt5%)I^y>jpoRVD;#7))ynu=45HYIgVG;URhFTtxqK+=QxC$feLUkW97Qe>`ZA{;V zaWDs!eOWo0sH2a|F~C$c1!G|({I~)3#0_u&p_- z+@HgU7Iw$)^I2FH?GNNIV~BOA9TcTR69wxaPBXgL88^UQln!PO(L|S9qNvoPjp_3k z;1E`Z9#)`nDD5!7ZnO@g9k(gMGIR?fVWa*FG8f;n!&8xva_De4D?;grNR*>h$R47P z9jG0}Er{zeH%Yt2+-uaZ2K{5$lDPg@wgNrO;CdRzMWO&@jm)Bg1E}H*YAFgb_gBYa z^soveY(#Sjkz#=3C?C(B=8^#{#t5rWJ%RS#n-ro)IRh9pbKOvBWg;fF{>dpmkbp23T~yJ3o{7=y;4B=(mi&wMsK3NV zFk0AyHV&YRGZ? z3MytC!N91ZKYK*fVvsQ+x-rBMBOFI*d)gN=FczS+!-%Lv6>XG%J|f&BS>gNSyFu)2-NqdiodJ55k5z!t;n8$>1gqX`jO8m@##(^UulL6hsM?^{N5hJ4MXi|zE z`q+s9_M%)kA_h@MX)zOH76!Nol_MEvG56o3U{c{@1IkAcNZbIsQN<8797i29jv*k- zMH5xDun4202`qkp4DB&EmWhs~zcwP8(Zg=^m(c$>?tef*J&qJ(5k^>s#_=Pf1_N~C z=M(6NK1L`Nu_BFuu@EgRM;|SePGrLPJ$7M;<8l2-^jkvUxHv_@qM)OV%TZm*9-@ZL zsAD@u*pE{2h?qhdGmlS53My!05xQ80^2sb9evfwi9#_Thu`7Om%7{n}#tkS)C(r=% zFu+2LPUTRcRKkkTz-IKYJ+42EjG&Goy2$^+Ly9n?hy|QZiqS?DLo7n|3<5;!jFFV6 zq!3VHp`vpJ(8Lz>u><8ZM?`=I_M?YWD4j(HPUJl*sACZtScWdvpocd4*o*#?*&~e5MC}}|CED1CA-1A=?uhWw!X6ATcPXAXBC3m-_?O%c z3^D6u>VHK*=%;?o3Qi%y3r0j8x)+kFQyK6wR$fAb%emjDk&#MHHELIp36xFhPv`wL z9LD%QV>;I@#2kz;KfZpyK?@kU*4s_#nX$(+SAEmuIy9MrPt?oI>dduAxrgXrP9* zI`?0v&`5=iohUuYVLX$Dn1$L(0z?DL(L@u&R!%dz&#?Dr5%@oOj{%w(KFLjW;|3U^ zG|cHQC&gHaAvU5E5%90c1m>cL#i)(2;<$d4+kgu8po#0 zW-eo*ok#h$Tjs$6RInJ;6oqmMI+}5XOvJHsM)`JI2Ec;ltaR5=(SY)9qoNOWWmM!{ zOg$FH?mH?hjP_%tu?Ny0m4lf061MQLQIT;O7BC+AhmVRLpT#=ux4gyqJMd zI(Ae97#_#_E0|yj5u`6S z6T0Y?a{oOFom2$aiy;o8^y^U}acyMGLKPRGhKo^09SvNLCU#(eA%-}P5oW~K?l+?% zA3bbDMh&~r#6fgXHrZRu!w3set>%oOjwTvd8~eLak!q*l{eDyopmfuy z(5_)1G*P{oNYTe2uIIK$zhwoepk&b=HC&Ds)}fEBas4gyi=S~E1I)OVgjB)+b9O4^k?{RoB!g35#&v0!hD9;ixTG$c4zyKrcN9~_{prC=7zoQ*0=wbnS zSd0;tqq2%EL=9`v#6}FT1Lfx!A5#{E843}qzvspCYy~P42V81 zM%8D)xE^aT#1;%*KOGbXAr z#8y-v91{cRK0GG$I_ljq5n%M#m?--L@1GbGF6u2~q6gil#zf^^1lBs160H=Be~gKY zKQge#MCd)s#PxJ|jum3q#>(y{pmqX9Z8a-I9W(Et-wUh^11v}TMaDtBgFw*0el&3k zEzG=^b{#2FL&2q@06i>5(G65Otho1hQL?gYrIGM^)b@iy3kiyt+$Hd}BGJrZ-0|bo5I^Lr)JSOTNB!I~=(TmYE<3Gg2TUj6~+gJb^ zv&KdA5cgln9Ov6*X|UV4NN-|bEWl{@anXoD?zrf|5C>4+V_eLjy63nkd6<e?w{gOa2 zz#x7;e_Uj=@QjO4|JAri6;qJP$3+Et*o4Nf>3}Boql+0&((yOreD5aD7Z4cw23vy> z4xn-&D@G0Fm9)QTTolJHV=K^JPC%$%LZIkhGS2t^KE({ppQNd zpm`Zv@^`Ep7pqXaisygO|7tRXd}py3#{l!5=K1<@(T+wn0eNKjMiz=e4ed}%rRYdX zb!)$I-=%IK`NYKB^dC5r$ZX5mqAK;w&tbu>loqK?}PvOi{4o4BRp< zI?%^)v~FduS+RWExLA$>ma{UgmW*JCCM(naK)}z??(T7s^DO7;W@0#2$=r z0L^<@$UnLNip^o6;9(W&_YnxH4dY@8HOyQ^Jt`Pr3Ci~q0NU6T*P|cTKfpw&;Q;D5 zgJI*iSo|ClKQu1t(Z^NKasLCC)A&58dX#}te~d$dCbpvSIM*qDUdi6I(a{?hgDAC8 z-%j8!5a4Rwzr{60y_=Pj5fdBGLz8xHKqh$aVJG_7yE?xA6b7k?F#QDvewS3DjQOab zhB_J;Vl!&*aZAv{nfU$tw11Jz^{{0qe?Vq1#6C1XB!eA{{}J!e#+DQXt(R+t0WSI% zEB=_ngAsZtf67+Gn{0AFyOQ2vsXV~FEuf5o1@%u2uE^8>wgWD@;B4lxEB8Q-Tq zA|oh`bN@Ri*qc~ETrtTtc?G9gDf(O3BXkA6N=NKMANyjZ36Z{rl_w^Ih8|X;kv1V( zQJys+1~J6EP8NWLD5Xz`5>(PBQo^91QBj2^Hll^CXrqrV_MkF*LX4xn-GnH5jrKcC zh-M716T{32F@q7xuQSn(OpH3}Xzes1TF}QHly^=|h$#xn&J!Z@4fYNd)UW_`EJhEj zP?^I-=wnV7E8T^GQQCDv)S-`EXk|_Cy`uzz1*pvezsxI>GmRGVYNRqV_)o zaLj~IV~=J0cjEv4r?84bfW4?_>}fy)T!ixR6QUZe6DCAE`q&-U7ZJd_1hkZlyvOs& z6QcZm`lE>|)}o6o7-2UWr%Z?_u0M5x?-Awx8zrQohlo#Og=n149-?&yk$%8{XHJMd z3^C(FQhoLW-!sa@1_84Y7YETpi3RwW6)y-EV~9FR7fy)fC}TCMSpQCny`kVzp<~F( z3>-%jGgx7O`KVq*s?lA}dsHsv5VCUr3Ra4y$pi$d{f_Zau4Ux}YTP~{`s08x<0GE$ zBvWYpfh|f=Fz;dFxZ-{$>SaPK#juHi(0z;*qTWKpAM^YqTY>sY>M>~Llz+m+|DYer z&oD8%*n#%56C%K_B-bD@OzS(ZeZ}ido?XJb9DoMGG?rc|K*6(9p&@Oc|$c z5+MZ-r6FFFkO7Ra7WLCe9eUV}%IUP*$b^`O@>#4Db?n3792OKY&bidbp0|l_OeFBK zO=18e%pG9?zuYA9$Kt>L%SqW78MuHIVRR8IoWP4o)g}hKgw&#UDS@JN*(Omu#l%>S zE_PyY#U_zHO@NiuqkSdgp?}pTF^KxrZ1ra5!BW&s=G~m40fh!C0&IyJU0eRR=kCs1@( zliKa+hdNsSA|Ui$VM})4$8x;JLNa;o+9Xmw1^=y0B5OxpbaPr!d4~@C443d-Qo1ug zR-=c3QSIL(nq=B-U}bX%AR;hyr`Q7Y(=h`S*Vc`reab0Ida+A}@;p^CpFX_CAxMWG>GOC&enX@+ZX%nuqc}n}H9X z6s>3NpdqqlqpC>$v|uh5op~ADEC&Dh;dRPb{oMADd9RYf^Y9V<#%u!3URx zgM2WBC=U~0JqtkX9{Qt>O=zHpCU&BQy~Espo5CO!F4pr2Cf&FAOvv>)X#qWl;cL=$B`3H8SrIQ~Rzo)jvdeA-{RZhU}6 zPq08fxbzmbh7YO`Q+a$+g{_mq;u9+R2P;SAX;OnWS`w!g2hj6aX@b-IEcZB#)4qy8 z(8mVUpPLkY7-8ltuG{mh6xFs#QHj!O7QhFa^una*LhVKFe?FgZN(Td>hYe`_iA93yY-ISmhb@; zeZ$tFG{D~S!4z#^rSn+85Z4gRNir3GKuJ@=j6aytr$jqOnNvbZ@;drXO} z-G~?sl=qqv4YBj5L?3EAK|Xp)^rMPXsAJ{=R)PweSb!E5qmAY0p@}}$Vu+0xVJpgu zr-Y9R_MnCXsN>9nG`|0bf}F>|n1?nNqKhTyp@BYDVSsfQViQK_p>)iY=tLQNQNck} zQQC)bF%MlV#1KpNNfFVptbhs&YvUK#g2r)EB19k4_hmqBN-RPPOE5$;eqKWAQ9YhO z&^UqA$6Isal+f9N0ILsRoTUVa<{4x*pZ9k%PKtt7Hzih~{zoE4yPg!%(Yu!|LDilT z8T<3Tfesj=iI&4*ik}-vB^rMwwFff6<80MItQ5=8Y-VDN{>EA0z1>2fsI8n5se*$U zn1X%?FVIBgDfaGA0>B>BTA2WSR1PEZzcT^qSd1tsSlV4rB69L z$1>qJyhnXK*9Vp1DUov=D?uIojbw<723U+CmZKE00F<#7Rcu5pMWK~~fj*kpgEkJJ zi!tTHg>VT6S!jc_JVK?7B+LLKYSz$UcNLmNBM!(L4J6b31TD6#huW}!UFp2cSY z7o&zPsAC5j7@&#$XyFvvn8{gjQHjqG7Q|-Qk3AUR0ERe&5z0kOoH;G>P|loAi9!kr6(y*mfhN{sgg#0;G9b!0fC|o_it>qU z0p_8Og=k<2nrNVfRp?Ag^Kg1`JPQ0UO|MY z-o(W5^Uc$u`czhSD+849ddBx!JnD%Ggw>k}8pB7UncQN6aM2LlGV+n?6p!y~mitDl9ECT*F1EKWR zv}iydyJNcv8TUQ58g=wax&H=*PAW|7jeVb$pF=>Hhancm_ON2q zK41?~$Hv$X>5m@vqmNUuAJP9@GSoXQicrNe)UXoePo{;PieFG@#_-c=k#Qa?`-}z{ zU;{?D3Y9N-U&e}X5!$#I<&gHMpoKv{TN>A|pB9*pFt4!W0DyGdZ<3D(Irisg=&z zEIQG^0rWAGL#mw1%FsfSRNCil7R{*sl4mmM{)%zPWK_Ocw8#F2eizXHLIT2I8RKF~ zyOe-?5qRvSWdDo5kWv?!R}}W|4j+ z0n`&I4UM~rjD{hq$p6SgG{hbM#4{cJ`$!>b4{R1)^fMY+@m1_)6Nm0<`k{)-!yGzv zA7Lxw`X@GvM%rmll1Vd7D#E-J1%pB%T3CWM8t7sbdRT{@*o4wbR)ksDgE~&3`qXBT ze+?72(jTS26F5fLg~2~Iiy8EvCcxjONj;bdgJ;wGFiohScrZ*E5_Q@n?);1FVGH~U*xb}N1z>>`T2hoq7G7i zeVSA?%^sq$h5L-s>03nR4Xpf(EkeVBbGL{VtS#RnB9tH9!nfVAax6z3O*F9 ztib?XOmCq-D%gt#&R`YFzh_Ia0F~5}TlhA+c+VLCrIieT`qNwZ`JcFo39tbhuo+u$ z)er-syODryBCwnpQHRQIGr~t5d(g%K?7^A%{q8eDzL~AYJWOd63Mm*^f>mgshqdTq zBL>)tA^NE9F(Wd$J=UHx{8uc2?={2!nvDt3MrFZ_=ten@2`#o{;f$!pTC7JOJ&XIV z?KdO(sp#2%hM((6Y7dwZi*Xei*niNB$heimb?^+|y~c{w8L=FtLzoDCY)AQACc2FP z&z})Gs=t~M7Mj?AHnyOL9oUJ%ZA2JS=%+#{XQEmv^KH;jIa}ph(n1% zG?NmUf26~ltztQPyKd#@d2-4Nw~7euqqd5?dNOnIR#Ah}rCWuE3U;D~y=dSdR-tq^ z{V)rgaS?`Cf)N_1R&3?RebT=o#e@_rDmu`{0GqKNL(I5``;WP(Uba#!hU< zR7jzlLV7I*hOhrLS2b%Gil{*oy|vV8J(Ah1$Rt ze#@3OaQ{OJ^;GBsbVMI}P+do6(8b*QafA*i$=ig7A@*Z1XPd}*fB=)*gn{;++e9lW zdv6m{sO_^&lsmX^n`l5Yf1A)63GBdaqN0)eZ!X&=I;b!%-XN0***G{?N zCw1M_+0L2q5cNNK#SeOs>V8s}!M|YCQupJja;dYNM;XFNe>Eu|Sj2NRZL)qeb=mj* zepo>qV&!-JMt+$3$FCZA6;J)+AzG-5qyKTc4(j;rQm=lWfFCcGf5`v;C4he~`Tr## zlRdGW6$~*qPQVW{Dg;=-t43$!)#UDuyDpiYEaQ3APuf&c=f`ah+U4Vu(xu&Z&)iGO zqi@{bcMe&TT)1D(Q~!4x2I!LYle!t|WapMO$zA7V{^(UMqcrlB@szW2O>)m!6;G{m zc0O^pJ(3l(*kT&SQ^kK2zG|rRokVAHK_b`Lr!%=1N9S&s-Or2m{}waI-gsPGkWigx zV!E9VI+I5y_*Gf2C3j6W@ryTp$YOj3SJA%k@BH2bXYIds%XUg%OJ?y~u`YWpd03*r zdHA*Dory|kpVyOTB$}M-US}B7dFJ)xsfkt2)|f8mcTHwDi@^J#QtiPn0{eyOTF0N}Zd!lMD8fUin`T@o7~#@|i!XQ{vF6 z%W>YM`P{r8z54EI@=A3QZzp%%ulv3KE%>{u$*Zm()oF~>PF|55oGpj)kT z<-5cdI*-1aT#%L-I3av_x$zL#9aNqg-*j*;t(yvNx# zoH_54-13e8H@T~J;WSbALw@4vx~QviPJ5r}6z3Lt&CC4ef5|PNMI!-aM9#|hlZTW4 zweKenNJ}4acIrtU&va+@kf1W>4?W2<=2ox&UsB@3TfsT4a)x@6OONT^z^{U#D*nT8 zQYWu^sr%tN#dW>Z_57r6kh;LR<^ytA;@tj0^0-93^V$c*TI@{6Pj$|bA40oxBcxTN z$2+u}Q~oK3zI@!g+z2fXa~oV@Z0 ztD12pKH-GA&XQ00Y%Dy0pGyCI!#F`xyYaD0-4ELr*JbV=|6RD^Q$FM?c@>Wr|A}7} z@T%@7b;Z;*|D>**I^S8#5OW84RruWi|NYdgt9cr1z^7m&R(`9aqIX`e6Ys(KZ~5tKI3;k*`IN_7C8@o#^tJ}*$*jiGMe zA?7ymDktvGABC@Wa?#?v`8nC@cZNPs-j?v4Yrf!Y^*axLk-UK4p0@RiG>|)_AwpzAg;ielEZq#B?ODz@@78WKZ z78d63eJ&!;z5D$=uNTZSpEGl2=FFKhXJ($~KK0K3Wzh_VJYnHmx!@Z)ce)WhGI#=Z z_}0OQEtN>0yw{1Uh{WIKaTd%n+7^QeMgZ0Y%FC3E+2P`D5ncu|! zWf1}vPEkW$r#ct~)*;)!U}kQW!(TAFR7vcY+L3(KWk?satX2}n%Ze{gkAi-p*pM&j z*L70;rQ;Ut--$0BQ|*n2D2eoXX+;_)X&sZh9An0Y!g5HJoRGR8g{V~2U-3tgGb{<> zNU)CfrAu`e*0o7K(I81iAEd}EnRXD*B3yPKM0@c}zCxqIB~gP~S^O2vNRh1?bjZ=K z$X69Xt)+K~0= zH*%jJO%0F4{e5&;lT;S*U?s9!lW&vGLk_+>Dx<%lS2AR-1{JdA8~mRZ+5ZiTfwt}L zk}SQ54w6ydk~>IZ2_i#ZcJGERQlx^VP?lb52l~NEWW~4GfkxT%EhfHE4u4Bm4#>T1f*9Ge>)%* zf(`YMVohMm!pgQCEL(DpGDfp3Bv7xyOZbyDN7338*?klxs*%G4K7K7S?t8~9dr`}9 z6`f@0i$!>{_j}ea*^LfATgauV_QUZ6;vE{FWD6wg9+~jH!!Eyk@3_QXVqv9Kj-dj@ zl6;I_N|iMlbjbc=jlig<4tD=eW_H`yY2wJ|w10C55&P7pZb-g%lzSj$@v3JxHO`TywCJDm_TKkSgSm zlDaIUA{f>|>X6tU94i^z+ke2zO#5`WNNr`tWsElq76H~yE79N|Fj67n_z?q9E(?Ej zOl4C*{_vyYQndW79}!%*jOu4<%#bDhjyb-yU9M@+;d1Dbv(#ww`5CKfF9jRmQ#DpC zDFN%ZU{11Cfb~h(2}V$iB%jcQ%^Z31gkvJE^7a$dYKI&+LHW&c!B38B>}}(QS*DUb zf4Ul(6+dAa3T59i+^$4XOHI-Iz#QyI_F)fg&zI|jzKc|lw*uf z;2gQ|6kd3)EIdVJqh#|b?6TMVZ)M&gheHNVIsAPCiK!B8NH_e(HqResnFhr4fPN0343RVIZ!o6OKWhG(lHgp>J1yF`2Mx~TMQ4ZGB6=3Ba>FSh&#CjWJ z=;xW<#>JSiWyBKmNjTJGWf+`Hvpui~uv`x;0W4eg!or?qA*I8j4XI_yA#dYGOlG2w zF^P#I$A_|-pX3WhB+yGkzpIgj2NnX>=z&Fn?UC)uq5+b%x*3q_!K@mY2et#O3=6N9 z7F7g>8u%J4$=35J8pXMkR0F9LY{>LE!Ro;pCDE6Pji630uo-hyH#F8D8#Kt2T^cYx zHAoll5d@WT!3bkA18pvWy{LjuLTP=u68Q6*rE7sTBaEx?o%W3|p11e&u_!+m9SUJS zW%tR7k!WIwY#C`x#T*?NY5bX*tnxQ*W9~TM53NuF0*pu4qFEhatn>+dL`IxtOk|Wt zo@HDdS@wv#;&;u)%zzE)7#7DX|5^rvtT@ZKg72j7I*Xcz%K;70hO-IU<$|*Z+i^C< zrONWNsdI(wIvX)Wi7k+d70Qf2lJN2OKx53f5~EFJRM)_9#S_Vp-I^;% zjs_YJ+e@2LsQvue`b1kIRE7GDx-uQRyl<8br1_v5!VVy^=H9 zn7q=TuR;xFQ{jiqM=l;%6quI>mIOA?;hr}GtRHM>1Sr3}|ASxAX?~;|>~HOib%24L zgPk$5kx2dNh^?OpONR4YJ+u8hhGXED!}3xN88_e_w76F$53B$z3A$dIt_X~!(-=%i z^B3+cY9KXPFco1`y33S|L4*mie~dBSRti!m8x>)5Y7Ek3b3SVPB z7>{83zgdoJkS8L+e^^wS zqK(Y{`{kRl#${)F@$IbQ5$M3)A7oy(VaUu7!({oC6M_b@Ru3_*^=*3F;#t_rGIf3$ z?Vw-E48HoJ<#MUKcR(ryvs&6Fuo6o;T@ti|G0`}T@ys`?G)R(aW!P}ay#rGgutNfd z1#(?lNG4dg7vHn7VEJJ9bg-~jT1Z(WDTmZ14ug?XA2P zNFQ=5<3u9Ej5qB&&Kf3ZV~Q5Cr6u0usCb=)q`ee!o4T-(6pkEefkSQApeEehNQ>SsI zZt+b3WjB|=$A6CeaRMkSXhoaEF_9oo7EGkfY+0`XyXzCtO*Z8li@bI2ZiVf-GHx`tb>^p?-=1s{}(z7cvbe zSdwc+x*)~N;tLJ-+xe)|P%f4GI_l_@>I+>Ze{vye5GuCG2)tfqPX=5kt0o&$Y+i6I zlCbkkL;gM47)>8_0_&190(~x)*a%`Mc?3daZ-RhhR{0_V3HQo`NEezD33qlDB3+ud zJrX-r#>ca?J$h-Fv6z9rakz%st~@aGH4x~CB~%rUZ1)1bl%H|I^d4Qf%St8^_xm66|4`;>Pu#UEtSqosA^>g zU!EeFUYfiFQWF@q&~-WaUjY^@VN>XiBuSovL8{~XRn|hfNKp%BwQ&7lH6B>teLC~3 zhec#1q#H;G4xl2e4;7Xt&K76LK|{oi51Ce4e;GGz?skhpGSi%v0sYAR4$1G z_5{AtRZd}gsRz`zObyraOW|B9yDl}@;gb1NT~>S9RJ1QtHcusYhP*cwUic?dQMYc1 zj6?Z?Wl0>(q0~6Mk0Lp)0aBet21edAI=oIcOmivON7IbEbzAN-*Z5v`nQ^Tn{;%Dq z@X*d&D!H_W)XML_454O?<~u~EiApMflxe|Yz)Ha~Bzd}Vv8?NK_>F8J?seW_dE-~u z%B9l{KcB$wFdhc%yn@L#K?IQNzf=Ot~8$2Y2Yflwpg}bMTMPm z^eVb2PaH{bE|IsZuglnh7+S)?@0fHdw1yxhfnM-M0$Uw1e+9xr!Vd zW&V#+IGA++go5=-_0&h7AeCNxmNPu~iHy zv5f4gKzgYh!%NT^u%VHoSUi~DeTUurr8KZ~*`LBlN`t$#5e1M^EtnG)rC@Bo%ybR% z*qNwWv&@`n{M)zg<-_t+qa$qOj@3A7rz5sDBH^-d7Rfm!o#mR>_sudU`*=Mh-_J5G zvS&OrT&D7`drYendo3BVSGanA=Hj-0u;i2M_%?c$Wp!`63I9-4OPHNLcb^I zy_JVuTV4Tb(jx%MW$PT{Dtk)tuwH3piy$S5cbdzR*wYyAm2y*>aSwKCZyKI*s7#xS zxoVXqbLr9nd37$vqgdu&Ps$cqf4wou7WLP|9O5o}pZ&EDt~V~h1M!}R+0T`^^YDNC zw#$?A@P9ZkA?n>HqtanvS)@W1mkUdn9K*V2NyNu)cuZAt`2CQS8B;Me%Osj4%uC>QE4=0QvVe?a(@W2hm)IhJc!>1x_$jAF_ zZ`pRralTx7BhGWL%)gPE^~(Ai@tD|Y$-orix@Q=3e4D3zCr_QAW$Q8+n@zGY!}ySz zExC!xb0U2cOR*hmyU(0Ar&3_$2K53a+)NX8$da4sCQhGkh9$G<&Bn81vo7aLX{6Ij zE7@!#83Jz*1ZYHh{2> zI&uKDfZj6u)5YNb`$^TUhMx->KZOG={T_BV-@zNwP;GN2 zSeG2QmHsW3(YLuq$_2L>cia2;FkaN@g0(WC&r&I=CdHM3d?Rm&hmukt`FmiQV18gj z@>N#(V7LU|--c?glL=WU8cVz^IwVAvXVHdM*_6d@Ro>0+{4*<=#VnXpd4aLy)Ldm^ zUuazH<8_N%z0kOj&Rx9FxP{j2UC5BAyo0aU4XzV>Z)cs*EcV+G8aw*88@Jf=`6%B| zOO$KMbIhT#?{>KI$c+Z9NbfKv`3~HPSTSmneh1Tp|6OwH9mYir(A9Ua=hh83kf zldD;QcFG{Cwd&aGRD{j_&{B}be_c%VKIx)zzC1*O(YEmv&yI)%qcmGXh*ZG zUWDRA$gV{U+cr6&LA=cP6%vk-RlmYoq;?EfNcAoL1u7)Fe?_(qIr=MlXkhPf9qu;# z?X{L1apXv#yc(H%H$q`^^KRN-CEM>tC<$_0!ElMrBdC)_d6Zrzn>A>cgLzb%zq0986H?DSc_D{!nfJ~h|K%Y5$(tYD-0Osr)?_) z!}nk8vX!yFMkPXJ=C4`)Hl5|3(El&G)3p{7ZP`o0$Obq77`wz$mTf zMYW$Nf6aKwk_+x3D3Q4u)X9Sc_SUn9OHm$Cf7NPlzX$fs9;6INO<+T6;Uu|!LA_57 z-!rK6`MUZd#Zb>HL;dh~tq0ZwR^x%SgH=h6ve1H)$f}pJ@T+4^_rOBH!UNsYMS-Qu zc3AkP1s-uddJvrpR!X`E7q>xvgjx_b)A?C1Cx3z4Tx;T`_^myVtPM$l6mgzAmI;;%W^G757)Ey~4XLw`g5bUbQY~0I z_j)PT1lHw&wS!?jmeG*3G42iV+sjC3xdxm4U6GJQ8YZ>}*(vEEg;rlLtw99MU@QGWOmdPed(bsqZPM6) z#wOc(q2uO0#I{+zDbGD*Oq8sLm>~yb5g7X;n;yaiDEx^Jmb!QjwkPxN^a_~sG^QnW zQ1^9mR5|&F$wd#d%U>)x55uHiHfpd=_CL(%uax5&V=gFUybs7tg~ZtQ(^!_gsxh9w z&{%`mm&463T&`b^C&A;+%U#n=wFcqx9zkTqkHgcUO1g9xHS@qK!EkVX!y#B1q@hmG z$~QuSg?xS%kJd8h`Z@Gd_i-1v_v`=|6DSNKqdZ9AuOVX#rcCR0s$aGHH^w9%uM6ah z-{6|W$*4zYJIlI9@JX=7kI;lxS*u{LY*#QzIu$ICQAL33B(})qkmVEs2FqFnV`RI6 z#nMU4CoMw$@mpiuh?)jQS)}XU*2I06%w0j^ZL(|yvSbH*1+#Om940v1>ry`a>Vsyl z`jhaRIkA%eTO6p$xIs?A|G;)l8{`zveVlaumZMqc3d3(i7IClXa{UTp+%qc;Kb#HQ zO4t`jq6YMh292_nz^5l!E-5yy3{VxVeM1+k(Z#q%2`NYP;iL*Gq^>3@)n850QaQAm z@|-f^F-oZ6i?4og)=Nt$e$!>RA0u0(y!9B_+9cp{vQ^5=$H~Ug<>M@Z*qVEs>9TC$ zX?L*X9V}6SyIxg*h4bB5Rb0I^tOIjOY$o;n*&{i>r?du= zuRPb7=7{CqL-G_4Oa8iaD5dU0IQN!PtwJevf)YN9Us4Xx&0~QI$Qj% zBc}=^=P6^Hy!(_9se7?cv3Jva)9Dg&TTmdOmnECee68=AA!1ebxaR9MeCd#S{( z=j5k**AcnnL&FiKS^6RSz2@#k1@2cfvVJ|DemH+4bJ$;1TfELy zx$39Ui8lG1}YaX`!u#ryq`fi8YTJ}QnF|D43l)!;o-7XHhmva@ps)Z z|Bo38U_)A>=|aIcdxFLJJ$yTOh?EYgp6dI*EB|`NxBK#M!aK63YaVE+H1 zbg&^-I;Vw#u>mVoJ5Jsco@glBPe(q$Swan@3W=;h>(gXW1&vOV%>=$_Cy&USbRM^h z*+~Czw!P7KBr=NcAP+4NwE8KZFybwk6D$)fMGkCq4H@r067ZhSAK~9CIe+9Jujw*A zx=K2|lt;*?%u!%Nnx|M4*dE#bM;)`5^~(4Yjxbv;82j&kH0C4@{Oqp0jY&OS76a7;h^9=^wnU<(9!- z2{B#fSE|Q((tRNJks{Rt^KVCB9#|+CN93@GOz75utnZ58&YOSV>_OHnrWI_GvU>@1in ze<2vFDl$h_SV-EOdPwCKOp`Z*t&{oH#>I(#Biy+Mc0vcUO2i2^0E;2aNs>4)UZbkU zYNc3`D=8lm=NL*V^B~ngDpk^WM-#WL9^`hg7RmV&IYURfmlym6qewO?DHoDXW_rc& zmj(%^^iOOF6#2X7Du=|=0)Hmg4oIo4JcHfb45?S<|5*)N0N>@ckoq9yfmxILe~C5q zNEZs$A=Szv^ep$}DUdS3tZXyE$~~}ruogM0ECSDVPhJiw)dQ;qEAhY@!1hRT4J-yc zNL`TP1Krv7gB5sSfn9p|y&e|!9!PHe45?d=))?cBOm6)~xs&t3yhf>p8xpvg&HqqK z0_9Uff)Ed^9xT`cYX%FF`I|X23f^o4Ir@nElV->gYe)MZR3CKhX6C6qvX`WoCt_2g zOCS`Ux-l+-E&q_}8yu#nQ~MWkhs%<`;BM#b-1iqYXBDkO zIQeo@9ZSg!*;Gf;5_wO-ZQ{MvnCjC!PJX@BxJa_Mx@Nq^V7fuPm4vPGp2lLt`z7NV zdpjSq_NT#msV|cHEgCHgUcx)z8Gx5Kv}(M6c#>1mq5bEWxRw4nXN&HtRe8N$ahuI;W}|@r%Ehum7FWluVA~AWd18?WP&Vug^p%#Oas>O8SC;!U;lVtR(NUunyy^6f*r217R*QKwrYp$)bvhY7X*s38+IfQ~?f#KjA z>VH)3n1w%`3l<@VUS$LXN$lTInhXsl+x&h|H&Ab78*e}{lXE{QAO=2JkT{6@JNm;> z#!j+wl(7?C*(22&V=1|lH7mod9*~`K0!M|>J-9oRd`{3NpXa>eU^GDCFtO!ypB<-w9NJ%o`b=arLwAVQ; zZ6?K#JX1+gNIjcm&Fh$!2Knf9i~`RfHy}bD#%SR15C^+~+&%KDg4xp9K$1N&dN*5s zseGD!h?kbuJ%Gz+!BoxzU`euSw=p%c%tF%SDJPK-nBMCZ!Cxj=i5%FCThru`yaG}q zSgn79STHB) zD#5B`!d^Hv$jrSsFqwRQekhlw@b~t{Ib5qLvSs^T>f0nI_VSnwk1+lducqs-?j;BM z@Ke_OTmzMA_aMbVY6G(l^Hi`_FslK|0%IzJg}oWlkbo1Y4L^_S#V*O4h_p~uCw(!)5rr;#}Ete%;_?GT7y(3TVHOAR$ zDH)&gEfN%q_uKGg%Tt3OS@t$yp6t?Kk9fbsOqS*?&%I+@GNNk)?Hatdg^cuOL9huj zs=8lOmHEoOP0V*OO)h_ZNfQrFaqnmACTXJ(pUP^t8W@FmugQ3xNo&bI8kiwl_pzX3 z0PaJ_c^c|pbUW+xe^GDd?thUlNIEsfBmD0gciC!v`KYqw+|DVtandm{ppqu1o~?zv z_bzO)9nA==UUoIph9rLbz_`{{YWv?j{-aP7S^J)=D$(zgCtjAnPo5ar`#xr@&99qR z&$m|@A+pfNJa=UIIo@8GBaaR~4dJBFdVpL>{5Lwof`Y)eXpkHh9e%F2S1EQ?lj)_( z8V^`2)CM**PGi6VsdB4?wIGu!ncw2F39AN!?Jev$ z)XOIti;#f*E?Lgdpj#GeP$3)lWA$Z|x=DrVTO`t6PfY~AY zgF)8?$liF4`y>&19>10^)gPe$4UmQ^sbLDFdN6BaGQq4YoTSTlu{f#)G8cSE&@D4G zU~iMa*X!J)GJX#G%#|PVWN;v{&o>g=LyQ*g`w)Gt67N>bBtO&8ie9xyaw`gj*Vu}H z8st@t@wkJ=_yvfM@Z8d6)knywP_}$TqspD`Ewo6dSJ;KtKakdE!j zvEDj4v{5&fU~R@&x@379Rb(Kv@t9NKboscAr%9+m8_)Wu#PjiWEuKrI+YrK!?@RJ0 zDtJg4F2W$G3zGi~_a^m&`GKWd(gixS2J4kY8YF8!#X-shb6S$8g5`n@nMA8wVm{mo}bdEMY7>jCb4=_ zSQ%y-=o6T=PWfPaC?fn2YKX+{Zu->1)CAwFoY)L_L^a zqFmWd=jO`7c4Km4Wg^*pTq#_#3+6YBDz2hv3l;&kBl+m5;=yFDbO~Ti*-Oa?=%aSz zgsnb6jDd837-y{qkXlcQyE6ENd3$w(Wu0cF$`b+>Cz}qi+mk;_&ib77Wzc7gFbwf$ zOc`F+$_<~n9!pvN878<@c7xiRXY<+m(@dO%CF8u=9S!)LzAU+J*hf|YH$Wz}Crjvgi)|=dMjZ?+(l~yZ0S*M7k`~ z7**1sUIIFeIX-~_a&xC~d7{@SK9uWXHOS04!P{#fkWWHeusE=O3+9BD3f9NZCcr;P zj&|~dYTeyO<>Cw@IUou0QtE_#`2tad%3EJhpjVNc_a$d{Z8G~yB%dV@eu;6&m*W}~ z$%9>39ae^2%qt0EKgfd)DI>bw2269f>h1i4uI^iOkdrF^v*q^((Gp&6KZuT1$i9P| zkQ7MRSH|mVB>7Un3cOy{~yDH&qUO&FgcVxc<7E2m0Ab>!#dNnQ@4u z1+wH258~l+9MXsFCh(zOS#>V6=(um_U>*|qh81qQRDXjV;~AZAjlW_i_i2zX5B4xi zW{LeUb2CSshiNGm42)OXaj zOGX_roj&rmfpE@ix<9r}@MT@u}oyb5GRzwsjT)CDIHX^bq>piy>fP$~gGxl}Ik zCt`WB<|oRj=S6Ow8|#xzKhqw(z@M1|c`|swHJD=u*d*v%>8=<9SEy66YJeA91B>OE z0pohSz=H$EU5*Mq&#v`S13nikqPDC(K}S-~NroKm-$}Sv$O#RaWX3NjFw2u)Xkjm} zc(X6T!Q&~04%-u_I9Kc15N7gJ>4t^oUEWn2_L}&_8&2>)otLT2TeJz@=Ec4P-+b-* zwHQZ6G6sIjaObMJ<$Gn6=&hGx3x?uuw4856Ys;dL2iCusH{>-y1sxkwq-h8>% z9SfT6?G*~971S$^zlvGjY~*YSfK#z_2B42@rk+K$F@a~%v`pE07B74`Ng8pTsyI=7 z3}gRU=2RqNJDXUlM4oM4Y|H2S^QE%>Y+ii0_iS?<=3wpF=5$-y#|nD~BKh{SO((1R zlfc-rX@TUemj!|5WK7zsK)_Vl6=*(E2#V#<4U0u(r1rtW}~%Q_EtRKN<@WC+kPMM6+FE*>ZF=Rj(DtdFB+~w*P)F z^QM@NXI7hjGrH$9hK}c0e2mF!+#SOMM=em?joOpD#$c(6I=+|jwbUgTRjrVKV6dJ+ zEG)W}bpD-~1M=vl+R_ac2c~@Va%m74OQv8`H?lSa)8I<^DA=55Yw!C0RO(>u66|J> zkKaML-frHnif%_%b#l;-{23GHla(!(^D!^D*5{l2{OmFD8EZa@tGaru`8%B`L(IEz zr8=5F{kxCAwZ!=_XsCktwAxmv0x9TboTp>webR{o5grNsPvOWyP^|DW6#WH#v0q^3D zGx;5vNqqMHw77J_Sw|7YQazaBkOn~#JDz|?WHg`@4d@9cot7XsInAr=Wz&wGS-qse zBs`n7gKTkP@t9PdbdulYa{UDJ7kgKNdr!3Is919*((~=|;6#Q8E2oJJV*e|TokF|y zZPD*1n&(lHZ4xSl-=P6dM^7@R+jm@b%x%6)yUVphGRfq9QApNBU;(6hu;9~ebrP0> zHOi=Pl(0o&!^zc53ag^DlA_5{h<0}tRc4PWoPixKYs1ZXK7PsaS-5#S1}yOcbG(n= zOu796^RmeHS?n=3MBnPIt zvx@r_W6}dl1@p6D%03Is3oJ`={?3E%0~eY>Y8)ohF&VOOvUwx@xqUJg#Q(Zurz%}z z^qB~3?oyc$ftd06G+4?@#Z-y?#0Z4moObNYxL0|U=V@m&_ zTK(#;C{3mW$0hd~36h z4Q{5D!>RTjU13K@nc`iy^Q|b;*PCSfqRA92VV5wn`eg1UNN<}gy96JgZvAjY)KUfC zizniNMS#_KUwwz z3oMwH5(>tEih(a39fM=i5rc`SmqRhgtwa)IDT*yl4O-JQd5G#EZLF4>tSb80y866NfTn$p#I05{tmc z?^*dJ&b-`KQFH86i+E2n$H{HeOa}(w!D)!5MXINfn1hgMFk8QfVVU4}7ak)bin z*JU(`&AiL7dMrSuW2s7IIe{&0_pzb5sC_zvp+F8Rl@~eU3F>6E1~IZf-kj{)^!+he zd5bwgLT4bT2DxAc<#+JvEyk)*7R^A@vt;!Q%D{z~f!1}&;TaT6Z7yfNZU6Y#sa|BF zms;4&hp|Ai_;T|_2Gr;)$jy{@1@cXoWmmw2eMSvfa$jNIh6*GmP?ZQ-qd|gvqyby5 ziHyLuf#IIeQQlpoMr27M)#Gd>5xI0oXCm_@8;w^YXUx=<$c00!D-m6#9K4cJY0p&z z&9dk!^FH79zn%8d3sy4S%;|Hpf~8<_k$q=Ot&=h=<&Y(B+GRru(&x3p6!RW_B3~xXG(V#kyl0trprJXlP$ibrv&iU_y|Y|X z(?_$+@reVQ_yj%W>ZL=k3TnX(4$^uRK~$~~}rFdhO@7J;|9vnYp@>VegQ zm4K=HqnGMO1K1u(z77@x9?82P#b>#*?FTFHzyg1-4POrn9J|fenKwpOpj=5>0+$w2 zN{U7gtP%`cF-Mz^fRZ#VmnLt7lxmT#Vr^h47AyuV8$se{&!PMCWix?q{lY$(a;KSi zmXd?0tJm!^G0nWxH*3>zeKp%5OVb#~g|a-2(N!xO)5x14@1E-E`#Ae0QIG`>K)XdS;<;oo)%A1ZUcgolhan8jQE~LGYKodKPm*aE;W%4uIH&BBN8FeE;sNAFh z#_C3Mx^LQ_kIQ}c8p*bbr*)YSmH`PFXCO|-LI$}*jlvKgmAi_E`;IVN0IXpkveZh;HK@)oqSPLAI~hDHg? z#L~9PLJb;aQzj|dlh&Ytmx(E_S#DZjPVs3jkk=NN7s<8-w3v110z_6KhZmp`tupFX z{KxQz+^3<2joJgrw^AAnztwyLj`rJF{iH4LJC#59!1n{UnWI&sZe!KXQ!H7e6Ng&Mz>;zKoOBlEw15RSst{6`}qMnRMCkT4+9i2xD)D zX}IjZotjq3(c5Wmra0~(#v#KUbYYS#(^!^lz5~Iq-*Sg}g^&N=#K>lM1D_`w!LmV_ zjb!NbY$VFTNe=rLCA=ML&he?;E|)AaFR|5DtLcrtljLaOo%C3{Y}O!6KGL8;Y(DPv_*Cci95}e*9GH;08#0t{LiE|M%mA z?|%m^qS3rZvWUuO^SY~ftu1xuael1F^&7c+l!`~V2yc5p9{iR0JoT{OjgNwReK*x% zd2lzfXp?;!aE@>{6%Uaac~p+B$YT>Qe_NkCwU_6B+BUO|CWrD!(IK&m*;I*tKpQLzWFQqIdKWy z-7EW+z&=L2?H1aZrSx{0*q4!n!J$E&Y+mLXnw=W!mdN`FT4dS%fWfl$e%$2*u|ELFQtbiMD_d4Q z04+myYY;Cd9-suL#1_zPxY-57*e)+114guf?7Xb>ATf?bA2jbHusww4v4VaG8VAS^ zp>qDF{Pd7{9krkNusP3OHvagT5>V)> z@BBizHOa0*^C@(E_HrDoF4?-AzAuy$%c)v{ME{1AJb&^VViB@MW9f2Kg9@4P2$IC2 zJmPBZ!AH!U#5NTnLQaS@$dHp7jw+>zyklt=pMvG9yLcLCJ?c@sBt8S_rOxY;ykb{Wh9-CVggfs z$98wg|B%fvE_IJ$HTC|na3Mtj2m~OBXk8}fI>>DbJG!IhvoA_#AR(lW+ zmf?Y=fu+m-Ar{u;1(38BR;(0EYhlGI!8qb8K>%GUfJWjfIBS|VFcq8?>j8_AW#k(h zWg$7~*x*K{mXIF?e@s4}NUkM;_Iw%`ud7Ruh$>PNh#yCAOH1aA3d5YqTY89%tZv1cA*l(MP)7-IqBqCug|ehl-KAg?~g z;K5Ko<|^6tIIKe?@^SM&=)QNU`HHTMN*O%0a;TJ1%G9@pfz>E0){xRE)oU0#19DJf zl<<3!usQL2mUQh)Xs-U6vR9M#$ml1?)+Y;}AO*AH6PS^@TWOts6New|e!{#SLpisM z{im$k&%n=>0rPf#8IyLNIMy=wak$pfZU*LB7{C&RZ|BWN-kuM&s#v@-E*f!a(`Qp}*uYh>HN4`?99Ul2A!S=|6byT^*gVYGA z$%923SffX}9x$dOWzpSgS|61h5X-3k!R@g`}GWxsdwh&^pwTsboF9 zyH1kVpO&z7fOU~jJIRXmgJ~yOvB3S>x$Bihkq0RbQlSTy3Rd8OWq~b~PFP6Idesl& zc^+vhz;ZpXI)1_`p^59Xwm70Z8cTZ5&3fV9Co51Zhz11fkT*MNP2ws&SQnGW6!ywP!lo53=nAe`zkDKCyLt(zAciwlK~-?MD=@_svPA>l zwbNjmjNV9)CNno;isNO?Ml38-$wripH%T?9k_msLLG3d0j~M$TS*0;vvDBDTIyJ^R z;#qUvh=JWdoNDlq_y6q(k$*gEj*!A<%?ONb^|KgT)2dCt7e$LnwM@^j{8)ceqLWMn=6ygAuk`}VM9bt0d(&vXh~ z_&k;Al~vEflLx9b)}VpO`+26nE#%D~`2AB}>9NasRji~KYE>o=B{lwViml!o_4rs} zUP1@PN8es$-k2C#^0k{$F7H5B-f|y@wP3km)^XSXRwc>RYO*Y(7%JNZDMS`mBX}0J z)s(eV_EuA8Coj*@VKEZ>CxUcY_9s^3@o)1p$NGkN>KAw$w0p={sbAglxq2I&n!H0M z{Mj7i+y2gA^5|BQcfT{7T-B%>tP9LK%M5^Z$SU$ClJ|_)uF1o{#5{Xo@nEeUY}3G6 zWIrsv@>a-kli@Ghk2 zfyILbdthl`Y*)fU%4^IZqky=-C5_gy6wI$l&e_Zu3X<5(I;5Ip)@Jk9Sd{IXS;HsD zv=`WO7?2GwpqmYH@C6oi+ho~`C~UXvdeNMBzW*=7(o?1tU&HhlZTdudHn|o}$g(6! zCrKAc*srcNZ?tEe8qOU7DXrV(iqvk8XXt;}AC118V{+0UJ^y?dWze4pEdvkq61|8|FL@79n5-9#|CEQrQlRvH2Dj zPPk`4%Der?LI1UoNR1_diowg(*3o}un=FlVuAgW0`_@(U!3{wkeettZlB!X*{uTLm z$;rQBuaIgTGT;@iI`azO%Ikg{JO=2f!(+wetYbn*k;JVSDxR9#N(RnXwvvHgfqTiE z=i9LS^jSsUVTQ{6?jrI34n_6ALcy@;FQH0)e`6L*A)e{m?h|iq93flBVFJTmp7v*jU=SRvSu@pQts6f9RpZHFQLGC^XI&v41Av0a+W1M3GX@W29(YUS5&=ddE*gA@lT z&w{CWN(E!9c{?i8&ufB|&wjzn%sV}@=w&pA%^i*LbmYq@Yd@Z+DyyySdwnuv)hjp< z1KhH{c!jKWgGkCTJ=X@|r1VwZO=+i^%!aR+*Ctl3a96rUl2&+NZD8dVEP`tGfUT2d zJ6y(L(+>7HYkoV-NmHct>GZQ-QxwQaO|fI8dx|n`sa#ww<^Y zaT2`~MPbKtC&M&|H}MAjq@D0$dvd2a#a{XNaA~R?lUf!-}>JF8I^>iHzmR(G)JXE4Vs;t?CiENWy8f5a$9Svd&?KKLllWDJ!Ax4(H zMu%m|hS#VXRzhPz(y1{Prmtf=bX=%Y4RZ_CH;g@WFqYH`@G1xu^W@pQP;OT`*Gi$=WyB zk_(rxMstpDNYLr31pE1T)e>=4rK6Fm@Sv`yh#EbZLbBg7`5{eWt|WDDk%ZS{-eUKc zwffuoe9N73@7qj{?8Uu}eX1MXf97OZl`C!pC3s+|U^O0C7Fd;Z!opr@A!Wj%1X6_r zyn{^AWYIf3rj&Vp|Cux97*a%xp&%HsFUIgx46{bwGfQfa1~gEYa0c7#+s&1duBb~*4q;^~(e|7N@1 zEARA^iDRYm-)3NB#0>Y@E&f~|uMn^hEtpF=r-33DdDIEJZpCCt3q6r8>s#1r9hf1P?B}GTfEQXgTmn*A z?2ZuTnX%AAX$OeL(3|iE?iX-$#h~!1VX6Pwba} ze`NSh&?&L4n7bC4IT%~kYCd4g_5E5uSgSugFwn~BO0DnLGNsaR zxQ+$ugMFBD5_V?Jfb@$A^AOhoa~?wNYXgvgYX{+|PKhe$u%OP%tmjS+Q)eKrrj@Dj38D1z$lVoCI!N4TjEsMpuVg zNU78%n{*+v;4`MVP}%&MYfkO_j2a&Je`DX^hA+&UwWu!`l%;a$3v)_j?SI^*TRRa82xb*c16YS7e~HW318GP? zD)BBzR?G?357x)$VqMx;O)lTSw$sX+F$we6HY`IGRNp8%P7Z&GpxR|d7s^l|>$}KR z^y!ew^CDiwr^5wnA(@KFfi4Q!Cf)}TOb_3QB}kCP8g$7f4ePud<(~pl?~x%>F(sRl)WOg%BF-_~A&!8T=KLg2wVBbjE-+pV2g7b} z(x6!OYYJ!XPxAahGkWBXNbDRDoh)o^MEF|GH_EaPmIK6D5PUjC4avWJezhh*)T;3yw2Pb>ngz>-d- zpP-oR?V)4JAXz)608*)v#ycvwt??k&fmQK|Tso$~LUIifNcA2C^(*G$W($p05mz5} zO?)o?86e#r8S)g<41*mrvW&Rbe}9tO=n+Z!4$rcRn5%#KAZ5z(?+{|YY}H_!bQ1Wc ze>T`Zw#G}aE3*E`P?vNQ&#=S;r?_J)dIWQkB*!)2U6EcoB}LZuGHZE-%0GL} zoAqTq<0vL-hs-?+HA^-h)v+}HXScDG7mFT%S@+tCz=Fm5dvnYUp&q0fNP!+K>NUAX zx@IsxOFBIR>2T$hUwvXD`mECtM3l^(^kDwBLE+SR=y zQxNq45qdY$wJ}}@utQEB<5}9Y8-I2UvyqKp6{jP%ZX#?V_tAkdvR;ECd9{y;nK_{k zOPeaQkE0iuX$`i?_T$h}<-~E96`uJ6fm7E1fREiS$A7?yu94^;&A&3efAS+sz#Zb< z&m3MSH}#uSZF$W<^GHihyAdqa{jR-^z5TFbzu*LXV&tY1Eb{nWh!ae7?63a>*d+^p zA_)(`{RE#7UP&YtEXh9;Ymf~;^H@-w1Pqw^p5oR4lV3m`Enf|ovshF_pM=O!=}BtU zET5b-?{H*ZIdH~}r;A*#kvAv$coob1U(B_8^TKYgi&3_$iu{+d@yIuAI;4F2-x zm3XW>tA8;+Jlnf`=Ywa3KI`M-byCh775W$NjGenjh5pVD&oueG(5u*kS#@6MecsNU zN6!oWI>dwr`x>ycaDw>eb?JNYUhEALT?%E-MVvHLg-{0;#!zYt^(PV9D1LR zU(?QWt`7a`Ebri*$J0W`2D4@#l@n_E#&7YK=U0S|+c`TY^q7x#^UlQF&_JfQo!31c zTFGNhJHOr>`mwKf_s)N83H{@vPcQWj+L;*@w(cJe=NyNtWf3#NhMMRK3&s1}u(6JH zr^!_Z+{sOtTgV;%pWHmJtK`hILFS&h*U5S%Z#zx)ESo3tlpHem|IVGd^XRu>=lU=i zdw)l=bvFzqTi4-U#ag}=4!Pqr+4-(JxqmQs`i=j0?mXUGCU@0ovS;pk$x(7p#{Zo= zLXIjq^EBBr_tKpcj)dLf?Wn(XFuSJ!f@FPf*jNV4UJaNyG{AsszyUjfBQt9->;H&$ z=Y*qS=Z+&;?78En1Qg#fn5Z?nR&f2g;pA AYybcN diff --git a/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl b/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl index aece98e..4494dfe 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobChorus.ttl @@ -40,7 +40,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ Emulation of a Boss CE-2 Chorus. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl b/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl index b2330ba..dd9237e 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobDelay.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ A straightforward no-frills digital delay. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl index 88495ec..dafeda2 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobFlanger.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ Emulation of a Boss BF-2 Flanger, based on circuit analysis and simulation of the original. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl index a3a1dce..c54e093 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobFlangerStereo.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ Digital emulation of a Boss BF-2 Flanger. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl b/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl index 2212071..51f3e1f 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobFreeverb.ttl @@ -41,7 +41,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ Toob Freeverb is an Lv2 implementation of the famous Freeverb reverb effect. FreeVerb delivers a well-balanced reverb with very little tonal coloration. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobML.ttl b/lv2/aarch64/ToobAmp.lv2/ToobML.ttl index c842055..d883091 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobML.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobML.ttl @@ -65,7 +65,7 @@ toobml:sagGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ The TooB ML Amplifier plugin provides emulation of a variety of amplifiers and overdrive pedals that are implemented using neural-network-based machine learning models of real amplifiers. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl b/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl index 0d628f8..d4d869f 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobNeuralAmpModeler.ttl @@ -61,7 +61,7 @@ toobNam:eqGroup doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ A port of Steven Atkinson's Neural Amp Modeler to LV2. diff --git a/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl b/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl index e3b1a4b..e185b2e 100644 --- a/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl +++ b/lv2/aarch64/ToobAmp.lv2/ToobTuner.ttl @@ -40,7 +40,7 @@ doap:license ; doap:maintainer ; lv2:minorVersion 0 ; - lv2:microVersion 52 ; + lv2:microVersion 53 ; rdfs:comment """ TooB Tuner is a chromatic guitar tuner. """ ; From 2ba440c57cbc00659547d4473be1ed3a6d5d31bf Mon Sep 17 00:00:00 2001 From: "Robin E. R. Davies" Date: Fri, 22 Nov 2024 19:22:55 -0500 Subject: [PATCH 17/17] Release notes copyedit. --- docs/ReleaseNotes.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md index 1b6421c..e68fbfc 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -3,17 +3,17 @@ ## PiPedal 1.3.69 Bug fixes: -- Fix file uploads for Toob NAM and TooB Convolution Reverb. +- Fix file uploads for TooB NAM and TooB Convolution Reverb. - Load actual list of Wi-Fi regulatory domains from regulatory database. - Reload channel list after selecting a new Wi-Fi regulatory domain. - Hotspot configuration dialog: validate country code and channel selection. - Add `--fix-permissions` and `-list-wifi-country-codes options` to `pipedalconfig` - Correct error in `wifi_latency_test` help text. - Cleaned up Debian package dependencies. -- Correct mDNS service announcements after a name collision. -- Cleaned up build pre-requisite documentation for PiPedal and ToobAmp projects. +- Correct bug with mDNS service announcements after a name collision. +- Cleaned up build prerequisite documentation for PiPedal and ToobAmp projects. - Clean service shutdown: avoid double-close of web server sockets. -- Numerous fixes for Ubutunu 24.04 LTS builds (experimental) +- Numerous fixes for Ubuntu 24.04 LTS builds for arm64 and amd64. (experimental) ## PiPedal 1.3.66 Release