mirror of
https://github.com/mpv-player/mpv
synced 2024-12-28 10:02:17 +00:00
2c5cb2c53f
I intend to rewrite this code approximately every 2 months. Last time, I did this in commitd66eb93e5d
(and065c307e8e
andb2006eeb74
). It was intended to remove the roundabout synchronous thread "ping pong" when observing properties. At first, the original async. code was replaced with some nice mostly synchronous code. But then an async. code path had to be added for vo_libmpv, and finally the sync. code was dropped because it broke in other obscure cases (like the Objective-C Cocoa backend). Try again. This time, update properties entirely on the main thread. Updates get batched out on every playloop iteration. (At first I wanted it to make it every time the player goes to sleep, but that might starve API clients if the playloop get saturated.) One nice thing is that clients only get woken up once all changed events have been sent, which might reduce overhead. While this sounds simple, it's not. The main problem is that reading properties must not block the client API, i.e. no client API locks can be held while reading the property. Maybe eventually we can avoid this requirement, but currently it's just a fact. This means we have to iterate over all clients and then over all properties (of each client), all while releasing all locks when updating a property. Solve this by rechecking on each iteration whether the list changed, and if so, aborting the iteration and redo it "next time". High risk change, expect bugs such as crashes and missing property updates.
58 lines
2.1 KiB
C
58 lines
2.1 KiB
C
#ifndef MP_CLIENT_H_
|
|
#define MP_CLIENT_H_
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "libmpv/client.h"
|
|
#include "libmpv/stream_cb.h"
|
|
#include "misc/bstr.h"
|
|
|
|
struct MPContext;
|
|
struct mpv_handle;
|
|
struct mp_client_api;
|
|
struct mp_log;
|
|
struct mpv_global;
|
|
|
|
// Includes space for \0
|
|
#define MAX_CLIENT_NAME 64
|
|
|
|
void mp_clients_init(struct MPContext *mpctx);
|
|
void mp_clients_destroy(struct MPContext *mpctx);
|
|
void mp_shutdown_clients(struct MPContext *mpctx);
|
|
bool mp_is_shutting_down(struct MPContext *mpctx);
|
|
bool mp_clients_all_initialized(struct MPContext *mpctx);
|
|
|
|
bool mp_client_exists(struct MPContext *mpctx, const char *client_name);
|
|
void mp_client_broadcast_event(struct MPContext *mpctx, int event, void *data);
|
|
int mp_client_send_event(struct MPContext *mpctx, const char *client_name,
|
|
uint64_t reply_userdata, int event, void *data);
|
|
int mp_client_send_event_dup(struct MPContext *mpctx, const char *client_name,
|
|
int event, void *data);
|
|
void mp_client_property_change(struct MPContext *mpctx, const char *name);
|
|
void mp_client_send_property_changes(struct MPContext *mpctx);
|
|
|
|
struct mpv_handle *mp_new_client(struct mp_client_api *clients, const char *name);
|
|
void mp_client_set_weak(struct mpv_handle *ctx);
|
|
struct mp_log *mp_client_get_log(struct mpv_handle *ctx);
|
|
struct mpv_global *mp_client_get_global(struct mpv_handle *ctx);
|
|
struct MPContext *mp_client_get_core(struct mpv_handle *ctx);
|
|
struct MPContext *mp_client_api_get_core(struct mp_client_api *api);
|
|
|
|
// m_option.c
|
|
void *node_get_alloc(struct mpv_node *node);
|
|
|
|
// for vo_libmpv.c
|
|
struct osd_state;
|
|
struct mpv_render_context;
|
|
bool mp_set_main_render_context(struct mp_client_api *client_api,
|
|
struct mpv_render_context *ctx, bool active);
|
|
struct mpv_render_context *
|
|
mp_client_api_acquire_render_context(struct mp_client_api *ca);
|
|
void kill_video_async(struct mp_client_api *client_api);
|
|
|
|
bool mp_streamcb_lookup(struct mpv_global *g, const char *protocol,
|
|
void **out_user_data, mpv_stream_cb_open_ro_fn *out_fn);
|
|
|
|
#endif
|