From db6924deb6f3025760cd8e424ca25a29467c16f0 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Sat, 15 Aug 2020 19:04:32 -0700 Subject: [PATCH] update plugin --- plugin/SqueezeESP32.zip | Bin 10327 -> 11502 bytes plugin/SqueezeESP32/Player.pm | 149 ++++++++++++++++++++++++++++++-- plugin/SqueezeESP32/install.xml | 2 +- plugin/repo.xml | 4 +- 4 files changed, 146 insertions(+), 9 deletions(-) diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 1d8b8c75c2a623b291aa0cb813f54b63fb7e3c63..34a0ec1a35d69ad79a837da406734fd4f6b89248 100644 GIT binary patch delta 3396 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 delta 2242 zcmZvddpy(oAIHC2la)5PoJ=}lw9Phh8M$<^E{8HRa!vcW6j2SCJ&N$ngrlahkz10K zau<>osTNwTavix^$nxIj6_xkJsb#{yZO_$Lsz6JRYCdxLXIUtV?!9 zft)_SS5{+Ld2lW176T_p)e&yG;;~af1sDDrhG>etM^mL|Ehs_&-~<0OLKF0DgQN#z zbNv*^*AyFKG8MZ=P~u$7d)nemUTOX#;!87+aV-^-VqWvcVx`|o-%TG@uzJCypYSJ@ zybBDOjJ|XV;apk*X`NxrkOjA-{wLVuy(Xxfx7*drXYCpD@po zJ!-*wr%PtWkiee49b11H4bAi^b!(VNDCbOpc@udDR_Oy77Lj{n)@5(lx4_ z%KIeCO{v!gH@IOZ(s*EjTfRIhkdy4e++Eh^RNuFLGU-85+d95XPiDcEPT3iCnW;5C zC<@EByXDPJvxsUn+FAz9Sq4yT`U$eln2j^rjv?0{KacxCMrDm-Ui`{hP%YUAFkZNekbe(#BepMU=) z+OchV-vYcnXBJesoa$p77skBf|}L3WD* z%0Cg5RC8I+PicCrdOC^r{qtt=R=bf9ONO6lO!TtyQqKNEW;)_(Z!c60+`D>MSL;x) z3i1SUF;!h&qY$GMbL+JEPLxwW^ouS^i_l=KdQ0JK*Qfi=7f3w_r3`57cC-glHR9D= z-W7jY=UQ2dUcKXts0eU1S3n;*A*7YG8u@^5hS^oBo%gRR*Q@N&zi5(!$f}MKaC~IM z<9BM+b{mvDk(ezmstNR5cPY6SQSB6*Vhg97R-~3f&s?i`< z)EZw;9(4ha4IM%7g_|BFrDwNCVhYN&_w*i%nxO=B`X^^Z1*q>D=}CTQJLJP0zZP(s z-ZJLPzEl@sST2Y`vr}Y~yw5-mbHql^-Qpd>=BX1zORDg~!_apJHLnHkTm>) zH-|Rmx@&A5c2TyAo_2<|CgV$?Szx}NFNwE}F1L$r`g%HSCasb!qLh!4O_bQHCp8Lx z2cvCpGec=nIlC>K{WE>BoZ^;jvJggEhN1oq5N>ONvY_?;VfX1;1mzwC6 zi9>}~2|lyO-&`E%_Jr0HkYB(ag;OjPG_N-jb#26CXIjG1fm@ONgFCIX_6$5wV2T-{ zKaOJRKC1OiN6l`HfuA%A8YN>!Zo&(% zhbY^(DH0#!SOR28-3L*Yuy!m+_EzEk-8;QaBeunkRo*MEWCKMn^T2L=`KxC0>MlhO zTT;a^U1fa2V#k4S)~6TlN~tMn=Lo-1(*`{;V>_Pg$(zl6+#SFu?iC95f~OCeXP1}c z$%jxaw_J}aZSLIGQ7SWI$O(Z28oH3z7CRQt^&QmB)OF??EbOm;pxoaQ>gryTiD)#2 zG2c43th0`1iUU5@My_R$H%F$MP7F==#X700fk4F;ROJeoW!!CA#e|yv8g(E099NIQ zcF6pf6uS{oJA`Hff$jj7KT7~uPMz&Iee9WZv7D8-9irD?j9k`%HPAK7`foM`XY`#_ zz?Dl`%BP>R6F7_SEca%Wl!c#J@zZFIi#N@ zinerk0HCp?*~lOAWwo>f01yBL$gaj_D`O=P-0dbcl(q!Yk^0}Oz4#{xze2Al@e>Ky zqvkz-gN-WnU;X}NeEB)4Zx3&`mH~iqX{!C`VV}yf2i6h)fTfK4(L=f3ytJ)v%AS*Y z;A;{I(7PM>RHCN*Q|h90lzff*%boKhmyTl5{6gZdm~b>i`T`$l5{JKsBC~S2bHvhG Lxn#sbYkBv7%{$Ly diff --git a/plugin/SqueezeESP32/Player.pm b/plugin/SqueezeESP32/Player.pm index 93ca40ae..42d3a5b1 100644 --- a/plugin/SqueezeESP32/Player.pm +++ b/plugin/SqueezeESP32/Player.pm @@ -9,17 +9,83 @@ use List::Util qw(min); use Slim::Utils::Log; use Slim::Utils::Prefs; +my $sprefs = preferences('server'); my $prefs = preferences('plugin.squeezeesp32'); my $log = logger('plugin.squeezeesp32'); +our $defaultPrefs = { + 'analogOutMode' => 0, + 'bass' => 0, + 'treble' => 0, + 'lineInAlwaysOn' => 0, + 'lineInLevel' => 50, + 'menuItem' => [qw( + NOW_PLAYING + BROWSE_MUSIC + RADIO + PLUGIN_MY_APPS_MODULE_NAME + PLUGIN_APP_GALLERY_MODULE_NAME + FAVORITES + GLOBAL_SEARCH + PLUGIN_LINE_IN + PLUGINS + SETTINGS + SQUEEZENETWORK_CONNECT + )], +}; + +my $handlersAdded; + sub model { 'squeezeesp32' } sub modelName { 'SqueezeESP32' } -sub hasIR { 0 } + +sub hasScrolling { 1 } +sub hasIR { 1 } +# TODO: add in settings when ready +sub hasLineIn { 0 } +sub hasHeadSubOut { 1 } +# TODO: LMS sliders are hard-coded in html file from -23 to +23 +sub maxTreble { 20 } +sub minTreble { -13 } +sub maxBass { 20 } +sub minBass { -13 } sub init { my $client = shift; + + if (!$handlersAdded) { + + # Add a handler for line-in/out status changes + Slim::Networking::Slimproto::addHandler( LIOS => \&lineInOutStatus ); + + # Create a new event for sending LIOS updates + Slim::Control::Request::addDispatch( + ['lios', '_state'], + [1, 0, 0, undef], + ); + + Slim::Control::Request::addDispatch( + ['lios', 'linein', '_state'], + [1, 0, 0, undef], + ); + + Slim::Control::Request::addDispatch( + ['lios', 'lineout', '_state'], + [1, 0, 0, undef], + ); + + $handlersAdded = 1; + + } + $client->SUPER::init(@_); - $client->config_artwork(); + $client->config_artwork; +} + +sub initPrefs { + my $client = shift; + $sprefs->client($client)->init($defaultPrefs); + $client->SUPER::initPrefs; } # Allow the player to define it's display width (and probably more) @@ -50,12 +116,26 @@ sub playerSettingsFrame { $client->SUPER::playerSettingsFrame($data_ref); } -sub hasScrolling { - return 1; +sub bass { + return tone(2, @_); +} + +sub treble { + return tone(8, @_); } -sub hasIR { - return 1; +sub tone { + my ($center, $client, $value) = @_; + my $equalizer = $prefs->get('equalizer'); + + if (defined($value)) { + $equalizer->[$center-1] = int($value * 0.2 + 0.5); + $equalizer->[$center] = int($value * 0.7 + 0.5); + $equalizer->[$center+1] = int($value * 0.1 + 0.5); + $prefs->client($client)->set('equalizer', $equalizer); + } + + return int($equalizer->[$center-1] * 0.2 + $equalizer->[$center] * 0.7 + $equalizer->[$center+1] * 0.1); } sub update_artwork { @@ -131,4 +211,61 @@ sub reconnect { $client->SUPER::reconnect(@_); } +# Change the analog output mode between headphone and sub-woofer +# If no mode is specified, the value of the client's analogOutMode preference is used. +# Otherwise the mode is temporarily changed to the given value without altering the preference. +sub setAnalogOutMode { + my $client = shift; + # 0 = headphone (internal speakers off), 1 = sub out, + # 2 = always on (internal speakers on), 3 = always off + my $mode = shift; + + if (! defined $mode) { + $mode = $sprefs->client($client)->get('analogOutMode'); + } + + my $data = pack('C', $mode); + $client->sendFrame('audo', \$data); +} + +# LINE_IN 0x01 +# LINE_OUT 0x02 +# HEADPHONE 0x04 + +sub lineInConnected { + my $state = Slim::Networking::Slimproto::voltage(shift) || return 0; + return $state & 0x01 || 0; +} + +sub lineOutConnected { + my $state = Slim::Networking::Slimproto::voltage(shift) || return 0; + return $state & 0x02 || 0; +} + +sub lineInOutStatus { + my ( $client, $data_ref ) = @_; + + my $state = unpack 'n', $$data_ref; + + my $oldState = { + in => $client->lineInConnected(), + out => $client->lineOutConnected(), + }; + + Slim::Networking::Slimproto::voltage( $client, $state ); + + Slim::Control::Request::notifyFromArray( $client, [ 'lios', $state ] ); + + if ($oldState->{in} != $client->lineInConnected()) { + Slim::Control::Request::notifyFromArray( $client, [ 'lios', 'linein', $client->lineInConnected() ] ); + if ( Slim::Utils::PluginManager->isEnabled('Slim::Plugin::LineIn::Plugin')) { + Slim::Plugin::LineIn::Plugin::lineInItem($client, 1); + } + } + + if ($oldState->{out} != $client->lineOutConnected()) { + Slim::Control::Request::notifyFromArray( $client, [ 'lios', 'lineout', $client->lineOutConnected() ] ); + } +} + 1; diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index 7d20081e..d6062cce 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -10,6 +10,6 @@ PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.94 + 0.100 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index f13e8830..a573f19c 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - a9bf10b47d13508ba051e4067cdabc2c283f4824 + 572fa8afeaa3bc3cfb245b8d42ba05739aec584b philippe_44@outlook.com SqueezeESP32 additional player id (100) http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip