summaryrefslogtreecommitdiffstats
path: root/audio/out/ao.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-10-11 19:25:45 +0200
committerwm4 <wm4@nowhere>2019-10-11 19:25:45 +0200
commitc84ec021287d72d122071d5c211f9bfbeb13a3fe (patch)
tree563612b5ecef18b9d26889445cbd53914e184b62 /audio/out/ao.c
parent52f3dee16a81ca4ed4d3a5a12e5f4fbf74cc3ddb (diff)
downloadmpv-c84ec021287d72d122071d5c211f9bfbeb13a3fe.tar.bz2
mpv-c84ec021287d72d122071d5c211f9bfbeb13a3fe.tar.xz
ao: add API for underrun reporting
AOs can now call ao_underrun_event() (in any context) if an underrun has happened. It will print a message. This will be used in the following commits. But for now, audio.c only clears the underrun bit, so that subsequent underruns still print the warning message. Since the underrun flag will be used in fragile ways by the playback state machine, there is the "reports_underruns" field that signals strong support for underrun reporting. (Otherwise, underrun events will not be used by it.)
Diffstat (limited to 'audio/out/ao.c')
-rw-r--r--audio/out/ao.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/audio/out/ao.c b/audio/out/ao.c
index e7af02276f..817aa29399 100644
--- a/audio/out/ao.c
+++ b/audio/out/ao.c
@@ -402,6 +402,7 @@ void ao_reset(struct ao *ao)
{
if (ao->api->reset)
ao->api->reset(ao);
+ atomic_fetch_and(&ao->events_, ~(unsigned int)AO_EVENT_UNDERRUN);
}
// Pause playback. Keep the current buffer. ao_get_delay() must return the
@@ -457,6 +458,14 @@ void ao_hotplug_event(struct ao *ao)
ao_add_events(ao, AO_EVENT_HOTPLUG);
}
+void ao_underrun_event(struct ao *ao)
+{
+ // Racy check, but it's just for the message.
+ if (!(atomic_load(&ao->events_) & AO_EVENT_UNDERRUN))
+ MP_WARN(ao, "Device underrun detected.\n");
+ ao_add_events(ao, AO_EVENT_UNDERRUN);
+}
+
bool ao_chmap_sel_adjust(struct ao *ao, const struct mp_chmap_sel *s,
struct mp_chmap *map)
{
@@ -517,6 +526,11 @@ const char *ao_get_description(struct ao *ao)
return ao->driver->description;
}
+bool ao_get_reports_underruns(struct ao *ao)
+{
+ return ao->driver->reports_underruns;
+}
+
bool ao_untimed(struct ao *ao)
{
return ao->untimed;