Support adding filepaths to the track queue

custom
jacqueline 8 months ago
parent 9145722b08
commit af7a70450e
  1. 16
      src/tangara/audio/track_queue.cpp
  2. 12
      src/tangara/audio/track_queue.hpp
  3. 18
      src/tangara/lua/lua_queue.cpp

@ -161,12 +161,6 @@ auto TrackQueue::getFilepath(database::TrackId id)
return db->getTrackPath(id);
}
// TODO WIP: Atm only appends are allowed, this will only ever append regardless
// of what index is given. But it is kept like this for compatability for now.
auto TrackQueue::insert(Item i, size_t index) -> void {
append(i);
}
auto TrackQueue::append(Item i) -> void {
bool was_queue_empty;
bool current_changed;
@ -186,6 +180,16 @@ auto TrackQueue::append(Item i) -> void {
updateShuffler(was_queue_empty);
}
notifyChanged(current_changed, Reason::kExplicitUpdate);
} else if (std::holds_alternative<std::string>(i)) {
auto& path = std::get<std::string>(i);
if (!path.empty()) {
{
const std::unique_lock<std::shared_mutex> lock(mutex_);
playlist_.append(std::get<std::string>(i));
updateShuffler(was_queue_empty);
}
notifyChanged(current_changed, Reason::kExplicitUpdate);
}
} else if (std::holds_alternative<database::TrackIterator>(i)) {
// Iterators can be very large, and retrieving items from them often
// requires disk i/o. Handle them asynchronously so that inserting them

@ -16,8 +16,8 @@
#include "cppbor_parse.h"
#include "database/database.hpp"
#include "database/track.hpp"
#include "tasks.hpp"
#include "playlist.hpp"
#include "tasks.hpp"
namespace audio {
@ -68,16 +68,18 @@ class TrackQueue {
TrackQueue(tasks::WorkerPool& bg_worker, database::Handle db);
/* Returns the currently playing track. */
using TrackItem = std::variant<std::string, database::TrackId, std::monostate>;
using TrackItem =
std::variant<std::string, database::TrackId, std::monostate>;
auto current() const -> TrackItem;
auto currentPosition() const -> size_t;
auto totalSize() const -> size_t;
auto open() -> bool;
auto openPlaylist(const std::string& playlist_file, bool notify = true) -> bool;
auto openPlaylist(const std::string& playlist_file, bool notify = true)
-> bool;
using Item = std::variant<database::TrackId, database::TrackIterator>;
auto insert(Item, size_t index = 0) -> void;
using Item =
std::variant<database::TrackId, database::TrackIterator, std::string>;
auto append(Item i) -> void;
auto updateShuffler(bool andUpdatePosition) -> void;

@ -4,6 +4,7 @@
* SPDX-License-Identifier: GPL-3.0-only
*/
#include "audio/audio_events.hpp"
#include "lua/lua_database.hpp"
#include <memory>
@ -39,6 +40,14 @@ static auto queue_add(lua_State* state) -> int {
audio::TrackQueue& queue = instance->services().track_queue();
queue.append(id);
});
} else if (lua_isstring(state, 1)) {
size_t len;
const char* str = luaL_checklstring(state, 1, &len);
std::string path{str, len};
instance->services().bg_worker().Dispatch<void>([=]() {
audio::TrackQueue& queue = instance->services().track_queue();
queue.append(path);
});
} else {
database::Iterator* it = db_check_iterator(state, 1);
instance->services().bg_worker().Dispatch<void>([=]() {
@ -70,10 +79,11 @@ static auto queue_open_playlist(lua_State* state) -> int {
return 0;
}
static const struct luaL_Reg kQueueFuncs[] = {{"add", queue_add},
{"clear", queue_clear},
{"open_playlist", queue_open_playlist},
{NULL, NULL}};
static const struct luaL_Reg kQueueFuncs[] = {
{"add", queue_add},
{"clear", queue_clear},
{"open_playlist", queue_open_playlist},
{NULL, NULL}};
static auto lua_queue(lua_State* state) -> int {
luaL_newlib(state, kQueueFuncs);

Loading…
Cancel
Save