0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 03:52:22 +02:00

audio: add command/function to reload audio output

Anticipated use: simple solution for dealing with audio APIs which
request configuration changes via events.
This commit is contained in:
wm4 2014-10-27 11:52:42 +01:00
parent ac35e3b308
commit d5b081152a
6 changed files with 29 additions and 1 deletions

View File

@ -544,7 +544,7 @@ Input Commands that are Possibly Subject to Change
Undocumented commands: ``tv_last_channel`` (TV/DVB only), ``get_property`` (?), Undocumented commands: ``tv_last_channel`` (TV/DVB only), ``get_property`` (?),
``vo_cmdline`` (experimental). ``vo_cmdline`` (experimental), ``ao_reload`` (experimental/internal).
Input Command Prefixes Input Command Prefixes
---------------------- ----------------------

View File

@ -29,6 +29,7 @@
#include "audio/format.h" #include "audio/format.h"
#include "audio/audio.h" #include "audio/audio.h"
#include "input/input.h"
#include "options/options.h" #include "options/options.h"
#include "options/m_config.h" #include "options/m_config.h"
#include "common/msg.h" #include "common/msg.h"
@ -406,6 +407,13 @@ bool ao_chmap_sel_get_def(struct ao *ao, const struct mp_chmap_sel *s,
return mp_chmap_sel_get_def(s, map, num); return mp_chmap_sel_get_def(s, map, num);
} }
// Request that the player core destroys and recreates the AO.
void ao_request_reload(struct ao *ao)
{
const char *cmd[] = {"ao_reload", NULL};
mp_input_run_cmd(ao->input_ctx, cmd);
}
// --- The following functions just return immutable information. // --- The following functions just return immutable information.
void ao_get_format(struct ao *ao, struct mp_audio *format) void ao_get_format(struct ao *ao, struct mp_audio *format)

View File

@ -183,6 +183,8 @@ bool ao_chmap_sel_adjust(struct ao *ao, const struct mp_chmap_sel *s,
bool ao_chmap_sel_get_def(struct ao *ao, const struct mp_chmap_sel *s, bool ao_chmap_sel_get_def(struct ao *ao, const struct mp_chmap_sel *s,
struct mp_chmap *map, int num); struct mp_chmap *map, int num);
void ao_request_reload(struct ao *ao);
// Add a deep copy of e to the list. // Add a deep copy of e to the list.
// Call from ao_driver->list_devs callback only. // Call from ao_driver->list_devs callback only.
void ao_device_list_add(struct ao_device_list *list, struct ao *ao, void ao_device_list_add(struct ao_device_list *list, struct ao *ao,

View File

@ -156,6 +156,7 @@ const struct mp_cmd_def mp_cmds[] = {
{ MP_CMD_DISCNAV, "discnav", { ARG_STRING } }, { MP_CMD_DISCNAV, "discnav", { ARG_STRING } },
{ MP_CMD_AF, "af", { ARG_STRING, ARG_STRING } }, { MP_CMD_AF, "af", { ARG_STRING, ARG_STRING } },
{ MP_CMD_AO_RELOAD, "ao_reload", },
{ MP_CMD_VF, "vf", { ARG_STRING, ARG_STRING } }, { MP_CMD_VF, "vf", { ARG_STRING, ARG_STRING } },

View File

@ -80,6 +80,7 @@ enum mp_command_type {
/// Audio Filter commands /// Audio Filter commands
MP_CMD_AF, MP_CMD_AF,
MP_CMD_AO_RELOAD,
/// Video filter commands /// Video filter commands
MP_CMD_VF, MP_CMD_VF,

View File

@ -1454,6 +1454,18 @@ static int get_device_entry(int item, int action, void *arg, void *ctx)
return m_property_read_sub(props, action, arg); return m_property_read_sub(props, action, arg);
} }
static void reload_audio_output(struct MPContext *mpctx)
{
if (!mpctx->ao)
return;
ao_reset(mpctx->ao);
uninit_audio_out(mpctx);
// This normally recreates the AO, although there are situations when AO
// creation is delayed; for example if there are no audio packets around,
// and the audio format is yet unknown.
reinit_audio_chain(mpctx);
}
static int mp_property_audio_devices(void *ctx, struct m_property *prop, static int mp_property_audio_devices(void *ctx, struct m_property *prop,
int action, void *arg) int action, void *arg)
{ {
@ -4233,6 +4245,10 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
} }
break; break;
case MP_CMD_AO_RELOAD:
reload_audio_output(mpctx);
break;
case MP_CMD_AF: case MP_CMD_AF:
return edit_filters_osd(mpctx, STREAM_AUDIO, cmd->args[0].v.s, return edit_filters_osd(mpctx, STREAM_AUDIO, cmd->args[0].v.s,
cmd->args[1].v.s, msg_osd); cmd->args[1].v.s, msg_osd);