From 3421bd652c39b253872e43d3b6e43664bd0b66e2 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 28 Aug 2024 15:30:53 +1000 Subject: [PATCH] When clicking a track in the file browser, play it Includes adding a `playback.is_playable` for working out whether or not a particular file is able to be played --- lua/file_browser.lua | 8 ++++++-- src/tangara/lua/file_iterator.cpp | 1 - src/tangara/lua/file_iterator.hpp | 3 +-- src/tangara/lua/lua_filesystem.cpp | 7 ------- src/tangara/ui/ui_fsm.cpp | 26 +++++++++++++++++++++----- 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/lua/file_browser.lua b/lua/file_browser.lua index f4f6f216..08d683e1 100644 --- a/lua/file_browser.lua +++ b/lua/file_browser.lua @@ -65,11 +65,15 @@ return screen:new { iterator = filesystem.iterator(item:filepath()), breadcrumb = item:filepath() }) - end - if item:filepath():match("%.playlist$") then + elseif item:filepath():match("%.playlist$") then queue.open_playlist(item:filepath()) playback.playing:set(true) backstack.push(playing:new()) + elseif playback.is_playable(item:filepath()) then + queue.clear() + queue.add(item:filepath()) + playback.playing:set(true) + backstack.push(playing:new()) end end end diff --git a/src/tangara/lua/file_iterator.cpp b/src/tangara/lua/file_iterator.cpp index 823775e8..71daf2d8 100644 --- a/src/tangara/lua/file_iterator.cpp +++ b/src/tangara/lua/file_iterator.cpp @@ -79,7 +79,6 @@ auto FileIterator::iterate(bool show_hidden) -> bool { .index = offset_, .isHidden = hidden, .isDirectory = (info.fattrib & AM_DIR) > 0, - .isTrack = false, // TODO .filepath = original_path_ + (original_path_.size() > 0 ? "/" : "") + info.fname, .name = info.fname, diff --git a/src/tangara/lua/file_iterator.hpp b/src/tangara/lua/file_iterator.hpp index c4071445..2d5c2d7d 100644 --- a/src/tangara/lua/file_iterator.hpp +++ b/src/tangara/lua/file_iterator.hpp @@ -19,7 +19,6 @@ struct FileEntry { int index; bool isHidden; bool isDirectory; - bool isTrack; std::string filepath; std::string name; }; @@ -44,4 +43,4 @@ class FileIterator { auto iterate(bool reverse = false) -> bool; }; -} // namespace lua \ No newline at end of file +} // namespace lua diff --git a/src/tangara/lua/lua_filesystem.cpp b/src/tangara/lua/lua_filesystem.cpp index e3a3018d..9c2ea880 100644 --- a/src/tangara/lua/lua_filesystem.cpp +++ b/src/tangara/lua/lua_filesystem.cpp @@ -117,12 +117,6 @@ static auto file_entry_is_hidden(lua_State* state) -> int { return 1; } -static auto file_entry_is_track(lua_State* state) -> int { - lua::FileEntry* entry = check_file_entry(state, 1); - lua_pushboolean(state, entry->isTrack); - return 1; -} - static auto file_entry_name(lua_State* state) -> int { lua::FileEntry* entry = check_file_entry(state, 1); lua_pushlstring(state, entry->name.c_str(), entry->name.size()); @@ -139,7 +133,6 @@ static const struct luaL_Reg kFileEntryFuncs[] = {{"filepath", file_entry_path}, {"name", file_entry_name}, {"is_directory", file_entry_is_dir}, {"is_hidden", file_entry_is_hidden}, - {"is_track", file_entry_is_track}, {"__tostring", file_entry_name}, {"__gc", file_entry_gc}, {NULL, NULL}}; diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp index a20eb0ef..94d1caf8 100644 --- a/src/tangara/ui/ui_fsm.cpp +++ b/src/tangara/ui/ui_fsm.cpp @@ -15,6 +15,8 @@ #include "FreeRTOSConfig.h" #include "draw/lv_draw_buf.h" #include "drivers/bluetooth.hpp" +#include "lauxlib.h" +#include "lua.h" #include "lvgl.h" #include "core/lv_group.h" @@ -609,11 +611,25 @@ void Lua::entry() { {"discovered_devices", &sBluetoothDiscoveredDevices}, {"known_devices", &sBluetoothKnownDevices}, }); - registry.AddPropertyModule("playback", { - {"playing", &sPlaybackPlaying}, - {"track", &sPlaybackTrack}, - {"position", &sPlaybackPosition}, - }); + registry.AddPropertyModule( + "playback", + { + {"playing", &sPlaybackPlaying}, + {"track", &sPlaybackTrack}, + {"position", &sPlaybackPosition}, + {"is_playable", + [&](lua_State* s) { + size_t len; + const char* path = luaL_checklstring(s, 1, &len); + auto res = sServices->tag_parser().ReadAndParseTags({path, len}); + if (res) { + lua_pushboolean(s, true); + } else { + lua_pushboolean(s, false); + } + return 1; + }}, + }); registry.AddPropertyModule( "queue", {