]> git.sesse.net Git - vlc/blobdiff - src/control/audio.c
control/media_descriptor.c: Don't forget to release the event manager. (Reported...
[vlc] / src / control / audio.c
index 9c0185caae6d417bc94816af38a86f7676102add..09d627c0e08dbe512bb2e859443be9545b2df27a 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
-#include "libvlc_internal.h"
 #include <vlc/libvlc.h>
 
 #include <vlc_input.h>
 #include <vlc_aout.h>
 
-/*
- * Remember to release the returned input_thread_t since it is locked at
- * the end of this function.
- */
-static input_thread_t *GetInput( libvlc_input_t *p_input,
-                                 libvlc_exception_t *p_exception )
-{
-    input_thread_t *p_input_thread = NULL;
-
-    if( !p_input )
-    {
-        libvlc_exception_raise( p_exception, "Input is NULL" );
-        return NULL;
-    }
-
-    p_input_thread = (input_thread_t*)vlc_object_get(
-                                 p_input->p_instance->p_libvlc_int,
-                                 p_input->i_input_id );
-    if( !p_input_thread )
-    {
-        libvlc_exception_raise( p_exception, "Input does not exist" );
-        return NULL;
-    }
+#include "libvlc_internal.h"
 
-    return p_input_thread;
-}
 
 /*
  * Remember to release the returned aout_instance_t since it is locked at
@@ -139,13 +114,30 @@ void libvlc_audio_set_volume( libvlc_instance_t *p_instance, int i_volume,
     }
 }
 
+/*****************************************************************************
+ * libvlc_audio_get_track_count : Get the number of available audio tracks
+ *****************************************************************************/
+int libvlc_audio_get_track_count( libvlc_media_instance_t *p_mi, 
+                                  libvlc_exception_t *p_e )
+{
+    input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e );
+    vlc_value_t val_list;
+
+    if( !p_input_thread )
+        return -1;
+
+    var_Change( p_input_thread, "audio-es", VLC_VAR_GETCHOICES, &val_list, NULL );
+    vlc_object_release( p_input_thread );
+    return val_list.p_list->i_count;
+}
+
 /*****************************************************************************
  * libvlc_audio_get_track : Get the current audio track
  *****************************************************************************/
-int libvlc_audio_get_track( libvlc_input_t *p_input,
+int libvlc_audio_get_track( libvlc_media_instance_t *p_mi,
                             libvlc_exception_t *p_e )
 {
-    input_thread_t *p_input_thread = GetInput( p_input, p_e );
+    input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e );
     vlc_value_t val_list;
     vlc_value_t val;
     int i_track = -1;
@@ -177,13 +169,14 @@ int libvlc_audio_get_track( libvlc_input_t *p_input,
     return i_track;
 }
 
+
 /*****************************************************************************
  * libvlc_audio_set_track : Set the current audio track
  *****************************************************************************/
-void libvlc_audio_set_track( libvlc_input_t *p_input, int i_track,
+void libvlc_audio_set_track( libvlc_media_instance_t *p_mi, int i_track,
                              libvlc_exception_t *p_e )
 {
-    input_thread_t *p_input_thread = GetInput( p_input, p_e );
+    input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e );
     vlc_value_t val_list;
     int i_ret = -1;
     int i;
@@ -217,11 +210,15 @@ int libvlc_audio_get_channel( libvlc_instance_t *p_instance,
                                 libvlc_exception_t *p_e )
 {
     aout_instance_t *p_aout = GetAOut( p_instance, p_e );
-    vlc_value_t val;
+    if( p_aout )
+    {
+        vlc_value_t val;
 
-    var_Get( p_aout, "audio-channels", &val );
-    vlc_object_release( p_aout );
-    return val.i_int;
+        var_Get( p_aout, "audio-channels", &val );
+        vlc_object_release( p_aout );
+        return val.i_int;
+    }
+    return -1;
 }
 
 /*****************************************************************************
@@ -231,29 +228,32 @@ void libvlc_audio_set_channel( libvlc_instance_t *p_instance, int i_channel,
                                libvlc_exception_t *p_e )
 {
     aout_instance_t *p_aout = GetAOut( p_instance, p_e );
-    vlc_value_t val;
-    int i_ret = -1;
-
-    val.i_int = i_channel;
-    switch( i_channel )
+    if( p_aout )
     {
-        case AOUT_VAR_CHAN_RSTEREO:
-        case AOUT_VAR_CHAN_STEREO:
-        case AOUT_VAR_CHAN_LEFT:
-        case AOUT_VAR_CHAN_RIGHT:
-        case AOUT_VAR_CHAN_DOLBYS:
-            i_ret = var_Set( p_aout, "audio-channels", val );
-            if( i_ret < 0 )
-            {
-                libvlc_exception_raise( p_e, "Failed setting audio channel" );
+        vlc_value_t val;
+        int i_ret = -1;
+
+        val.i_int = i_channel;
+        switch( i_channel )
+        {
+            case AOUT_VAR_CHAN_RSTEREO:
+            case AOUT_VAR_CHAN_STEREO:
+            case AOUT_VAR_CHAN_LEFT:
+            case AOUT_VAR_CHAN_RIGHT:
+            case AOUT_VAR_CHAN_DOLBYS:
+                i_ret = var_Set( p_aout, "audio-channels", val );
+                if( i_ret < 0 )
+                {
+                    libvlc_exception_raise( p_e, "Failed setting audio channel" );
+                    vlc_object_release( p_aout );
+                    return;
+                }
                 vlc_object_release( p_aout );
-                return;
-            }
-            vlc_object_release( p_aout );
-            return; /* Found */
-        default:
-            libvlc_exception_raise( p_e, "Audio channel out of range" );
-            break;
+                return; /* Found */
+            default:
+                libvlc_exception_raise( p_e, "Audio channel out of range" );
+                break;
+        }
+        vlc_object_release( p_aout );
     }
-    vlc_object_release( p_aout );
 }