123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- package Plugins::SqueezeESP32::Graphics;
- use strict;
- use base qw(Slim::Display::Squeezebox2);
- use Slim::Utils::Prefs;
- use Slim::Utils::Log;
- my $prefs = preferences('plugin.squeezeesp32');
- my $log = logger('plugin.squeezeesp32');
- my $VISUALIZER_NONE = 0;
- my $VISUALIZER_VUMETER = 1;
- my $VISUALIZER_SPECTRUM_ANALYZER = 2;
- my $VISUALIZER_WAVEFORM = 3;
- my $VISUALIZER_VUMETER_ESP32 = 0x11;
- my $VISUALIZER_SPECTRUM_ANALYZER_ESP32 = 0x12;
- {
- #__PACKAGE__->mk_accessor('array', 'modes');
- __PACKAGE__->mk_accessor('rw', 'modes');
- __PACKAGE__->mk_accessor('rw', qw(vfdmodel));
- }
- sub new {
- my $class = shift;
- my $client = shift;
-
- my $display = $class->SUPER::new($client);
- my $cprefs = $prefs->client($client);
-
- $cprefs->init( {
- width => 128,
- small_VU => 15,
- spectrum => { scale => 25,
- small => { size => 25, band => 5.33 },
- full => { band => 8 },
- },
- }
- );
-
- $display->init_accessor(
- modes => $display->build_modes,
- # Only seems to matter for screensaver and update to decide font. Not
- # any value is acceptable, so use Boom value which seems to be best
- # compromise
- vfdmodel => 'graphic-160x32',
- );
-
- return $display;
- }
- =comment
- sub modes {
- return \@modes;
- }
- =cut
- sub nmodes {
- return scalar($#{shift->modes()});
- }
- sub displayWidth {
- my $display = shift;
- my $client = $display->client;
-
- # if we're showing the always-on visualizer & the current buttonmode
- # hasn't overridden, then use the playing display mode to index
- # into the display width, otherwise, it's fullscreen.
- my $mode = 0;
-
- if ( $display->showVisualizer() && !defined($client->modeParam('visu')) ) {
- my $cprefs = preferences('server')->client($client);
- $mode = $cprefs->get('playingDisplayModes')->[ $cprefs->get('playingDisplayMode') ];
- }
-
- if ($display->widthOverride) {
- my $artwork = $prefs->client($client)->get('artwork');
- if ($artwork->{'enable'} && $artwork->{'y'} < 32 && $client->isPlaying) {
- return $artwork->{x} + ($display->modes->[$mode || 0]{_width} || 0);
- } else {
- return $display->widthOverride + ($display->modes->[$mode || 0]{_width} || 0);
- }
- } else {
- return $display->modes->[$mode || 0]{width};
- }
- }
- sub brightnessMap {
- return (65535, 10, 50, 100, 200);
- }
- =comment
- sub bytesPerColumn {
- return 4;
- }
- =cut
- # I don't think LMS renderer handles properly screens other than 32 pixels. It
- # seems that all we get is a 32 pixel-tall data with anything else padded to 0
- # i.e. if we try 64 pixels height, bytes 0..3 and 4..7 will contains the same
- # pattern than the 32 pixels version, where one would have expected bytes 4..7
- # to be empty
- sub displayHeight {
- return 32;
- }
- sub build_modes {
- my $client = shift->client;
- my $cprefs = $prefs->client($client);
-
- my $width = $cprefs->get('width') || 128;
- my $artwork = $cprefs->get('artwork');
-
- # if artwork is in main display, reduce width
- $width = $artwork->{'x'} if $artwork->{'enable'} && $artwork->{y} < 32;
-
- my $small_VU = $cprefs->get('small_VU');
- my $spectrum = $cprefs->get('spectrum');
-
- my $small_spectrum_pos = { x => $width - int ($spectrum->{small}->{size} * $width / 100),
- width => int ($spectrum->{small}->{size} * $width / 100),
- };
- my $small_VU_pos = { x => $width - int ($small_VU * $width / 100),
- width => int ($small_VU * $width / 100),
- };
-
- my @modes = (
- # mode 0
- { desc => ['BLANK'],
- bar => 0, secs => 0, width => $width,
- params => [$VISUALIZER_NONE] },
- # mode 1
- { desc => ['PROGRESS_BAR'],
- bar => 1, secs => 0, width => $width,
- params => [$VISUALIZER_NONE] },
- # mode 2
- { desc => ['ELAPSED'],
- bar => 0, secs => 1, width => $width,
- params => [$VISUALIZER_NONE] },
- # mode 3
- { desc => ['ELAPSED', 'AND', 'PROGRESS_BAR'],
- bar => 1, secs => 1, width => $width,
- params => [$VISUALIZER_NONE] },
- # mode 4
- { desc => ['REMAINING'],
- bar => 0, secs => -1, width => $width,
- params => [$VISUALIZER_NONE] },
- # mode 5
- { desc => ['CLOCK'],
- bar => 0, secs => 0, width => $width, clock => 1,
- params => [$VISUALIZER_NONE] },
- # mode 6
- { desc => ['SETUP_SHOWBUFFERFULLNESS'],
- bar => 0, secs => 0, width => $width, fullness => 1,
- params => [$VISUALIZER_NONE] },
- # mode 7
- { desc => ['VISUALIZER_VUMETER_SMALL'],
- bar => 0, secs => 0, width => $width, _width => -$small_VU_pos->{'width'},
- # extra parameters (width, height, col (< 0 = from right), row (< 0 = from bottom), left_space)
- params => [$VISUALIZER_VUMETER_ESP32, $small_VU_pos->{'width'}, 32, $small_VU_pos->{'x'}, 0, 2] },
- # mode 8
- { desc => ['VISUALIZER_SPECTRUM_ANALYZER_SMALL'],
- bar => 0, secs => 0, width => $width, _width => -$small_spectrum_pos->{'width'},
- # extra parameters (width, height, col (< 0 = from right), row (< 0 = from bottom), left_space, #bars, scale)
- params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $small_spectrum_pos->{width}, 32, $small_spectrum_pos->{'x'}, 0, 2, $small_spectrum_pos->{'width'} / $spectrum->{small}->{band}, $spectrum->{scale}] },
- # mode 9
- { desc => ['VISUALIZER_VUMETER'],
- bar => 0, secs => 0, width => $width,
- params => [$VISUALIZER_VUMETER_ESP32, 0] },
- # mode 10
- { desc => ['VISUALIZER_ANALOG_VUMETER'],
- bar => 0, secs => 0, width => $width,
- params => [$VISUALIZER_VUMETER_ESP32, 1] },
- # mode 11
- { desc => ['VISUALIZER_SPECTRUM_ANALYZER'],
- bar => 0, secs => 0, width => $width,
- # extra parameters (bars)
- params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] },
- );
- my @extra = (
- # mode E1
- { desc => ['VISUALIZER_VUMETER', 'AND', 'ELAPSED'],
- bar => 0, secs => 1, width => $width,
- params => [$VISUALIZER_VUMETER_ESP32, 0] },
- # mode E2
- { desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'ELAPSED'],
- bar => 0, secs => 1, width => $width,
- params => [$VISUALIZER_VUMETER_ESP32, 1] },
- # mode E3
- { desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'ELAPSED'],
- bar => 0, secs => 1, width => $width,
- # extra parameters (bars)
- params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] },
- # mode E4
- { desc => ['VISUALIZER_VUMETER', 'AND', 'REMAINING'],
- bar => 0, secs => -1, width => $width,
- params => [$VISUALIZER_VUMETER_ESP32, 0] },
- # mode E5
- { desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'REMAINING'],
- bar => 0, secs => -1, width => $width,
- params => [$VISUALIZER_VUMETER_ESP32, 1] },
- # mode E6
- { desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'REMAINING'],
- bar => 0, secs => -1, width => $width,
- # extra parameters (bars)
- params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] },
- );
-
- @modes = (@modes, @extra) if $cprefs->get('height') > 32;
-
- return \@modes;
- }
- 1;
|