summaryrefslogtreecommitdiffstats
path: root/audio/out
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-11-09 09:58:44 +0100
committerwm4 <wm4@nowhere>2014-11-09 09:58:44 +0100
commitb021d038c2217903e511ca3673d5f2f1b996c4d4 (patch)
treeadc8258d5f8d18f11aa85f72fb6bc34ff62fb33f /audio/out
parent7ee4e533693ee02e660ae0efb2e0e94db8c8c5af (diff)
downloadmpv-b021d038c2217903e511ca3673d5f2f1b996c4d4.tar.bz2
mpv-b021d038c2217903e511ca3673d5f2f1b996c4d4.tar.xz
audio/out: make ao_request_reload() idempotent
This is what you would expect. Before this commit, each ao_request_reload() call would just queue a reload command, and then recreate the AO for the number of times the function was called. Instead of sending a command, introduce some sort of event retrieval mechanism. At least for the reload case, use atomics, because we're too lazy to setup an extra mutex.
Diffstat (limited to 'audio/out')
-rw-r--r--audio/out/ao.c23
-rw-r--r--audio/out/ao.h6
-rw-r--r--audio/out/internal.h5
3 files changed, 25 insertions, 9 deletions
diff --git a/audio/out/ao.c b/audio/out/ao.c
index baf6db1e45..b92a78ff26 100644
--- a/audio/out/ao.c
+++ b/audio/out/ao.c
@@ -397,6 +397,22 @@ bool ao_eof_reached(struct ao *ao)
return ao->api->get_eof ? ao->api->get_eof(ao) : true;
}
+// Query the AO_EVENT_*s as requested by the events parameter, and return them.
+int ao_query_and_reset_events(struct ao *ao, int events)
+{
+ int actual_events = 0;
+ if (atomic_load(&ao->request_reload)) // don't need to reset it
+ actual_events |= AO_EVENT_RELOAD;
+ return actual_events & events;
+}
+
+// Request that the player core destroys and recreates the AO.
+void ao_request_reload(struct ao *ao)
+{
+ atomic_store(&ao->request_reload, true);
+ mp_input_wakeup(ao->input_ctx);
+}
+
bool ao_chmap_sel_adjust(struct ao *ao, const struct mp_chmap_sel *s,
struct mp_chmap *map)
{
@@ -409,13 +425,6 @@ bool ao_chmap_sel_get_def(struct ao *ao, const struct mp_chmap_sel *s,
return mp_chmap_sel_get_def(s, map, num);
}
-// Request that the player core destroys and recreates the AO.
-void ao_request_reload(struct ao *ao)
-{
- const char *cmd[] = {"ao_reload", NULL};
- mp_input_run_cmd(ao->input_ctx, cmd);
-}
-
// --- The following functions just return immutable information.
void ao_get_format(struct ao *ao, struct mp_audio *format)
diff --git a/audio/out/ao.h b/audio/out/ao.h
index 3d811fe8d3..f1c922ae69 100644
--- a/audio/out/ao.h
+++ b/audio/out/ao.h
@@ -46,6 +46,10 @@ enum aocontrol {
// data might be written again, instead of closing the AO.
#define AOPLAY_FINAL_CHUNK 1
+enum {
+ AO_EVENT_RELOAD = 1,
+};
+
typedef struct ao_control_vol {
float left;
float right;
@@ -85,6 +89,8 @@ void ao_pause(struct ao *ao);
void ao_resume(struct ao *ao);
void ao_drain(struct ao *ao);
bool ao_eof_reached(struct ao *ao);
+int ao_query_and_reset_events(struct ao *ao, int events);
+void ao_request_reload(struct ao *ao);
struct ao_device_list *ao_get_device_list(struct mpv_global *global);
void ao_print_devices(struct mpv_global *global, struct mp_log *log);
diff --git a/audio/out/internal.h b/audio/out/internal.h
index 8ba789f603..fbea763306 100644
--- a/audio/out/internal.h
+++ b/audio/out/internal.h
@@ -22,6 +22,7 @@
#include <stdbool.h>
#include <pthread.h>
+#include "osdep/atomics.h"
#include "audio/out/ao.h"
/* global data used by ao.c and ao drivers */
@@ -55,6 +56,8 @@ struct ao {
// Used during init: if init fails, redirect to this ao
char *redirect;
+ atomic_bool request_reload;
+
int buffer;
double def_buffer;
void *api_priv;
@@ -186,8 +189,6 @@ bool ao_chmap_sel_adjust(struct ao *ao, const struct mp_chmap_sel *s,
bool ao_chmap_sel_get_def(struct ao *ao, const struct mp_chmap_sel *s,
struct mp_chmap *map, int num);
-void ao_request_reload(struct ao *ao);
-
// Add a deep copy of e to the list.
// Call from ao_driver->list_devs callback only.
void ao_device_list_add(struct ao_device_list *list, struct ao *ao,