From c994c5f3e3e7047efe2e4ec6a4350473315ee8e8 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Thu, 2 Apr 2020 17:07:54 -0700 Subject: [PATCH] tweak for square displays & vertical VU - release --- components/squeezelite/display.c | 103 +++++++++++++++++++++---------- plugin/SqueezeESP32.zip | Bin 8316 -> 8346 bytes plugin/SqueezeESP32/Graphics.pm | 33 +++++----- plugin/SqueezeESP32/install.xml | 2 +- plugin/repo.xml | 2 +- 5 files changed, 89 insertions(+), 51 deletions(-) diff --git a/components/squeezelite/display.c b/components/squeezelite/display.c index 982c83cf..0e2ab177 100644 --- a/components/squeezelite/display.c +++ b/components/squeezelite/display.c @@ -183,6 +183,7 @@ static struct { #define VISU_ESP32 0x10 static EXT_RAM_ATTR struct { int bar_gap, bar_width, bar_border; + bool rotate; struct { int current, max; int limit; @@ -580,7 +581,7 @@ static void vfdc_handler( u8_t *_data, int bytes_read) { /**************************************************************************************** * Display VU-Meter (lots of hard-coding) */ -void draw_VU(struct GDS_Device * display, const uint8_t *data, int level, int x, int y, int width) { +void draw_VU(struct GDS_Device * display, const uint8_t *data, int level, int x, int y, int width, bool rotate) { // VU data is by columns and vertical flip to allow block offset data += level * VU_WIDTH * VU_HEIGHT; @@ -596,10 +597,18 @@ void draw_VU(struct GDS_Device * display, const uint8_t *data, int level, int x, int scale = 8 - GDS_GetDepth(display); // use "fast" version as we are not beyond screen boundaries - for (int r = 0; r < width; r++) { - for (int c = 0; c < VU_HEIGHT; c++) { - GDS_DrawPixelFast(display, r + x, c + y, *data++ >> scale); + if (visu.rotate) { + for (int r = 0; r < width; r++) { + for (int c = VU_HEIGHT; --c >= 0;) { + GDS_DrawPixelFast(display, c + x, r + y, *data++ >> scale); + } } + } else { + for (int r = 0; r < width; r++) { + for (int c = 0; c < VU_HEIGHT; c++) { + GDS_DrawPixelFast(display, r + x, c + y, *data++ >> scale); + } + } } // need to manually set dirty flag as DrawPixel does not do it @@ -921,35 +930,49 @@ static void visu_update(void) { if (mode != VISU_VUMETER || !visu.style) { // there is much more optimization to be done here, like not redrawing bars unless needed for (int i = visu.n; --i >= 0;) { - int x1 = visu.col + visu.border + visu.bar_border + i*(visu.bar_width + visu.bar_gap); - int y1 = visu.row + visu.height - 1; - + // update maximum if (visu.bars[i].current > visu.bars[i].max) visu.bars[i].max = visu.bars[i].current; else if (visu.bars[i].max) visu.bars[i].max--; else if (!clear) continue; - for (int j = 0; j <= visu.bars[i].current; j += 2) + if (visu.rotate) { + int x1 = visu.col; + int y1 = visu.row + visu.border + visu.bar_border + i*(visu.bar_width + visu.bar_gap); + + for (int j = 0; j <= visu.bars[i].current; j += 2) + GDS_DrawLine(display, x1 + j, y1, x1 + j, y1 + visu.bar_width - 1, GDS_COLOR_WHITE); + + if (visu.bars[i].max > 2) { + GDS_DrawLine(display, x1 + visu.bars[i].max, y1, x1 + visu.bars[i].max, y1 + visu.bar_width - 1, GDS_COLOR_WHITE); + if (visu.bars[i].max < visu.max - 1) GDS_DrawLine(display, x1 + visu.bars[i].max + 1, y1, x1 + visu.bars[i].max + 1, y1 + visu.bar_width - 1, GDS_COLOR_WHITE); + } + } else { + int x1 = visu.col + visu.border + visu.bar_border + i*(visu.bar_width + visu.bar_gap); + int y1 = visu.row + visu.height - 1; + for (int j = 0; j <= visu.bars[i].current; j += 2) GDS_DrawLine(display, x1, y1 - j, x1 + visu.bar_width - 1, y1 - j, GDS_COLOR_WHITE); - if (visu.bars[i].max > 2) { - GDS_DrawLine(display, x1, y1 - visu.bars[i].max, x1 + visu.bar_width - 1, y1 - visu.bars[i].max, GDS_COLOR_WHITE); - GDS_DrawLine(display, x1, y1 - visu.bars[i].max + 1, x1 + visu.bar_width - 1, y1 - visu.bars[i].max + 1, GDS_COLOR_WHITE); - } + if (visu.bars[i].max > 2) { + GDS_DrawLine(display, x1, y1 - visu.bars[i].max, x1 + visu.bar_width - 1, y1 - visu.bars[i].max, GDS_COLOR_WHITE); + if (visu.bars[i].max < visu.max - 1) GDS_DrawLine(display, x1, y1 - visu.bars[i].max + 1, x1 + visu.bar_width - 1, y1 - visu.bars[i].max + 1, GDS_COLOR_WHITE); + } + } } } else if (displayer.width / 2 > 3 * VU_WIDTH / 4) { - draw_VU(display, vu_bitmap, visu.bars[0].current, 0, visu.row, visu.width / 2); - draw_VU(display, vu_bitmap, visu.bars[1].current, visu.width / 2, visu.row, visu.width / 2); + int width = visu.rotate ? visu.height : visu.width; + draw_VU(display, vu_bitmap, visu.bars[0].current, 0, visu.row, width / 2, visu.rotate); + draw_VU(display, vu_bitmap, visu.bars[1].current, width / 2, visu.row, width / 2, visu.rotate); } else { int level = (visu.bars[0].current + visu.bars[1].current) / 2; - draw_VU(display, vu_bitmap, level, 0, visu.row, visu.width); + draw_VU(display, vu_bitmap, level, 0, visu.row, visu.rotate ? visu.height : visu.width, visu.rotate); } } /**************************************************************************************** - * Visu packet handler + * Calculate spectrum spread */ -void spectrum_limits(int min, int n, int pos) { +static void spectrum_limits(int min, int n, int pos) { if (n / 2) { int step = ((DISPLAY_BW - min) * visu.spectrum_scale) / (n/2); visu.bars[pos].limit = min + step; @@ -960,6 +983,29 @@ void spectrum_limits(int min, int n, int pos) { } } +/**************************************************************************************** + * Fit visu + */ +static void visu_fit(int bars, int width, int height) { + // try to adapt to what we have + if ((visu.mode & ~VISU_ESP32) == VISU_SPECTRUM) { + visu.n = bars ? bars : MAX_BARS; + visu.max = height - 1; + if (visu.spectrum_scale <= 0 || visu.spectrum_scale > 0.5) visu.spectrum_scale = 0.5; + spectrum_limits(0, visu.n, 0); + } else { + visu.n = 2; + visu.max = (visu.style ? VU_COUNT : height) - 1; + } + + do { + visu.bar_width = (width - visu.border - visu.bar_gap * (visu.n - 1)) / visu.n; + if (visu.bar_width > 0) break; + } while (--visu.n); + + visu.bar_border = (width - visu.border - (visu.bar_width + visu.bar_gap) * visu.n + visu.bar_gap) / 2; +} + /**************************************************************************************** * Visu packet handler */ @@ -984,6 +1030,7 @@ static void visu_handler( u8_t *data, int len) { if (visu.mode) { // these will be overidden if necessary visu.col = visu.border = 0; + visu.rotate = false; // what type of visu if (visu.mode & VISU_ESP32) { @@ -1007,6 +1054,9 @@ static void visu_handler( u8_t *data, int len) { visu.height = GDS_GetHeight(display) > displayer.height ? GDS_GetHeight(display) - displayer.height : GDS_GetHeight(display); visu.row = GDS_GetHeight(display) - visu.height; + // try to estimate if we should rotate visu + if (visu.height > displayer.height && visu.height > 2*visu.width) visu.rotate = true; + // is this spectrum or analogue/digital if ((visu.mode & ~VISU_ESP32) == VISU_SPECTRUM) { bars = htonl(pkt->full.bars); @@ -1031,22 +1081,9 @@ static void visu_handler( u8_t *data, int len) { if (bars > MAX_BARS) bars = MAX_BARS; } - // try to adapt to what we have - if ((visu.mode & ~VISU_ESP32) == VISU_SPECTRUM) { - visu.n = bars ? bars : MAX_BARS; - visu.max = visu.height - 1; - if (visu.spectrum_scale <= 0 || visu.spectrum_scale > 0.5) visu.spectrum_scale = 0.5; - spectrum_limits(0, visu.n, 0); - } else { - visu.n = 2; - visu.max = visu.style ? (VU_COUNT - 1) : (visu.height - 1); - } - - do { - visu.bar_width = (visu.width - visu.border - visu.bar_gap * (visu.n - 1)) / visu.n; - if (visu.bar_width > 0) break; - } while (--visu.n); - visu.bar_border = (visu.width - visu.border - (visu.bar_width + visu.bar_gap) * visu.n + visu.bar_gap) / 2; + // for rotate, swap width & height + if (visu.rotate) visu_fit(bars, visu.height, visu.width); + else visu_fit(bars, visu.width, visu.height); // give up if not enough space if (visu.bar_width < 0) { diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 81d7585ae61dfb619cc10e3ac4583e1589bb4375..a0fe0991552e8c9674071fccd73834981c07386f 100644 GIT binary patch delta 2522 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 delta 2478 zcmV;f2~qZ%LHs~}P)h>@6aWAK2ml71fl$jPu>X_?004m<000XB002jFVQ^?^V{R>#*cAvqvpNMi0HAoAVay}TfRLhGnb z2gvO&`~2#TYVZJK@lF`Qc&rYslDl*6g$C#xG`rfpr#mES8A#4W?v;#IkeQWD2Z;0^m3~u;@fX6`J zEMTt5cv1DGgJm9RXWXyXRMby+#~T759>0ey*b0@{w7g0_Ijn`@t2-qVyd`@DKLV-n5jCbW6xroqF1(qgUMb>!r!c7$QIXJgZBc|d6clA*TVe!{kD*$7pyM?k8;*lzkV^-0#b>4n z!ZEHWbA_9R!$?>oA^wYR!6j74?eB>YTfnvG_d&T{heZM&gou^k6!0LC%CCijo@z&Q zU7){zBn^?*S-wds%R(wLP(QRCt0x7d?K+&h&I~wXV-CWDu^|KtVBiJ7&44kN8{hDn zJPCcv5R5<;Gi{3@$Q5Nc^8}D0#LVEE;e-rq4&;U}jK0Hk;2u!JKJ~nD44B|p7-dHL z4F7nn#`MO1;Eiq0@G{{F#h?zOc~Yw0t4y(fEA=Q3RJeeNFmTf-C9fW%qA`|M5-du@ zJVkzbB3BTIxKP9_%%iB5Mo_$QeJ+VtI+lQVi_XygtLFM^LZPdX_?)x8nl;_yNnS1`@#1BHz+}$<$33 za65}AW;!NCrjT@1KF@nH%!Ry?t}cK%oUN$bl9S6QR|=VdRR6D)L^`NOO46Wz{lFfM zgo`ur)bN*jyLj*5ppH|xTG8R4Lf`mNtDx<*;nAN7#@j4-<~iZmUD9zkn;+NV1T2p_ zPmFB$3$#wVfE=}ur~&q*YdJVsaIX0*aAwJ9jd}_M%BhgPJ;iX#a3WBh9F8OsK)c6; z0a8Uy))ZP2B*CF2F~|$HrnGQDxmG+E{h*=kUH|j3QZQx*@BWdu+r>PbwOHomo>k&<)F8Zr?ea#d?0==mOHb`De8r{e%hw39$FRg1pKyB72VcYy`m zN}zYB`!pTmBM>BKuDvyXkb=e0YT&_xR+Kx?0r+nHUCE{cLdE_&m6EkbooV9l6{AH)v z?e?BFIx9x2zc#v$&05Z8v(;#Ko6on!SiPdT`et+VK+-s)ubqN_u3k0McXMuZnx~DE zvy-!z+u|-&^()1F0FX2JtabkE7gSo0&vZQVi;R9R%lDKu)7|Eqi*~R3>ipf)ix)4N zofj9a))}UJFJjYSlJ@BRJ-VNBXT!5{_q5S!?d47{T`8^15ga`6P7u4mrXnyvI?DuZ zd{B%uq}!_LIZ%9m1QnbFg8-j@Rd(*g)W5HB6?hreW(_03Eja z2pgqSlF(^qHIol=ncV(D;Sc3Bnd^T&vpQTyr@1a4@bY=y;YErLnBvDaiJ=Ix&5f3Z1qRx_x$BwajTkh ztGWm6_jGI%i-~xbVqBy(I)+3Sca}*o2$%SwZ6k;r-|_3rC(^mqBTBRSd(Nc0>!01; zcVkhrrohfL`n#T1bDq}sA=Xu0{ZFZuCgbid((bu-hXh+p%EtZu=(Y4%@cZOcf1jNFN||TfgG;dP-$sxpln!Yt1@U+yCp zHm#D;9<38bujBJ%5l7B*U2$nNuH$cX@rItB0Ja`=2f3i42r7K%jr7cOj}$e3lUM=y z>kb?$E+nl#gcNm+#d3LV8ZV9cOiH7G^zlG{dTw{J%}!{SrtGUh{K5WBnhrLQftse@kIO8Q)dEPT4&_P^ zi`*Ma^YMRyj81nl^6zH9vvv#=4-N*Mfl$jPu>X_?004mHz=%3jibl00000001BW0012e003!jb97;BY%X|hYzhD%000000096P0PLT{WSR(* sqaHi~Sd-u$S_0(`lRO_`0lJf(A6fyvlldQ90jrZ%AU+0Q8vpclient; my $cprefs = $prefs->client($client); - my $width = $cprefs->get('width') || 128; my $artwork = $cprefs->get('artwork'); - + my $disp_width = $cprefs->get('width') || 128; + # if artwork is in main display, reduce width - $width = $artwork->{'x'} if $artwork->{'enable'} && $artwork->{y} < 32; - + 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'); @@ -168,58 +169,58 @@ sub build_modes { # mode 9 { desc => ['VISUALIZER_VUMETER'], bar => 0, secs => 0, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width, 0] }, + params => [$VISUALIZER_VUMETER_ESP32, $width_low, 0] }, # mode 10 { desc => ['VISUALIZER_ANALOG_VUMETER'], bar => 0, secs => 0, width => $width, - params => [$VISUALIZER_VUMETER_ESP32, $width, 1] }, + 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, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, + 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, 0] }, + 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, 1] }, + 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, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, + 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, 0] }, + 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, 1] }, + 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, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, + 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, 0] }, + 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, 1] }, + 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, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, + params => [$VISUALIZER_SPECTRUM_ANALYZER_ESP32, $width_low, int ($width/$spectrum->{full}->{band}), $spectrum->{scale}] }, ); @modes = (@modes, @extra) if $cprefs->get('height') > 32; diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index 9d5f45b6..cab27f46 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -10,6 +10,6 @@ PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.70 + 0.71 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index 677847de..45cb9296 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,7 +1,7 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe 2a8cb954928e0cd8f521acd94b90ce9f34a7a1f0