[vlc-devel] [PATCH 1/2] audiotrack : refactored the audiotrack creation

Duncan McNAMARA dcn.mcnamara at gmail.com
Fri Jul 1 14:05:35 CEST 2016


---
 modules/audio_output/audiotrack.c | 96 +++++++++++++++++++--------------------
 1 file changed, 46 insertions(+), 50 deletions(-)

diff --git a/modules/audio_output/audiotrack.c b/modules/audio_output/audiotrack.c
index 4c6fb71..438f330 100644
--- a/modules/audio_output/audiotrack.c
+++ b/modules/audio_output/audiotrack.c
@@ -824,29 +824,11 @@ AudioTrack_Recreate( JNIEnv *env, audio_output_t *p_aout )
 static int
 AudioTrack_Create( JNIEnv *env, audio_output_t *p_aout,
                    unsigned int i_rate,
-                   vlc_fourcc_t i_vlc_format,
+                   int i_format,
                    uint16_t i_physical_channels )
 {
     aout_sys_t *p_sys = p_aout->sys;
-    int i_size, i_min_buffer_size, i_channel_config, i_format;
-
-    switch( i_vlc_format )
-    {
-        case VLC_CODEC_U8:
-            i_format = jfields.AudioFormat.ENCODING_PCM_8BIT;
-            break;
-        case VLC_CODEC_S16N:
-            i_format = jfields.AudioFormat.ENCODING_PCM_16BIT;
-            break;
-        case VLC_CODEC_FL32:
-            i_format = jfields.AudioFormat.ENCODING_PCM_FLOAT;
-            break;
-        case VLC_CODEC_SPDIFB:
-            i_format = jfields.AudioFormat.ENCODING_AC3;
-            break;
-        default:
-            vlc_assert_unreachable();
-    }
+    int i_size, i_min_buffer_size, i_channel_config;
 
     switch( i_physical_channels )
     {
@@ -899,6 +881,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
     int i_nb_channels, i_max_channels, i_native_rate = 0, i_ret;
     unsigned int i_rate;
     bool b_spdif;
+    int i_format;
 
     if( p_sys->at_dev == AT_DEV_HDMI )
     {
@@ -933,53 +916,69 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
             i_native_rate = VLC_CLIP( p_sys->fmt.i_rate, 4000, 48000 );
     }
 
-    /* We can only accept U8, S16N, FL32, and AC3 */
-    switch( p_sys->fmt.i_format )
+    do
     {
+        /* We can only accept U8, S16N, FL32, and AC3 */
+        switch( p_sys->fmt.i_format )
+        {
         case VLC_CODEC_U8:
+            i_format = jfields.AudioFormat.ENCODING_PCM_8BIT;
             break;
         case VLC_CODEC_S16N:
+            i_format = jfields.AudioFormat.ENCODING_PCM_16BIT;
             break;
         case VLC_CODEC_FL32:
-            if( !jfields.AudioFormat.has_ENCODING_PCM_FLOAT )
+            if( jfields.AudioFormat.has_ENCODING_PCM_FLOAT )
+                i_format = jfields.AudioFormat.ENCODING_PCM_FLOAT;
+            else
+            {
                 p_sys->fmt.i_format = VLC_CODEC_S16N;
+                i_format = jfields.AudioFormat.ENCODING_PCM_16BIT;
+            }
             break;
         case VLC_CODEC_A52:
             if( jfields.AudioFormat.has_ENCODING_AC3 && b_spdif )
+            {
                 p_sys->fmt.i_format = VLC_CODEC_SPDIFB;
+                i_format = jfields.AudioFormat.ENCODING_AC3;
+            }
             else if( jfields.AudioFormat.has_ENCODING_PCM_FLOAT )
+            {
                 p_sys->fmt.i_format = VLC_CODEC_FL32;
+                i_format = jfields.AudioFormat.ENCODING_PCM_FLOAT;
+            }
             else
+            {
                 p_sys->fmt.i_format = VLC_CODEC_S16N;
+                i_format = jfields.AudioFormat.ENCODING_PCM_16BIT;
+            }
             break;
         default:
             p_sys->fmt.i_format = VLC_CODEC_S16N;
+            i_format = jfields.AudioFormat.ENCODING_PCM_16BIT;
             break;
-    }
+        }
 
-    /* Android AudioTrack supports only mono, stereo, 5.1 and 7.1.
-     * Android will downmix to stereo if audio output doesn't handle 5.1 or 7.1
-     */
-    i_nb_channels = aout_FormatNbChannels( &p_sys->fmt );
-    if( p_sys->fmt.i_format != VLC_CODEC_SPDIFB )
-        i_nb_channels = __MIN( i_max_channels, i_nb_channels );
-    if( i_nb_channels > 5 )
-    {
-        if( i_nb_channels > 7 && jfields.AudioFormat.has_CHANNEL_OUT_SIDE )
-            p_sys->fmt.i_physical_channels = AOUT_CHANS_7_1;
-        else
-            p_sys->fmt.i_physical_channels = AOUT_CHANS_5_1;
-    } else
-    {
-        if( i_nb_channels == 1 )
-            p_sys->fmt.i_physical_channels = AOUT_CHAN_LEFT;
-        else
-            p_sys->fmt.i_physical_channels = AOUT_CHANS_STEREO;
-    }
+        /* Android AudioTrack supports only mono, stereo, 5.1 and 7.1.
+         * Android will downmix to stereo if audio output doesn't handle 5.1 or 7.1
+         */
 
-    do
-    {
         i_nb_channels = aout_FormatNbChannels( &p_sys->fmt );
+        if( p_sys->fmt.i_format != VLC_CODEC_SPDIFB )
+            i_nb_channels = __MIN( i_max_channels, i_nb_channels );
+        if( i_nb_channels > 5 )
+        {
+            if( i_nb_channels > 7 && jfields.AudioFormat.has_CHANNEL_OUT_SIDE )
+                p_sys->fmt.i_physical_channels = AOUT_CHANS_7_1;
+            else
+                p_sys->fmt.i_physical_channels = AOUT_CHANS_5_1;
+        } else
+        {
+            if( i_nb_channels == 1 )
+                p_sys->fmt.i_physical_channels = AOUT_CHAN_LEFT;
+            else
+                p_sys->fmt.i_physical_channels = AOUT_CHANS_STEREO;
+        }
         i_rate = p_sys->fmt.i_format == VLC_CODEC_SPDIFB ?
                                         VLC_CLIP( p_sys->fmt.i_rate, 32000, 48000 )
                                         : (unsigned int) i_native_rate;
@@ -988,7 +987,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
          * format configuration. If AudioTrack_Create fails, try again with a
          * less advanced format (PCM S16N). If it fails again, try again with
          * Stereo channels. */
-        i_ret = AudioTrack_Create( env, p_aout, i_rate, p_sys->fmt.i_format,
+        i_ret = AudioTrack_Create( env, p_aout, i_rate, i_format,
                                    p_sys->fmt.i_physical_channels );
         if( i_ret != 0 )
         {
@@ -996,10 +995,7 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
             {
                 msg_Warn( p_aout, "SPDIF configuration failed, "
                                   "fallback to PCM" );
-                if( jfields.AudioFormat.has_ENCODING_PCM_FLOAT )
-                    p_sys->fmt.i_format = VLC_CODEC_FL32;
-                else
-                    p_sys->fmt.i_format = VLC_CODEC_S16N;
+                p_sys->fmt.i_format = VLC_CODEC_FL32;
             }
             else if( p_sys->fmt.i_format == VLC_CODEC_FL32 )
             {
-- 
2.5.5



More information about the vlc-devel mailing list