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:
Max Kellermann
2018-06-22 19:37:18 +02:00
parent 01d8eb6290
commit d0fbf6db59
66 changed files with 403 additions and 280 deletions

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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();

View File

@@ -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;

View File

@@ -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);

View File

@@ -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());

View File

@@ -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

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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));