[vlc-commits] aout: remove output conversions

Rémi Denis-Courmont git at videolan.org
Tue Nov 13 19:28:20 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Nov 13 20:23:07 2012 +0200| [5b595ec89fe2cb966aa5cbab64af77562ee54cdd] | committer: Rémi Denis-Courmont

aout: remove output conversions

The filters chain will convert to whatever output format is needed, so
this was redundant.

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

 src/audio_output/aout_internal.h |    5 +-
 src/audio_output/dec.c           |   12 +++--
 src/audio_output/output.c        |   93 +++++++++++---------------------------
 3 files changed, 35 insertions(+), 75 deletions(-)

diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h
index 7affe5a..f3fac12 100644
--- a/src/audio_output/aout_internal.h
+++ b/src/audio_output/aout_internal.h
@@ -70,8 +70,6 @@ typedef struct
     unsigned nb_filters;
     filter_t *filters[AOUT_MAX_FILTERS]; /**< Configured user filters
         (e.g. equalization) and their conversions */
-    unsigned nb_converters;
-    filter_t *converters[5]; /**< Converters to the output */
 
     aout_request_vout_t request_vout;
     bool recycle_vout;
@@ -123,8 +121,7 @@ audio_output_t *aout_New (vlc_object_t *);
 #define aout_New(a) aout_New(VLC_OBJECT(a))
 void aout_Destroy (audio_output_t *);
 
-int aout_OutputNew( audio_output_t * p_aout,
-                    const audio_sample_format_t * p_format );
+int aout_OutputNew(audio_output_t *, audio_sample_format_t *);
 int aout_OutputTimeGet(audio_output_t *, mtime_t *);
 void aout_OutputPlay(audio_output_t *, block_t *);
 void aout_OutputPause( audio_output_t * p_aout, bool, mtime_t );
diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index 5e62bc8..0832194 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -75,10 +75,13 @@ int aout_DecNew( audio_output_t *p_aout,
     var_Destroy( p_aout, "stereo-mode" );
 
     /* Create the audio output stream */
-    owner->input_format = *p_format;
-    vlc_atomic_set (&owner->restart, 0);
     owner->volume = aout_volume_New (p_aout, p_replay_gain);
-    if( aout_OutputNew( p_aout, p_format ) < 0 )
+
+    vlc_atomic_set (&owner->restart, 0);
+    owner->input_format = *p_format;
+    owner->mixer_format = owner->input_format;
+
+    if (aout_OutputNew (p_aout, &owner->mixer_format))
         goto error;
     aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format);
 
@@ -142,7 +145,8 @@ static int aout_CheckRestart (audio_output_t *aout)
     if (restart & AOUT_RESTART_OUTPUT)
     {
         aout_OutputDelete (aout);
-        if (aout_OutputNew (aout, &owner->input_format))
+        owner->mixer_format = owner->input_format;
+        if (aout_OutputNew (aout, &owner->mixer_format))
             abort (); /* FIXME we are officially screwed */
         aout_volume_SetFormat (owner->volume, owner->mixer_format.i_format);
     }
diff --git a/src/audio_output/output.c b/src/audio_output/output.c
index cf71752..91e9b78 100644
--- a/src/audio_output/output.c
+++ b/src/audio_output/output.c
@@ -28,7 +28,6 @@
 #include <vlc_common.h>
 #include <vlc_aout.h>
 #include <vlc_modules.h>
-#include <vlc_cpu.h>
 
 #include "libvlc.h"
 #include "aout_internal.h"
@@ -300,19 +299,24 @@ int aout_MuteSet (audio_output_t *aout, bool mute)
 
 /**
  * Starts an audio output stream.
- * \param fmtp audio output stream format [IN/OUT]
+ * \param fmt audio output stream format [IN/OUT]
  * \warning The caller must hold the audio output lock.
  */
