[PATCH] libvlc API: Add equalizer to audio.c

Cyril Mathé cmathe at actech-innovation.com
Wed Jul 1 15:39:14 CEST 2009


  -libvlc_audio_set_eqz_enable(int b_enable)    : enable or disable equalizer
  -libvlc_ausio_get_eqz()                       : get the current libvlc_audio_eqz_t
  -libvlc_audio_set_eqz(libvlc_audio_eqz_t eqz) : set a libvlc_audio_eqz_t
  -libvlc_audio_get_eqz_preset(int i_eqz_preset): get the equalizer preset corresponding to i_eqz_preset
  -libvlc_audio_set_eqz_preset(int i_eqz_preset): set the equalizer preset corresponding to i_eqz_preset
---
 include/vlc/libvlc_media_player.h |   62 ++++++++++++
 src/control/audio.c               |  199 +++++++++++++++++++++++++++++++++++++
 src/libvlc.sym                    |    5 +
 3 files changed, 266 insertions(+), 0 deletions(-)

diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
index d44c006..dd48626 100644
--- a/include/vlc/libvlc_media_player.h
+++ b/include/vlc/libvlc_media_player.h
@@ -98,6 +98,19 @@ typedef enum libvlc_video_marquee_string_option_t {
     libvlc_marquee_Text = 0
 } libvlc_video_marquee_string_option_t;
 
+/**
+ * Equalizer
+ */
+
+#define EQZ_BANDS_MAX 10
+
+typedef struct libvlc_audio_eqz_t
+{
+    const char *psz_name;
+    int  i_band;
+    float f_preamp;
+    float f_amp[EQZ_BANDS_MAX];
+} libvlc_audio_eqz_t;
 
 /**
  * Create an empty Media Player object
@@ -1034,6 +1047,55 @@ VLC_PUBLIC_API void libvlc_audio_set_channel( libvlc_instance_t *,
                                               int,
                                               libvlc_exception_t * );
 
+/**
+ * Enable or disable equalizer.
+ *
+ * \param p_instance vlc instance
+ * \param b_enable enable or disable bool (int)
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_audio_set_eqz_enable( libvlc_instance_t *,
+                                                 int, libvlc_exception_t * );
+
+/**
+ * Get equalizer settings.
+ *
+ * \param p_instance vlc instance
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API libvlc_audio_eqz_t libvlc_audio_get_eqz( libvlc_instance_t *,
+                                                        libvlc_exception_t * );
+
+/**
+ * Set equalizer band or preamp.
+ *
+ * \param p_instance vlc instance
+ * \param eqz equalizer settings
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_audio_set_eqz(libvlc_instance_t *,
+                                         libvlc_audio_eqz_t,
+                                         libvlc_exception_t * );
+
+/**
+ * Get equalizer preset name.
+ *
+ * \param p_e an initialized exception pointer
+ * \param i_eqz_preset number of the equalizer preset
+ */
+VLC_PUBLIC_API libvlc_audio_eqz_t libvlc_audio_get_eqz_preset(int,
+                                                              libvlc_exception_t *);
+
+/**
+ * Set an equalizer preset.
+ *
+ * \param p_instance vlc instance
+ * \param i_eqz_preset equalizer to set (int)
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_audio_set_eqz_preset( libvlc_instance_t *,
+                                                 int, libvlc_exception_t * );
+
 /** @} audio */
 
 /** @} media_player */
diff --git a/src/control/audio.c b/src/control/audio.c
index fb96b70..c59e243 100644
--- a/src/control/audio.c
+++ b/src/control/audio.c
@@ -33,9 +33,11 @@
 #include <vlc_common.h>
 #include <vlc_input.h>
 #include <vlc_aout.h>
+#include <vlc_charset.h>
 
 #include "libvlc_internal.h"
 #include "media_player_internal.h"
