[vlc-commits] aout: keep the requested stereo-mode across several inputs

Thomas Guillem git at videolan.org
Mon Apr 16 10:26:20 CEST 2018


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Mar 30 11:16:31 2018 +0200| [d0893832c64e18687adf7005db54cd2ce34f8071] | committer: Thomas Guillem

aout: keep the requested stereo-mode across several inputs

This also fixes the stereo-mode being forgotten when the decoder thread reload
its decoder module and aout.

If the requested stereo-mode is not available, fallback to the default one, but
keep this mode for next inputs. That is why the requested_stereo_mode
intermediate variable is needed.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d0893832c64e18687adf7005db54cd2ce34f8071
---

 src/audio_output/aout_internal.h |  2 +-
 src/audio_output/dec.c           |  3 --
 src/audio_output/output.c        | 72 +++++++++++++++++++++++-----------------
 3 files changed, 42 insertions(+), 35 deletions(-)

diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h
index e5b1842ef2..850500428e 100644
--- a/src/audio_output/aout_internal.h
+++ b/src/audio_output/aout_internal.h
@@ -84,7 +84,7 @@ typedef struct
         bool discontinuity;
     } sync;
 
-    int initial_stereo_mode; /**< Initial stereo mode set by options */
+    int requested_stereo_mode; /**< Requested stereo mode set by the user */
 
     audio_sample_format_t input_format;
     audio_sample_format_t mixer_format;
diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index 60c35e6176..99740027a0 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -84,9 +84,6 @@ int aout_DecNew( audio_output_t *p_aout,
     owner->mixer_format = owner->input_format;
     owner->request_vout = *p_request_vout;
 
-    var_Change (p_aout, "stereo-mode", VLC_VAR_SETVALUE,
-                &(vlc_value_t) { .i_int = owner->initial_stereo_mode }, NULL);
-
     owner->filters_cfg = AOUT_FILTERS_CFG_INIT;
     if (aout_OutputNew (p_aout, &owner->mixer_format, &owner->filters_cfg))
         goto error;
diff --git a/src/audio_output/output.c b/src/audio_output/output.c
index 9e4e227f58..eb7bda394c 100644
--- a/src/audio_output/output.c
+++ b/src/audio_output/output.c
@@ -177,6 +177,11 @@ static int StereoModeCallback (vlc_object_t *obj, const char *varname,
     audio_output_t *aout = (audio_output_t *)obj;
     (void)varname; (void)oldval; (void)newval; (void)data;
 
+    aout_owner_t *owner = aout_owner (aout);
+    vlc_mutex_lock (&owner->lock);
+    owner->requested_stereo_mode = newval.i_int;
+    vlc_mutex_unlock (&owner->lock);
+
     aout_RestartRequest (aout, AOUT_RESTART_STEREOMODE);
     return 0;
 }
@@ -338,7 +343,7 @@ audio_output_t *aout_New (vlc_object_t *parent)
 
     /* Stereo mode */
     var_Create (aout, "stereo-mode", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
-    owner->initial_stereo_mode = var_GetInteger (aout, "stereo-mode");
+    owner->requested_stereo_mode = var_GetInteger (aout, "stereo-mode");
 
     var_AddCallback (aout, "stereo-mode", StereoModeCallback, NULL);
     vlc_value_t txt;
@@ -404,17 +409,21 @@ static void aout_PrepareStereoMode (audio_output_t *aout,
                                     audio_sample_format_t *restrict fmt,
                                     aout_filters_cfg_t *filters_cfg,
                                     audio_channel_type_t input_chan_type,
-                                    unsigned i_nb_input_channels,
-                                    int i_forced_stereo_mode)
+                                    unsigned i_nb_input_channels)
 {
+    aout_owner_t *owner = aout_owner (aout);
+
     /* Fill Stereo mode choices */
     var_Change (aout, "stereo-mode", VLC_VAR_CLEARCHOICES, NULL, NULL);
-    vlc_value_t val, txt, default_val = { .i_int = AOUT_VAR_CHAN_UNSET };
+    vlc_value_t val, txt;
     val.i_int = 0;
 
     if (!AOUT_FMT_LINEAR(fmt) || i_nb_input_channels == 1)
         return;
 
+    int i_output_mode = owner->requested_stereo_mode;
+    int i_default_mode = AOUT_VAR_CHAN_UNSET;
+
     val.i_int = AOUT_VAR_CHAN_MONO;
     txt.psz_string = _("Mono");
     var_Change (aout, "stereo-mode", VLC_VAR_ADDCHOICE, &val, &txt);
@@ -439,7 +448,10 @@ static void aout_PrepareStereoMode (audio_output_t *aout,
 
     if (i_nb_input_channels == 2)
     {
-        default_val.i_int = val.i_int; /* Stereo or Dolby Surround */
+        if (fmt->i_chan_mode & AOUT_CHANMODE_DUALMONO)
+            i_default_mode = AOUT_VAR_CHAN_LEFT;
+        else
+            i_default_mode = val.i_int; /* Stereo or Dolby Surround */
 
         val.i_int = AOUT_VAR_CHAN_LEFT;
         txt.psz_string = _("Left");
@@ -460,18 +472,26 @@ static void aout_PrepareStereoMode (audio_output_t *aout,
         txt.psz_string = _("Headphones");
         var_Change (aout, "stereo-mode", VLC_VAR_ADDCHOICE, &val, &txt);
 
-        if (i_forced_stereo_mode == AOUT_VAR_CHAN_UNSET
-         && aout->current_sink_info.headphones)
+        if (aout->current_sink_info.headphones)
+            i_default_mode = AOUT_VAR_CHAN_HEADPHONES;
+    }
+
+    bool mode_available = false;
+    vlc_value_t vals;
+    if (!var_Change(aout, "stereo-mode", VLC_VAR_GETCHOICES, &vals, NULL))
+    {
+        for (int i = 0; !mode_available && i < vals.p_list->i_count; ++i)
         {
-            i_forced_stereo_mode = AOUT_VAR_CHAN_HEADPHONES;
-            default_val.i_int = val.i_int;
-            var_Change (aout, "stereo-mode", VLC_VAR_SETVALUE, &default_val,
-                        NULL);
+            if (vals.p_list->p_values[i].i_int == i_output_mode)
+                mode_available = true;
         }
+        var_FreeList(&vals, NULL);
     }
+    if (!mode_available)
+        i_output_mode = i_default_mode;
 
     /* The user may have selected a different channels configuration. */
-    switch (i_forced_stereo_mode)
+    switch (i_output_mode)
     {
         case AOUT_VAR_CHAN_RSTEREO:
             filters_cfg->remap[AOUT_CHANIDX_LEFT] = AOUT_CHANIDX_RIGHT;
@@ -497,16 +517,11 @@ static void aout_PrepareStereoMode (audio_output_t *aout,
                 filters_cfg->remap[i] = AOUT_CHANIDX_LEFT;
             break;
         default:
-            if (i_nb_input_channels == 2
-             && fmt->i_chan_mode & AOUT_CHANMODE_DUALMONO)
-            {   /* Go directly to the left channel. */
-                filters_cfg->remap[AOUT_CHANIDX_RIGHT] = AOUT_CHANIDX_DISABLE;
-                default_val.i_int = val.i_int = AOUT_VAR_CHAN_LEFT;
-            }
-            var_Change (aout, "stereo-mode", VLC_VAR_SETVALUE, &default_val,
-                        NULL);
             break;
     }
+
+    var_Change(aout, "stereo-mode", VLC_VAR_SETVALUE,
+               &(vlc_value_t) { .i_int = i_output_mode }, NULL);
 }
 
 /**
@@ -517,10 +532,10 @@ static void aout_PrepareStereoMode (audio_output_t *aout,
 int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt,
                     aout_filters_cfg_t *filters_cfg)
 {
+    aout_owner_t *owner = aout_owner (aout);
     aout_OutputAssertLocked (aout);
 
     audio_channel_type_t input_chan_type = fmt->channel_type;
-    int i_forced_stereo_mode = AOUT_VAR_CHAN_UNSET;
     unsigned i_nb_input_channels = fmt->i_channels;
 
     /* Ideally, the audio filters would be created before the audio output,
@@ -548,15 +563,10 @@ int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt,
         fmt->i_format = (fmt->i_bitspersample > 16) ? VLC_CODEC_FL32
                                                     : VLC_CODEC_S16N;
 
-        i_forced_stereo_mode = var_GetInteger (aout, "stereo-mode");
-        if (i_forced_stereo_mode != AOUT_VAR_CHAN_UNSET)
-        {
-            if (i_forced_stereo_mode == AOUT_VAR_CHAN_LEFT
-             || i_forced_stereo_mode == AOUT_VAR_CHAN_RIGHT)
-                fmt->i_physical_channels = AOUT_CHAN_CENTER;
-            else
-                fmt->i_physical_channels = AOUT_CHANS_STEREO;
-        }
+        if (fmt->i_physical_channels == AOUT_CHANS_STEREO
+         && (owner->requested_stereo_mode == AOUT_VAR_CHAN_LEFT
+          || owner->requested_stereo_mode == AOUT_VAR_CHAN_RIGHT))
+            fmt->i_physical_channels = AOUT_CHAN_CENTER;
 
         aout_FormatPrepare (fmt);
         assert (aout_FormatNbChannels(fmt) > 0);
@@ -571,7 +581,7 @@ int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt,
     }
 
     aout_PrepareStereoMode (aout, fmt, filters_cfg, input_chan_type,
-                            i_nb_input_channels, i_forced_stereo_mode);
+                            i_nb_input_channels);
 
     aout_FormatPrepare (fmt);
     assert (fmt->i_bytes_per_frame > 0 && fmt->i_frame_length > 0);



More information about the vlc-commits mailing list