Files
squeezelite-esp32/plugin/SqueezeESP32/RgbLed.pm
2023-05-01 09:45:10 +01:00

190 lines
4.4 KiB
Perl

package Plugins::SqueezeESP32::RgbLed;
=head1 NAME
Plugins::SqueezeESP32::RgbLed
=head1 DESCRIPTION
L<Plugins::SqueezeESP32::RgbLed>
=cut
use strict;
use Slim::Utils::Strings qw(string cstring);
use Slim::Utils::Log;
use Slim::Utils::Prefs;
use Plugins::SqueezeESP32::Player
my $log = logger('player.RgbLed');
my $prefs = preferences('plugin.squeezeesp32');
my $log = logger('plugin.squeezeesp32');
sub init {
Slim::Control::Request::subscribe( sub { onNotification(@_) }, [ ['playlist'], ['open', 'pause', 'resume', 'stop', 'clear'] ]);
# register led visualizer comands to allow independant update and command line controls.
Slim::Control::Request::addDispatch([ 'dmx', '_data', '_xoff'], [1, 0, 0, \&sendDMX]);
Slim::Control::Request::addDispatch([ 'led_visual', '_mode', '_bright'], [1, 0, 0, \&setLEDVisu]);
}
my $VISUALIZER_NONE = 0;
my $VISUALIZER_VUMETER = 1;
my $VISUALIZER_SPECTRUM_ANALYZER = 2;
my $VISUALIZER_WAVEFORM = 3;
my @ledvisualizers = (
{ desc => ['BLANK'],
params => [$VISUALIZER_NONE],
},
{ desc => ['VISUALIZER_ANALOG_VUMETER'],
params => [$VISUALIZER_VUMETER, 0],
},
{ desc => ['VISUALIZER_DIGITAL_VUMETER'],
params => [$VISUALIZER_VUMETER, 1],
},
{ desc => ['VISUALIZER_SPECTRUM_ANALYZER'],
params => [$VISUALIZER_SPECTRUM_ANALYZER, 0],
},
{ desc => ['VISUALIZER_SPECTRUM_ANALYZER','2'],
params => [$VISUALIZER_SPECTRUM_ANALYZER, 1],
},
{ desc => ['PLUGIN_SQUEEZEESP32_WAVEFORM'],
params => [$VISUALIZER_WAVEFORM, 0],
},
{ desc => ['PLUGIN_SQUEEZEESP32_WAVEFORM','2'],
params => [$VISUALIZER_WAVEFORM, 1],
},
);
my $nledvisualizers = $#ledvisualizers;
sub ledVisualizerModes {
return \@ledvisualizers;
}
sub ledVisualizerNModes {
return $nledvisualizers;
}
sub updateLED {
my $client = shift;
my $on = shift || 1;
my $cprefs = $prefs->client($client);
my $visu = $cprefs->get('led_visualizer') || 0;
my $bright = $cprefs->get('led_brightness') || 20;
$visu = 0 if ($visu < 0 || $visu > ledVisualizerNModes || !(Slim::Player::Source::playmode($client) eq 'play') || !$on);
my $modes = ledVisualizerModes;
my $params = $modes->[$visu]{'params'};
my $data = pack('CCC', $params->[0], $params->[1], $bright);
main::INFOLOG && $log->is_debug && $log->info("Sending visu mode $visu ", $client->name);
$client->sendFrame( ledv => \$data );
}
sub ledVisualParams {
my $client = shift;
my $visu = $prefs->client($client)->get('led_visualizer') || 0;
return $ledvisualizers[$visu]{params};
}
sub ledVisualModeOptions {
my $client = shift;
my $display = {
'-1' => ' '
};
my $modes = ledVisualizerModes;
my $nmodes = ledVisualizerNModes;
for (my $i = 0; $i <= $nmodes; $i++) {
my $desc = $modes->[$i]{'desc'};
for (my $j = 0; $j < scalar @$desc; $j++) {
$display->{$i} .= ' ' if ($j > 0);
$display->{$i} .= string(@{$desc}[$j]) || @{$desc}[$j];
}
}
return $display;
}
sub sendDMX {
my $request = shift;
# check this is the correct command.
if ($request->isNotCommand([['dmx']])) {
$request->setStatusBadDispatch();
return;
}
# get our parameters
my $client = $request->client();
my $count = 0;
my $outData;
my @values = split(',', $request->getParam('_data') || '');
foreach my $val (@values) {
$outData .= pack ( 'C', $val);
$count++;
}
$count /= 3;
my $data = pack('nn', $request->getParam('_xoff') || 0, $count ) . $outData;
# changed from dmxt to ledd (matches 'ledc' for tricolor led in receiver player)
$client->sendFrame( ledd => \$data );
}
sub setLEDVisu {
my $request = shift;
# check this is the correct command.
if ($request->isNotCommand([['led_visual']])) {
$request->setStatusBadDispatch();
return;
}
my $client = $request->client();
return if (!$client->hasLED);
my $cprefs = $prefs->client($client);
my $visu = $cprefs->get('led_visualizer') || 0;
my $mode = $request->getParam('_mode') || -1;
if ($mode == -1) {
$visu+=1;
} else {
$visu = $mode;
}
$visu = 0 if ($visu < 0 || $visu > ledVisualizerNModes);
$cprefs->set('led_visualizer', $visu);
my $bright = $request->getParam('_bright') || -1;
if ($bright >= 0 && $bright < 256) {
$cprefs->set('led_brightness', $bright);
}
updateLED($client);
}
sub onNotification {
my $request = shift;
my $client = $request->client || return;
foreach my $player ($client->syncGroupActiveMembers) {
next unless $player->isa('Plugins::SqueezeESP32::Player');
updateLED($player) if $player->hasLED;
}
}
1;