command: make audio device list available to the client API

This commit is contained in:
wm4 2014-10-10 19:46:21 +02:00
parent 04a5d25bf7
commit 2f28e071c8
2 changed files with 53 additions and 0 deletions

View File

@ -1334,6 +1334,27 @@ Property list
Note that you need to escape the ``\`` character, because the string is
processed for C escape sequences before passing it to the OSD code.
``audio-device-list``
Return the list of discovered audio devices. This is mostly for use with
the client API, and reflects what ``--audio-device=help`` with the command
line player returns.
When querying the property with the client API using ``MPV_FORMAT_NODE``,
or with Lua ``mp.get_property_native``, this will return a mpv_node with
the following contents:
::
MPV_FORMAT_NODE_ARRAY
MPV_FORMAT_NODE_MAP (for each device entry)
"name" MPV_FORMAT_STRING
"description" MPV_FORMAT_STRING
The ``name`` is what is to be passed to the ``--audio-device`` option (and
often a rather cryptic audio API-specific ID), while ``description`` is
human readable free form text. The description is an empty string if none
was received.
``options/<name>`` (RW)
Read-only access to value of option ``--<name>``. Most options can be
changed at runtime by writing to this property. Note that many options

View File

@ -84,6 +84,8 @@ struct command_ctx {
// bitmap list can be manipulated without additional synchronization.
struct sub_bitmaps overlay_osd[2];
struct sub_bitmaps *overlay_osd_current;
struct ao_device_list *cached_ao_devices;
};
struct overlay {
@ -1308,6 +1310,35 @@ static int mp_property_volrestore(void *ctx, struct m_property *prop,
return mp_property_generic_option(mpctx, prop, action, arg);
}
static int get_device_entry(int item, int action, void *arg, void *ctx)
{
struct ao_device_list *list = ctx;
struct ao_device_desc *entry = &list->devices[item];
struct m_sub_property props[] = {
{"name", SUB_PROP_STR(entry->name)},
{"description", SUB_PROP_STR(entry->desc)},
{0}
};
return m_property_read_sub(props, action, arg);
}
static int mp_property_audio_devices(void *ctx, struct m_property *prop,
int action, void *arg)
{
struct MPContext *mpctx = ctx;
struct command_ctx *cmd = mpctx->command_ctx;
if (!cmd->cached_ao_devices)
cmd->cached_ao_devices = ao_get_device_list(mpctx->global);
if (!cmd->cached_ao_devices)
return M_PROPERTY_ERROR;
talloc_steal(cmd, cmd->cached_ao_devices);
return m_property_read_list(action, arg, cmd->cached_ao_devices->num_devices,
get_device_entry, cmd->cached_ao_devices);
}
/// Audio delay (RW)
static int mp_property_audio_delay(void *ctx, struct m_property *prop,
int action, void *arg)
@ -2794,6 +2825,7 @@ static const struct m_property mp_properties[] = {
{"aid", mp_property_audio},
{"balance", mp_property_balance},
{"volume-restore-data", mp_property_volrestore},
{"audio-device-list", mp_property_audio_devices},
// Video
{"fullscreen", mp_property_fullscreen},