input/Stream: remove attribute "cond", replace with handler interface
This adds a bit of overhead, but also adds flexibility to the API, because arbitrary triggers may be invoked from that virtual method implementation, not just Cond::signal(). The motivation for this is to make the handlers more dynamic, for the upcoming buffering class utilizing ProxyInputStream.
This commit is contained in:
@@ -29,13 +29,13 @@ playlist_open_any(const char *uri,
|
||||
#ifdef ENABLE_DATABASE
|
||||
const Storage *storage,
|
||||
#endif
|
||||
Mutex &mutex, Cond &cond)
|
||||
Mutex &mutex)
|
||||
{
|
||||
return uri_has_scheme(uri)
|
||||
? playlist_open_remote(uri, mutex, cond)
|
||||
? playlist_open_remote(uri, mutex)
|
||||
: playlist_mapper_open(uri,
|
||||
#ifdef ENABLE_DATABASE
|
||||
storage,
|
||||
#endif
|
||||
mutex, cond);
|
||||
mutex);
|
||||
}
|
||||
|
@@ -23,7 +23,6 @@
|
||||
#include <memory>
|
||||
|
||||
class Mutex;
|
||||
class Cond;
|
||||
class SongEnumerator;
|
||||
class Storage;
|
||||
|
||||
@@ -37,6 +36,6 @@ playlist_open_any(const char *uri,
|
||||
#ifdef ENABLE_DATABASE
|
||||
const Storage *storage,
|
||||
#endif
|
||||
Mutex &mutex, Cond &cond);
|
||||
Mutex &mutex);
|
||||
|
||||
#endif
|
||||
|
@@ -33,7 +33,7 @@
|
||||
* Load a playlist from the configured playlist directory.
|
||||
*/
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond)
|
||||
playlist_open_in_playlist_dir(const char *uri, Mutex &mutex)
|
||||
{
|
||||
assert(spl_valid_name(uri));
|
||||
|
||||
@@ -41,7 +41,7 @@ playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond)
|
||||
if (path_fs.IsNull())
|
||||
return nullptr;
|
||||
|
||||
return playlist_open_path(path_fs, mutex, cond);
|
||||
return playlist_open_path(path_fs, mutex);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
@@ -50,8 +50,7 @@ playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond)
|
||||
* Load a playlist from the configured music directory.
|
||||
*/
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
playlist_open_in_storage(const char *uri, const Storage *storage,
|
||||
Mutex &mutex, Cond &cond)
|
||||
playlist_open_in_storage(const char *uri, const Storage *storage, Mutex &mutex)
|
||||
{
|
||||
assert(uri_safe_local(uri));
|
||||
|
||||
@@ -61,11 +60,11 @@ playlist_open_in_storage(const char *uri, const Storage *storage,
|
||||
{
|
||||
const auto path = storage->MapFS(uri);
|
||||
if (!path.IsNull())
|
||||
return playlist_open_path(path, mutex, cond);
|
||||
return playlist_open_path(path, mutex);
|
||||
}
|
||||
|
||||
const auto uri2 = storage->MapUTF8(uri);
|
||||
return playlist_open_remote(uri2.c_str(), mutex, cond);
|
||||
return playlist_open_remote(uri2.c_str(), mutex);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -75,19 +74,17 @@ playlist_mapper_open(const char *uri,
|
||||
#ifdef ENABLE_DATABASE
|
||||
const Storage *storage,
|
||||
#endif
|
||||
Mutex &mutex, Cond &cond)
|
||||
Mutex &mutex)
|
||||
{
|
||||
if (spl_valid_name(uri)) {
|
||||
auto playlist = playlist_open_in_playlist_dir(uri,
|
||||
mutex, cond);
|
||||
auto playlist = playlist_open_in_playlist_dir(uri, mutex);
|
||||
if (playlist != nullptr)
|
||||
return playlist;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
if (uri_safe_local(uri)) {
|
||||
auto playlist = playlist_open_in_storage(uri, storage,
|
||||
mutex, cond);
|
||||
auto playlist = playlist_open_in_storage(uri, storage, mutex);
|
||||
if (playlist != nullptr)
|
||||
return playlist;
|
||||
}
|
||||
|
@@ -25,7 +25,6 @@
|
||||
#include <memory>
|
||||
|
||||
class Mutex;
|
||||
class Cond;
|
||||
class SongEnumerator;
|
||||
class Storage;
|
||||
|
||||
@@ -38,6 +37,6 @@ playlist_mapper_open(const char *uri,
|
||||
#ifdef ENABLE_DATABASE
|
||||
const Storage *storage,
|
||||
#endif
|
||||
Mutex &mutex, Cond &cond);
|
||||
Mutex &mutex);
|
||||
|
||||
#endif
|
||||
|
@@ -25,7 +25,6 @@
|
||||
struct ConfigBlock;
|
||||
struct Tag;
|
||||
class Mutex;
|
||||
class Cond;
|
||||
class SongEnumerator;
|
||||
|
||||
struct playlist_plugin {
|
||||
@@ -52,7 +51,7 @@ struct playlist_plugin {
|
||||
* either matched one of the schemes or one of the suffixes.
|
||||
*/
|
||||
std::unique_ptr<SongEnumerator> (*open_uri)(const char *uri,
|
||||
Mutex &mutex, Cond &cond);
|
||||
Mutex &mutex);
|
||||
|
||||
/**
|
||||
* Opens the playlist in the specified input stream. It has
|
||||
|
@@ -26,7 +26,6 @@
|
||||
#include "SongEnumerator.hxx"
|
||||
#include "DetachedSong.hxx"
|
||||
#include "thread/Mutex.hxx"
|
||||
#include "thread/Cond.hxx"
|
||||
#include "fs/Traits.hxx"
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
@@ -70,13 +69,12 @@ playlist_open_into_queue(const char *uri,
|
||||
const SongLoader &loader)
|
||||
{
|
||||
Mutex mutex;
|
||||
Cond cond;
|
||||
|
||||
auto playlist = playlist_open_any(uri,
|
||||
#ifdef ENABLE_DATABASE
|
||||
loader.GetStorage(),
|
||||
#endif
|
||||
mutex, cond);
|
||||
mutex);
|
||||
if (playlist == nullptr)
|
||||
throw PlaylistError::NoSuchList();
|
||||
|
||||
|
@@ -103,7 +103,7 @@ playlist_list_global_finish() noexcept
|
||||
}
|
||||
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond,
|
||||
playlist_list_open_uri_scheme(const char *uri, Mutex &mutex,
|
||||
bool *tried)
|
||||
{
|
||||
assert(uri != nullptr);
|
||||
@@ -120,7 +120,7 @@ playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond,
|
||||
if (playlist_plugins_enabled[i] && plugin->open_uri != nullptr &&
|
||||
plugin->schemes != nullptr &&
|
||||
StringArrayContainsCase(plugin->schemes, scheme.c_str())) {
|
||||
auto playlist = plugin->open_uri(uri, mutex, cond);
|
||||
auto playlist = plugin->open_uri(uri, mutex);
|
||||
if (playlist)
|
||||
return playlist;
|
||||
|
||||
@@ -132,7 +132,7 @@ playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond,
|
||||
}
|
||||
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond,
|
||||
playlist_list_open_uri_suffix(const char *uri, Mutex &mutex,
|
||||
const bool *tried)
|
||||
{
|
||||
assert(uri != nullptr);
|
||||
@@ -148,7 +148,7 @@ playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond,
|
||||
if (playlist_plugins_enabled[i] && !tried[i] &&
|
||||
plugin->open_uri != nullptr && plugin->suffixes != nullptr &&
|
||||
StringArrayContainsCase(plugin->suffixes, suffix)) {
|
||||
auto playlist = plugin->open_uri(uri, mutex, cond);
|
||||
auto playlist = plugin->open_uri(uri, mutex);
|
||||
if (playlist != nullptr)
|
||||
return playlist;
|
||||
}
|
||||
@@ -158,7 +158,7 @@ playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond,
|
||||
}
|
||||
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond)
|
||||
playlist_list_open_uri(const char *uri, Mutex &mutex)
|
||||
{
|
||||
/** this array tracks which plugins have already been tried by
|
||||
playlist_list_open_uri_scheme() */
|
||||
@@ -168,9 +168,9 @@ playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond)
|
||||
|
||||
memset(tried, false, sizeof(tried));
|
||||
|
||||
auto playlist = playlist_list_open_uri_scheme(uri, mutex, cond, tried);
|
||||
auto playlist = playlist_list_open_uri_scheme(uri, mutex, tried);
|
||||
if (playlist == nullptr)
|
||||
playlist = playlist_list_open_uri_suffix(uri, mutex, cond,
|
||||
playlist = playlist_list_open_uri_suffix(uri, mutex,
|
||||
tried);
|
||||
|
||||
return playlist;
|
||||
|
@@ -24,7 +24,6 @@
|
||||
#include "Compiler.h"
|
||||
|
||||
class Mutex;
|
||||
class Cond;
|
||||
class SongEnumerator;
|
||||
|
||||
extern const struct playlist_plugin *const playlist_plugins[];
|
||||
@@ -51,7 +50,7 @@ playlist_list_global_finish() noexcept;
|
||||
* Opens a playlist by its URI.
|
||||
*/
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond);
|
||||
playlist_list_open_uri(const char *uri, Mutex &mutex);
|
||||
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_list_open_stream_suffix(InputStreamPtr &&is, const char *suffix);
|
||||
|
@@ -32,7 +32,7 @@
|
||||
#include <assert.h>
|
||||
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
playlist_open_path_suffix(Path path, Mutex &mutex, Cond &cond)
|
||||
playlist_open_path_suffix(Path path, Mutex &mutex)
|
||||
try {
|
||||
assert(!path.IsNull());
|
||||
|
||||
@@ -44,7 +44,7 @@ try {
|
||||
if (!playlist_suffix_supported(suffix_utf8.c_str()))
|
||||
return nullptr;
|
||||
|
||||
auto is = OpenLocalInputStream(path, mutex, cond);
|
||||
auto is = OpenLocalInputStream(path, mutex);
|
||||
return playlist_list_open_stream_suffix(std::move(is),
|
||||
suffix_utf8.c_str());
|
||||
} catch (...) {
|
||||
@@ -53,16 +53,16 @@ try {
|
||||
}
|
||||
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_open_path(Path path, Mutex &mutex, Cond &cond)
|
||||
playlist_open_path(Path path, Mutex &mutex)
|
||||
try {
|
||||
assert(!path.IsNull());
|
||||
|
||||
const std::string uri_utf8 = path.ToUTF8();
|
||||
auto playlist = !uri_utf8.empty()
|
||||
? playlist_list_open_uri(uri_utf8.c_str(), mutex, cond)
|
||||
? playlist_list_open_uri(uri_utf8.c_str(), mutex)
|
||||
: nullptr;
|
||||
if (playlist == nullptr)
|
||||
playlist = playlist_open_path_suffix(path, mutex, cond);
|
||||
playlist = playlist_open_path_suffix(path, mutex);
|
||||
|
||||
return playlist;
|
||||
} catch (...) {
|
||||
@@ -71,15 +71,15 @@ try {
|
||||
}
|
||||
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond)
|
||||
playlist_open_remote(const char *uri, Mutex &mutex)
|
||||
try {
|
||||
assert(uri_has_scheme(uri));
|
||||
|
||||
auto playlist = playlist_list_open_uri(uri, mutex, cond);
|
||||
auto playlist = playlist_list_open_uri(uri, mutex);
|
||||
if (playlist != nullptr)
|
||||
return playlist;
|
||||
|
||||
auto is = InputStream::OpenReady(uri, mutex, cond);
|
||||
auto is = InputStream::OpenReady(uri, mutex);
|
||||
return playlist_list_open_stream(std::move(is), uri);
|
||||
} catch (...) {
|
||||
LogError(std::current_exception());
|
||||
|
@@ -25,7 +25,6 @@
|
||||
#include <memory>
|
||||
|
||||
class Mutex;
|
||||
class Cond;
|
||||
class SongEnumerator;
|
||||
class Path;
|
||||
|
||||
@@ -37,10 +36,10 @@ class Path;
|
||||
*/
|
||||
gcc_nonnull_all
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_open_path(Path path, Mutex &mutex, Cond &cond);
|
||||
playlist_open_path(Path path, Mutex &mutex);
|
||||
|
||||
gcc_nonnull_all
|
||||
std::unique_ptr<SongEnumerator>
|
||||
playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond);
|
||||
playlist_open_remote(const char *uri, Mutex &mutex);
|
||||
|
||||
#endif
|
||||
|
@@ -26,7 +26,6 @@
|
||||
#include "DetachedSong.hxx"
|
||||
#include "fs/Traits.hxx"
|
||||
#include "thread/Mutex.hxx"
|
||||
#include "thread/Cond.hxx"
|
||||
#include "Partition.hxx"
|
||||
#include "Instance.hxx"
|
||||
|
||||
@@ -59,7 +58,6 @@ playlist_file_print(Response &r, Partition &partition,
|
||||
const char *uri, bool detail)
|
||||
{
|
||||
Mutex mutex;
|
||||
Cond cond;
|
||||
|
||||
#ifndef ENABLE_DATABASE
|
||||
(void)partition;
|
||||
@@ -69,7 +67,7 @@ playlist_file_print(Response &r, Partition &partition,
|
||||
#ifdef ENABLE_DATABASE
|
||||
partition.instance.storage,
|
||||
#endif
|
||||
mutex, cond);
|
||||
mutex);
|
||||
if (playlist == nullptr)
|
||||
return false;
|
||||
|
||||
|
@@ -89,8 +89,7 @@ static constexpr TagHandler embcue_tag_handler = {
|
||||
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
embcue_playlist_open_uri(const char *uri,
|
||||
gcc_unused Mutex &mutex,
|
||||
gcc_unused Cond &cond)
|
||||
gcc_unused Mutex &mutex)
|
||||
{
|
||||
if (!PathTraitsUTF8::IsAbsolute(uri))
|
||||
/* only local files supported */
|
||||
|
@@ -88,7 +88,7 @@ FlacPlaylist::NextSong()
|
||||
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
flac_playlist_open_uri(const char *uri,
|
||||
gcc_unused Mutex &mutex, gcc_unused Cond &cond)
|
||||
gcc_unused Mutex &mutex)
|
||||
{
|
||||
if (!PathTraitsUTF8::IsAbsolute(uri))
|
||||
/* only local files supported */
|
||||
|
@@ -221,9 +221,9 @@ static constexpr yajl_callbacks parse_callbacks = {
|
||||
*/
|
||||
static void
|
||||
soundcloud_parse_json(const char *url, Yajl::Handle &handle,
|
||||
Mutex &mutex, Cond &cond)
|
||||
Mutex &mutex)
|
||||
{
|
||||
auto input_stream = InputStream::OpenReady(url, mutex, cond);
|
||||
auto input_stream = InputStream::OpenReady(url, mutex);
|
||||
Yajl::ParseInputStream(handle, *input_stream);
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ soundcloud_parse_json(const char *url, Yajl::Handle &handle,
|
||||
* soundcloud://url/<url or path of soundcloud page>
|
||||
*/
|
||||
static std::unique_ptr<SongEnumerator>
|
||||
soundcloud_open_uri(const char *uri, Mutex &mutex, Cond &cond)
|
||||
soundcloud_open_uri(const char *uri, Mutex &mutex)
|
||||
{
|
||||
assert(strncmp(uri, "soundcloud://", 13) == 0);
|
||||
uri += 13;
|
||||
@@ -277,7 +277,7 @@ soundcloud_open_uri(const char *uri, Mutex &mutex, Cond &cond)
|
||||
|
||||
SoundCloudJsonData data;
|
||||
Yajl::Handle handle(&parse_callbacks, nullptr, &data);
|
||||
soundcloud_parse_json(u, handle, mutex, cond);
|
||||
soundcloud_parse_json(u, handle, mutex);
|
||||
|
||||
data.songs.reverse();
|
||||
return std::make_unique<MemorySongEnumerator>(std::move(data.songs));
|
||||
|
Reference in New Issue
Block a user