| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | 
							- 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 || $client->isPaused)) {
 
- 			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 (0 .. 5);
 
- }
 
- =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 $artwork = $cprefs->get('artwork');
 
- 	my $disp_width = $cprefs->get('width') || 128;
 
- 	# if artwork is in main display, reduce width
 
- 	my $width = ($artwork->{'enable'} && $artwork->{'y'} < 32) ? $artwork->{'x'} : $disp_width;
 
- 	my $width_low = ($artwork->{'enable'} && ($artwork->{'y'} >= 32 || $disp_width - $artwork->{'x'} > 32)) ? $artwork->{'x'} : $disp_width;
 
- 			
 
- 	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, $width_low, 0] },
 
- 		# mode 10	
 
- 		{ desc => ['VISUALIZER_ANALOG_VUMETER'],
 
- 		bar => 0, secs => 0,  width => $width,
 
- 		params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] },
 
- 		# mode 11
 
- 		{ desc => ['VISUALIZER_SPECTRUM_ANALYZER'],
 
- 		bar => 0, secs => 0,  width => $width,
 
- 		# extra parameters (bars)
 
- 		params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, 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, $width_low, 0] },
 
- 		# mode E2	 
 
- 		{ desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'ELAPSED'],
 
- 		bar => 0, secs => 1,  width => $width,
 
- 		params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] },
 
- 		# mode E3
 
- 		{ desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'ELAPSED'],
 
- 		bar => 0, secs => 1,  width => $width,
 
- 		# extra parameters (bars)
 
- 		params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] },	  
 
- 		# mode E4	 
 
- 		{ desc => ['VISUALIZER_VUMETER', 'AND', 'REMAINING'],
 
- 		bar => 0, secs => -1,  width => $width,
 
- 		params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] },
 
- 		# mode E5
 
- 		{ desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'REMAINING'],
 
- 		bar => 0, secs => -1,  width => $width,
 
- 		params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] },
 
- 		# mode E6
 
- 		{ desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'REMAINING'],
 
- 		bar => 0, secs => -1,  width => $width,
 
- 		# extra parameters (bars)
 
- 		params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] },	
 
- 		# mode E7	 
 
- 		{ desc => ['VISUALIZER_VUMETER', 'AND', 'PROGRESS_BAR', 'AND', 'REMAINING'],
 
- 		bar => 1, secs => -1,  width => $width,
 
- 		params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] },
 
- 		# mode E8
 
- 		{ desc => ['VISUALIZER_ANALOG_VUMETER', 'AND', 'PROGRESS_BAR', 'AND', 'REMAINING'],
 
- 		bar => 1, secs => -1,  width => $width,
 
- 		params => [$VISUALIZER_VUMETER_ESP32, $width_low, 1] },
 
- 		# mode E9
 
- 		{ desc => ['VISUALIZER_SPECTRUM_ANALYZER', 'AND', 'PROGRESS_BAR', 'AND', 'REMAINING'],
 
- 		bar => 1, secs => -1,  width => $width,
 
- 		# extra parameters (bars)
 
- 		params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] },	
 
- 	);		
 
- 	
 
- 	@modes = (@modes, @extra) if $cprefs->get('height') > 32;
 
- 		
 
- 	return \@modes;
 
- }	
 
- 1;
 
 
  |