[vlc-commits] Don't use more aout channels than the stream actually has to avoid upmix.

Denis Charmet git at videolan.org
Sun Sep 8 17:56:28 CEST 2013


vlc | branch: master | Denis Charmet <typx at dinauz.org> | Sun Sep  8 17:54:54 2013 +0200| [22ccb7a210ce33ea6de896985b7900bc1c170867] | committer: Denis Charmet

Don't use more aout channels than the stream actually has to avoid upmix.

Fix #9342

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

 modules/audio_output/directx.c |   37 +++++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git a/modules/audio_output/directx.c b/modules/audio_output/directx.c
index 8367535..fbcf0fc 100644
--- a/modules/audio_output/directx.c
+++ b/modules/audio_output/directx.c
@@ -185,6 +185,8 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
     if( i == 0 )
     {
         DWORD ui_speaker_config;
+        int i_channels = 2; /* Default to stereo */
+        int i_orig_channels = aout_FormatNbChannels( fmt );
 
         /* Check the speaker configuration to determine which channel config
          * should be the default */
@@ -194,7 +196,6 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
             ui_speaker_config = DSSPEAKER_STEREO;
             msg_Dbg( p_aout, "GetSpeakerConfig failed" );
         }
-        fmt->i_physical_channels = AOUT_CHANS_2_0;
 
         const char *name = "Unknown";
         switch( DSSPEAKER_CONFIG(ui_speaker_config) )
@@ -202,16 +203,16 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
         case DSSPEAKER_7POINT1:
         case DSSPEAKER_7POINT1_SURROUND:
             name = "7.1";
-            fmt->i_physical_channels = AOUT_CHANS_7_1;
+            i_channels = 8;
             break;
         case DSSPEAKER_5POINT1:
         case DSSPEAKER_5POINT1_SURROUND:
             name = "5.1";
-            fmt->i_physical_channels = AOUT_CHANS_5_1;
+            i_channels = 6;
             break;
         case DSSPEAKER_QUAD:
             name = "Quad";
-            fmt->i_physical_channels = AOUT_CHANS_4_0;
+            i_channels = 4;
             break;
 #if 0 /* Lots of people just get their settings wrong and complain that
        * this is a problem with VLC so just don't ever set mono by default. */
@@ -220,14 +221,38 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
             fmt->i_physical_channels = AOUT_CHAN_CENTER;
             break;
 #endif
-        case DSSPEAKER_SURROUND: /* XXX: stereo, really? -- Courmisch */
+        case DSSPEAKER_SURROUND:
             name = "Surround";
+            i_channels = 4;
             break;
         case DSSPEAKER_STEREO:
             name = "Stereo";
+            i_channels = 2;
+            break;
+        }
+
+        i_channels = ( i_channels < i_orig_channels )? i_channels: i_orig_channels;
+
+        msg_Dbg( p_aout, "%s speaker config: %s and stream has %d channels, using %d channels",
+                 "Windows", name, i_orig_channels, i_channels );
+
+        switch( i_channels )
+        {
+        case 8:
+            fmt->i_physical_channels = AOUT_CHANS_7_1;
+            break;
+        case 7:
+        case 6:
+            fmt->i_physical_channels = AOUT_CHANS_5_1;
+            break;
+        case 5:
+        case 4:
+            fmt->i_physical_channels = AOUT_CHANS_4_0;
+            break;
+        default:
+            fmt->i_physical_channels = AOUT_CHANS_2_0;
             break;
         }
-        msg_Dbg( p_aout, "%s speaker config: %s", "Windows", name );
     }
     else
     {   /* Overriden speaker configuration */



More information about the vlc-commits mailing list