From a3be14683a33211e3e07094246bb3342fc789763 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Mon, 2 Feb 2015 23:01:11 +0100 Subject: [PATCH] command: add property returning detected audio device This can be useful to adjust some other audio related properties at runtime depending on the audio device being used. --- DOCS/man/input.rst | 4 ++++ audio/out/ao.c | 5 +++++ audio/out/ao.h | 1 + audio/out/ao_coreaudio.c | 2 ++ audio/out/internal.h | 3 +++ player/command.c | 12 +++++++++++- 6 files changed, 26 insertions(+), 1 deletion(-) diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 7d8ac297f4..9d27f9d98d 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -1589,6 +1589,10 @@ Property list ``current-ao`` Current audio output driver (name as used with ``--ao``). +``audio-out-detected-device`` + Return the audio device selected by the AO driver (only implemented for + some drivers: currently only ``coreaudio``). + ``mpv-version`` Return the mpv version/copyright string. Depending on how the binary was built, it might contain either a release version, or just a git hash. diff --git a/audio/out/ao.c b/audio/out/ao.c index f77ae4c24a..dbdcf272cb 100644 --- a/audio/out/ao.c +++ b/audio/out/ao.c @@ -440,6 +440,11 @@ bool ao_untimed(struct ao *ao) return ao->untimed; } +const char *ao_get_detected_device(struct ao *ao) +{ + return ao->detected_device; +} + struct ao_device_list *ao_get_device_list(struct mpv_global *global) { struct ao_device_list *list = talloc_zero(NULL, struct ao_device_list); diff --git a/audio/out/ao.h b/audio/out/ao.h index f1c922ae69..dbbed24873 100644 --- a/audio/out/ao.h +++ b/audio/out/ao.h @@ -79,6 +79,7 @@ void ao_uninit(struct ao *ao); void ao_get_format(struct ao *ao, struct mp_audio *format); const char *ao_get_name(struct ao *ao); const char *ao_get_description(struct ao *ao); +const char *ao_get_detected_device(struct ao *ao); bool ao_untimed(struct ao *ao); int ao_play(struct ao *ao, void **data, int samples, int flags); int ao_control(struct ao *ao, enum aocontrol cmd, void *arg); diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c index 0c7f769e72..590549bd1a 100644 --- a/audio/out/ao_coreaudio.c +++ b/audio/out/ao_coreaudio.c @@ -156,6 +156,8 @@ static int init(struct ao *ao) OSStatus err = ca_select_device(ao, ao->device, &p->device); CHECK_CA_ERROR("failed to select device"); + ao->detected_device = talloc_asprintf(ao, "%d", p->device); + if (!init_chmap(ao)) goto coreaudio_error; diff --git a/audio/out/internal.h b/audio/out/internal.h index 4d18adef78..9414208923 100644 --- a/audio/out/internal.h +++ b/audio/out/internal.h @@ -50,6 +50,9 @@ struct ao { // default device should be used, this is set to NULL. char *device; + // Device actually chosen by the AO + char *detected_device; + // Application name to report to the audio API. char *client_name; diff --git a/player/command.c b/player/command.c index e886dd4360..85e5b17be0 100644 --- a/player/command.c +++ b/player/command.c @@ -1577,6 +1577,15 @@ static int mp_property_ao(void *ctx, struct m_property *p, int action, void *arg mpctx->ao ? ao_get_name(mpctx->ao) : NULL); } +static int mp_property_ao_detected_device(void *ctx,struct m_property *prop, + int action, void *arg) +{ + MPContext *mpctx = ctx; + if (!mpctx->ao) + return M_PROPERTY_UNAVAILABLE; + return m_property_strdup_ro(action, arg, ao_get_detected_device(mpctx->ao)); +} + /// Audio delay (RW) static int mp_property_audio_delay(void *ctx, struct m_property *prop, int action, void *arg) @@ -3375,6 +3384,7 @@ static const struct m_property mp_properties[] = { {"audio-device", mp_property_audio_device}, {"audio-device-list", mp_property_audio_devices}, {"current-ao", mp_property_ao}, + {"audio-out-detected-device", mp_property_ao_detected_device}, // Video {"fullscreen", mp_property_fullscreen}, @@ -3516,7 +3526,7 @@ static const char *const *const mp_event_property_change[] = { "detected-hwdec"), E(MPV_EVENT_AUDIO_RECONFIG, "audio-format", "audio-codec", "audio-bitrate", "samplerate", "channels", "audio", "volume", "mute", "balance", - "volume-restore-data", "current-ao"), + "volume-restore-data", "current-ao", "audio-out-detected-device"), E(MPV_EVENT_SEEK, "seeking", "core-idle"), E(MPV_EVENT_PLAYBACK_RESTART, "seeking", "core-idle"), E(MPV_EVENT_METADATA_UPDATE, "metadata", "filtered-metadata"),