summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--misc/dispatch.c4
-rw-r--r--misc/dispatch.h2
-rw-r--r--player/client.c21
-rw-r--r--player/core.h1
-rw-r--r--player/playloop.c2
5 files changed, 20 insertions, 10 deletions
diff --git a/misc/dispatch.c b/misc/dispatch.c
index 2ddac2c92d..0c8727d053 100644
--- a/misc/dispatch.c
+++ b/misc/dispatch.c
@@ -230,7 +230,7 @@ void mp_dispatch_queue_process(struct mp_dispatch_queue *queue, double timeout)
// not a synchronization mechanism; it merely makes sure the target thread does
// not leave mp_dispatch_queue_process(), even if it's done. mp_dispatch_lock()
// can be used for exclusive access.
-void mp_dispatch_suspend(struct mp_dispatch_queue *queue)
+static void mp_dispatch_suspend(struct mp_dispatch_queue *queue)
{
pthread_mutex_lock(&queue->lock);
queue->suspend_requested++;
@@ -247,7 +247,7 @@ void mp_dispatch_suspend(struct mp_dispatch_queue *queue)
}
// Undo mp_dispatch_suspend().
-void mp_dispatch_resume(struct mp_dispatch_queue *queue)
+static void mp_dispatch_resume(struct mp_dispatch_queue *queue)
{
pthread_mutex_lock(&queue->lock);
assert(queue->suspended);
diff --git a/misc/dispatch.h b/misc/dispatch.h
index 96a5d7cf4b..7a0d037cab 100644
--- a/misc/dispatch.h
+++ b/misc/dispatch.h
@@ -15,8 +15,6 @@ void mp_dispatch_enqueue_autofree(struct mp_dispatch_queue *queue,
void mp_dispatch_run(struct mp_dispatch_queue *queue,
mp_dispatch_fn fn, void *fn_data);
void mp_dispatch_queue_process(struct mp_dispatch_queue *queue, double timeout);
-void mp_dispatch_suspend(struct mp_dispatch_queue *queue);
-void mp_dispatch_resume(struct mp_dispatch_queue *queue);
void mp_dispatch_lock(struct mp_dispatch_queue *queue);
void mp_dispatch_unlock(struct mp_dispatch_queue *queue);
diff --git a/player/client.c b/player/client.c
index 81b94abd22..ac89d3a141 100644
--- a/player/client.c
+++ b/player/client.c
@@ -330,8 +330,11 @@ void mpv_suspend(mpv_handle *ctx)
}
pthread_mutex_unlock(&ctx->lock);
- if (do_suspend)
- mp_dispatch_suspend(ctx->mpctx->dispatch);
+ if (do_suspend) {
+ mp_dispatch_lock(ctx->mpctx->dispatch);
+ ctx->mpctx->suspend_count++;
+ mp_dispatch_unlock(ctx->mpctx->dispatch);
+ }
}
void mpv_resume(mpv_handle *ctx)
@@ -347,8 +350,11 @@ void mpv_resume(mpv_handle *ctx)
}
pthread_mutex_unlock(&ctx->lock);
- if (do_resume)
- mp_dispatch_resume(ctx->mpctx->dispatch);
+ if (do_resume) {
+ mp_dispatch_lock(ctx->mpctx->dispatch);
+ ctx->mpctx->suspend_count--;
+ mp_dispatch_unlock(ctx->mpctx->dispatch);
+ }
}
void mp_resume_all(mpv_handle *ctx)
@@ -358,8 +364,11 @@ void mp_resume_all(mpv_handle *ctx)
ctx->suspend_count = 0;
pthread_mutex_unlock(&ctx->lock);
- if (do_resume)
- mp_dispatch_resume(ctx->mpctx->dispatch);
+ if (do_resume) {
+ mp_dispatch_lock(ctx->mpctx->dispatch);
+ ctx->mpctx->suspend_count--;
+ mp_dispatch_unlock(ctx->mpctx->dispatch);
+ }
}
static void lock_core(mpv_handle *ctx)
diff --git a/player/core.h b/player/core.h
index 25eb8b71a8..bdf19a815a 100644
--- a/player/core.h
+++ b/player/core.h
@@ -224,6 +224,7 @@ enum playback_status {
typedef struct MPContext {
bool initialized;
bool autodetach;
+ int suspend_count;
struct mpv_global *global;
struct MPOpts *opts;
struct mp_log *log;
diff --git a/player/playloop.c b/player/playloop.c
index 079d3a952a..449813c777 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -70,6 +70,8 @@ void mp_process_input(struct MPContext *mpctx)
mp_cmd_free(cmd);
mp_dispatch_queue_process(mpctx->dispatch, 0);
}
+ while (mpctx->suspend_count)
+ mp_dispatch_queue_process(mpctx->dispatch, 100);
}
double get_relative_time(struct MPContext *mpctx)