From 1d9032f011a57a31f6a8ccc40a0aba08a8e74e0d Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 5 Sep 2016 21:07:34 +0200 Subject: audio/out: deprecate "exclusive" sub-options And introduce a global option which does this. Or more precisely, this deprecates the global wasapi and coreaudio options, and adds a new one that merges their functionality. (Due to the way the sub-option deprecation mechanism works, this is simpler.) --- DOCS/interface-changes.rst | 2 ++ DOCS/man/ao.rst | 3 +++ DOCS/man/options.rst | 9 +++++++++ audio/out/ao.h | 2 ++ audio/out/ao_coreaudio.c | 5 ++++- audio/out/ao_wasapi.c | 5 ++++- options/options.c | 1 + options/options.h | 1 + player/audio.c | 3 +++ 9 files changed, 29 insertions(+), 2 deletions(-) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index 3b2ff485ad..f6bffe537d 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -25,6 +25,8 @@ Interface changes "--vo=opengl:scale=nearest" turns into "--scale=nearest". In some cases, the global option is prefixed. - deprecate the device/sink options on all AOs. Use --audio-device instead. + - deprecate "--ao=wasapi:exclusive" and "--ao=coreaudio:exclusive", + use --audio-exclusive instead. - subtle changes in how "--no-..." options are treated mean that they are not accessible under "options/..." anymore (instead, these are resolved at parsing time). This does not affect options which start with "--no-", diff --git a/DOCS/man/ao.rst b/DOCS/man/ao.rst index e82c541024..979da9ee0e 100644 --- a/DOCS/man/ao.rst +++ b/DOCS/man/ao.rst @@ -107,10 +107,12 @@ Available audio output drivers are: utility. Note that this does not affect the selected speaker setup. ``--coreaudio-exclusive`` + Deprecated, use ``--audio-exclusive``. Use exclusive mode access. This merely redirects to ``coreaudio_exclusive``, but should be preferred over using that AO directly. + ``coreaudio_exclusive`` (Mac OS X only) Native Mac OS X audio output driver using direct device access and exclusive mode (bypasses the sound server). @@ -263,6 +265,7 @@ Available audio output drivers are: The following global options are supported by this audio output: ``--ao-wasapi-exclusive`` + Deprecated, use ``--audio-exclusive``. Requests exclusive, direct hardware access. By definition prevents sound playback of any other program until mpv exits. ``--ao-wasapi-device=`` diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index 5d361d10b3..062dc307c0 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -1008,6 +1008,15 @@ Audio manually. For example ``name/foobar`` forces the AO ``name`` to use the device ``foobar``. +``--audio-exclusive=`` + Enable exclusive output mode. In this mode, the system is usually locked + out, and only mpv will be able to output audio. + + This only works for some audio outputs, such as ``wasapi`` and + ``coreaudio``. Other audio outputs silently ignore this options. They either + have no concept of exclusive mode, or the mpv side of the implementation is + missing. + ``--audio-fallback-to-null=`` If no audio device can be opened, behave as if ``--ao=null`` was given. This is useful in combination with ``--audio-device``: instead of causing an diff --git a/audio/out/ao.h b/audio/out/ao.h index 3b187e7355..fe09e2750a 100644 --- a/audio/out/ao.h +++ b/audio/out/ao.h @@ -58,6 +58,8 @@ enum { AO_INIT_SAFE_MULTICHANNEL_ONLY = 1 << 1, // Stream silence as long as no audio is playing. AO_INIT_STREAM_SILENCE = 1 << 2, + // Force exclusive mode, i.e. lock out the system mixer. + AO_INIT_EXCLUSIVE = 1 << 3, }; typedef struct ao_control_vol { diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c index 1300489084..3a7aa2eac1 100644 --- a/audio/out/ao_coreaudio.c +++ b/audio/out/ao_coreaudio.c @@ -143,6 +143,8 @@ static int init(struct ao *ao) { struct priv *p = ao->priv; + p->exclusive |= ao->init_flags & AO_INIT_EXCLUSIVE; + if (!af_fmt_is_pcm(ao->format) || p->exclusive) { MP_VERBOSE(ao, "redirecting to coreaudio_exclusive\n"); ao->redirect = "coreaudio_exclusive"; @@ -427,7 +429,8 @@ const struct ao_driver audio_out_coreaudio = { .priv_size = sizeof(struct priv), .options = (const struct m_option[]){ OPT_FLAG("change-physical-format", change_physical_format, 0), - OPT_FLAG("exclusive", exclusive, 0), + OPT_FLAG("exclusive", exclusive, 0, + .deprecation_message = "use --audio-exclusive"), {0} }, .legacy_prefix = "coreaudio", diff --git a/audio/out/ao_wasapi.c b/audio/out/ao_wasapi.c index 23a958bb3b..17f3e98653 100644 --- a/audio/out/ao_wasapi.c +++ b/audio/out/ao_wasapi.c @@ -275,6 +275,8 @@ static int init(struct ao *ao) struct wasapi_state *state = ao->priv; state->log = ao->log; + state->opt_exclusive |= ao->init_flags & AO_INIT_EXCLUSIVE; + state->deviceID = wasapi_find_deviceID(ao); if (!state->deviceID) { uninit(ao); @@ -495,7 +497,8 @@ const struct ao_driver audio_out_wasapi = { .hotplug_uninit = hotplug_uninit, .priv_size = sizeof(wasapi_state), .options = (const struct m_option[]) { - OPT_FLAG("exclusive", opt_exclusive, 0), + OPT_FLAG("exclusive", opt_exclusive, 0, + .deprecation_message = "use --audio-exclusive"), OPT_STRING("device", opt_device, 0, DEVICE_OPT_DEPRECATION), {NULL}, }, diff --git a/options/options.c b/options/options.c index e2bd3d8d95..b620ab9bc3 100644 --- a/options/options.c +++ b/options/options.c @@ -481,6 +481,7 @@ const m_option_t mp_opts[] = { OPT_SETTINGSLIST("ao-defaults", ao_defs, 0, &ao_obj_list, .deprecation_message = "deprecated, use global options"), OPT_STRING("audio-device", audio_device, 0), + OPT_FLAG("audio-exclusive", audio_exclusive, 0), OPT_STRING("audio-client-name", audio_client_name, 0), OPT_FLAG("audio-fallback-to-null", ao_null_fallback, 0), OPT_FLAG("audio-stream-silence", audio_stream_silence, 0), diff --git a/options/options.h b/options/options.h index 7d735e93b4..376c62e989 100644 --- a/options/options.h +++ b/options/options.h @@ -86,6 +86,7 @@ typedef struct MPOpts { struct m_obj_settings *audio_driver_list, *ao_defs; char *audio_device; + int audio_exclusive; char *audio_client_name; int ao_null_fallback; int audio_stream_silence; diff --git a/player/audio.c b/player/audio.c index 89f75d9095..507ef4d218 100644 --- a/player/audio.c +++ b/player/audio.c @@ -382,6 +382,9 @@ static void reinit_audio_filters_and_output(struct MPContext *mpctx) if (opts->audio_stream_silence) ao_flags |= AO_INIT_STREAM_SILENCE; + if (opts->audio_exclusive) + ao_flags |= AO_INIT_EXCLUSIVE; + if (af_fmt_is_pcm(afs->output.format)) { if (!opts->audio_output_channels.set || opts->audio_output_channels.auto_safe) -- cgit v1.2.3