diff options
author | wm4 <wm4@nowhere> | 2018-05-06 21:23:28 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2018-05-24 19:56:34 +0200 |
commit | c349e2f337693c53687b0bd5e4d8669363e2d79d (patch) | |
tree | 0a899ccac339c9a4d791d1cb0bfe5cd1ee4c7761 /player/loadfile.c | |
parent | b440f6dfb3d29651d8dcb7abfeb8ed18e3f2b995 (diff) | |
download | mpv-c349e2f337693c53687b0bd5e4d8669363e2d79d.tar.bz2 mpv-c349e2f337693c53687b0bd5e4d8669363e2d79d.tar.xz |
command: make sub-add and audio-add commands async
Pretty trivial, since commands can be async now, and the common code
even provides convenience like running commands on a worker thread.
The only ugly thing is that mp_add_external_file() needs an extra flag
for locking. This is because there's still some code which calls this
synchronously from the main thread, and unlocking the core makes no
sense there.
Diffstat (limited to 'player/loadfile.c')
-rw-r--r-- | player/loadfile.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/player/loadfile.c b/player/loadfile.c index 65d693e264..09d3bad3a1 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -579,7 +579,7 @@ bool mp_remove_track(struct MPContext *mpctx, struct track *track) // Add the given file as additional track. The filter argument controls how or // if tracks are auto-selected at any point. int mp_add_external_file(struct MPContext *mpctx, char *filename, - enum stream_type filter) + enum stream_type filter, bool unlock) { struct MPOpts *opts = mpctx->opts; if (!filename) @@ -600,11 +600,19 @@ int mp_add_external_file(struct MPContext *mpctx, char *filename, break; } + if (unlock) + mp_core_unlock(mpctx); + struct demuxer *demuxer = demux_open_url(filename, ¶ms, mpctx->playback_abort, mpctx->global); + if (demuxer) + enable_demux_thread(mpctx, demuxer); + + if (unlock) + mp_core_lock(mpctx); + if (!demuxer) goto err_out; - enable_demux_thread(mpctx, demuxer); if (opts->rebase_start_time) demux_set_ts_offset(demuxer, -demuxer->start_time); @@ -619,7 +627,11 @@ int mp_add_external_file(struct MPContext *mpctx, char *filename, } if (!has_any) { + if (unlock) + mp_core_unlock(mpctx); free_demuxer_and_stream(demuxer); + if (unlock) + mp_core_lock(mpctx); char *tname = mp_tprintf(20, "%s ", stream_type_name(filter)); if (filter == STREAM_TYPE_COUNT) tname = ""; @@ -652,7 +664,7 @@ static void open_external_files(struct MPContext *mpctx, char **files, enum stream_type filter) { for (int n = 0; files && files[n]; n++) - mp_add_external_file(mpctx, files[n], filter); + mp_add_external_file(mpctx, files[n], filter, false); } void autoload_external_files(struct MPContext *mpctx) @@ -691,7 +703,7 @@ void autoload_external_files(struct MPContext *mpctx) goto skip; if (list[i].type == STREAM_AUDIO && !sc[STREAM_VIDEO]) goto skip; - int first = mp_add_external_file(mpctx, filename, list[i].type); + int first = mp_add_external_file(mpctx, filename, list[i].type, false); if (first < 0) goto skip; |