Pārlūkot izejas kodu

Enable live EQ preview in Material skin (and Classic/EN)

* add JavaScript to submit the changes before storing them
* add input validation
* fix settings page loading in case of networking issues (which I suffered from when I tried to implement the above :-))
Michael Herger 2 gadi atpakaļ
vecāks
revīzija
1876b26100

+ 8 - 0
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,

+ 62 - 36
plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/player.html

@@ -1,3 +1,55 @@
+[% IF useExtJS; extJsScripts = BLOCK %]
+<script type="text/javascript">
+	Ext.onReady(function () {
+		new Ext.util.TaskRunner().start({
+			run: checkEq,
+			interval: 1000
+		});
+	});
+
+	function checkEq() {
+		var eqValues = [];
+		this.lastValues = this.lastValues || [];
+
+		for (var x = 0; x < 10; x++) {
+			eqValues[x] = Ext.get('pref_equalizer.' + x).dom.value || 0;
+		}
+
+		if (eqValues.join() != this.lastValues.join()) {
+			this.lastValues = eqValues;
+			SqueezeJS.Controller.request({
+				params: ['[% playerid %]', ['squeezeesp32', 'seteq', eqValues.join()]]
+			});
+		}
+	}
+</script>
+[% END; ELSIF !useExtJS; pageHeaderScripts = BLOCK %]
+<script type="text/javascript">
+	setInterval(checkEq, 1000);
+
+	function checkEq() {
+		var eqValues = [];
+		this.lastValues = this.lastValues || [];
+
+		for (var x = 0; x < 10; x++) {
+			eqValues[x] = $('pref_equalizer.' + x).value || 0;
+		}
+
+		if (eqValues.join() != this.lastValues.join()) {
+			this.lastValues = eqValues;
+			new Ajax.Request('/jsonrpc.js', {
+				method: 'post',
+				postBody: JSON.stringify({
+					id: 1,
+					method: 'slim.request',
+					params: ['[% playerid %]', ['squeezeesp32', 'seteq', eqValues.join()]]
+				})
+			});
+		}
+	}
+</script>
+[% END; END %]
+
 [% PROCESS settings/header.html %]
 
 	[% WRAPPER setting title="PLUGIN_SQUEEZEESP32_FIRMWARE" desc="" %]
@@ -59,62 +111,36 @@
 			<div>[% "PLUGIN_SQUEEZEESP32_EQUALIZER_SAVE" | string %]</div>
 		[% END %]
 
-		<script TYPE="text/javascript">
-			if (Ext) {
-				Ext.onReady(function () {
-					new Ext.util.TaskRunner().start({
-						run: checkEq,
-						interval: 1000
-					});
-				});
-
-				function checkEq() {
-					var eqValues = [];
-					this.lastValues = this.lastValues || [];
-
-					for (var x = 0; x < 10; x++) {
-						eqValues[x] = Ext.get('pref_equalizer.' + x).dom.value || 0;
-					}
-
-					if (eqValues.join() != this.lastValues.join()) {
-						this.lastValues = eqValues;
-						SqueezeJS.Controller.request({
-							params: ['[% playerid %]', ['squeezeesp32', 'seteq', eqValues.join()]]
-						});
-					}
-				}
-			}
-		</script>
 		[% WRAPPER settingSection %]
 			[% WRAPPER settingGroup title='31Hz' desc="" %]
-			<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.0" id="pref_equalizer.0" value="[% pref_equalizer.0 %]" size="2"">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.0" id="pref_equalizer.0" value="[% pref_equalizer.0 || 0 %]" size="2"">
 			[% END %]
 			[% WRAPPER settingGroup title='62Hz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.1" id="pref_equalizer.1" value="[% pref_equalizer.1 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.1" id="pref_equalizer.1" value="[% pref_equalizer.1 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='125Hz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.2" id="pref_equalizer.2" value="[% pref_equalizer.2 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.2" id="pref_equalizer.2" value="[% pref_equalizer.2 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='250Hz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.3" id="pref_equalizer.3" value="[% pref_equalizer.3 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.3" id="pref_equalizer.3" value="[% pref_equalizer.3 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='500Hz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.4" id="pref_equalizer.4" value="[% pref_equalizer.4 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.4" id="pref_equalizer.4" value="[% pref_equalizer.4 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='1kHz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.5" id="pref_equalizer.5" value="[% pref_equalizer.5 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.5" id="pref_equalizer.5" value="[% pref_equalizer.5 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='2kHz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.6" id="pref_equalizer.6" value="[% pref_equalizer.6 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.6" id="pref_equalizer.6" value="[% pref_equalizer.6 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='4kHz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.7" id="pref_equalizer.7" value="[% pref_equalizer.7 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.7" id="pref_equalizer.7" value="[% pref_equalizer.7 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='8kHz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.8" id="pref_equalizer.8" value="[% pref_equalizer.8 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.8" id="pref_equalizer.8" value="[% pref_equalizer.8 || 0 %]" size="2">
 			[% END %]
 			[% WRAPPER settingGroup title='16kHz' desc="" %]
-				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.9" id="pref_equalizer.9" value="[% pref_equalizer.9 %]" size="2">
+				<input type="text" class="stdedit sliderInput_-13_20" name="pref_equalizer.9" id="pref_equalizer.9" value="[% pref_equalizer.9 || 0 %]" size="2">
 			[% END %]
 		[% END %]
 	[% END %]

+ 44 - 29
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')) {

+ 5 - 3
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) = @_;