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

@@ -75,10 +75,10 @@ class AlsaInputStream final
public:
AlsaInputStream(EventLoop &_loop,
const char *_uri, Mutex &_mutex, Cond &_cond,
const char *_uri, Mutex &_mutex,
const char *_device,
snd_pcm_t *_handle, int _frame_size)
:AsyncInputStream(_loop, _uri, _mutex, _cond,
:AsyncInputStream(_loop, _uri, _mutex,
ALSA_MAX_BUFFERED, ALSA_RESUME_AT),
MultiSocketMonitor(_loop),
device(_device),
@@ -111,7 +111,7 @@ public:
}
static InputStreamPtr Create(EventLoop &event_loop, const char *uri,
Mutex &mutex, Cond &cond);
Mutex &mutex);
protected:
/* virtual methods from AsyncInputStream */
@@ -148,7 +148,7 @@ private:
inline InputStreamPtr
AlsaInputStream::Create(EventLoop &event_loop, const char *uri,
Mutex &mutex, Cond &cond)
Mutex &mutex)
{
const char *device = StringAfterPrefix(uri, "alsa://");
if (device == nullptr)
@@ -168,7 +168,7 @@ AlsaInputStream::Create(EventLoop &event_loop, const char *uri,
int frame_size = snd_pcm_format_width(format) / 8 * channels;
return std::make_unique<AlsaInputStream>(event_loop,
uri, mutex, cond,
uri, mutex,
device, handle, frame_size);
}
@@ -204,7 +204,7 @@ AlsaInputStream::DispatchSockets() noexcept
if (Recover(n_frames) < 0) {
postponed_exception = std::make_exception_ptr(std::runtime_error("PCM error - stream aborted"));
cond.broadcast();
InvokeOnAvailable();
return;
}
}
@@ -403,10 +403,10 @@ alsa_input_init(EventLoop &event_loop, const ConfigBlock &)
}
static InputStreamPtr
alsa_input_open(const char *uri, Mutex &mutex, Cond &cond)
alsa_input_open(const char *uri, Mutex &mutex)
{
return AlsaInputStream::Create(*alsa_input_event_loop, uri,
mutex, cond);
mutex);
}
const struct InputPlugin input_plugin_alsa = {