-int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
+int aout_OutputNew (audio_output_t *aout, audio_sample_format_t *restrict fmt)
 {
-    aout_owner_t *owner = aout_owner (aout);
-
-    audio_sample_format_t fmt = *fmtp;
-    aout_FormatPrepare (&fmt);
-
     aout_assert_locked (aout);
 
-    if (aout->start (aout, &fmt))
+    /* Ideally, the audio filters would be created before the audio output,
+     * and the ideal audio format would be the output of the filters chain.
+     * But that scheme would not really play well with digital pass-through. */
+    if (AOUT_FMT_LINEAR(fmt))
+    {   /* Try to stay in integer domain if possible for no/slow FPU. */
+        fmt->i_format = (fmt->i_bitspersample > 16) ? VLC_CODEC_FL32
+                                                    : VLC_CODEC_S16N;
+        aout_FormatPrepare (fmt);
+    }
+
+    if (aout->start (aout, fmt))
     {
         msg_Err (aout, "module not functional");
         return -1;
@@ -327,24 +331,24 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
     switch (var_GetInteger (aout, "stereo-mode"))
     {
         case AOUT_VAR_CHAN_RSTEREO:
-            fmt.i_original_channels |= AOUT_CHAN_REVERSESTEREO;
-             break;
+            fmt->i_original_channels |= AOUT_CHAN_REVERSESTEREO;
+            break;
         case AOUT_VAR_CHAN_STEREO:
-            fmt.i_original_channels = AOUT_CHANS_STEREO;
+            fmt->i_original_channels = AOUT_CHANS_STEREO;
             break;
         case AOUT_VAR_CHAN_LEFT:
-            fmt.i_original_channels = AOUT_CHAN_LEFT;
+            fmt->i_original_channels = AOUT_CHAN_LEFT;
             break;
         case AOUT_VAR_CHAN_RIGHT:
-            fmt.i_original_channels = AOUT_CHAN_RIGHT;
+            fmt->i_original_channels = AOUT_CHAN_RIGHT;
             break;
         case AOUT_VAR_CHAN_DOLBYS:
-            fmt.i_original_channels = AOUT_CHANS_STEREO|AOUT_CHAN_DOLBYSTEREO;
+            fmt->i_original_channels = AOUT_CHANS_STEREO|AOUT_CHAN_DOLBYSTEREO;
             break;
         default:
         {
-            if ((fmt.i_original_channels & AOUT_CHAN_PHYSMASK)
-                                                         != AOUT_CHANS_STEREO)
+            if ((fmt->i_original_channels & AOUT_CHAN_PHYSMASK)
+                                                          != AOUT_CHANS_STEREO)
                  break;
 
             vlc_value_t val, txt;
@@ -352,7 +356,7 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
             var_Change (aout, "stereo-mode", VLC_VAR_DELCHOICE, &val, NULL);
             txt.psz_string = _("Stereo audio mode");
             var_Change (aout, "stereo-mode", VLC_VAR_SETTEXT, &txt, NULL);
-            if (fmt.i_original_channels & AOUT_CHAN_DOLBYSTEREO)
+            if (fmt->i_original_channels & AOUT_CHAN_DOLBYSTEREO)
             {
                 val.i_int = AOUT_VAR_CHAN_DOLBYS;
                 txt.psz_string = _("Dolby Surround");
@@ -367,9 +371,9 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
             val.i_int = AOUT_VAR_CHAN_LEFT;
             txt.psz_string = _("Left");
             var_Change (aout, "stereo-mode", VLC_VAR_ADDCHOICE, &val, &txt);
-            if (fmt.i_original_channels & AOUT_CHAN_DUALMONO)
+            if (fmt->i_original_channels & AOUT_CHAN_DUALMONO)
             {   /* Go directly to the left channel. */
-                fmt.i_original_channels = AOUT_CHAN_LEFT;
+                fmt->i_original_channels = AOUT_CHAN_LEFT;
                 var_Change (aout, "stereo-mode", VLC_VAR_SETVALUE, &val, NULL);
             }
             val.i_int = AOUT_VAR_CHAN_RIGHT;
@@ -381,37 +385,8 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
         }
     }
 
-    aout_FormatPrepare (&fmt);
-    aout_FormatPrint (aout, "output", &fmt );
-
-    /* Choose the mixer format. */
-    owner->mixer_format = fmt;
-    if (!AOUT_FMT_LINEAR(&fmt))
-        owner->mixer_format.i_format = fmtp->i_format;
-    else
-    /* Most audio filters can only deal with single-precision,
-     * so lets always use that when hardware supports floating point. */
-    if( HAVE_FPU )
-        owner->mixer_format.i_format = VLC_CODEC_FL32;
-    else
-    /* Fallback to 16-bits. This avoids pointless conversion to and from
-     * 32-bits samples for the sole purpose of software mixing. */
-        owner->mixer_format.i_format = VLC_CODEC_S16N;
-
-    aout_FormatPrepare (&owner->mixer_format);
-    aout_FormatPrint (aout, "mixer", &owner->mixer_format);
-
-    /* Create converters. */
-    owner->nb_converters = 0;
-    if (aout_FiltersPipelineCreate (aout, owner->converters,
-                                    &owner->nb_converters,
-                    sizeof (owner->converters) / sizeof (owner->converters[0]),
-                                    &owner->mixer_format, &fmt) < 0)
-    {
-        msg_Err (aout, "couldn't create audio output pipeline");
-        aout_OutputDelete (aout);
-        return -1;
-    }
+    aout_FormatPrepare (fmt);
+    aout_FormatPrint (aout, "output", fmt);
     return 0;
 }
 
@@ -422,14 +397,11 @@ int aout_OutputNew (audio_output_t *aout, const audio_sample_format_t *fmtp)
  */
 void aout_OutputDelete (audio_output_t *aout)
 {
-    aout_owner_t *owner = aout_owner (aout);
-
     aout_assert_locked (aout);
 
     var_DelCallback (aout, "stereo-mode", aout_ChannelsRestart, NULL);
     if (aout->stop != NULL)
         aout->stop (aout);
-    aout_FiltersPipelineDestroy (owner->converters, owner->nb_converters);
 }
 
 int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts)
@@ -448,20 +420,7 @@ int aout_OutputTimeGet (audio_output_t *aout, mtime_t *pts)
  */
 void aout_OutputPlay (audio_output_t *aout, block_t *block)
 {
-    aout_owner_t *owner = aout_owner (aout);
-
     aout_assert_locked (aout);
-
-    block = aout_FiltersPipelinePlay (owner->converters, owner->nb_converters,
-                                      block);
-    if (block == NULL)
-        return;
-    if (block->i_buffer == 0)
-    {
-        block_Release (block);
-        return;
-    }
-
     aout->play (aout, block);
 }
 



More information about the vlc-commits mailing list