[vlc-devel] [PATCH 4/6] http lua: Update equalizer support

Rémi Denis-Courmont remi at remlab.net
Sat Nov 28 15:38:51 CET 2015


On Saturday 28 November 2015 00:31:04 Ronald Wright wrote:
> Note:  Patches 2 through 6 must be applied all together, and patches 2 and 3
> cannot be applied without patch 1.
> ---
>  modules/lua/libs/equalizer.c                 | 253
> +++++++++++++++++++++------ share/lua/http/css/main.css                  | 
> 17 ++
>  share/lua/http/dialogs/equalizer_window.html |   3 +
>  share/lua/http/js/controllers.js             |  59 ++++++-
>  share/lua/http/mobile_equalizer.html         |   3 +
>  share/lua/intf/modules/httprequests.lua      |   1 +
>  6 files changed, 279 insertions(+), 57 deletions(-)
> 
> diff --git a/modules/lua/libs/equalizer.c b/modules/lua/libs/equalizer.c
> index 512bae1..f366ce4 100644
> --- a/modules/lua/libs/equalizer.c
> +++ b/modules/lua/libs/equalizer.c
> @@ -36,6 +36,7 @@
>  #include <vlc_aout.h>
>  #include <vlc_input.h>
>  #include <vlc_charset.h>
> +#include <vlc_eqz_util.h>
> 
>  #include "input.h"
>  #include "../libs.h"
> @@ -106,6 +107,8 @@ static int vlclua_preamp_set( lua_State *L )
> 
>  /**************************************************************************
> *** Bands:
> +
> +10-band VLC equalizer:
>  Band 0:  60 Hz
>  Band 1: 170 Hz
>  Band 2: 310 Hz
> @@ -116,14 +119,74 @@ Band 6:  6 kHz
>  Band 7: 12 kHz
>  Band 8: 14 kHz
>  Band 9: 16 kHz
> +
> +10-band ISO equalizer:
> +Band 0:  31.5 Hz
> +Band 1:  63   Hz
> +Band 2: 125   Hz
> +Band 3: 250   Hz
> +Band 4: 500   Hz
> +Band 5:   1  kHz
> +Band 6:   2  kHz
> +Band 7:   4  kHz
> +Band 8:   8  kHz
> +Band 9:  16  kHz
> +
> +15-band ISO equalizer:
> +Band  0:  25  Hz
> +Band  1:  40  Hz
> +Band  2:  63  Hz
> +Band  3: 100  Hz
> +Band  4: 160  Hz
> +Band  5: 250  Hz
> +Band  6: 400  Hz
> +Band  7: 630  Hz
> +Band  8:   1 kHz
> +Band  9: 1.6 kHz
> +Band 10: 2.5 kHz
> +Band 11:   4 kHz
> +Band 12: 6.3 kHz
> +Band 13:  10 kHz
> +Band 14:  16 kHz
> +
> +31-band ISO equalizer:
> +Band  0:  20     Hz
> +Band  1:  25     Hz
> +Band  2:  31.5   Hz
> +Band  3:  40     Hz
> +Band  4:  50     Hz
> +Band  5:  63     Hz
> +Band  6:  80     Hz
> +Band  7: 100     Hz
> +Band  8: 125     Hz
> +Band  9: 160     Hz
> +Band 10: 200     Hz
> +Band 11: 250     Hz
> +Band 12: 315     Hz
> +Band 13: 400     Hz
> +Band 14: 500     Hz
> +Band 15: 630     Hz
> +Band 16: 800     Hz
> +Band 17:   1    kHz
> +Band 18:   1.25 kHz
> +Band 19:   1.6  kHz
> +Band 20:   2    kHz
> +Band 21:   2.5  kHz
> +Band 22:   3.15 kHz
> +Band 23:   4    kHz
> +Band 24:   5    kHz
> +Band 25:   6.3  kHz
> +Band 26:   8    kHz
> +Band 27:  10    kHz
> +Band 28:  12.5  kHz
> +Band 29:  16    kHz
> +Band 30:  20    kHz
>  ***************************************************************************
> **/
> /**************************************************************************
> *** * Return EQ level for all bands as a Table
>  ***************************************************************************
> **/ static int vlclua_equalizer_get( lua_State *L )
>  {
> -    const unsigned bands = 10;
> -
>      playlist_t *p_playlist = vlclua_get_playlist_internal( L );
>      audio_output_t *p_aout = playlist_GetAout( p_playlist );
>      if( p_aout == NULL )
> @@ -138,44 +201,69 @@ static int vlclua_equalizer_get( lua_State *L )
>      }
>      free( psz_af );
> 
> -    char *psz_bands_origin, *psz_bands;
> -    psz_bands_origin = psz_bands = var_GetNonEmptyString( p_aout,
> "equalizer-bands" ); +    char *psz_bands = var_GetNonEmptyString( p_aout,
> "equalizer-bands" ); if( !psz_bands )
>      {
>          vlc_object_release( p_aout );
>          return 0;
>      }
> 
> -    bool error = false;
> -    locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL);
> -    locale_t oldloc = uselocale (loc);
> -    lua_newtable( L );
> -    for( unsigned i = 0; i < bands; i++ )
> +    char *psz_band_count = var_InheritString( p_aout,
> +            "equalizer-bands-count" );
> +    if( !psz_band_count )
>      {
> -        float level = strtof( psz_bands, &psz_bands );
> -        char *str;
> -        if( asprintf( &str , "%f" , level ) == -1 )
> +        free( psz_bands );
> +        vlc_object_release( p_aout );
> +        return 0;
> +    }
> +
> +    bool b_vlcFreqs = var_InheritBool( p_aout, "equalizer-vlcfreqs" );
> +    int i_type = EqzGetTypeNumber( VLC_OBJECT( p_aout ),
> +                                   atoi( psz_band_count ), b_vlcFreqs );
> +    if( i_type == EQZ_UNKNOWN_TYPE )
> +        i_type = EQZ_VLC10_TYPE;
> +
> +    vlc_band_parse_t ctx;
> +    bool error = vlc_eqz_util_band_parser_init( VLC_OBJECT( p_aout ), &ctx,
> +        psz_bands, i_type, NULL ) != VLC_SUCCESS;
> +    if( !error )
> +    {
> +        int i_bands = EqzGetNumBandsByType( i_type );
> +        const float * pf_levels = vlc_eqz_util_get_amp_array( ctx );
> +
> +        locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL);
> +        locale_t oldloc = uselocale (loc);

