From ca07925abc7d5a8f18715ad458477a5da4216e65 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Sun, 16 Aug 2020 16:44:01 -0700 Subject: [PATCH] better synchronize bass/treble & equalizer --- plugin/SqueezeESP32.zip | Bin 11503 -> 11817 bytes plugin/SqueezeESP32/Player.pm | 70 ++++++++++++++++++++------ plugin/SqueezeESP32/PlayerSettings.pm | 1 + plugin/SqueezeESP32/install.xml | 2 +- plugin/repo.xml | 4 +- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 6f4d67911ed53292fa314fea5755c56b764d3a28..f251d2a29bb11d59f637e909e1e495a5e577fca8 100644 GIT binary patch delta 4176 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 diff --git a/plugin/SqueezeESP32/Player.pm b/plugin/SqueezeESP32/Player.pm index 2e0b903d..0fd20681 100644 --- a/plugin/SqueezeESP32/Player.pm +++ b/plugin/SqueezeESP32/Player.pm @@ -13,6 +13,19 @@ my $sprefs = preferences('server'); my $prefs = preferences('plugin.squeezeesp32'); my $log = logger('plugin.squeezeesp32'); +{ + __PACKAGE__->mk_accessor('rw', 'tone_update'); +} + +sub new { + my $class = shift; + my $client = $class->SUPER::new(@_); + $client->init_accessor( + tone_update => 0, + ); + return $client; +} + our $defaultPrefs = { 'analogOutMode' => 0, 'bass' => 0, @@ -54,6 +67,9 @@ sub init { my $client = shift; if (!$handlersAdded) { + + $sprefs->setChange( \&change_tone, 'bass'); + $sprefs->setChange( \&change_tone, 'treble'); # Add a handler for line-in/out status changes Slim::Networking::Slimproto::addHandler( LIOS => \&lineInOutStatus ); @@ -116,26 +132,48 @@ sub playerSettingsFrame { $client->SUPER::playerSettingsFrame($data_ref); } -sub bass { - return tone(2, @_); -} +sub change_tone { + my ($type, $new, $client, $old) = @_; + return $client->$type($new) unless $client->isa('Plugins::SqueezeESP32::Player') && !$client->tone_update; -sub treble { - return tone(8, @_); + my ($c, $minValue, $maxValue); + my $equalizer = $prefs->client($client)->get('equalizer'); + + if ($type eq 'bass') { + $c = 2; + $minValue = minBass; + $maxValue = maxBass; + } else { + $c = 8; + $minValue = minTreble; + $maxValue = maxTreble; + } + + $new = $minValue if $new < $minValue; + $new = $minValue if $new < $minValue; + + if ($old - $minValue) { + my $ratio = ($new - $minValue) / ($old - $minValue) - 1; + $equalizer->[$c-1] = min(int(($equalizer->[$c-1] - $minValue) * (1 + 0.2 * $ratio) + 0.5 + $minValue), $maxValue); + $equalizer->[$c] = min(int(($equalizer->[$c] - $minValue) * (1 + 0.7 * $ratio) + 0.5 + $minValue), $maxValue); + $equalizer->[$c+1] = min(int(($equalizer->[$c+1] - $minValue) * (1 + 0.1 * $ratio) + 0.5 + $minValue), $maxValue); + } else { + $equalizer->[$c-1] = int($new * 0.2 + 0.5); + $equalizer->[$c] = int($new * 0.7 + 0.5); + $equalizer->[$c+1] = int($new * 0.1 + 0.5); + } + + $prefs->client($client)->set('equalizer', $equalizer); + $sprefs->client($client)->set($type, $new); } -sub tone { - my ($center, $client, $value) = @_; - my $equalizer = $prefs->client($client)->get('equalizer'); - - if (defined($value)) { - $equalizer->[$center-1] = int($value * 0.2 + 0.5); - $equalizer->[$center] = int($value * 0.7 + 0.5); - $equalizer->[$center+1] = int($value * 0.1 + 0.5); - $prefs->client($client)->set('equalizer', $equalizer); - } +sub update_tones { + my ($client, $equalizer) = @_; - return int($equalizer->[$center-1] * 0.2 + $equalizer->[$center] * 0.7 + $equalizer->[$center+1] * 0.1); + $client->tone_update(1); + $sprefs->client($client)->set('bass', int($equalizer->[1]*0.2 + $equalizer->[2]*0.7 + $equalizer->[3]*0.1 + 0.5)); + $sprefs->client($client)->set('treble', int($equalizer->[7]*0.2 + $equalizer->[8]*0.7 + $equalizer->[9]*0.1 + 0.5)); + $client->tone_update(0); } sub update_artwork { diff --git a/plugin/SqueezeESP32/PlayerSettings.pm b/plugin/SqueezeESP32/PlayerSettings.pm index 4f0af9cf..d4a4e2d6 100644 --- a/plugin/SqueezeESP32/PlayerSettings.pm +++ b/plugin/SqueezeESP32/PlayerSettings.pm @@ -73,6 +73,7 @@ sub handler { $equalizer->[$i] = $paramRef->{"pref_equalizer.$i"} || 0; } $cprefs->set('equalizer', $equalizer); + $client->update_tones($equalizer); } if ($client->displayWidth) { diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index d422c209..999b3d54 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -10,6 +10,6 @@ PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.101 + 0.102 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index a41c5f07..63f82785 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - 49cb70db3a3d4359360332f1f49a845e2e4970b8 + f9c8fbc60812bed4e3989e6dfa3e99fb1a2869c3 philippe_44@outlook.com SqueezeESP32 additional player id (100) http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip