aout: channel mask can be 0
authorThomas Guillem <thomas@gllm.fr>
Wed, 5 Oct 2016 13:41:25 +0000 (15:41 +0200)
committerThomas Guillem <thomas@gllm.fr>
Fri, 7 Oct 2016 10:09:03 +0000 (12:09 +0200)
Audio outputs don't need the channel mask for S/PDIF or HDMI passthrough.
This will be convenient for Dolby Atmos that can have a higher channel count
that can't be mapped.

20 files changed:
modules/audio_output/adummy.c
modules/audio_output/alsa.c
modules/audio_output/amem.c
modules/audio_output/audioqueue.c
modules/audio_output/audiotrack.c
modules/audio_output/audiounit_ios.m
modules/audio_output/auhal.c
modules/audio_output/directsound.c
modules/audio_output/file.c
modules/audio_output/jack.c
modules/audio_output/kai.c
modules/audio_output/opensles_android.c
modules/audio_output/oss.c
modules/audio_output/pulse.c
modules/audio_output/sndio.c
modules/audio_output/tizen_audio.c
modules/audio_output/waveout.c
src/audio_output/common.c
src/audio_output/dec.c
src/audio_output/filters.c

index a973aed..0c33000 100644 (file)
@@ -55,6 +55,9 @@ static void Flush(audio_output_t *aout, bool wait)
 
 static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
 {
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     if (AOUT_FMT_SPDIF(fmt) && var_InheritBool(aout, "spdif"))
     {
         fmt->i_format = VLC_CODEC_SPDIFL;
index a3e0944..580ebb0 100644 (file)
@@ -287,6 +287,9 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt)
     snd_pcm_format_t pcm_format; /* ALSA sample format */
     bool spdif = false;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     switch (fmt->i_format)
     {
         case VLC_CODEC_FL64:
index 9e9ece6..1821e46 100644 (file)
@@ -163,6 +163,9 @@ static int Start (audio_output_t *aout, audio_sample_format_t *fmt)
     char format[5] = "S16N";
     unsigned channels;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     if (sys->setup != NULL)
     {
         channels = aout_FormatNbChannels(fmt);
index b594a8f..0a6ad74 100644 (file)
@@ -121,6 +121,9 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
     aout_sys_t *p_sys = p_aout->sys;
     OSStatus error = 0;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     // prepare the format description for our output
     AudioStreamBasicDescription streamDescription;
     streamDescription.mSampleRate = fmt->i_rate;
index f0975a4..3e46152 100644 (file)
@@ -895,6 +895,9 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
     bool b_spdif;
     int i_at_format;
 
+    if (aout_FormatNbChannels(p_fmt) == 0)
+        return VLC_EGENERIC;
+
     if( p_sys->at_dev == AT_DEV_HDMI )
     {
         b_spdif = true;
index cee8eab..3f591ce 100644 (file)
@@ -138,6 +138,9 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
 {
     struct aout_sys_t *p_sys = NULL;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     p_sys = p_aout->sys;
     p_sys->au_component = NULL;
     p_sys->au_unit = NULL;
index de64f42..4463804 100644 (file)
@@ -320,6 +320,9 @@ static int Start(audio_output_t *p_aout, audio_sample_format_t *restrict fmt)
 
     bool                    b_start_digital = false;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     p_sys = p_aout->sys;
     p_sys->b_digital = false;
     p_sys->au_component = NULL;
index 8518c4c..55f1e7a 100644 (file)
@@ -593,6 +593,9 @@ static void OutputStop( audio_output_t *aout )
 static HRESULT Start( vlc_object_t *obj, aout_stream_sys_t *sys,
                       audio_sample_format_t *restrict pfmt )
 {
+    if( aout_FormatNbChannels( pfmt ) == 0 )
+        return E_FAIL;
+
 #if !VLC_WINSTORE_APP
     /* Set DirectSound Cooperative level, ie what control we want over Windows
      * sound device. In our case, DSSCL_EXCLUSIVE means that we can modify the
index 3a36aa9..e651dff 100644 (file)
@@ -135,6 +135,9 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
     const char * const * ppsz_compare = format_list;
     int i_channels, i = 0;
 
+    if( aout_FormatNbChannels( fmt ) == 0 )
+        return VLC_EGENERIC;
+
     psz_name = var_InheritString( p_aout, "audiofile-file" );
     if( !psz_name )
     {
index 4cc4da3..cfecabe 100644 (file)
@@ -121,6 +121,9 @@ static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
     unsigned int i;
     int i_error;
 
+    if( aout_FormatNbChannels( fmt ) == 0 )
+        return VLC_EGENERIC;
+
     p_sys->latency = 0;
     p_sys->paused = VLC_TS_INVALID;
 
index d3cbb5a..210919b 100644 (file)
@@ -135,6 +135,9 @@ static int Start ( audio_output_t *p_aout, audio_sample_format_t *fmt )
     vlc_value_t val, text;
     audio_sample_format_t format = *fmt;
 
+    if( aout_FormatNbChannels( fmt ) == 0 )
+        return VLC_EGENERIC;
+
     psz_mode = var_InheritString( p_aout, "kai-audio-device" );
     if( !psz_mode )
         psz_mode = ( char * )ppsz_kai_audio_device[ 0 ];  // "auto"
index a067b6a..41b5c2a 100644 (file)
@@ -379,6 +379,9 @@ static int aout_get_native_sample_rate(audio_output_t *aout)
  *****************************************************************************/
 static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
 {
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     SLresult       result;
 
     aout_sys_t *sys = aout->sys;
index ba1a0f6..d60c68a 100644 (file)
@@ -90,6 +90,9 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt)
 {
     aout_sys_t* sys = aout->sys;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     /* Open the device */
     const char *device = sys->device;
     if (device == NULL)
index a088e44..4a11ec6 100644 (file)
@@ -698,6 +698,9 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
     struct pa_sample_spec ss;
     pa_encoding_t encoding = PA_ENCODING_INVALID;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     switch (fmt->i_format)
     {
         case VLC_CODEC_FL64:
index 4d023a0..fb5f4bd 100644 (file)
@@ -66,6 +66,9 @@ static int Start (audio_output_t *aout, audio_sample_format_t *restrict fmt)
 {
     aout_sys_t *sys = aout->sys;
 
+    if (aout_FormatNbChannels(fmt) == 0)
+        return VLC_EGENERIC;
+
     sys->hdl = sio_open (NULL, SIO_PLAY, 0 /* blocking */);
     if (sys->hdl == NULL)
     {
index 111a3b6..e013c2f 100644 (file)
@@ -196,6 +196,9 @@ Start( audio_output_t *p_aout, audio_sample_format_t *restrict p_fmt )
 {
     aout_sys_t *p_sys = p_aout->sys;
 
+    if( aout_FormatNbChannels( p_fmt ) == 0 )
+        return VLC_EGENERIC;
+
     aout_FormatPrint( p_aout, "Tizen audio is looking for:", p_fmt );
 
     /* Sample rate: tizen accept rate between 8000 and 48000 Hz */
index 3ce8158..58d26df 100644 (file)
@@ -167,6 +167,9 @@ vlc_module_end ()
  *****************************************************************************/
 static int Start( audio_output_t *p_aout, audio_sample_format_t *restrict fmt )
 {
+    if( aout_FormatNbChannels( fmt ) == 0 )
+        return VLC_EGENERIC;
+
     p_aout->time_get = WaveOutTimeGet;
     p_aout->play = Play;
     p_aout->pause = WaveOutPause;
index 60438c6..2c03728 100644 (file)
@@ -87,7 +87,10 @@ unsigned int aout_BitsPerSample( vlc_fourcc_t i_format )
  *****************************************************************************/
 void aout_FormatPrepare( audio_sample_format_t * p_format )
 {
-    p_format->i_channels = aout_FormatNbChannels( p_format );
+
+    unsigned i_channels = aout_FormatNbChannels( p_format );
+    if( i_channels > 0 )
+        p_format->i_channels = i_channels;
     p_format->i_bitspersample = aout_BitsPerSample( p_format->i_format );
     if( p_format->i_bitspersample > 0 )
     {
@@ -213,7 +216,7 @@ const char * aout_FormatPrintChannels( const audio_sample_format_t * p_format )
         return "3F2M3R/LFE";
     }
 
-    return "ERROR";
+    return AOUT_FMT_LINEAR( p_format ) ? "ERROR" : "Unknown-chan-mask";
 }
 
 #undef aout_FormatPrint
index 1751e30..2f75408 100644 (file)
@@ -46,7 +46,8 @@ int aout_DecNew( audio_output_t *p_aout,
                  const aout_request_vout_t *p_request_vout )
 {
     /* Sanitize audio format */
-    if( p_format->i_channels != aout_FormatNbChannels( p_format ) )
+    unsigned i_channels = aout_FormatNbChannels( p_format );
+    if( i_channels != p_format->i_channels && AOUT_FMT_LINEAR( p_format ) )
     {
         msg_Err( p_aout, "incompatible audio channels count with layout mask" );
         return -1;
index 83e8646..020376f 100644 (file)
@@ -461,6 +461,11 @@ aout_filters_t *aout_FiltersNew (vlc_object_t *obj,
         }
         return filters;
     }
+    if (aout_FormatNbChannels(infmt) == 0 || aout_FormatNbChannels(outfmt) == 0)
+    {
+        msg_Warn (obj, "No channel mask, cannot setup filters");
+        goto error;
+    }
 
     /* parse user filter lists */
     if (var_InheritBool (obj, "audio-time-stretch"))