[vlc-commits] auhal: test digital devices and hog_pid when needed
Thomas Guillem
git at videolan.org
Thu Mar 2 18:16:53 CET 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Mar 2 13:10:58 2017 +0100| [2756b1edf493ea3cc0194476fa04dd6b80c3f362] | committer: Thomas Guillem
auhal: test digital devices and hog_pid when needed
This commit change the behaviour of the Start() function. this function will
now fail with S/PDIF audio formats if there is no digital devices (Start will
be called again with a PCM format in that case).
fix #17741
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2756b1edf493ea3cc0194476fa04dd6b80c3f362
---
modules/audio_output/auhal.c | 70 ++++++++++++++++++++++----------------------
1 file changed, 35 insertions(+), 35 deletions(-)
diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c
index 709548a..3f7212e 100644
--- a/modules/audio_output/auhal.c
+++ b/modules/audio_output/auhal.c
@@ -1016,7 +1016,36 @@ error:
static int
StartSPDIF(audio_output_t * p_aout, audio_sample_format_t *fmt)
{
- struct aout_sys_t *p_sys = p_aout->sys;
+ struct aout_sys_t *p_sys = p_aout->sys;
+ int ret;
+
+ /* Check if device supports digital */
+ if (!AudioDeviceSupportsDigital(p_aout, p_sys->i_selected_dev))
+ {
+ msg_Dbg(p_aout, "Audio device supports PCM mode only");
+ return VLC_EGENERIC;
+ }
+
+ ret = AO_GET1PROP(p_sys->i_selected_dev, pid_t, &p_sys->i_hog_pid,
+ kAudioDevicePropertyHogMode,
+ kAudioObjectPropertyScopeOutput);
+ if (ret != VLC_SUCCESS)
+ {
+ /* This is not a fatal error. Some drivers simply don't support this
+ * property */
+ p_sys->i_hog_pid = -1;
+ }
+
+ if (p_sys->i_hog_pid != -1 && p_sys->i_hog_pid != getpid())
+ {
+ msg_Err(p_aout, "Selected audio device is exclusively in use by another"
+ " program.");
+ vlc_dialog_display_error(p_aout, _("Audio output failed"), "%s",
+ _("The selected audio output device is exclusively in "
+ "use by another program."));
+ return VLC_EGENERIC;
+ }
+
AudioStreamBasicDescription desired_stream_format;
memset(&desired_stream_format, 0, sizeof(desired_stream_format));
@@ -1032,9 +1061,9 @@ StartSPDIF(audio_output_t * p_aout, audio_sample_format_t *fmt)
* ignored to avoid endless restarting.
*/
p_sys->b_ignore_streams_changed_callback = true;
- int ret = AO_SETPROP(p_sys->i_selected_dev, sizeof(p_sys->i_hog_pid),
- &p_sys->i_hog_pid, kAudioDevicePropertyHogMode,
- kAudioObjectPropertyScopeOutput);
+ ret = AO_SETPROP(p_sys->i_selected_dev, sizeof(p_sys->i_hog_pid),
+ &p_sys->i_hog_pid, kAudioDevicePropertyHogMode,
+ kAudioObjectPropertyScopeOutput);
p_sys->b_ignore_streams_changed_callback = false;
if (ret != VLC_SUCCESS)
@@ -1255,6 +1284,7 @@ StartSPDIF(audio_output_t * p_aout, audio_sample_format_t *fmt)
return VLC_EGENERIC;
}
+ msg_Dbg(p_aout, "Using audio device for digital output");
return VLC_SUCCESS;
}
@@ -1355,7 +1385,6 @@ Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
/* Use int here, to match kAudioDevicePropertyDeviceIsAlive
* property size */
int b_alive = false;
- bool b_start_digital = false;
if (aout_FormatNbChannels(fmt) == 0 || AOUT_FMT_HDMI(fmt))
return VLC_EGENERIC;
@@ -1363,7 +1392,6 @@ Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
p_sys = p_aout->sys;
p_sys->b_digital = false;
p_sys->au_unit = NULL;
- p_sys->i_hog_pid = -1;
p_sys->i_stream_index = -1;
p_sys->b_revert = false;
p_sys->b_changed_mixing = false;
@@ -1433,39 +1461,11 @@ Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
}
vlc_mutex_unlock(&p_sys->selected_device_lock);
- /* Check if device supports digital */
- b_start_digital = AudioDeviceSupportsDigital(p_aout, p_sys->i_selected_dev);
-
- if (b_start_digital)
- msg_Dbg(p_aout, "Using audio device for digital output");
- else
- msg_Dbg(p_aout, "Audio device supports PCM mode only");
-
/* add a callback to see if the device dies later on */
AO_UPDATELISTENER(p_sys->i_selected_dev, true, DeviceAliveListener, p_aout,
kAudioDevicePropertyDeviceIsAlive,
kAudioObjectPropertyScopeGlobal);
- int ret = AO_GET1PROP(p_sys->i_selected_dev, pid_t, &p_sys->i_hog_pid,
- kAudioDevicePropertyHogMode,
- kAudioObjectPropertyScopeOutput);
- if (ret != VLC_SUCCESS)
- {
- /* This is not a fatal error. Some drivers simply don't support this
- * property */
- p_sys->i_hog_pid = -1;
- }
-
- if (p_sys->i_hog_pid != -1 && p_sys->i_hog_pid != getpid())
- {
- msg_Err(p_aout, "Selected audio device is exclusively in use by another"
- " program.");
- vlc_dialog_display_error(p_aout, _("Audio output failed"), "%s",
- _("The selected audio output device is exclusively in "
- "use by another program."));
- goto error;
- }
-
/* get device latency */
AO_GET1PROP(p_sys->i_selected_dev, UInt32, &p_sys->c.i_latency_samples,
kAudioDevicePropertyLatency, kAudioObjectPropertyScopeOutput);
@@ -1482,7 +1482,7 @@ Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
}
/* Check for Digital mode or Analog output mode */
- if (AOUT_FMT_SPDIF (fmt) && b_start_digital)
+ if (AOUT_FMT_SPDIF (fmt))
{
if (StartSPDIF (p_aout, fmt) == VLC_SUCCESS)
{
More information about the vlc-commits
mailing list