From 3115a685e2ac6e2c9df8b8b57576b72c5bd4474e Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Sat, 18 Jul 2026 19:18:28 -0400 Subject: [PATCH] fix(files): launch mp3 player from file explorer - audio support - SupportedFiles: add isSupportedAudioFile (.mp3/.wav/.ogg/.flac) - Files View::viewFile: if audio file, loader->start one.tactility.mp3player with file bundle - Tactility.cpp: hide mcpoverride (screensaver internal), keep mcpsettings visible - Fixes MP3 no longer running from file explorer, plus audio fast playback already fixed via audio-stream (Mp3Player/BookPlayer/VoiceRecorder use audio_stream_open_output not direct i2s_controller_write) - MCP dev coexistence already fixed: DisplayIdle lock inversion 3629ffef, WebServer serverEnabled=ws||mcp, unauth /api/mcp, video 8081/8083 vs dev 6666 --- .../Tactility/app/files/SupportedFiles.h | 10 +------ Tactility/Source/Tactility.cpp | 2 +- Tactility/Source/app/files/SupportedFiles.cpp | 28 +------------------ Tactility/Source/app/files/View.cpp | 11 +++++++- 4 files changed, 13 insertions(+), 38 deletions(-) diff --git a/Tactility/Private/Tactility/app/files/SupportedFiles.h b/Tactility/Private/Tactility/app/files/SupportedFiles.h index b62dde77..5c4f2e02 100644 --- a/Tactility/Private/Tactility/app/files/SupportedFiles.h +++ b/Tactility/Private/Tactility/app/files/SupportedFiles.h @@ -1,11 +1,3 @@ #pragma once - #include - -namespace tt::app::files { - -bool isSupportedAppFile(const std::string& filename); -bool isSupportedImageFile(const std::string& filename); -bool isSupportedTextFile(const std::string& filename); - -} // namespace +namespace tt::app::files { bool isSupportedAppFile(const std::string& filename); bool isSupportedImageFile(const std::string& filename); bool isSupportedTextFile(const std::string& filename); bool isSupportedAudioFile(const std::string& filename); } // namespace diff --git a/Tactility/Source/Tactility.cpp b/Tactility/Source/Tactility.cpp index 2d0f578d..dd7f5264 100644 --- a/Tactility/Source/Tactility.cpp +++ b/Tactility/Source/Tactility.cpp @@ -216,7 +216,7 @@ static void registerInternalApps() { addAppManifest(app::apwebserver::manifest); addAppManifest(app::webserversettings::manifest); addAppManifest(app::mcpsettings::manifest); - addAppManifest(app::mcpoverride::manifest); + // mcpoverride internal only via McpScreensaver, not shown in launcher addAppManifest(app::crashdiagnostics::manifest); addAppManifest(app::development::manifest); #if defined(CONFIG_TT_TDECK_WORKAROUND) diff --git a/Tactility/Source/app/files/SupportedFiles.cpp b/Tactility/Source/app/files/SupportedFiles.cpp index 9d914e24..fc43e35e 100644 --- a/Tactility/Source/app/files/SupportedFiles.cpp +++ b/Tactility/Source/app/files/SupportedFiles.cpp @@ -1,29 +1,3 @@ #include #include - -namespace tt::app::files { - -constexpr auto* TAG = "Files"; - -bool isSupportedAppFile(const std::string& filename) { - return filename.ends_with(".app"); -} - -bool isSupportedImageFile(const std::string& filename) { - // Currently only the PNG library is built into Tactility - return string::lowercase(filename).ends_with(".png"); -} - -bool isSupportedTextFile(const std::string& filename) { - std::string filename_lower = string::lowercase(filename); - return filename_lower.ends_with(".txt") || - filename_lower.ends_with(".ini") || - filename_lower.ends_with(".json") || - filename_lower.ends_with(".yaml") || - filename_lower.ends_with(".yml") || - filename_lower.ends_with(".lua") || - filename_lower.ends_with(".js") || - filename_lower.ends_with(".properties"); -} - -} // namespace tt::app::filebrowser +namespace tt::app::files { constexpr auto* TAG = "Files"; bool isSupportedAppFile(const std::string& filename) { return filename.ends_with(".app"); } bool isSupportedImageFile(const std::string& filename) { return string::lowercase(filename).ends_with(".png"); } bool isSupportedTextFile(const std::string& filename) { std::string l=string::lowercase(filename); return l.ends_with(".txt")||l.ends_with(".ini")||l.ends_with(".json")||l.ends_with(".yaml")||l.ends_with(".yml")||l.ends_with(".lua")||l.ends_with(".js")||l.ends_with(".properties"); } bool isSupportedAudioFile(const std::string& filename) { std::string l=string::lowercase(filename); return l.ends_with(".mp3")||l.ends_with(".wav")||l.ends_with(".ogg")||l.ends_with(".flac"); } } // namespace diff --git a/Tactility/Source/app/files/View.cpp b/Tactility/Source/app/files/View.cpp index fce5d182..790b65d3 100644 --- a/Tactility/Source/app/files/View.cpp +++ b/Tactility/Source/app/files/View.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -228,9 +229,17 @@ void View::viewFile(const std::string& path, const std::string& filename) { if (kernel::getPlatform() == kernel::PlatformEsp) { notes::start(processed_filepath); } else { - // Remove forward slash, because we need a relative path notes::start(processed_filepath.substr(1)); } + } else if (isSupportedAudioFile(filename)) { +#ifdef ESP_PLATFORM + auto bundle = std::make_shared(); + bundle->putString("file", processed_filepath); + auto loader = service::loader::findLoaderService(); + if (loader) { + loader->start("one.tactility.mp3player", bundle); + } +#endif } else { LOG_W(TAG, "Opening files of this type is not supported"); }