diff --git a/components/squeezelite/equalizer.c b/components/squeezelite/equalizer.c index 4038f69e..c772f0d8 100644 --- a/components/squeezelite/equalizer.c +++ b/components/squeezelite/equalizer.c @@ -63,9 +63,9 @@ static const float loudness_envelope_coefficients[EQ_BANDS][POLYNOME_COUNT] = { /**************************************************************************************** * calculate loudness gains */ -static void calculate_loudness(void) { - for (int i = 0; i < EQ_BANDS && equalizer.loudness > 0; i++) { - for (int j = 0; j < POLYNOME_COUNT; j++) { +static void calculate_loudness(void) { + for (int i = 0; i < EQ_BANDS; i++) { + for (int j = 0; j < POLYNOME_COUNT && equalizer.loudness != 0; j++) { equalizer.loudness_gain[i] += loudness_envelope_coefficients[i][j] * pow(equalizer.volume, j); } diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 68bc264f..9dd0e60b 100644 Binary files a/plugin/SqueezeESP32.zip and b/plugin/SqueezeESP32.zip differ diff --git a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html index 0ddf2fd6..02409069 100644 --- a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html +++ b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html @@ -21,6 +21,18 @@ params: ['[% playerid %]', ['squeezeesp32', 'seteq', eqValues.join()]] }); } + + var ldValue = 0; + this.lastLd = this.lastLd || 0; + + ldValue = Ext.get('pref_loudness').dom.value || 0; + + if (ldValue != this.lastLd) { + this.lastLd = ldValue; + SqueezeJS.Controller.request({ + params: ['[% playerid %]', ['squeezeesp32', 'setld', ldValue]] + }); + } } [% END; ELSIF !useExtJS; pageHeaderScripts = BLOCK %] @@ -46,6 +58,23 @@ }) }); } + + var ldValue = 0; + this.lastLd = this.lastLd || 0; + + ldValue = $('pref_loudness').value || 0; + + if (ldValue != this.lastLd) { + this.lastLd = ldValue; + new Ajax.Request('/jsonrpc.js', { + method: 'post', + postBody: JSON.stringify({ + id: 1, + method: 'slim.request', + params: ['[% playerid %]', ['squeezeesp32', 'setld', ldValue]] + }) + }); + } } [% END; END %] @@ -140,6 +169,10 @@ [% END %] [% WRAPPER settingSection %] + [% WRAPPER settingGroup title='Loudness' desc="" %] + + [% END %] + [% WRAPPER settingGroup title='31Hz' desc="" %] [% END %] diff --git a/plugin/SqueezeESP32/Player.pm b/plugin/SqueezeESP32/Player.pm index f21bf38c..cb455c7f 100644 --- a/plugin/SqueezeESP32/Player.pm +++ b/plugin/SqueezeESP32/Player.pm @@ -115,6 +115,7 @@ sub initPrefs { $prefs->client($client)->init( { equalizer => [(0) x 10], + loudness => 0, artwork => undef, led_config => 0, led_visualizer => 0, @@ -216,6 +217,14 @@ sub send_equalizer { $client->sendFrame( eqlz => \$data ); } +sub send_loudness { + my ($client, $loudness) = @_; + + $loudness ||= $prefs->client($client)->get('loudness') || 0; + my $data = pack("c1", $loudness); + $client->sendFrame( loud => \$data ); +} + sub update_equalizer { my ($client, $value, $index) = @_; return if $client->tone_update; @@ -318,6 +327,7 @@ sub reconnect { $client->pluginData('artwork_md5', ''); $client->config_artwork if $client->display->isa("Plugins::SqueezeESP32::Graphics"); $client->send_equalizer; + $client->send_loudness; } # Change the analog output mode between headphone and sub-woofer diff --git a/plugin/SqueezeESP32/PlayerSettings.pm b/plugin/SqueezeESP32/PlayerSettings.pm index 3c1298ae..86cceab2 100644 --- a/plugin/SqueezeESP32/PlayerSettings.pm +++ b/plugin/SqueezeESP32/PlayerSettings.pm @@ -87,6 +87,8 @@ sub handler { $equalizer = [ splice(@$equalizer, 0, 10) ]; $cprefs->set('equalizer', $equalizer); $client->update_tones($equalizer); + + $cprefs->set('loudness', $paramRef->{"pref_loudness"} || 0); } if ($client->hasLED) { @@ -107,7 +109,10 @@ sub handler { $paramRef->{'ledVisualModes'} = Plugins::SqueezeESP32::RgbLed::ledVisualModeOptions($client); } - $paramRef->{'pref_equalizer'} = $cprefs->get('equalizer') if $client->can('depth') && $client->depth == 16; + if ($client->can('depth') && $client->depth == 16) { + $paramRef->{'pref_equalizer'} = $cprefs->get('equalizer'); + $paramRef->{'pref_loudness'} = $cprefs->get('loudness'); + } $paramRef->{'player_ip'} = $client->ip; require Plugins::SqueezeESP32::FirmwareHelper; diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm index 982c9fbc..628d31cf 100644 --- a/plugin/SqueezeESP32/Plugin.pm +++ b/plugin/SqueezeESP32/Plugin.pm @@ -34,6 +34,10 @@ $prefs->setChange(sub { $_[2]->send_equalizer; }, 'equalizer'); +$prefs->setChange(sub { + $_[2]->send_loudness; +}, 'loudness'); + sub initPlugin { my $class = shift; @@ -54,6 +58,7 @@ sub initPlugin { # register a command to set the EQ - without saving the values! Send params as single comma separated list of values Slim::Control::Request::addDispatch(['squeezeesp32', 'seteq', '_eq'], [1, 0, 0, \&setEQ]); + Slim::Control::Request::addDispatch(['squeezeesp32', 'setld', '_ld'], [1, 0, 0, \&setLD]); # Note for some forgetful know-it-all: we need to wrap the callback to make it unique. Otherwise subscriptions would overwrite each other. Slim::Control::Request::subscribe( sub { onNotification(@_) }, [ ['newmetadata'] ] ); @@ -100,4 +105,20 @@ sub setEQ { $client->send_equalizer(\@eqParams); } +sub setLD { + my $request = shift; + + # check this is the correct command. + if ($request->isNotCommand([['squeezeesp32'],['setld']])) { + $request->setStatusBadDispatch(); + return; + } + + # get our parameters + my $client = $request->client(); + my $loudness = $request->getParam('_ld') || 0; + + $client->send_loudness($loudness); +} + 1; diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index 07adee02..1a107b0f 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -10,6 +10,6 @@ PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.362 + 0.500 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index d58e8f13..2940c002 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - 6c6454b1a6c533a74e1b00b69c5a2143d6df536d + a75e49528bc45e6e48b0dbd0b47ce975795e1fba philippe_44@outlook.com SqueezeESP32 additional player id (100/101) http://raw.githubusercontent.com/sle118/squeezelite-esp32/master-v4.3/plugin/SqueezeESP32.zip