summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/msg.c10
-rw-r--r--common/msg_control.h4
-rw-r--r--player/client.c30
3 files changed, 29 insertions, 15 deletions
diff --git a/common/msg.c b/common/msg.c
index d2e728b585..fa8b235243 100644
--- a/common/msg.c
+++ b/common/msg.c
@@ -82,6 +82,8 @@ struct mp_log_buffer {
struct mp_log_root *root;
struct mp_ring *ring;
int level;
+ void (*wakeup_cb)(void *ctx);
+ void *wakeup_cb_ctx;
};
// Protects some (not all) state in mp_log_root
@@ -319,6 +321,8 @@ static void write_msg_to_buffers(struct mp_log *log, int lev, char *text)
};
}
mp_ring_write(buffer->ring, (unsigned char *)&entry, sizeof(entry));
+ if (buffer->wakeup_cb)
+ buffer->wakeup_cb(buffer->wakeup_cb_ctx);
}
}
}
@@ -459,7 +463,9 @@ void mp_msg_uninit(struct mpv_global *global)
}
struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global,
- int size, int level)
+ int size, int level,
+ void (*wakeup_cb)(void *ctx),
+ void *wakeup_cb_ctx)
{
struct mp_log_root *root = global->log->root;
@@ -470,6 +476,8 @@ struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global,
.root = root,
.level = level,
.ring = mp_ring_new(buffer, sizeof(void *) * size),
+ .wakeup_cb = wakeup_cb,
+ .wakeup_cb_ctx = wakeup_cb_ctx,
};
if (!buffer->ring)
abort();
diff --git a/common/msg_control.h b/common/msg_control.h
index 49eeee025c..755cd10e57 100644
--- a/common/msg_control.h
+++ b/common/msg_control.h
@@ -20,7 +20,9 @@ struct mp_log_buffer_entry {
struct mp_log_buffer;
struct mp_log_buffer *mp_msg_log_buffer_new(struct mpv_global *global,
- int size, int level);
+ int size, int level,
+ void (*wakeup_cb)(void *ctx),
+ void *wakeup_cb_ctx);
void mp_msg_log_buffer_destroy(struct mp_log_buffer *buffer);
struct mp_log_buffer_entry *mp_msg_log_buffer_read(struct mp_log_buffer *buffer);
diff --git a/player/client.c b/player/client.c
index eee401f089..5c480be561 100644
--- a/player/client.c
+++ b/player/client.c
@@ -114,6 +114,7 @@ struct mpv_handle {
};
static bool gen_property_change_event(struct mpv_handle *ctx);
+static void recreate_message_buffer(mpv_handle *ctx);
void mp_clients_init(struct MPContext *mpctx)
{
@@ -226,6 +227,8 @@ void mpv_set_wakeup_callback(mpv_handle *ctx, void (*cb)(void *d), void *d)
pthread_mutex_lock(&ctx->lock);
ctx->wakeup_cb = cb;
ctx->wakeup_cb_ctx = d;
+ // Update the message callback
+ recreate_message_buffer(ctx);
pthread_mutex_unlock(&ctx->lock);
}
@@ -1240,6 +1243,18 @@ int mpv_load_config_file(mpv_handle *ctx, const char *filename)
return 0;
}
+// called locked
+static void recreate_message_buffer(mpv_handle *ctx)
+{
+ mp_msg_log_buffer_destroy(ctx->messages);
+ ctx->messages = NULL;
+ if (ctx->messages_level >= 0) {
+ ctx->messages =
+ mp_msg_log_buffer_new(ctx->mpctx->global, 1000, ctx->messages_level,
+ ctx->wakeup_cb, ctx->wakeup_cb_ctx);
+ }
+}
+
int mpv_request_log_messages(mpv_handle *ctx, const char *min_level)
{
int level = -1;
@@ -1253,19 +1268,8 @@ int mpv_request_log_messages(mpv_handle *ctx, const char *min_level)
return MPV_ERROR_INVALID_PARAMETER;
pthread_mutex_lock(&ctx->lock);
-
- if (!ctx->messages)
- ctx->messages_level = -1;
-
- if (ctx->messages_level != level) {
- mp_msg_log_buffer_destroy(ctx->messages);
- ctx->messages = NULL;
- if (level >= 0) {
- ctx->messages =
- mp_msg_log_buffer_new(ctx->mpctx->global, 1000, level);
- }
- ctx->messages_level = level;
- }
+ ctx->messages_level = level;
+ recreate_message_buffer(ctx);
pthread_mutex_unlock(&ctx->lock);
return 0;