From 8f2a1aec536bc0a59cc7bcdc68fcae26f482e243 Mon Sep 17 00:00:00 2001 From: philippe44 Date: Sun, 25 Sep 2022 11:35:37 -0700 Subject: [PATCH] update plugin (credits @mherger) --- plugin/SqueezeESP32.zip | Bin 17125 -> 18354 bytes plugin/SqueezeESP32/FirmwareHelper.pm | 8 ++ .../plugins/SqueezeESP32/settings/player.html | 98 +++++++++++------- plugin/SqueezeESP32/Player.pm | 73 +++++++------ plugin/SqueezeESP32/PlayerSettings.pm | 8 +- plugin/SqueezeESP32/install.xml | 2 +- plugin/repo.xml | 4 +- 7 files changed, 122 insertions(+), 71 deletions(-) diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index be686348c99d72de7627ffbb361ef052f2981de3..863c2e3bd233b1c7f0630bfd9016f93baff190ba 100644 GIT binary patch delta 14734 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 YRhE|mfAji)fRNt)PT%gT1%8(PA7y$g7ytkO delta 13409 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 diff --git a/plugin/SqueezeESP32/FirmwareHelper.pm b/plugin/SqueezeESP32/FirmwareHelper.pm index 55292ae4..0312f7ef 100644 --- a/plugin/SqueezeESP32/FirmwareHelper.pm +++ b/plugin/SqueezeESP32/FirmwareHelper.pm @@ -63,6 +63,9 @@ sub initFirmwareDownload { $cb->() if $cb; } } + elsif ($cb) { + $cb->(); + } }, sub { my ($http, $error) = @_; @@ -119,10 +122,15 @@ sub prefetchFirmware { $cb->($releaseInfo, _gh2lmsUrl($url), $customFwUrl) if $cb; } + elsif ($cb) { + $cb->(); + } }, sub { my ($http, $error) = @_; $log->error("Failed to get releases from Github: $error"); + + $cb->() if $cb; }, { timeout => 10, diff --git a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html index 85e9d6e8..f5e683d5 100644 --- a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html +++ b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html @@ -1,3 +1,55 @@ +[% IF useExtJS; extJsScripts = BLOCK %] + +[% END; ELSIF !useExtJS; pageHeaderScripts = BLOCK %] + +[% END; END %] + [% PROCESS settings/header.html %] [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_FIRMWARE" desc="" %] @@ -59,62 +111,36 @@
[% "PLUGIN_SQUEEZEESP32_EQUALIZER_SAVE" | string %]
[% END %] - [% WRAPPER settingSection %] [% WRAPPER settingGroup title='31Hz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='62Hz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='125Hz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='250Hz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='500Hz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='1kHz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='2kHz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='4kHz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='8kHz' desc="" %] - + [% END %] [% WRAPPER settingGroup title='16kHz' desc="" %] - + [% END %] [% END %] [% END %] diff --git a/plugin/SqueezeESP32/Player.pm b/plugin/SqueezeESP32/Player.pm index d73c2880..cbc32d3b 100644 --- a/plugin/SqueezeESP32/Player.pm +++ b/plugin/SqueezeESP32/Player.pm @@ -32,8 +32,8 @@ our $defaultPrefs = { 'analogOutMode' => 0, 'bass' => 0, 'treble' => 0, - 'lineInAlwaysOn' => 0, - 'lineInLevel' => 50, + 'lineInAlwaysOn' => 0, + 'lineInLevel' => 50, 'menuItem' => [qw( NOW_PLAYING BROWSE_MUSIC @@ -67,51 +67,66 @@ sub minBass { -13 } sub init { my $client = shift; my ($id, $caps) = @_; - + my ($depth) = $caps =~ /Depth=(\d+)/; $client->depth($depth || 16); - + if (!$handlersAdded) { - + # Add a handler for line-in/out status changes Slim::Networking::Slimproto::addHandler( LIOS => \&lineInOutStatus ); - + # Create a new event for sending LIOS updates Slim::Control::Request::addDispatch( ['lios', '_state'], [1, 0, 0, undef], ); - + Slim::Control::Request::addDispatch( ['lios', 'linein', '_state'], [1, 0, 0, undef], ); - + Slim::Control::Request::addDispatch( ['lios', 'lineout', '_state'], [1, 0, 0, undef], ); - + $handlersAdded = 1; } - + $client->SUPER::init(@_); Plugins::SqueezeESP32::FirmwareHelper::init($client); main::INFOLOG && $log->is_info && $log->info("SqueezeESP player connected: " . $client->id); -} +} sub initPrefs { my $client = shift; - + $sprefs->client($client)->init($defaultPrefs); - - $prefs->client($client)->init( { + + $prefs->client($client)->init( { equalizer => [(0) x 10], artwork => undef, } ); + $prefs->setValidate({ + validator => sub { + my ($pref, $new, $params, $old, $client) = @_; + + $new ||= [(0) x 10]; + + foreach (0..9) { + return 0 if $new->[$_] < $client->minBass; + return 0 if $new->[$_] > $client->maxBass; + } + + return 1; + } + }, 'equalizer'); + $client->SUPER::initPrefs; } @@ -121,15 +136,15 @@ sub power { my $res = $client->SUPER::power($on, @_); return $res unless defined $on; - + if ($on) { $client->update_artwork(1); } else { $client->clear_artwork(1); } - + return $res; -} +} # Allow the player to define it's display width (and probably more) sub playerSettingsFrame { @@ -162,16 +177,16 @@ sub playerSettingsFrame { sub bass { my ($client, $new) = @_; my $value = $client->SUPER::bass($new); - + $client->update_equalizer($value, [2, 1, 3]) if defined $new; - + return $value; } sub treble { my ($client, $new) = @_; my $value = $client->SUPER::treble($new); - + $client->update_equalizer($value, [8, 9, 7]) if defined $new; return $value; @@ -189,8 +204,8 @@ sub send_equalizer { sub update_equalizer { my ($client, $value, $index) = @_; return if $client->tone_update; - - my $equalizer = $prefs->client($client)->get('equalizer'); + + my $equalizer = $prefs->client($client)->get('equalizer'); $equalizer->[$index->[0]] = $value; $equalizer->[$index->[1]] = int($value / 2 + 0.5); $equalizer->[$index->[2]] = int($value / 4 + 0.5); @@ -203,7 +218,7 @@ sub update_tones { $client->tone_update(1); $sprefs->client($client)->set('bass', int(($equalizer->[1] * 2 + $equalizer->[2] + $equalizer->[3] * 4) / 7 + 0.5)); $sprefs->client($client)->set('treble', int(($equalizer->[7] * 4 + $equalizer->[8] + $equalizer->[9] * 2) / 7 + 0.5)); - $client->tone_update(0); + $client->tone_update(0); } sub update_artwork { @@ -212,7 +227,7 @@ sub update_artwork { my $artwork = $cprefs->get('artwork') || return; return unless $artwork->{'enable'} && $client->display->isa("Plugins::SqueezeESP32::Graphics"); - + my $header = pack('Nnn', $artwork->{'enable'}, $artwork->{'x'}, $artwork->{'y'}); $client->sendFrame( grfa => \$header ); $client->display->update; @@ -267,7 +282,7 @@ sub clear_artwork { if ((!$artwork->{'x'} && !$artwork->{'y'}) || $force) { $client->sendFrame(grfa => \("\x00"x4)); $client->display->update; - } + } } } @@ -284,7 +299,7 @@ sub config_artwork { sub reconnect { my $client = shift; $client->SUPER::reconnect(@_); - + $client->pluginData('artwork_md5', ''); $client->config_artwork if $client->display->isa("Plugins::SqueezeESP32::Graphics"); $client->send_equalizer; @@ -323,18 +338,18 @@ sub lineOutConnected { sub lineInOutStatus { my ( $client, $data_ref ) = @_; - + my $state = unpack 'n', $$data_ref; my $oldState = { in => $client->lineInConnected(), out => $client->lineOutConnected(), }; - + Slim::Networking::Slimproto::voltage( $client, $state ); Slim::Control::Request::notifyFromArray( $client, [ 'lios', $state ] ); - + if ($oldState->{in} != $client->lineInConnected()) { Slim::Control::Request::notifyFromArray( $client, [ 'lios', 'linein', $client->lineInConnected() ] ); if ( Slim::Utils::PluginManager->isEnabled('Slim::Plugin::LineIn::Plugin')) { diff --git a/plugin/SqueezeESP32/PlayerSettings.pm b/plugin/SqueezeESP32/PlayerSettings.pm index 83be9d07..4265f335 100644 --- a/plugin/SqueezeESP32/PlayerSettings.pm +++ b/plugin/SqueezeESP32/PlayerSettings.pm @@ -3,7 +3,7 @@ package Plugins::SqueezeESP32::PlayerSettings; use strict; use base qw(Slim::Web::Settings); use JSON::XS::VersionOneAndTwo; -use List::Util qw(first); +use List::Util qw(first min max); use Slim::Utils::Log; use Slim::Utils::Prefs; @@ -79,9 +79,10 @@ sub handler { if ($client->can('depth') && $client->depth == 16) { my $equalizer = $cprefs->get('equalizer'); - for my $i (0 .. $#{$equalizer}) { - $equalizer->[$i] = $paramRef->{"pref_equalizer.$i"} || 0; + foreach (0 .. 9) { + $equalizer->[$_] = min($client->maxBass, max($client->minBass, $paramRef->{"pref_equalizer.$_"} || 0)) } + $equalizer = [ splice(@$equalizer, 0, 10) ]; $cprefs->set('equalizer', $equalizer); $client->update_tones($equalizer); } @@ -97,6 +98,7 @@ sub handler { $paramRef->{'pref_equalizer'} = $cprefs->get('equalizer') if $client->can('depth') && $client->depth == 16; $paramRef->{'player_ip'} = $client->ip; + require Plugins::SqueezeESP32::FirmwareHelper; Plugins::SqueezeESP32::FirmwareHelper::initFirmwareDownload($client, sub { my ($currentFWInfo, $newFWUrl, $customFwUrl) = @_; diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index 7ab3d2d3..b96ab123 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -10,6 +10,6 @@ PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.351 + 0.352 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index e719805a..6c68fab8 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - 3209d93e2b02c1c9161572977f03c93938272b30 + 757946e8aecc05a0600fe887c370996a1a399b4b philippe_44@outlook.com SqueezeESP32 additional player id (100/101) http://github.com/sle118/squeezelite-esp32/raw/master-cmake/plugin/SqueezeESP32.zip