+#include "modules/audio_filter/equalizer_presets.h"
 
 /*
  * Remember to release the returned aout_instance_t since it is locked at
@@ -511,3 +513,200 @@ void libvlc_audio_set_channel( libvlc_instance_t *p_instance,
     }
 
 }
+
+/*****************************************************************************
+ * Equalizer
+ *****************************************************************************/
+static inline void set_eqz(vlc_object_t * p_aout, libvlc_audio_eqz_t eqz)
+{
+    bool b_neg = false;
+    char *psz_newbands = NULL;
+
+    for( int i = 0; i < eqz.i_band ; i++ )
+    {
+        lldiv_t d;
+        float f_tmp;
+        char *psz;
+
+        if(eqz.f_amp[i] > 20)
+            eqz.f_amp[i] = 20;
+        if(eqz.f_amp[i] < -20)
+            eqz.f_amp[i] = -20;
+
+        /* this is to avoid problem with negative value for lldiv */
+        if( eqz.f_amp[i] < 0 )
+        {
+            f_tmp = - eqz.f_amp[i];
+            b_neg = true;
+        }
+        else
+        {
+            f_tmp = eqz.f_amp[i];
+            b_neg = false;
+        }
+
+        d = lldiv( f_tmp * 10000000, 10000000 );
+
+        if( b_neg == true)
+        {
+            d.quot = -d.quot;
+        }
+
+        if( asprintf( &psz, "%s %lld.%07llu",
+                      psz_newbands ? psz_newbands : "",
+                      d.quot, d.rem ) == -1 )
+        {
+            free( psz_newbands );
+        }
+        psz_newbands = psz;
+    }
+
+    if(eqz.f_preamp > 20)
+        eqz.f_preamp = 20;
+    if(eqz.f_preamp < -20)
+        eqz.f_preamp = -20;
+
+    var_SetString( p_aout, "equalizer-bands", psz_newbands );
+    var_SetFloat( p_aout, "equalizer-preamp", eqz.f_preamp );
+}
+
+static inline libvlc_audio_eqz_t convert_eqz_preset( int i_eqz_preset )
+{
+    libvlc_audio_eqz_t eqz;
+    eqz.psz_name = eqz_preset_10b[i_eqz_preset]->psz_name;
+    eqz.i_band = eqz_preset_10b[i_eqz_preset]->i_band;
+    eqz.f_preamp = eqz_preset_10b[i_eqz_preset]->f_preamp;
+    for(int i = 0 ; i < EQZ_BANDS_MAX ; i++)
+        eqz.f_amp[i] = eqz_preset_10b[i_eqz_preset]->f_amp[i];
+
+    return eqz;
+}
+
+/*****************************************************************************
+ * libvlc_audio_get_eqz: get libvlc_audio_eqz_t
+ *****************************************************************************/
+libvlc_audio_eqz_t libvlc_audio_get_eqz( libvlc_instance_t *p_instance,
+                                         libvlc_exception_t *p_e )
+{
+    aout_instance_t *p_aout = GetAOut( p_instance, p_e );
+
+    if( !p_aout )
+        return;
+
+    vlc_value_t val, val_preamp;
+    libvlc_audio_eqz_t eqz;
+    /* get the current band values */
+    var_Get( p_aout, "equalizer-bands", &val );
+
+    char *psz_bands = val.psz_string;
+    char *psz_next;
+    char *p = psz_bands;
+    int i;
+
+    for( i = 0 ; i < EQZ_BANDS_MAX ; i++ )
+    {
+        float f_val;
+
+        if( *psz_bands == '\0' )
+            break;
+
+#ifdef HAVE_STRTOF
+        f_val = us_strtof( p, &psz_next );
+#else
+        f_val = (float)us_strtod( p, &psz_next );
+#endif
+
+        eqz.f_amp[i] = f_val;
+
+        if( psz_next == p )
+            break; /* no conversion */
+
+        if( *psz_next == '\0' )
+            break; /* end of line */
+        p = &psz_next[1];
+
+    }
+
+    /* get the preamp value */
+    var_Get( p_aout, "equalizer-preamp", &val_preamp );
+    eqz.f_preamp = val_preamp.f_float;
+    eqz.i_band = i+1;
+
+    vlc_object_release( p_aout );
+    return eqz;
+}
+
+/*****************************************************************************
+ * libvlc_audio_set_eqz: set a libvlc_audio_eqz_t
+ *****************************************************************************/
+void libvlc_audio_set_eqz( libvlc_instance_t *p_instance,
+                           libvlc_audio_eqz_t eqz,
+                           libvlc_exception_t *p_e )
+{
+    aout_instance_t *p_aout = GetAOut( p_instance, p_e );
+
+    if ( !p_aout )
+        return;
+
+    /* set the equalizer */
+    set_eqz(p_aout, eqz);
+    vlc_object_release( p_aout );
+}
+
+/*****************************************************************************
+ * libvlc_audio_get_eqz_preset: get a libvlc_audio_eqz_t corresponding
+ *                              to i_eqz_preset
+ *****************************************************************************/
+libvlc_audio_eqz_t libvlc_audio_get_eqz_preset( int i_eqz_preset,
+                                                libvlc_exception_t *p_e )
+{
+    if( ( i_eqz_preset < 0 ) || ( i_eqz_preset >= NB_PRESETS)  )
+    {
+        libvlc_audio_eqz_t eqz;
+        libvlc_exception_raise( p_e, "No preset equalizer corresponding" );
+        return eqz;
+    }
+
+    return convert_eqz_preset(i_eqz_preset);
+}
+
+/*****************************************************************************
+ * libvlc_audio_set_eqz_preset: set a libvlc_audio_eqz_t corresponding
+ *                              to i_eqz_preset
+ *****************************************************************************/
+void libvlc_audio_set_eqz_preset( libvlc_instance_t *p_instance,
+                                  int i_eqz_preset,
+                                  libvlc_exception_t *p_e )
+{
+    if( ( i_eqz_preset < 0 ) || ( i_eqz_preset >= NB_PRESETS ) )
+    {
+        libvlc_exception_raise( p_e, "No preset equalizer corresponding" );
+        return;
+    }
+
+    aout_instance_t *p_aout = GetAOut( p_instance, p_e );
+
+    if( !p_aout )
+        return;
+
+    libvlc_audio_eqz_t eqz = convert_eqz_preset( i_eqz_preset );
+    /* set the preset equalizer */
+    set_eqz(p_aout, eqz);
+    vlc_object_release( p_aout );
+}
+
+/*****************************************************************************
+ * libvlc_audio_set_eqz_enable: Enable or disable audio equalizer filter
+ *****************************************************************************/
+void libvlc_audio_set_eqz_enable( libvlc_instance_t *p_instance,
+                                 int b_enable, libvlc_exception_t *p_e )
+{
+    aout_instance_t *p_aout = GetAOut( p_instance, p_e );
+
+    if( !p_aout)
+        return;
+
+    /* enable or disable equalizer */
+    aout_EnableFilter( VLC_OBJECT( p_aout ), "equalizer", b_enable );
+    vlc_object_release( p_aout );
+}
diff --git a/src/libvlc.sym b/src/libvlc.sym
index 1583c31..067b9f2 100644
--- a/src/libvlc.sym
+++ b/src/libvlc.sym
@@ -9,12 +9,17 @@ libvlc_audio_output_list_release
 libvlc_audio_output_set
 libvlc_audio_output_set_device_type
 libvlc_audio_get_channel
+libvlc_audio_get_eqz
+libvlc_audio_get_eqz_preset
 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_eqz
+libvlc_audio_set_eqz_enable
+libvlc_audio_set_eqz_preset
 libvlc_audio_set_mute
 libvlc_audio_set_track
 libvlc_audio_set_volume
-- 
1.5.4.3


--=-vQLUx7Fa3sx2/SSYCFni--



More information about the vlc-devel mailing list