[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