Not needed anymore? Ditto below.

> +        lua_newtable( L );
> +
> +        for( int i = 0; i < i_bands; i++ )
>          {
> -            error = true;
> -            break;
> +            float level = pf_levels[i];
> +            char *str;
> +            if( asprintf( &str , "%f" , level ) == -1 )
> +            {
> +                error = true;
> +                break;
> +            }
> +            lua_pushstring( L, str );
> +            free(str);
> +            if( asprintf( &str , "band id=\"%u\"", i ) == -1 )
> +            {
> +                error = true;
> +                break;
> +            }
> +            lua_setfield( L , -2 , str );
> +            free( str );
>          }
> -        lua_pushstring( L, str );
> -        free(str);
> -        if( asprintf( &str , "band id=\"%u\"", i ) == -1 )
> +        vlc_eqz_util_band_parser_destroy( ctx );
> +
> +        if( loc != (locale_t)0 )
>          {
> -            error = true;
> -            break;
> +            uselocale (oldloc);
> +            freelocale (loc);
>          }
> -        lua_setfield( L , -2 , str );
> -        free( str );
> -    }
> -
> -    free( psz_bands_origin );
> -    if( loc != (locale_t)0 )
> -    {
> -        uselocale (oldloc);
> -        freelocale (loc);
>      }
> +    free( psz_bands );
> +    free( psz_band_count );
>      vlc_object_release( p_aout );
>      return error ? 0 : 1;
>  }
> @@ -187,7 +275,7 @@ static int vlclua_equalizer_get( lua_State *L )
>  static int vlclua_equalizer_set( lua_State *L )
>  {
>      int bandid = luaL_checknumber( L, 1 );
> -    if( bandid < 0 || bandid > 9)
> +    if( bandid < 0 )
>          return 0;
> 
>      playlist_t *p_playlist = vlclua_get_playlist_internal( L );
> @@ -204,41 +292,103 @@ static int vlclua_equalizer_set( lua_State *L )
>      }
>      free( psz_af );
> 
> +    char * psz_band_count =
> +        var_InheritString( p_aout, "equalizer-bands-count" );
> +    bool b_vlcFreqs = var_InheritBool( p_aout, "equalizer-vlcfreqs" );
> +    int i_type = EqzGetTypeNumber( VLC_OBJECT( p_aout ),
> +                                   atoi( psz_band_count ), b_vlcFreqs );
> +    if( i_type == EQZ_UNKNOWN_TYPE )
> +        i_type = EQZ_VLC10_TYPE;
> +    int i_bands = EqzGetNumBandsByType( i_type );
> +    if( bandid >= i_bands )
> +    {
> +        vlc_object_release( p_aout );
> +        return 0;
> +    }
> +
>      float level = luaL_checknumber( L, 2 );
>      char *bands = var_GetString( p_aout, "equalizer-bands" );
> 
> -    locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL);
> -    locale_t oldloc = uselocale (loc);
> -    char *b = bands;
> -    while( bandid > 0 )
> +    vlc_band_parse_t ctx;
> +    if( vlc_eqz_util_band_parser_init( VLC_OBJECT( p_aout ), &ctx,
> +        bands, i_type, NULL ) == VLC_SUCCESS )
>      {
> -        float dummy = strtof( b, &b );
> -        (void)dummy;
> -        bandid--;
> -    }
> -    if( *b != '\0' )
> -        *b++ = '\0';
> -    float dummy = strtof( b, &b );
> -    (void)dummy;
> +        const float * pf_levels = vlc_eqz_util_get_amp_array( ctx );
> +        char *newstr = NULL;
> 
> -    char *newstr;
> -    if( asprintf( &newstr, "%s %.1f%s", bands, level, b ) != -1 )
> -    {
> -        var_SetString( p_aout, "equalizer-bands", newstr );
> -        free( newstr );
> -    }
> +        locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL);
> +        locale_t oldloc = uselocale (loc);
> 
> -    if( loc != (locale_t)0 )
> -    {
> -        uselocale (oldloc);
> -        freelocale (loc);
> +        for( int i = 0; i < i_bands; i++ )
> +        {
> +            float f_level = i == bandid ? level : pf_levels[i];
> +            char *psz;
> +            if( asprintf( &psz, "%s %.1f", i ? newstr : "", f_level ) == -1
> ) +                psz = NULL;
> +
> +            free( newstr );
> +            newstr = psz;
> +            if( unlikely( psz == NULL ) )
> +                break;
> +        }
> +        vlc_eqz_util_band_parser_destroy( ctx );
> +
> +        /* For 10 bands, we must help VLC differentiate between VLC bands
> and +         * ISO bands */
> +        if( likely( newstr ) && i_bands == EQZ_ISO10_BANDS_MAX )
> +        {
> +            char id = EqzGetIdentifier( i_type );
> +            char * psz;
> +            if( asprintf( &psz, "%s %c", newstr, id ) == -1 )
> +                psz = NULL;
> +
> +            free( newstr );
> +            newstr = psz;
> +        }
> +
> +        if( likely( newstr ) )
> +        {
> +            var_SetString( p_aout, "equalizer-bands", newstr );
> +            free( newstr );
> +        }
> +
> +        if( loc != (locale_t)0 )
> +        {
> +            uselocale (oldloc);
> +            freelocale (loc);
> +        }
>      }
>      free( bands );
> +    free( psz_band_count );
>      vlc_object_release( p_aout );
>      return 0;
>  }
> 
>  /**************************************************************************
> *** +* Get whether VLC frequencies are active
> +***************************************************************************
> **/ +static int vlclua_usevlcfreqs_get( lua_State *L )
> +{
> +    playlist_t *p_playlist = vlclua_get_playlist_internal( L );
> +    audio_output_t *p_aout = playlist_GetAout( p_playlist );
> +    if( p_aout == NULL )
> +        return 0;
> +
> +    char *psz_af = var_GetNonEmptyString( p_aout, "audio-filter" );
> +    if( !psz_af || strstr ( psz_af, "equalizer" ) == NULL )
> +    {
> +        free( psz_af );
> +        vlc_object_release( p_aout );
> +        return 0;
> +    }
> +    free( psz_af );
> +
> +    lua_pushboolean( L, var_InheritBool( p_aout, "equalizer-vlcfreqs") );
> +    vlc_object_release( p_aout );
> +    return 1;
> +}
> +
> +/**************************************************************************
> *** * Set the preset specified by preset id
>  ***************************************************************************
> **/ static int vlclua_equalizer_setpreset( lua_State *L )
> @@ -296,6 +446,7 @@ static const luaL_Reg vlclua_equalizer_reg[] = {
>      { "preampset", vlclua_preamp_set },
>      { "equalizerget", vlclua_equalizer_get },
>      { "equalizerset", vlclua_equalizer_set },
> +    { "usingvlcfreqsget", vlclua_usevlcfreqs_get },
>      { "enable", vlclua_equalizer_enable },
>      { "presets",vlclua_equalizer_get_presets },
>      { "setpreset", vlclua_equalizer_setpreset },

Split below to separate patch...

> diff --git a/share/lua/http/css/main.css b/share/lua/http/css/main.css
> index aebe6ce..5d52c2a 100644
> --- a/share/lua/http/css/main.css
> +++ b/share/lua/http/css/main.css
> @@ -227,6 +227,18 @@ body{
>  	font-size: 11px;
>  }
> 
> +.eqtable{
> +	display:table;
> +}
> +
> +.eqrow{
> +	display:table-row;
> +}
> +
> +.eqcell{
> +	display:table-cell;
> +}
> +
>  #window_equalizer div div{
>  	text-align: center;
>  	font-size: 11px;
> @@ -237,6 +249,11 @@ body{
>  	height:80px !important ;
>  }
> 
> +#window_equalizer_controls {
> +	overflow-x: auto;
> +	white-space: nowrap;
> +}
> +
>  .eqBand{
>  	margin-bottom: 10px;
>  	margin-top: 10px;
> diff --git a/share/lua/http/dialogs/equalizer_window.html
> b/share/lua/http/dialogs/equalizer_window.html index a81bb13..edc9d1d
> 100755
> --- a/share/lua/http/dialogs/equalizer_window.html
> +++ b/share/lua/http/dialogs/equalizer_window.html
> @@ -51,4 +51,7 @@
>  	<div style="margin: 5px 5px 10px 5px;">
>  		<div id="preamp" style="font-size: 18px;"></div>
>  	</div>
> +	<div style="margin: 5px 5px 5px 5px;">
> +		<div id="window_equalizer_controls"><div class="eqtable"><div
> id="window_equalizer_control_row" class="eqrow"></div></div></div> +	</div>
>  </div>
> diff --git a/share/lua/http/js/controllers.js
> b/share/lua/http/js/controllers.js index 8c3a419..853ec93 100644
> --- a/share/lua/http/js/controllers.js
> +++ b/share/lua/http/js/controllers.js
> @@ -9,6 +9,35 @@ function updateArt(url) {
>      });
>  }
> 
> +function getEqzBandFreqs(bandsCount, vlcFreqs) {
> +    var freq;
> +    if (bandsCount == 10) {
> +        if (vlcFreqs) {
> +            freq = ["60 Hz", "170 Hz", "310 Hz", "600 Hz", "1 kHz", "3
> kHz", +                    "6 kHz", "12 kHz", "14 kHz", "16 kHz"];
> +        }
> +        else {
> +            freq = ["31.5 Hz", "63 Hz", "125 Hz", "250 Hz", "500 Hz", "1
> kHz", +                      "2 kHz", "4 kHz",  "8 kHz"," 16 kHz"];
> +        }
> +    }
> +    else if (bandsCount == 15) {
> +        freq = [  "25 Hz",  "40 Hz",  "63 Hz",  "100 Hz",  "160 Hz", "250
> Hz", +                 "400 Hz", "630 Hz",  "1 kHz", "1.6 KHz", "2.5 kHz", 
> "4 kHz", +                "6.3 kHz", "10 kHz", "16 kHz"];
> +    }
> +    else if (bandsCount == 31) {
> +        freq = [  "20 Hz",   "25 Hz", "31.5 Hz",    "40 Hz",   "50 Hz",
> +                  "63 Hz",   "80 Hz",  "100 Hz",   "125 Hz",  "160 Hz",
> +                 "200 Hz",  "250 Hz",  "315 Hz",   "400 Hz",  "500 Hz",
> +                 "630 Hz",  "800 Hz",   "1 kHz", "1.25 kHz", "1.6 kHz",
> +                  "2 kHz", "2.5 kHz", "3.15 Hz",    "4 kHz",   "5 kHz",
> +                "6.3 kHz",   "8 kHz",  "10 kHz", "1.25 kHz", "1.6 kHz",
> +                 "20 kHz"];
> +    }
> +    return freq;
> +}
> +
>  function updateStatus() {
>      $.ajax({
>          url: 'requests/status.xml',
> @@ -85,12 +114,21 @@ function updateStatus() {
>                  }
> 
>              }
> -            $('band', data).each(function () {
> +            var bands = $('band', data);
> +            bands.sort(function(a, b) {
> +                return $(a).attr('id') - $(b).attr('id');
> +            });
> +            var vlcfreqs = $('vlcfreqs', data).text() == "true";
> +            var freq = getEqzBandFreqs(bands.length, vlcfreqs);
> +            var freqdisps =
> $('#window_equalizer_control_row').children('.eqcell').children('div').chil
> dren('.eqz_freq_disp'); +            if (bands.length != freqdisps.length ||
> vlcfreqs != (freqdisps.length > 0 && freqdisps.first().text() == "60 Hz"))
> { +                $('#window_equalizer_control_row').empty();
> +            }
> +            bands.each(function () {
>                  var id = $(this).attr('id');
>                  var value = $(this).text() ? $(this).text() : 0;
> -                var freq = ["60 Hz","170 Hz", "310 Hz", "600 Hz", "1
> kHz","3 kHz", "6 kHz", "12 kHz" , "14 kHz" , "16 kHz" ]; if
> (!$('#eq_container' + id).length) {
> -                    $('#window_equalizer').append('<div
> style="float:left;width:44px;" align="center" id="eq_container' + id +
> '"><div id="eq' + id + '_txt">' + value + 'dB</div><div class="eqBand"
> id="eq' + id + '" style="font-size: 18px;"></div><div>' + freq[id] +
> '</div></div>'); +                   
> $('#window_equalizer_control_row').append('<div class="eqcell"><div
> style="float:left;width:44px;" align="center" id="eq_container' + id +
> '"><div id="eq' + id + '_txt">' + value + 'dB</div><div class="eqBand"
> id="eq' + id + '" style="font-size: 18px; display:
> inline-block;"></div><div class="eqz_freq_disp">' + freq[id] + '</div><div
> style="height: 10px;"></div></div></div>'); $('#eq' + id).slider({
>                          min: -20,
>                          max: 20,
> @@ -382,12 +420,21 @@ function updateEQ() {
>      $.ajax({
>          url: 'requests/status.xml',
>          success: function (data, status, jqXHR) {
> -            $('band', data).each(function () {
> -                var freq = ["60 Hz","170 Hz", "310 Hz", "600 Hz", "1
> kHz","3 kHz", "6 kHz", "12 kHz" , "14 kHz" , "16 kHz" ]; +            var
> bands = $('band', data);
> +            bands.sort(function(a, b) {
> +                return $(a).attr('id') - $(b).attr('id');
> +            });
> +            var vlcfreqs = $('vlcfreqs', data).text() == "true";
> +            var freq = getEqzBandFreqs(bands.length, vlcfreqs);
> +            var freqdisps =
> $('#window_equalizer_control_row').children('.eqcell').children('div').chil
> dren('.eqz_freq_disp'); +            if (bands.length != freqdisps.length ||
> vlcfreqs != (freqdisps.length > 0 && freqdisps.first().text() == "60 Hz"))
> { +                $('#window_equalizer_control_row').empty();
> +            }
> +            bands.each(function () {
>                  var id = $(this).attr('id');
>                  var value = $(this).text() ? $(this).text() : 0;
>                  if (!$('#eq_container' + id).length) {
> -                    $('#window_equalizer').append('<div
> style="float:left;width:44px;" align="center" id="eq_container' + id +
> '"><div id="eq' + id + '_txt">' + value + 'dB</div><div class="eqBand"
> id="eq' + id + '" style="font-size: 18px;"></div><div>' + freq[id] +
> '</div></div>'); +                   
> $('#window_equalizer_control_row').append('<div class="eqcell"><div
> style="float:left;width:44px;" align="center" id="eq_container' + id +
> '"><div id="eq' + id + '_txt">' + value + 'dB</div><div class="eqBand"
> id="eq' + id + '" style="font-size: 18px; display:
> inline-block;"></div><div class="eqz_freq_disp">' + freq[id] + '</div><div
> style="height: 10px;"></div></div></div>'); $('#eq' + id).slider({
>                          min: -20,
>                          max: 20,
> diff --git a/share/lua/http/mobile_equalizer.html
> b/share/lua/http/mobile_equalizer.html index 7341109..258eb08 100644
> --- a/share/lua/http/mobile_equalizer.html
> +++ b/share/lua/http/mobile_equalizer.html
> @@ -64,6 +64,9 @@
>  			<div style="margin: 5px 5px 10px 5px;">
>  				<div id="preamp" style="font-size: 22px;"></div>
>  			</div>
> +			<div style="margin: 5px 5px 5px 5px;">
> +				<div id="window_equalizer_controls"><div class="eqtable"><div
> id="window_equalizer_control_row" class="eqrow"></div></div></div>
> +			</div>
>  		</div>
>  	</body>
>  </html>
> diff --git a/share/lua/intf/modules/httprequests.lua
> b/share/lua/intf/modules/httprequests.lua index e060cc1..1504057 100644
> --- a/share/lua/intf/modules/httprequests.lua
> +++ b/share/lua/intf/modules/httprequests.lua
> @@ -507,6 +507,7 @@ getstatus = function (includecategories)
>      s.equalizer={}
>      s.equalizer.preamp=round(vlc.equalizer.preampget(),2)
>      s.equalizer.bands=vlc.equalizer.equalizerget()
> +    s.equalizer.vlcfreqs=vlc.equalizer.usingvlcfreqsget()
>      if s.equalizer.bands ~= null then
>          for k,i in pairs(s.equalizer.bands) do
> s.equalizer.bands[k]=round(i,2) end
> s.equalizer.presets=vlc.equalizer.presets()

-- 
Rémi Denis-Courmont
http://www.remlab.net/



More information about the vlc-devel mailing list