]> git.sesse.net Git - vlc/commitdiff
libvlc: better audio handling
authorLukas Durfina <lukas.durfina@gmail.com>
Sat, 1 Nov 2008 12:23:25 +0000 (13:23 +0100)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 7 Nov 2008 11:48:09 +0000 (12:48 +0100)
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
include/vlc/libvlc.h
include/vlc/libvlc_structures.h
src/control/audio.c
src/libvlc.sym

index 3a8ef99ce82d7ec62275eb680d5e832ebcaf5795..80a387010b571e71013a1b0a6834ebd768d9e682 100644 (file)
@@ -1022,6 +1022,135 @@ VLC_PUBLIC_API void libvlc_video_set_viewport( libvlc_instance_t *, const libvlc
  * @{
  */
 
+/**
+ * Audio device types
+ */
+typedef enum libvlc_audio_output_device_types_t {
+    libvlc_AudioOutputDevice_Error  = -1,
+    libvlc_AudioOutputDevice_Mono   =  1,
+    libvlc_AudioOutputDevice_Stereo =  2,
+    libvlc_AudioOutputDevice_2F2R   =  4,
+    libvlc_AudioOutputDevice_3F2R   =  5,
+    libvlc_AudioOutputDevice_5_1    =  6,
+    libvlc_AudioOutputDevice_6_1    =  7,
+    libvlc_AudioOutputDevice_7_1    =  8,
+    libvlc_AudioOutputDevice_SPDIF  = 10
+} libvlc_audio_output_device_types_t;
+
+/**
+ * Audio channels
+ */
+typedef enum libvlc_audio_output_channel_t {
+    libvlc_AudioChannel_Error   = -1,
+    libvlc_AudioChannel_Stereo  =  1,
+    libvlc_AudioChannel_RStereo =  2,
+    libvlc_AudioChannel_Left    =  3,
+    libvlc_AudioChannel_Right   =  4,
+    libvlc_AudioChannel_Dolbys  =  5
+} libvlc_audio_output_channel_t;
+
+
+/**
+ * Get the list of available audio outputs
+ *
+ * \param p_instance libvlc instance
+ * \param p_e an initialized exception pointer
+ * \return list of available audio outputs, at the end free it with
+*          \see libvlc_audio_output_list_release \see libvlc_audio_output_t
+ */
+VLC_PUBLIC_API libvlc_audio_output_t *
+        libvlc_audio_output_list_get( libvlc_instance_t *,
+                                      libvlc_exception_t * );
+
+/**
+ * Free the list of available audio outputs
+ *
+ * \param p_list list with audio outputs for release
+ */
+VLC_PUBLIC_API void libvlc_audio_output_list_release( libvlc_audio_output_t * );
+
+/**
+ * Set the audio output.
+ * Change will be applied after stop and play.
+ *
+ * \param p_instance libvlc instance
+ * \param psz_name name of audio output,
+ *               use psz_name of \see libvlc_audio_output_t
+ * \return true if function succeded
+ */
+VLC_PUBLIC_API int libvlc_audio_output_set( libvlc_instance_t *,
+                                            const char * );
+
+/**
+ * Get count of devices for audio output, these devices are hardware oriented
+ * like analor or digital output of sound card
+ *
+ * \param p_instance libvlc instance
+ * \param psz_audio_output - name of audio output, \see libvlc_audio_output_t
+ * \return number of devices
+ */
+VLC_PUBLIC_API int libvlc_audio_output_device_count( libvlc_instance_t *,
+                                                     const char * );
+
+/**
+ * Get long name of device, if not available short name given
+ *
+ * \param p_instance libvlc instance
+ * \param psz_audio_output - name of audio output, \see libvlc_audio_output_t
+ * \param i_device device index
+ * \return long name of device
+ */
+VLC_PUBLIC_API char * libvlc_audio_output_device_longname( libvlc_instance_t *,
+                                                           const char *,
+                                                           int );
+
+/**
+ * Get id name of device
+ *
+ * \param p_instance libvlc instance
+ * \param psz_audio_output - name of audio output, \see libvlc_audio_output_t
+ * \param i_device device index
+ * \return id name of device, use for setting device, need to be free after use
+ */
+VLC_PUBLIC_API char * libvlc_audio_output_device_id( libvlc_instance_t *,
+                                                     const char *,
+                                                     int );
+
+/**
+ * Set device for using
+ *
+ * \param p_instance libvlc instance
+ * \param psz_audio_output - name of audio output, \see libvlc_audio_output_t
+ * \param psz_device_id device
+ */
+VLC_PUBLIC_API void libvlc_audio_output_device_set( libvlc_instance_t *,
+                                                    const char *,
+                                                    const char * );
+
+/**
+ * Get current audio device type. Device type describes something like
+ * character of output sound - stereo sound, 2.1, 5.1 etc
+ *
+ * \param p_instance vlc instance
+ * \param p_e an initialized exception pointer
+ * \return the audio devices type \see libvlc_audio_output_device_types_t
+ */
+VLC_PUBLIC_API int libvlc_audio_output_get_device_type(
+        libvlc_instance_t *, libvlc_exception_t * );
+
+/**
+ * Set current audio device type.
+ *
+ * \param p_instance vlc instance
+ * \param device_type the audio device type,
+          according to \see libvlc_audio_output_device_types_t
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_audio_output_set_device_type( libvlc_instance_t *,
+                                                         int,
+                                                         libvlc_exception_t * );
+
+
 /**
  * Toggle mute status.
  *
@@ -1075,6 +1204,16 @@ VLC_PUBLIC_API void libvlc_audio_set_volume( libvlc_instance_t *, int, libvlc_ex
  */
 VLC_PUBLIC_API int libvlc_audio_get_track_count( libvlc_media_player_t *,  libvlc_exception_t * );
 
+ /**
+ * Get the description of available audio tracks.
+ *
+ * \param p_mi media player
+ * \param p_e an initialized exception
+ * \return list with description of available audio tracks
+ */
+VLC_PUBLIC_API libvlc_track_description_t *
+        libvlc_audio_get_track_description( libvlc_media_player_t *,  libvlc_exception_t * );
+
 /**
  * Get current audio track.
  *
@@ -1098,18 +1237,21 @@ VLC_PUBLIC_API void libvlc_audio_set_track( libvlc_media_player_t *, int, libvlc
  *
  * \param p_instance vlc instance
  * \param p_e an initialized exception pointer
- * \return the audio channel (int)
+ * \return the audio channel \see libvlc_audio_output_channel_t
  */
-VLC_PUBLIC_API int libvlc_audio_get_channel( libvlc_instance_t *, libvlc_exception_t * );
+VLC_PUBLIC_API int
+    libvlc_audio_get_channel( libvlc_instance_t *, libvlc_exception_t * );
 
 /**
  * Set current audio channel.
  *
  * \param p_instance vlc instance
- * \param i_channel the audio channel (int)
+ * \param channel the audio channel, \see libvlc_audio_output_channel_t
  * \param p_e an initialized exception pointer
  */
-VLC_PUBLIC_API void libvlc_audio_set_channel( libvlc_instance_t *, int, libvlc_exception_t * );
+VLC_PUBLIC_API void libvlc_audio_set_channel( libvlc_instance_t *,
+                                              int,
+                                              libvlc_exception_t * );
 
 /** @} audio */
 
index 3339afb795d91c547e61f09743376ee6b867120a..867712f41f6584efbfc6d53a2d8533586cdb9736 100644 (file)
@@ -233,6 +233,29 @@ typedef struct libvlc_track_description_t
 
 /**@} */
 
+/*****************************************************************************
+ * Audio
+ *****************************************************************************/
+/** \defgroup libvlc_audio libvlc_audio
+ * \ingroup libvlc_media_player
+ * LibVLC Audio handling
+ * @{
+ */
+
+/**
+ * Description for audio output. It contains
+ * name, description and pointer to next record.
+ */
+typedef struct libvlc_audio_output_t
+{
+    char *psz_name;
+    char *psz_description;
+    struct libvlc_audio_output_t *p_next;
+
+} libvlc_audio_output_t;
+
+/**@} */
+
 
 /*****************************************************************************
  * Video
index 6bacd3ce822011c750989606f0999635d5d7a96d..21147fe8253cfa729f59c601b65d99f2d614cc90 100644 (file)
@@ -36,6 +36,9 @@
 static aout_instance_t *GetAOut( libvlc_instance_t *p_instance,
                                  libvlc_exception_t *p_exception )
 {
+    if( !p_instance )
+        return NULL;
+
     aout_instance_t * p_aout = NULL;
 
     p_aout = vlc_object_find( p_instance->p_libvlc_int, VLC_OBJECT_AOUT, FIND_CHILD );
@@ -48,6 +51,269 @@ static aout_instance_t *GetAOut( libvlc_instance_t *p_instance,
     return p_aout;
 }
 
+/*****************************************
+ * Get the list of available audio outputs
+ *****************************************/
+VLC_PUBLIC_API libvlc_audio_output_t *
+        libvlc_audio_output_list_get( libvlc_instance_t *p_instance,
+                                      libvlc_exception_t *p_e )
+{
+    VLC_UNUSED( p_instance );
+    libvlc_audio_output_t *p_list = NULL,
+                          *p_actual = NULL,
+                          *p_previous = NULL;
+    module_t **module_list = module_list_get( NULL );
+
+    for (size_t i = 0; module_list[i]; i++)
+    {
+        module_t *p_module = module_list[i];
+
+        if( module_provides( p_module, "audio output" ) )
+        {
+            if( p_actual == NULL)
+            {
+                p_actual = ( libvlc_audio_output_t * )
+                    malloc( sizeof( libvlc_audio_output_t ) );
+                if( p_actual == NULL )
+                {
+                    libvlc_exception_raise( p_e, "Not enough memory" );
+                    libvlc_audio_output_list_release( p_list );
+                    module_list_free( module_list );
+                    return NULL;
+                }
+                if( p_list == NULL )
+                {
+                    p_list = p_actual;
+                    p_previous = p_actual;
+                }
+            }
+            p_actual->psz_name = strdup( module_get_name( p_module, false ) );
+            p_actual->psz_description = strdup( module_get_name( p_module, true )  );
+            p_actual->p_next = NULL;
+            if( p_previous != p_actual ) /* not first item */
+                p_previous->p_next = p_actual;
+            p_previous = p_actual;
+            p_actual = p_actual->p_next;
+        }
+    }
+
+    module_list_free( module_list );
+
+    return p_list;
+}
+
+/********************************************
+ * Free the list of available audio outputs
+ ***********************************************/
+VLC_PUBLIC_API void libvlc_audio_output_list_release( libvlc_audio_output_t *p_list )
+{
+    libvlc_audio_output_t *p_actual, *p_before;
+    p_actual = p_list;
+
+    while ( p_actual )
+    {
+        free( p_actual->psz_name );
+        free( p_actual->psz_description );
+        p_before = p_actual;
+        p_actual = p_before->p_next;
+        free( p_before );
+    }
+}
+
+
+/***********************
+ * Set the audio output.
+ ***********************/
+VLC_PUBLIC_API int libvlc_audio_output_set( libvlc_instance_t *p_instance,
+                                            const char *psz_name )
+{
+    if( module_exists( psz_name ) )
+    {
+        config_PutPsz( p_instance->p_libvlc_int, "aout", psz_name );
+        return true;
+    }
+    else
+        return false;
+}
+
+/****************************
+ * Get count of devices.
+ *****************************/
+int libvlc_audio_output_device_count( libvlc_instance_t *p_instance,
+                                      const char *psz_audio_output )
+{
+    char *psz_config_name = NULL;
+    if( !psz_audio_output )
+        return 0;
+    if( asprintf( &psz_config_name, "%s-audio-device", psz_audio_output ) == -1 )
+        return 0;
+
+    module_config_t *p_module_config = config_FindConfig(
+        VLC_OBJECT( p_instance->p_libvlc_int ), psz_config_name );
+
+    if( p_module_config && p_module_config->pf_update_list )
+    {
+        vlc_value_t val;
+        val.psz_string = strdup( p_module_config->value.psz );
+
+        p_module_config->pf_update_list(
+            VLC_OBJECT( p_instance->p_libvlc_int ), psz_config_name, val, val, NULL );
+        free( val.psz_string );
+        free( psz_config_name );
+
+        return p_module_config->i_list;
+    }
+    else
+        free( psz_config_name );
+
+
+    return 0;
+}
+
+/********************************
+ * Get long name of device
+ *********************************/
+char * libvlc_audio_output_device_longname( libvlc_instance_t *p_instance,
+                                            const char *psz_audio_output,
+                                            int i_device )
+{
+    char *psz_config_name = NULL;
+    if( !psz_audio_output )
+        return NULL;
+    if( asprintf( &psz_config_name, "%s-audio-device", psz_audio_output ) == -1 )
+        return NULL;
+
+    module_config_t *p_module_config = config_FindConfig(
+        VLC_OBJECT( p_instance->p_libvlc_int ), psz_config_name );
+
+    if( p_module_config )
+    {
+        // refresh if there arent devices
+        if( p_module_config->i_list < 2 && p_module_config->pf_update_list )
+        {
+            vlc_value_t val;
+            val.psz_string = strdup( p_module_config->value.psz );
+
+            p_module_config->pf_update_list(
+                VLC_OBJECT( p_instance->p_libvlc_int ), psz_config_name, val, val, NULL );
+            free( val.psz_string );
+        }
+        free( psz_config_name );
+
+        if( i_device >= 0 && i_device < p_module_config->i_list )
+        {
+            if( p_module_config->ppsz_list_text[i_device] )
+                return strdup( p_module_config->ppsz_list_text[i_device] );
+            else
+                return strdup( p_module_config->ppsz_list[i_device] );
+        }
+    }
+    else
+        free( psz_config_name );
+
+    return NULL;
+}
+
+/********************************
+ * Get id name of device
+ *********************************/
+char * libvlc_audio_output_device_id( libvlc_instance_t *p_instance,
+                                      const char *psz_audio_output,
+                                      int i_device )
+{
+    char *psz_config_name = NULL;
+    if( !psz_audio_output )
+        return NULL;
+    if( asprintf( &psz_config_name, "%s-audio-device", psz_audio_output ) == -1)
+        return NULL;
+
+    module_config_t *p_module_config = config_FindConfig(
+        VLC_OBJECT( p_instance->p_libvlc_int ), psz_config_name );
+
+    if( p_module_config )
+    {
+        // refresh if there arent devices
+        if( p_module_config->i_list < 2 && p_module_config->pf_update_list )
+        {
+            vlc_value_t val;
+            val.psz_string = strdup( p_module_config->value.psz );
+
+            p_module_config->pf_update_list(
+                VLC_OBJECT( p_instance->p_libvlc_int ), psz_config_name, val, val, NULL );
+            free( val.psz_string );
+        }
+        free( psz_config_name );
+
+        if( i_device >= 0 && i_device < p_module_config->i_list )
+            return strdup( p_module_config->ppsz_list[i_device] );
+
+    }
+    else
+        free( psz_config_name );
+
+    return NULL;
+}
+
+/*****************************
+ * Set device for using
+ *****************************/
+VLC_PUBLIC_API void libvlc_audio_output_device_set( libvlc_instance_t *p_instance,
+                                                    const char *psz_audio_output,
+                                                    const char *psz_device_id )
+{
+    char *psz_config_name = NULL;
+    if( !psz_audio_output || !psz_device_id )
+        return;
+    if( asprintf( &psz_config_name, "%s-audio-device", psz_audio_output ) == -1 )
+        return;
+    config_PutPsz( p_instance->p_libvlc_int, psz_config_name, psz_device_id );
+    free( psz_config_name );
+}
+
+/*****************************************************************************
+ * libvlc_audio_output_get_device_type : Get the current audio device type
+ *****************************************************************************/
+int libvlc_audio_output_get_device_type( libvlc_instance_t *p_instance,
+                                         libvlc_exception_t *p_e )
+{
+    aout_instance_t *p_aout = GetAOut( p_instance, p_e );
+    if( p_aout )
+    {
+        vlc_value_t val;
+
+        var_Get( p_aout, "audio-device", &val );
+        vlc_object_release( p_aout );
+        return val.i_int;
+    }
+    libvlc_exception_raise( p_e, "Unable to get audio output" );
+    return libvlc_AudioOutputDevice_Error;
+}
+
+/*****************************************************************************
+ * libvlc_audio_output_set_device_type : Set the audio device type
+ *****************************************************************************/
+void libvlc_audio_output_set_device_type( libvlc_instance_t *p_instance,
+                                          int device_type,
+                                          libvlc_exception_t *p_e )
+{
+    aout_instance_t *p_aout = GetAOut( p_instance, p_e );
+    if( p_aout )
+    {
+        vlc_value_t val;
+        int i_ret = -1;
+
+        val.i_int = (int) device_type;
+        i_ret = var_Set( p_aout, "audio-device", val );
+        if( i_ret < 0 )
+        {
+            libvlc_exception_raise( p_e, "Failed setting audio device" );
+            vlc_object_release( p_aout );
+            return;
+        }
+
+        vlc_object_release( p_aout );
+    }
+}
 
 /*****************************************************************************
  * libvlc_audio_get_mute : Get the volume state, true if muted
@@ -217,7 +483,7 @@ void libvlc_audio_set_track( libvlc_media_player_t *p_mi, int i_track,
  * libvlc_audio_get_channel : Get the current audio channel
  *****************************************************************************/
 int libvlc_audio_get_channel( libvlc_instance_t *p_instance,
-                                libvlc_exception_t *p_e )
+                              libvlc_exception_t *p_e )
 {
     aout_instance_t *p_aout = GetAOut( p_instance, p_e );
     if( p_aout )
@@ -228,13 +494,15 @@ int libvlc_audio_get_channel( libvlc_instance_t *p_instance,
         vlc_object_release( p_aout );
         return val.i_int;
     }
-    return -1;
+    libvlc_exception_raise( p_e, "Unable to get audio output" );
+    return libvlc_AudioChannel_Error;
 }
 
 /*****************************************************************************
  * libvlc_audio_set_channel : Set the current audio channel
  *****************************************************************************/
-void libvlc_audio_set_channel( libvlc_instance_t *p_instance, int i_channel,
+void libvlc_audio_set_channel( libvlc_instance_t *p_instance,
+                               int channel,
                                libvlc_exception_t *p_e )
 {
     aout_instance_t *p_aout = GetAOut( p_instance, p_e );
@@ -243,27 +511,12 @@ void libvlc_audio_set_channel( libvlc_instance_t *p_instance, int i_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; /* Found */
-            default:
-                libvlc_exception_raise( p_e, "Audio channel out of range" );
-                break;
-        }
+        val.i_int = channel;
+        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 );
     }
+
 }
index 9a3976952085bcb04b25c24572063d78a7338975..759751e0083d9627e002b86e7d7b818aecd86eba 100644 (file)
@@ -1,11 +1,22 @@
 libvlc_add_intf
+libvlc_audio_output_device_count
+libvlc_audio_output_device_id
+libvlc_audio_output_device_longname
+libvlc_audio_output_device_set
+libvlc_audio_output_get_device_type
+libvlc_audio_output_list_get
+libvlc_audio_output_list_release
+libvlc_audio_output_set
+libvlc_audio_output_set_device_type
 libvlc_audio_get_channel
+libvlc_audio_get_device
 libvlc_audio_get_mute
 libvlc_audio_get_track
 libvlc_audio_get_track_count
 libvlc_audio_get_track_description
 libvlc_audio_get_volume
 libvlc_audio_set_channel
+libvlc_audio_set_device
 libvlc_audio_set_mute
 libvlc_audio_set_track
 libvlc_audio_set_volume