summaryrefslogtreecommitdiffstats
path: root/player/client.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-02-24 22:49:07 +0100
committerwm4 <wm4@nowhere>2014-02-24 22:50:25 +0100
commit0adb8a9aaf1e1c76300d717a0a3dd04849e70d1d (patch)
tree3dd2387c4eacd986a25a6025fac2e99aad621396 /player/client.c
parent5d7007c6448660b2bdbc7758db7f486157ff1fa2 (diff)
downloadmpv-0adb8a9aaf1e1c76300d717a0a3dd04849e70d1d.tar.bz2
mpv-0adb8a9aaf1e1c76300d717a0a3dd04849e70d1d.tar.xz
client API: report pause/unpause reason
Not sure about this... might redo. At least this provides a case of a broadcasted event, which requires per-event data allocation. See github issue #576.
Diffstat (limited to 'player/client.c')
-rw-r--r--player/client.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/player/client.c b/player/client.c
index eaf91c45a8..886ae5b0c8 100644
--- a/player/client.c
+++ b/player/client.c
@@ -324,23 +324,37 @@ static void status_reply(struct mpv_handle *ctx, int event,
send_reply(ctx, userdata, &reply);
}
+// set ev->data to a new copy of the original data
+static void dup_event_data(struct mpv_event *ev)
+{
+ switch (ev->event_id) {
+ case MPV_EVENT_PAUSE:
+ case MPV_EVENT_UNPAUSE:
+ ev->data = talloc_memdup(NULL, ev->data, sizeof(mpv_event_pause_reason));
+ break;
+ default:
+ // Doesn't use events with memory allocation.
+ if (ev->data)
+ abort();
+ }
+}
+
void mp_client_broadcast_event(struct MPContext *mpctx, int event, void *data)
{
struct mp_client_api *clients = mpctx->clients;
- struct mpv_event event_data = {
- .event_id = event,
- .data = data,
- };
-
pthread_mutex_lock(&clients->lock);
- for (int n = 0; n < clients->num_clients; n++)
+ for (int n = 0; n < clients->num_clients; n++) {
+ struct mpv_event event_data = {
+ .event_id = event,
+ .data = data,
+ };
+ dup_event_data(&event_data);
send_event(clients->clients[n], &event_data);
+ }
pthread_mutex_unlock(&clients->lock);
-
- talloc_free(data);
}
int mp_client_send_event(struct MPContext *mpctx, const char *client_name,