From 606f1983c5ff83439008e9f9b3cd68dd57b605b0 Mon Sep 17 00:00:00 2001 From: philippe44 Date: Thu, 19 Mar 2020 16:13:59 -0700 Subject: [PATCH] artwork support - release --- components/squeezelite/display.c | 17 ++++++++------- plugin/SqueezeESP32.zip | Bin 7772 -> 7873 bytes plugin/SqueezeESP32/Graphics.pm | 4 ++-- plugin/SqueezeESP32/Player.pm | 5 +++++ plugin/SqueezeESP32/PlayerSettings.pm | 3 +++ plugin/SqueezeESP32/Plugin.pm | 30 +++++++++++++++----------- plugin/SqueezeESP32/SqueezeESP32.zip | Bin 7772 -> 0 bytes plugin/SqueezeESP32/install.xml | 2 +- plugin/repo.xml | 4 ++-- 9 files changed, 40 insertions(+), 25 deletions(-) delete mode 100644 plugin/SqueezeESP32/SqueezeESP32.zip diff --git a/components/squeezelite/display.c b/components/squeezelite/display.c index c85cf4a2..cace344e 100644 --- a/components/squeezelite/display.c +++ b/components/squeezelite/display.c @@ -595,9 +595,6 @@ static void grfs_handler(u8_t *data, int len) { scroller.first = true; scroller.overflow = false; - // background excludes space taken by visu (if any) - scroller.back.width = displayer.width - ((visu.mode && visu.row < SB_HEIGHT) ? visu.width : 0); - // set scroller steps & beginning if (pkt->direction == 1) { scroller.scrolled = 0; @@ -634,6 +631,7 @@ static void grfg_handler(u8_t *data, int len) { // size of scrollable area (less than background) scroller.width = htons(pkt->width); + scroller.back.width = ((len - sizeof(struct grfg_packet)) * 8) / displayer.height; memcpy(scroller.back.frame, data + sizeof(struct grfg_packet), len - sizeof(struct grfg_packet)); // update display asynchronously (frames are organized by columns) @@ -670,13 +668,20 @@ static void grfa_handler(u8_t *data, int len) { // new grfa artwork, allocate memory if (!offset) { + // same trick to clean current/previous window + if (artwork.size) { + GDS_ClearWindow(display, artwork.x, artwork.y, -1, -1, GDS_COLOR_BLACK); + artwork.size = 0; + } + + // now use new parameters artwork.x = htons(pkt->x); artwork.y = htons(pkt->y); if (artwork.data) free(artwork.data); artwork.data = malloc(length); artwork.size = 0; } - + // copy artwork data memcpy(artwork.data + offset, data + sizeof(struct grfa_packet), size); artwork.size += size; @@ -685,7 +690,6 @@ static void grfa_handler(u8_t *data, int len) { GDS_DrawJPEG(display, artwork.data, artwork.x, artwork.y, artwork.y < 32 ? (GDS_IMAGE_RIGHT | GDS_IMAGE_TOP) : GDS_IMAGE_CENTER); free(artwork.data); artwork.data = NULL; - artwork.size = 0; } LOG_INFO("gfra l:%u x:%hu, y:%hu, o:%u s:%u", length, artwork.x, artwork.y, offset, size); @@ -849,9 +853,6 @@ static void visu_handler( u8_t *data, int len) { visu.border = htonl(pkt->border); bars = htonl(pkt->bars); visu.spectrum_scale = htonl(pkt->spectrum_scale) / 100.; - - // might have a race condition with scroller message, so update width in case - if (scroller.active) scroller.back.width = displayer.width - visu.width; } else { // full screen visu, try to use bottom screen if available visu.width = displayer.width; diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 2a3b0eebcdb365ef11b617d71d3ffef688565697..cf1d7f509cfddcf36ec54844612cc4fc24675e57 100644 GIT binary patch delta 4062 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 S*L~nKR5+IknHuP?|M)+WPgb%3 diff --git a/plugin/SqueezeESP32/Graphics.pm b/plugin/SqueezeESP32/Graphics.pm index a8dead59..f90134ac 100644 --- a/plugin/SqueezeESP32/Graphics.pm +++ b/plugin/SqueezeESP32/Graphics.pm @@ -109,7 +109,7 @@ sub build_modes { my $artwork = $cprefs->get('artwork'); # if artwork is in main display, reduce width - $width = $artwork->{'x'} - 1 if $artwork->{'enable'} && $artwork->{y} < 32; + $width = $artwork->{'x'} if $artwork->{'enable'} && $artwork->{y} < 32; my $small_VU = $cprefs->get('small_VU'); my $spectrum = $cprefs->get('spectrum'); @@ -119,7 +119,7 @@ sub build_modes { }; my $small_VU_pos = { x => $width - int ($small_VU * $width / 100), width => int ($small_VU * $width / 100), - }; + }; my @modes = ( # mode 0 diff --git a/plugin/SqueezeESP32/Player.pm b/plugin/SqueezeESP32/Player.pm index d3692e2e..e0e6a3b7 100644 --- a/plugin/SqueezeESP32/Player.pm +++ b/plugin/SqueezeESP32/Player.pm @@ -42,6 +42,11 @@ sub hasScrolling { return 1; } +sub reconnect { + my $client = shift; + $client->pluginData('artwork_md5', ''); + $client->SUPER::reconnect(@_); +} sub directMetadata { my $client = shift; diff --git a/plugin/SqueezeESP32/PlayerSettings.pm b/plugin/SqueezeESP32/PlayerSettings.pm index 1ff4f7b9..4fd57722 100644 --- a/plugin/SqueezeESP32/PlayerSettings.pm +++ b/plugin/SqueezeESP32/PlayerSettings.pm @@ -54,6 +54,9 @@ sub handler { $cprefs->set('artwork', $artwork); $client->display->modes($client->display->build_modes); $client->display->update; + + # force update + Plugins::SqueezeESP32::Plugin::update_artwork($client, 1) if $artwork->{'enable'}; } # as there is nothing captured, we need to re-set these variables diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm index 22a462d6..37dcc055 100644 --- a/plugin/SqueezeESP32/Plugin.pm +++ b/plugin/SqueezeESP32/Plugin.pm @@ -33,38 +33,44 @@ sub initPlugin { Slim::Networking::Slimproto::addPlayerClass($class, 100, 'squeezeesp32', { client => 'Plugins::SqueezeESP32::Player', display => 'Plugins::SqueezeESP32::Graphics' }); $log->info("Added class 100 for SqueezeESP32"); - Slim::Control::Request::subscribe(\&update_artwork, [ ['newmetadata'] ] ); - Slim::Control::Request::subscribe(\&update_artwork, [ ['playlist'], ['open', 'newsong'] ]); + Slim::Control::Request::subscribe(\&onNotification, [ ['newmetadata'] ] ); + Slim::Control::Request::subscribe(\&onNotification, [ ['playlist'], ['open', 'newsong'] ]); +} + +sub onNotification { + my $request = shift; + my $client = $request->client; + + my $reqstr = $request->getRequestString(); + $log->info("artwork update notification $reqstr"); + #my $path = $request->getParam('_path'); + + update_artwork($client); } sub update_artwork { - my $request = shift; - my $client = $request->client; + my $client = shift; + my $force = shift || 0; my $cprefs = $prefs->client($client); my $artwork = $cprefs->get('artwork'); return unless $client->model eq 'squeezeesp32' && $artwork->{'enable'}; - my $reqstr = $request->getRequestString(); - #my $path = $request->getParam('_path'); - my $s = $artwork->{'y'} >= 32 ? $cprefs->get('height') - $artwork->{'y'} : 32; $s = min($s, $cprefs->get('width') - $artwork->{'x'}); my $path = 'music/current/cover_' . $s . 'x' . $s . '_o.jpg'; - my $body = Slim::Web::Graphics::artworkRequest($client, $path, undef, \&send_artwork, undef, HTTP::Response->new); + my $body = Slim::Web::Graphics::artworkRequest($client, $path, $force, \&send_artwork, undef, HTTP::Response->new); send_artwork($client, undef, \$body) if $body; - - $log->info("artwork update notification $reqstr with $path"); } sub send_artwork { - my ($client, $params, $dataref) = @_; + my ($client, $force, $dataref) = @_; # I'm not sure why we are called so often, so only send when needed my $md5 = md5($$dataref); - return if $client->pluginData('artwork_md5') eq $md5; + return if $client->pluginData('artwork_md5') eq $md5 && !$force; $client->pluginData('artwork', $dataref); $client->pluginData('artwork_md5', $md5); diff --git a/plugin/SqueezeESP32/SqueezeESP32.zip b/plugin/SqueezeESP32/SqueezeESP32.zip deleted file mode 100644 index 2a3b0eebcdb365ef11b617d71d3ffef688565697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7772 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 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.40 + 0.41 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index e0c81729..41953d0e 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - aa122a85db949c903ffa978d3e3b4ee3205e4ec2 + 88ecf433757f057351bcb88461c1db040caef884 philippe_44@outlook.com SqueezeESP32 additional player id (100) http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip