From 6452b5a941a4e3f1cbae364b7db62c7aab313b78 Mon Sep 17 00:00:00 2001 From: ayumi Date: Fri, 7 Feb 2025 04:18:35 +0100 Subject: [PATCH 1/7] Make icons smaller --- lua/img/back.png | Bin 165 -> 88 bytes lua/img/bat/0.png | Bin 198 -> 96 bytes lua/img/bat/100.png | Bin 285 -> 101 bytes lua/img/bat/20.png | Bin 234 -> 101 bytes lua/img/bat/40.png | Bin 258 -> 101 bytes lua/img/bat/60.png | Bin 249 -> 101 bytes lua/img/bat/80.png | Bin 270 -> 101 bytes lua/img/bat/chg.png | Bin 207 -> 91 bytes lua/img/bat/chg_outline.png | Bin 225 -> 104 bytes lua/img/bt.png | Bin 210 -> 97 bytes lua/img/bt_conn.png | Bin 246 -> 105 bytes lua/img/ce.png | Bin 497 -> 549 bytes lua/img/chevron.png | Bin 141 -> 83 bytes lua/img/db.png | Bin 228 -> 104 bytes lua/img/enqueue.png | Bin 162 -> 87 bytes lua/img/file_icons/directory.png | Bin 198 -> 90 bytes lua/img/file_icons/playlist.png | Bin 162 -> 87 bytes lua/img/files.png | Bin 279 -> 105 bytes lua/img/info.png | Bin 156 -> 79 bytes lua/img/listened.png | Bin 189 -> 98 bytes lua/img/menu.png | Bin 138 -> 77 bytes lua/img/next.png | Bin 297 -> 96 bytes lua/img/pause.png | Bin 234 -> 76 bytes lua/img/pausecirc.png | Bin 360 -> 104 bytes lua/img/play.png | Bin 225 -> 94 bytes lua/img/play_small.png | Bin 165 -> 83 bytes lua/img/playcirc.png | Bin 348 -> 111 bytes lua/img/prev.png | Bin 288 -> 97 bytes lua/img/queue.png | Bin 195 -> 83 bytes lua/img/repeat.png | Bin 225 -> 99 bytes lua/img/repeat_off.png | Bin 249 -> 108 bytes lua/img/repeat_queue.png | Bin 264 -> 108 bytes lua/img/settings.png | Bin 291 -> 113 bytes lua/img/shuffle.png | Bin 264 -> 112 bytes lua/img/shuffle_off.png | Bin 228 -> 97 bytes lua/img/shuffleplay.png | Bin 189 -> 85 bytes lua/img/unlistened.png | Bin 174 -> 87 bytes lua/img/usb.png | Bin 276 -> 113 bytes lua/img/weee.png | Bin 562 -> 638 bytes 39 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lua/img/back.png b/lua/img/back.png index 7c6d28c26276cbe4dc5117b01d6d66732fd893d0..5995883124200c1b950cf73ae90991eec45fd575 100644 GIT binary patch delta 69 zcmZ3=7%@T8o`r#d!E463*+5F()5S5Q;#Tqj=70Z>3pfb>>SuYt#L*Bd>Lf6~cLoE) Ym0N{}Z5C8xGYe_^wR2Wx{kckSwAPhsB=>LDQrb~CgF2)Md zgO^lA{0Q6`X(ZV%^GlOb%Bn`bL&{8_01$?qt7Z`N#Gzpai>re{IaAJo=xv7zTz#@2 z7@FZST8Yp%rz12ir(L|_Jb%2d9DSE>=6CvpSiU gJ8H-@ToPbqsA&$_FkiszDNqZ8r>mdKI;Vst0EW{YfdBvi delta 180 zcmV;l089U1#sQESe+B>m0CpZUK>z>%i%CR5R47xWkx>rCAP58n?|os zs1amzU2PmRJ7C8PUm?wmr0m1&b1uu9oR8Wli2YR&5pwsI3J?__R@Q_?GY*iY8vpA2 z??l~vF;8C6hK1UEZ(7iWOZGBM7}k`%VH99k4_3_{qa9kv@GP{ftn?a0A iT-N&A-#<8lA5c0^>P=p+IRF3v07*qoM6N<$f&c)aDNUaM diff --git a/lua/img/bat/100.png b/lua/img/bat/100.png index 85c8fe9789051d5efa660d521faf25aa3c925b42..d01f114a36a081595adacae4b04f4bc272532c1c 100644 GIT binary patch delta 82 zcmbQslsZAuhlPQG;g0y9Q$R|`)5S5Q;#Tqkkw58w`ne67mi&Kw<%hgiLRL!$lc4U> lnIAlb3oKg>F>3GzGPE4t;bW^I7zNbF;OXk;vd$@?2>|_J9rpkL delta 268 zcmV+n0rUQ4odS>m0CpZUK>z>%;z>k7R47xWlG_r4FbG6h;{SiKfu2pQ4}Gem zbtVwl3s}XAM=!8(gL`&&He3p|&xj^2b&OUtr}K4B{m9hHs=!_GzfQUfN`oybiM*|# z>1))7RcxjrW=8M^VID~@;FJE*Gn5Bzjiwg@qDT$EMGl#De{7w4VzUgMmwd`>r%U&| zCYhGP$;eHxb^zEqo57@jcg%A3-qzw=RB;+y5GhgC?%gv_YC{O)m6^F^5JIy!N0Hpw z;7&{V0(YMX9FM+veYb7(i7NZqR_%IwvKD#q%cbgZ*zel-BemcEz$@?vJT{-?JpMG= S00000NkvXX2ChP2f&c(9-hJl) diff --git a/lua/img/bat/20.png b/lua/img/bat/20.png index dee3fdf97b5d303cf517d39c51603b4b3d1041d7..c88943bb221acd888009432087ae7ae06f5dede3 100644 GIT binary patch delta 82 zcmaFGm^wkyhlPQG;g0y9Q$R|`)5S5Q;#Tqkkw58w`ne67mi&Kw<%fK`iHCLvi&B)A l@x#e#4~jTinFFL2F;qll%rR?J^9Jf;@O1TaS?83{1ONu19svLV delta 216 zcmV;}04M)t>H&}$e+B>m0CpZUK>z>%uSrBfR47xWkx>rBAP7VOz5j_7_RV(F^h@28 zSc}HTIOz5w`~_<_oRww9m|@l^N$P2qP7)l`n!LV$XG=4YnH8ZE=TR^hJgTB!g;r6V zGt|9>55at_bhAAykpgbOMJ2~-P2@WCPFeQkJp@z9b0FW6QYQ2Rc>HeJeTtLXEaktaVvR&$e;8-{oDpkOa4E;@)n&_+ lv_tB?2c8OWu`e)jVLbe>ro-)AN-|I%gQu&X%Q~loCIA)3AFcoZ delta 240 zcmVm0CpZUK>z>%$w@>(R47xWlG_f$FbG4r^#8xOfgPvQG)-x> zsyw6$)CQZlJqUk*wGX&@v@UI-!`wM253yHU231|6Rkn!m3GUk4W4kp)jhf8>H{gS4 z71cY<(tPOSOvPN}I0%hF;uI`$6_HX^mbp3K_8qN>PO)8qYH15L=P#PF8P~z$Q3IAE z>p&izhoKD%eNIX0Kh5w<8S@neK>)hOu^l#19T%O~CceSb@oC(#TgXtNWkXCq45rSN q#`9%hoJXFUbf*71f9qlV621VxmUiA;?+R}K0000m0CpZUK>z>%z)3_wR47xWl2H!BFbG2--ThCzz@B00N83%R z8mUAi7#lZk50*c`+78Z)OwvfR&C=4pSCi8LMWt>O)f&UQBETuRqXI}a7}nwA1P;2I zdWww=UYG;cmrE!?5gAwDcVrz4Uvj&PRH`wdMg@G9ouPs8VL^}zUP35!R0}L=*UY7g zOUYgG#of$v&5U6e%xWA^ZRKR!TwrFIJ?(G9{<&XEaktaVvR&$e;8-{oDpkOa4E;@WS_4W|Wv8GH%mVDOS%lF)F5VHHpxgQu&X%Q~loCIAl%A6)m0CpZUK>z>%)Ja4^R47xWQCkkfFbKo6_djvLvq`&7``Xk< zd4jPW5Dx|(VB-xYn-LvaG`0Xs=Pd%QB&Q+D5hWBVcI+5%cQZ5pQbCOY96absmxUe` zy7myR=@)1b1POE>)IvI_`)xswM(|2jL|MzDLf8|BaL{x)c7bo%A|C4;m$}$1M6a2p z^FBCKX)&{?Z`s8bXj?Uwf+-?)&&{%Xd8Q8^ALjez)BAjl@!Cuwhj4dJu)-hAzx1B0 z1zzkn@1Ew_Ys)Q*7qhjVv5~Gnko3QL`>p5^_yy9YhT`iMUHkw5002ovPDHLkV1fW@ C`fu<6 diff --git a/lua/img/bat/chg.png b/lua/img/bat/chg.png index 17af13c9141e038a82465cfecdf990cdcdda64a5..a9b7aee841dbfbedb28651936f19886419d51323 100644 GIT binary patch delta 72 zcmX@l7(GGKiG_iI;g0y9Q$R||)5S5Q;#RT(=bv^anM+H&l^7g7Sq>m0CpZUK>z>%lu1NER47xWl3NbLFbD(z=l&;-p+l@hsT|Wv z;nUvXv7quIv|@LUXesazX(6iZOJBkP94I1L(@DF89ndwzx{7Txm<=sq&@3pXw$wa+ zc!x7)bZGhx8)axj$aOIjJlchFWlq!`GF{^dzy3GuFq&jZH{2_p8!Fu%X6K5Y=dM?k rFtNIY!tEV!E0dR>zb^L``~lh;J`OO^KYIWG002ovPDHLkV1fVuo&HX( diff --git a/lua/img/bat/chg_outline.png b/lua/img/bat/chg_outline.png index e15fb0e97b4d3e3a0d6db24948788f07a3ea8eaa..86f2b6cbf61023e32be6a58f238f9be4f6f46dd9 100644 GIT binary patch delta 85 zcmaFJm@z@ppM`;e;g0y9Q$R}J)5S5Q;#RT)>;HuehYnA0*|5QDvR>x|x6QJ_LX-U? pgl-1x*>>1N=2D8MlE?%$2FX6#!)>P3?|@nvJYD@<);T3K0RTzqA6WnZ delta 207 zcmV;=05Jb(;Q^2te+B>m0CpZUK>z>%s7XXYR47x0QqdBCAPgGQ|Nmkg;dPdkntSLb zF%X4q7HcpZ<`ybgf|_AHnh~h1Oh^wrNIG!sEy*l}$oax4riA~MBZBU?MT&`+<>qp# zJpRlmP12}>%7-Bz@=B%Wp$K*E)767q1muamPGnS>xI_FXNw>)$tb&&G?IDedeb_Q> zWv0;1bg2eIfWKrG5wc@;MO$)L+7Xvm)qwYFn!V!XnRjo#V+Y4_Vh-L^3?cvk002ov JPDHLkV1j2hU55Yw diff --git a/lua/img/bt.png b/lua/img/bt.png index 632a81c2335cebbcfc4d9c0f5130fc999371af26..2909057d99a214d57ee2c23b15ff9c541d07d39f 100644 GIT binary patch delta 78 zcmcb_m^eYwgN1>C!T9R*FF;De)5S5Q;#RVP)Sv(T{z4odJemyrIOpv8@64E4rc^R1 hS>0!nPrVR71J?%glRMpIy?}ZcJYD@<);T3K0RR}Y8ZiI> delta 192 zcmV;x06+g>(gBbee+B>m0GZrhe*gdgmq|oHR47xOl2H!BAPhs}(EFcw#B*99O@+{E zNc<2Uu^nK4E>v8QbfB!41+vq^46QBilwglwb4M`L*{6HcK?raG1MFR*#T_@<%Z}+! z+gt$v)Sl&TJbq|Gv5=X8F2R(Ev!rgq(O!6DLZ?S693VaCIum*JJG#vruQX+s%H=uL u@oL7?CHJ1@sBh+YNv(cXS$O)wU&YW(4tk2Rx&QzG07*qoM6N<$f&c)qURNgo diff --git a/lua/img/bt_conn.png b/lua/img/bt_conn.png index e569d827b2d79ddd1dbfad070db9e275e9354e56..995422b2a358f33e037ceceb514cff8b334e7d8d 100644 GIT binary patch delta 86 zcmeyym^nc*fQ5m9!T9R*FF?w`)5S5Q;#RT(*Ps9W{z4oAIXYH>O9Xu++9tfX6wt6r p!c|JqF+e@e`s0piD)p1t7=AqqT|M1kw>MBPgQu&X%Q~loCIAy^9<2ZX delta 228 zcmVm0GZrhe*gdgy-7qtR47xOlG_f$APhre%Kv{c#B;QUap^Q^ zeQ8B~oHzvb=YyT2lPEaOcikgsZic$T@}vBQ{s4P(UbVoxgx3m_jgVthAE2wpq8=#_ z0(+DIt?JD6UGDZN9ri3CcxTZ|mSL3H5|Ew1spk~9Xj6xoUMGcA3%EYjmyF>m$`FMG z&&E0JjC5waGcYR05EO37c+cRNs_RG5aI(eu{<7LK)sazzby~nPv@ga{u{E-8m;bbt eKUeG9D!%~VfQb%O5k(>Z0000De^I43zfzSjyyj2cW}FW33RKYp{y5}*J*S;Z+{@tc2q z4vJ)EFc-0L+G<5YjArcP2QL0lNA9DEN+{1!Yyd+EIoY8@vVRg{4CD)dv4oObMiZ5g zjunK`u@cF#DijOu+cV>Sx}LSCun!65**9OZM03Kvjmuf_J~qpvA$@h$SkVJ z%O{kdGzbr#L4Wy04NHWvXtTm&mH3CU&JyA@%3E@V$3~;r)Dl({<`2puQ*Z~$4PwHQ zR%ne(!OJLXEFq?#*qq?7@7GcV-=jb? zL87LhrnzU37(hHYn8P;`ZJ=I)N20TI^^HWv;ciBx;chKnA34rE*Kn8kF_q;wm<|iEa!3FG002ovPDHLkV1mCf1jPUV literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^MnJ5>!3-q-Eak-ae8fNv{17F$B{kKy`8gu&)=HcagF_= zHBi}+1)`;UbDw) zo_t-ijAdfJM&`Zhi9%+9r`(d;gb%Na+uL*O$f8xx3d$B)nT9oeC_0=ayGXs-`U;O- ztbw*?o6E&4d40t+;lB+U-mSLJ0!8OCr(~|T7K_X(FOi+#!)YORUo_S6u$M#al!inp zPlX-XLT@%?sUFPpb9uIGU4(}B_9)4oOA~J_l3A{u{+YEq;{Ku=_JI+Cps~75)D&&b=1O_96r>mdKI;Vst0Gs9L>Hq)$ diff --git a/lua/img/chevron.png b/lua/img/chevron.png index deaf47e7056d598357e061b343d821b5cc95e91e..4584ecb54fe33517f705fd70f1d05d919011c689 100644 GIT binary patch delta 64 zcmeBW44xoq#lpbAz`S(-S|BCm>EaktaVvR&>5u>N&Aks4GDJ89j^&AzGBR|Y;Qf5{ S<@p~#RScf4elF{r5}E+5OBUn+ delta 122 zcmV-=0EPckjRBAubOrzb0I95ZCIA2cQ%OWYR2Wyik--jtFbG3e@c+M9c#;@rmU(cO zaic9I6t#uYg0^iC6N%iWO__<=jSnOVGIb0B$$LLJ5oc{URCCnaz<(Z?5tzS@PhuO= c`170#xIi2XQD4zy00000NkvXXu0mjf0O!pvZ~y=R diff --git a/lua/img/db.png b/lua/img/db.png index d6c516886989d8ce75a23aa2df77fa0fd731f8ef..6bd5bcc0aca725fc1fad6554de5bde7a533a4a25 100644 GIT binary patch delta 85 zcmaFDm@z@ppM`;e;ZMz!93Z9d>EaktaVuGY{ZINoezpWNi32JYiA@4LY6nHw9XVS9 oSxO2XPkL}v^m09JKe=Kufzt4TybR47xOkxLT8FbG4D;r=H!sB-+7WV&gZ zjRQvFfnhH{ysWn)U?quWMYCwQ@?=+}T*5qN?g&PG^Icd38j?lVISTjv5v1H4u`avB zfs&vt0SAB#kDzBUe7f!bB84Q3q(Phyq`N@PsAd>5V0C2|Oy(YLDDS+zCnFryg%%St zOY^j~jVmD}Ur3u**qUo%e+^Al33V(}Yn`qGQ=z#cEVKU~?$;Op0QRnT4W1Z`*Z=?k M07*qoM6N<$f=yLejQ{`u diff --git a/lua/img/enqueue.png b/lua/img/enqueue.png index a0b58176005ffae888c71a1d0fe240e06357b559..1f512df2d2b329570df80c53aa644c0c75907b65 100644 GIT binary patch delta 68 zcmZ3)7(PMLj)j4NLEW0&3`og&x;TbZ+)6&c`S1U65hi8@Ue<`vM}~sD2UJ(Al4baO W+wi>oPGL2mN(N6?KbLh*2~7Zqa1?a_ delta 144 zcmV;B0B`?Sq5+T@e+B>m0F5%wy#N3JXh}ptR2Wx{k4p}KKnOz%-v7o*Z86Tm7=>h# z;n!CJ!-#vXip-3aKli&qO+h~rNKJdGlqU~$vujI%YQ~@9#AYk*_7@boC)@ y#~14Lm@(Rihze{X!5`s;?aNJfOw>Gc0+t#m3yT{(oB#j-3IIt(PDHLkV1fXIojQU5 diff --git a/lua/img/file_icons/directory.png b/lua/img/file_icons/directory.png index f9fe507145d54f8cc17a80d3e0ca7b837e7ab272..d6a097985c7f901890d701020648e47b4ef1dd86 100644 GIT binary patch delta 71 zcmX@c7&SrCk%fVQLEW0&3`i+@x;TbZ+)6&c_|KVfmcon{<`oLFgj%HbXnBgeFk8g% ZF>ILYym#Hn*dIW}44$rjF6*2UngGez70&m0F5%wy#N3Jj7da6R2Wx{k5LW;AqYbOz5j{D?!(n&GI5jj zL&3Jty8U^)cvDlRNfkWPTJP)sc{WiB_f;pNfNbF=gjTnM76_(Ozb9p;T5Fq_LRQ<+ zd7=z+dJ{d6AL3wSXXGu{97BQU1rApCZR1TIIn>)GPKfb?E_nQZQ=`I&)qE^jkek!ARP W-SE7;ocBqfN(N6?KbLh*2~7Z{niXLH delta 144 zcmV;B0B`?Sq5+T@e+B>m0F5%wy#N3JX-PyuR2Wy4jzJQ|FbG0HbN>??s7<=)=6CXO z<2cBJI23Q6tIRRh{!5QhMiOjE@;Zu`A%u;{!F4OyBliB8cv5qtJ8>Gw*e_iKgrLS} ybfuhZf3IG5}MNUMnLSTYYj6Yid diff --git a/lua/img/files.png b/lua/img/files.png index b9f1268d1cbffbad9da769c0c492de6ef83a1d9b..f6847f2115932eade9a3827cb0f4cffa964185bd 100644 GIT binary patch delta 86 zcmbQvlsQ2%fQ5m9VXNcQC?I9v>Eaktack>&Q$_{{hQkMbnEyS~BUv5H_;8V4-y)5K q*rr914y&F?ys&T6Zk(57KH+z6Yjx?q3(tXi89ZJ6T-G@yGywp2jv`S2 delta 261 zcmV+g0s8)FmjaL(e+B>m03S##(EtDd-bqA3R47x8k^zo|AP_^RgZDo%O!tke|Hovr zNKgbREuAW8)8%2svLpLBhI;+KrdiWR9*>PR%OTNMSQ)`##eDQh6`_$*)pF*Z;buo1 zXQ_b&Fi%FaT7lGR7QP1K`J-tNu`-;DEIp(Gb8_77ekbc%e;9-2U&du=FS{{vzW|~b z$vE($EzDCpm`4M@cimwd^8rA}{oXN_C&0@P_e9Tn{>6MNlc6Ovk(WU`nI!HN>c8%GcRmw`|wad@bRSI>h+&o00000 LNkvXXu0mjf7w~u& diff --git a/lua/img/info.png b/lua/img/info.png index 67fc526d76b173f037f5cd28041025ae0d3a528f..6012ab92eddbb655cc53b54e07b8e8389e57e690 100644 GIT binary patch delta 60 zcmbQk=s!WyjD>-LVXNcQC?F-~>EaktaVvQN-w%G43e}V5WiLE~_!t5YD&Kv0%m03S##(EtDdV@X6oR47xOkwFf?KnMcC?f+j~rL^a6HfrL{ z2?)e+IOMPet4bu{{k_?Px&m0N{}Z5C8xGgGod|R2WxnkXaVPAPfU7!~IW8td7%?ri(s! zfaQ@v@zPOt$`KXebSN@}x_mC>!jR|wuC>Z@rew4`zD<2zU0+b%3SdU*qR>B~8iuEN)DgZ^Fx8QH))G Z08)!v>1>ywHmLmtIft340dU+ z%}GRacoLh(%^r>`N;YT&gR*>qyLInnCL;JU`M}YzT~1b@ewYH7kH!Gm{);Qq95=@b ZoC&+k91kX0KzaZG002ovPDHLkV1li3FCPE^ diff --git a/lua/img/next.png b/lua/img/next.png index 72095b528cdb7be9ad45b8bbf12d3d0835b7984f..bb8173e973d85057521efd8db8ee117c068f6c75 100644 GIT binary patch delta 77 zcmZ3EaktaVvQN&!7MOe$9~_d_BjeurN#X>UFZcQ0H9E fSm03S##(EtDd?ny*JR47xWlHrnsFbIPIeg7vea9`T4?zw+% z_Np@#DM<)*`*Qi0b#@i@==RgEIIH@Ixbv-57IDmfZ-t}H58hQ=S#7~V&}IyfkqTe= zn*lui2va`1Ms-6NzTz>m4;7qGM$RQLQAIWcKG(!+CvMAfe>-k07*qoM6N<$f&c)y2z_4w diff --git a/lua/img/pause.png b/lua/img/pause.png index 3db657a02ed3bf8730e74af91168530b7f5fcbf5..7fe61e2253c34377f7ae2f685bb6afe65899d444 100644 GIT binary patch delta 57 zcmaFG=rcjmn1z9XVXNcQC?F;5>EaktaVvR&%pZ29l&X+PNem38*ZntcNZ#rUlxFaB L^>bP0l+XkK`tA}Z delta 216 zcmV;}04M)U>H&}$e+B>m03S##(EtDdut`KgR47xOl35bNAPhsjaQ_qARt1F2bkdd% z`C{?2WCfMOPY*eHfC0b&F|%=(D4wV^)3@3OSW!?HQJrAl7nfU*?SZ5sD+k#1ij91u z2wKY&X$vITJJ7(!Dhoxacv+?T*y}a(3iIQP<(x^ULU({tQn8)YU>L@5mSSXrYo@%L zk%cf8F2x9lJ5%0(L2Jg}dxIcYJn@EaktaVy!O;ePkhg-tC;Yi2v&D&BK&=d(u6{1-oD!Mm03S##(EtDeE=fc|R47wzk^z#%AP7SNd;b$x*cVY}_y4ss ztwlme(Cwd9EQR&*O!G1PGwn~H5LT0=pt(_=!3U1@yn4)N&~0K82Xs#KT}!fd^Zcpx#xkt! pcwdGu;4Pq0KzT@yq|3nO2h-uo^oqLA$p8QV07*qoM6N<$f&h9isp$X! diff --git a/lua/img/play.png b/lua/img/play.png index 39fa3d66b86a64df70d0d40b26c99eef99b00bcf..4907e4a14dd75dce58693b1e3179a5d4e53fb9cd 100644 GIT binary patch delta 75 zcmaFJ7&k%Em4$(UVXNcQC?KWk>EaktaVvR&$e;iH{z5zjo`)FuJm+xzOJ?|_;#n^6 e&S8NT14CbY^4y03p|gM*7(8A5T-G@yGywp@lNrVU delta 207 zcmV;=05Jbv;Q^2te+B>m03S##(EtDds7XXYR47xOQb`iTAP8ic|G#*or@>rEtc;}> zDWx}5<#6dCP8tvasOc72Yl`?n)daL*WO#GaE=MZn2_T9pM14(gQyiBfBoJauqGVb* z=s-}4U8!0HRSQ<&gexP=8Qg#Y4IUX}6Ts$&#*7RW0N%~`|3|BK5Q$UBPNH zy8~&JW^0vQir8oUJdcdvP?$vMX#Y77G<9Y8_oKFc$%^C{_yc~iP7fUu5a0j+002ov JPDHLkV1j`oQ-uHk diff --git a/lua/img/play_small.png b/lua/img/play_small.png index 471bbf0198fc606ab6d9520e01d4a28fb97f778a..91d842cdbaf6d8fbd31e6eedb50948cc6714a98b 100644 GIT binary patch delta 64 zcmZ3=7(7AJiiLrJLEW0&3`j|Nx;TbZ+)7s9{lm_*rb$BR|3rqurWs-rSsCvB*S~n` S=hpu~RScf4elF{r5}E)+%oPU! delta 147 zcmV;E0BrwLr2&u`e+B>m0F5%wy#N3JYe_^wR2Wy4kO2z7APfVO&j0_o%_2DGU@%ui zrC!rmVl%kOVS=g>NH1?MF_Y#56utRQizvJluP=dV}fDSd#4tT=4(#e9iL&H^V9m^a6Nv4FCWD07*qoM6N<$f&h;Z BJ6r$& diff --git a/lua/img/playcirc.png b/lua/img/playcirc.png index c76b9ea04240dfd832c10c8b3f6ccefa0bb76458..aa44915cea76098e9a2fd2e9e499d8f435a824cc 100644 GIT binary patch delta 92 zcmcb^ls`c-jD>-LVXNcQC?I9#>EaktaVy!O;ePgTe~DWM4fr^g>N delta 331 zcmV-R0kr;a+yampe+B>m03S##(EtDeB1uF+R47x0k_(Q*FbG8X^!_J~Vc+1SZQ4rf zNJ$I~3`5`2d-_?jv`CoN+KfbeM@HeaswL z4(2mDycPh}MYJI87cD!qXTH$% dP2+a{0F->O^}EWJAOHXW07*qoM6N<$f&dB7j{X1u diff --git a/lua/img/prev.png b/lua/img/prev.png index b8a591feafb77ad3279f40867258d5578b19e763..85834eaa340f79740e1251da1bd672667f179e9f 100644 GIT binary patch delta 78 zcmZ3$lsG}sgN1>CVXNcQC?KWb>EaktaVvQN&mVRs4sOR}52XwfPmaz7f|E2F^d_~) fw)j2fXXyeeWSgGJe_7Z7sE5JR)z4*}Q$iB}a$^=) delta 271 zcmV+q0r37|paPH?e+B>m03S##(EtDdJc&HMWo6aU>t=-QCnS&6e{6#x)Cc$04Y&u zJ2V1A&_ybmM2E$<@v;x#P|_7~9stpAVqfmgC^2`0vwu{Z>C_2$B!U VZ>s750000<2}Mpsu0mjf005^6dTRgx diff --git a/lua/img/queue.png b/lua/img/queue.png index ec89c1644105a8a4907ec349beff0b5b213e42e1..77e6c6c86b39a9e88b3b6de0690bd081fc426b27 100644 GIT binary patch delta 64 zcmX@i7(7AJiiLrJVXNcQC?F-}>EaktaVuGY;U6=joF|*n!FrhniM`4P{226td^a;K SFs=rwV(@hJb6Mw<&;$TV(GrRP delta 177 zcmV;i08al?!vT;Pe+B>m03S##(EtDdib+I4R47x;l2H$YAPj@)@c;i}S+50R%;g^7 zd=W!3nVbDqQ2tzS9hoFiBGBJg)+}rU>T;1AZ+(1Ma!F0~2xYQsA054^xPbjUlz^Wd zrf=?NQdg$<^N;75jA|h1PZnyxDW2#=O;Hu5!L^&tjt$>lE5hg-H_RJD*8Q8|WOWvD fS~IY_k9_<9Lq#+XhD_L$00000NkvXXu0mjfR7g$p diff --git a/lua/img/repeat.png b/lua/img/repeat.png index d5d92ef81d7dbdeb1fd09cd86bce01713bfc1c37..4c45f9759aca4fedb34e791ba9634c250c63997c 100644 GIT binary patch delta 80 zcmaFJm^?w!i-m!KVXNcQC?KWf>EaktaVvR&%pZ3qiJ%pyKFo5uP_ZVm03S##(EtDdr%6OXR47xOQc(_tAPifl_dhYLc9=W`OdiUI z1Zlgj1NL#@BhMycu+ZqHj}dMzA5KkfcN)NM!-pU9$DJ$2afx0Dc-#4EaktaVuGY`_KRWLyinQnjxu2q)s+mtx!>9>D6Op s)9^CjRXWSbao2*G;buXJW)TBJ`_1r`b%pm10kt!Dy85}Sb4q9e04!=9&j0`b delta 231 zcmVm03S##(EtDdzez+vR47xOk>L`AAP9s3d;cdE_7=<1oVmK= zPm{9p?V|E$>90DlH0v%z4ImGTioyj_1RDG;S}EEN%_IzpY_sLD>VR2@QQQZ;M(v2N zg~)LYJE&1{y4%!dkATzoh0{F&0h*;(A?|MFL`@X9GZbr=VcD!lQ#J-OvtdvZ<|Kg; zgF3$KiiY!TRdcGG(ovrFI|-3Ip<-Otx?e7SI3GOjo`6d1lBW34%!G+T%&ySRa6A() h>y+0XpL~t?9}3ZK547V;6aWAK07*qoM6N<$f&ir9XxRV& diff --git a/lua/img/repeat_queue.png b/lua/img/repeat_queue.png index f9c10124e12a5c3920ae680711e677dfa5fafb97..928e1467b83c0057f61faf5a796f95605ea5dcb2 100644 GIT binary patch delta 89 zcmeBR%9$V;%)-FHu+{Nt6p%9Zba4!+xRtEH^v9hsBj|;fqr@qftGtPir?{BS5pkcW s*Xho_%TI$>@PKBgse}Qq`oTbkW$%l7Q_o6G1!`yTboFyt=akR{01{#yn*aa+ delta 246 zcmVm03S##(EtDd%}GQ-R47xWQUMZ!FbD(e|6kmaC8D#QbGviB z^DHeSA=K^R^0_VtU}5Hl^*G@QxnLe~%6$ikj_`K6oI#0+#oZHwdE6B;7}Q>CWHJ_y z*!g*}b>(4LMB55kNhK4zL{_18jd#QX>CBb_x|R0JvyX+4aCR9&T(Qn=?11-$UL97C zS7rZ6O=>fmAY7rN^MnHoOCATM9y3&~;+1h|Hq6||v-Y^!T5@N{H4+ZvJPs9nbGmaT wZF@nN9#w2IhLqsnMXfA$2j2ObnR9c*lN tjBHR$Wpi%l7GRWg&UCk-R}$A3xm|wM^K(4Lj}) ZLY2P&P%}G&4FCWD07*qoM6N<$f&fDidAtAs diff --git a/lua/img/shuffle.png b/lua/img/shuffle.png index ce087783e5ec7ba6f4672a099912e9342f52c3c8..39b13ba834ced3ff37e720025ae943042820aae3 100644 GIT binary patch delta 93 zcmeBRDwrS{&ceXJu+{Nt6p%9aba4!+xHXlZnUTRD=e_)|YdO-F0$v-7i#Q0*S##X^ xAGcCxV(au&`A6!1H~v^~L;L*E;5l#gOr%Ux=1!5j&kHny!PC{xWt~$(696GOBToPT delta 246 zcmVm03S##(EtDd%}GQ-R47xOQc~suLXFePY!|LLF)s z`3HM4X$~{19F&&m$}`(O@&BHdE*z<8(N1!c?1OI25j!>La2CG>x+b)XRhGJI2ahCb zAfED`%+={;N4p?(Yj0`+X0RKwIqq0000CVXNcQC?KWb>EaktaVuFt^3VVNgeJx=m8Spl><3bH1RiXj%*Jpz hqG%6OV$gMM24R)pwMNqm03S##(EtDdt4TybR47xml8p|-AP9sH_5GiCz&`A@Y>i9o zlG)ZG@^c)Req6Tem+oo3zwDm0F5%wy#N3Jf=NU{R2Wx{kXsG}AqWI%^!_JSdP?_^&1Ou7 z4+7G5iHe7zldh_4N3@n(v(wwFX0f*R`v3SCy?2x~X#=r=Z_uMUbM03q-7sBob{c=;SC9QL#*_%v_KKY`f<3Iia ZGlxJ6vH?1G00000NkvXXu0mjf0025LPx1f& diff --git a/lua/img/unlistened.png b/lua/img/unlistened.png index 8d70e7924bfd22584adb28625ae5209cd7b85fc4..a9169a5a7654c566ae71c888b37771172b2d3aa2 100644 GIT binary patch delta 68 zcmZ3-7(PMLj)j4N!E463*+5Fp)5S5Q;#M+4m0N{}Z5C8xGbV)=(R2Wx%kWmi9APhrem;0YM*fXr1CaqmQ zEJO@14(cqmT~w)1j9OL47+CEsvQ1#0zpE_|q|^Cg@crVhTGNnZl8+`$#T4Q3Yzi@^ zZu1=Q4(Az@gTo(OGI`GuqC@q`ZN^y-pJB*o3&kp78eofN9jnoqVWI#002ov KPDHLkV1fWo-$O0{ diff --git a/lua/img/usb.png b/lua/img/usb.png index 522be6a2afb98c3b21c698150c82cdaab38feb82..8a83a181525a7a9b8841770b8acde8d7d6298d2f 100644 GIT binary patch delta 94 zcmbQjR5(F0f`x&BVXNcQC?I9w>EaktaVxo@;eSR0qvV1jLls2{r%B6%)!*BTH7pcj x+~B1&r&W>RV8)~wPA)e*HGT*%DEhRhFyv}xPxWB@tphZJ!PC{xWt~$(69BXC9m03S##(EtDd+et)0R47xGlIs$MAP9uH^!`t*>{%>}nr!Cq zM+Rm6Tu~{}qQS)k5D9}Qa}}*#P@G=APlnk6d5LGc^@#H|!rI}gzpsM8e&v$2CThIw!ue0u0&wvC>%5e#KiL!Nmf z(nh3PW8)jP7e@)g`Yu?-FI2i_higIZM0%Q4J-AT$1$ulzs@Iz)awnA^RDZpZrju&N zzM0XuV>xeQFCFF@%*Oa}0Lxb`T?EmybxzRJ;bmjXvHNKJ0dh-=51V`?od5s;07*qo IM6N<$f(=}98vp#`WZ?WRlx#xhIUWa-0Ft}s{11kWIo<8P@RY0F?pvo>&j{&cF;^SB^BnFrPDPmyOKg3zuo4`!o z^PLwQlv?cTW`AcJC~*;h$J}Wxr=%X6+s#H!NUZM2vYWhMWEwx_eTeF}!Q(J`eFRm!=-0xz~+WN-x&*r72R2QQT`9yVxS#7}&-B$Hyj2HAZre z=@aYOFWp$(mv%1t%{#_UB}R0&nNqNXdu`sWTioqomwCfM?lWqo@9Ivob{^&{@7SZW z1O4Sx7is#@Sf+Eg5z?LE++mJ%a)G1Ljm6yTN;9Wmc6S&i9SrSO^QU3vc9S97cXf*e z)0A??7%YhyEtsZR(#RR0C8o4!la0`QifPtd{rAp$c(%!=OQ9d1=`AB0000< KMNUMnLSTY_p*Fx|S7k$ry#&-z;|x^81%sBFf+404JIqEFhx0nBDbJos{`gO|j%J)Ov zQ#pRIO8+{s%RtE8>gaUoy~`&qvOII@4g0J9kgG@XA6_=mn($}q^v^QOxmlZvrys2C zeKTdIpX2irvm-WY`g47Cl<%D~Z$E>f?(=siTYuh5TlatUp$W73UdJvvk;^W``#*Z# oofjVqqVt~olPRuR9Cb}zomKLW_VkLKz_4fVboFyt=akR{0Ogt*k^lez From 0c2377726fc563285cdb68536af93b0777bfc3a4 Mon Sep 17 00:00:00 2001 From: Tursiae Date: Sun, 9 Feb 2025 14:34:16 +1100 Subject: [PATCH 2/7] Console: Update doco to point to `sdkconfig.local`, and handle no-stats cases. When `CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS` is not set, the FreeRTOS scheduler will not keep track of task runtime statistics, and the `tasks` command on the console will show `nan%` for the usage. This adds a recommendation for the user to enable the `...STATS` config in their build, and also updates the guidance for `configUSE_TRACE_FACILITY` to point at the supported `sdkconfig.local` configuration pathway, instead of pointing at the `#define` that's deeper in the configuration stack. Also, the sampling period is dropped from 2.5s to 10ms when the runtime stats are not enabled; given that we're not measuring any usage, it's not worth sleeping any longer than that. We might even be able to drop to zero? --- src/tangara/app_console/app_console.cpp | 31 ++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/tangara/app_console/app_console.cpp b/src/tangara/app_console/app_console.cpp index 21dec56a..7aa7fccf 100644 --- a/src/tangara/app_console/app_console.cpp +++ b/src/tangara/app_console/app_console.cpp @@ -207,8 +207,11 @@ void RegisterDbInit() { int CmdTasks(int argc, char** argv) { #if (configUSE_TRACE_FACILITY == 0) - std::cout << "configUSE_TRACE_FACILITY must be enabled" << std::endl; - std::cout << "also consider configTASKLIST_USE_COREID" << std::endl; + std::cout + << "FreeRTOS is not configured to track task info." << std::endl + << "Enable CONFIG_FREERTOS_USE_TRACE_FACILITY=y in " << std::endl + << "sdkconfig.local, and also consider enabling " << std::endl + << "CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y" << std::endl; return 1; #endif @@ -218,6 +221,14 @@ int CmdTasks(int argc, char** argv) { return 1; } + // Sample the task runtime percentage over 2.5 seconds if collecting + // task statistics. Else, we don't need to sample for as long. +#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS + const int kSamplePeriodMs = 2500; +#else + const int kSamplePeriodMs = 10; +#endif + // Pad the number of tasks so that uxTaskGetSystemState still returns info // if new tasks are started during measurement. size_t num_tasks = uxTaskGetNumberOfTasks() + 4; @@ -229,11 +240,21 @@ int CmdTasks(int argc, char** argv) { size_t start_num_tasks = uxTaskGetSystemState(start_status, num_tasks, &start_elapsed_ticks); - vTaskDelay(pdMS_TO_TICKS(2500)); + vTaskDelay(pdMS_TO_TICKS(kSamplePeriodMs)); size_t end_num_tasks = uxTaskGetSystemState(end_status, num_tasks, &end_elapsed_ticks); + uint32_t elapsed_ticks = end_elapsed_ticks - start_elapsed_ticks; + + if (0 == elapsed_ticks) { + std::cout << "Warning: the scheduler is not recording run-time" << std::endl + << "statistics, and this means that detailed task" << std::endl + << "information is not available." << std::endl + << "Enable CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS" << std::endl + << "in sdkconfig.local to capture these stats." << std::endl; + } + std::vector> info_strings; for (int i = 0; i < start_num_tasks; i++) { int k = -1; @@ -279,8 +300,12 @@ int CmdTasks(int argc, char** argv) { str << "\t\t"; } +#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS str << std::fixed << std::setprecision(1) << (time_percent * 100); str << "%"; +#else + str << "(unavailable)"; +#endif info_strings.push_back({run_time, std::pmr::string{str.str()}}); } From dcd39a75e8b4be170e27eb2e7eb1b4f755ba32f2 Mon Sep 17 00:00:00 2001 From: Tursiae Date: Mon, 10 Feb 2025 16:12:54 +1100 Subject: [PATCH 3/7] Also document the `idf.py menuconfig` approach. --- src/tangara/app_console/app_console.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/tangara/app_console/app_console.cpp b/src/tangara/app_console/app_console.cpp index 7aa7fccf..e4e42786 100644 --- a/src/tangara/app_console/app_console.cpp +++ b/src/tangara/app_console/app_console.cpp @@ -209,9 +209,12 @@ int CmdTasks(int argc, char** argv) { #if (configUSE_TRACE_FACILITY == 0) std::cout << "FreeRTOS is not configured to track task info." << std::endl - << "Enable CONFIG_FREERTOS_USE_TRACE_FACILITY=y in " << std::endl - << "sdkconfig.local, and also consider enabling " << std::endl - << "CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y" << std::endl; + << "You can enable task tracing via sdkconfig.local, by" << std::endl + << "setting CONFIG_FREERTOS_USE_TRACE_FACILITY=y. Alternately," << std::endl + << "use idf.py menuconfig to enable Components / FreeRTOS /" << std::endl + << "Kernel / configUSE_TRACE_FACILITY to do the same." << std::endl + << "Also consider 'Enable display of xCoreID in vTaskList'," << std::endl + << "or CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y" << std::endl; return 1; #endif @@ -252,7 +255,9 @@ int CmdTasks(int argc, char** argv) { << "statistics, and this means that detailed task" << std::endl << "information is not available." << std::endl << "Enable CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS" << std::endl - << "in sdkconfig.local to capture these stats." << std::endl; + << "in sdkconfig.local to capture these stats, or" << std::endl + << "via idf.py menuconfig, in Components/FreeRTOS/" << std::endl + << "Kernel/configGENERATE_RUN_TIME_STATS." << std::endl; } std::vector> info_strings; From 187cd772ee4027f252b03788cb1c0774d62ef207 Mon Sep 17 00:00:00 2001 From: Tursiae Date: Mon, 10 Feb 2025 16:58:20 +1100 Subject: [PATCH 4/7] s/sdkconfig.local/sdkconfig/g --- src/tangara/app_console/app_console.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tangara/app_console/app_console.cpp b/src/tangara/app_console/app_console.cpp index e4e42786..ce6c75d9 100644 --- a/src/tangara/app_console/app_console.cpp +++ b/src/tangara/app_console/app_console.cpp @@ -209,10 +209,10 @@ int CmdTasks(int argc, char** argv) { #if (configUSE_TRACE_FACILITY == 0) std::cout << "FreeRTOS is not configured to track task info." << std::endl - << "You can enable task tracing via sdkconfig.local, by" << std::endl - << "setting CONFIG_FREERTOS_USE_TRACE_FACILITY=y. Alternately," << std::endl - << "use idf.py menuconfig to enable Components / FreeRTOS /" << std::endl - << "Kernel / configUSE_TRACE_FACILITY to do the same." << std::endl + << "You can enable task tracing via sdkconfig, by setting" << std::endl + << "CONFIG_FREERTOS_USE_TRACE_FACILITY=y. Alternately, use" << std::endl + << "idf.py menuconfig to enable Components/FreeRTOS/Kernel" << std::endl + << "configUSE_TRACE_FACILITY to do the same." << std::endl << std::endl << "Also consider 'Enable display of xCoreID in vTaskList'," << std::endl << "or CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y" << std::endl; return 1; @@ -255,9 +255,9 @@ int CmdTasks(int argc, char** argv) { << "statistics, and this means that detailed task" << std::endl << "information is not available." << std::endl << "Enable CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS" << std::endl - << "in sdkconfig.local to capture these stats, or" << std::endl - << "via idf.py menuconfig, in Components/FreeRTOS/" << std::endl - << "Kernel/configGENERATE_RUN_TIME_STATS." << std::endl; + << "in sdkconfig to capture these stats, or via" << std::endl + << "idf.py menuconfig, in Components/FreeRTOS/Kernel" << std::endl + << "configGENERATE_RUN_TIME_STATS." << std::endl; } std::vector> info_strings; From 8819a60dd245e1d1e66bdded4a5ca07ab13ee7aa Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 11 Feb 2025 10:37:19 +1100 Subject: [PATCH 5/7] Revert the smaller icons that were actually bigger Google 'images inflation' to learn more --- lua/img/ce.png | Bin 549 -> 497 bytes lua/img/weee.png | Bin 638 -> 562 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lua/img/ce.png b/lua/img/ce.png index 8c9a14b760f0d0901001487b46b848e37762b87f..bb5ab08f53d2396831cb9bdd75164276e0c180e1 100644 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^MnJ5>!3-q-Eak-ae8fNv{17F$B{kKy`8gu&)=HcagF_= zHBi}+1)`;UbDw) zo_t-ijAdfJM&`Zhi9%+9r`(d;gb%Na+uL*O$f8xx3d$B)nT9oeC_0=ayGXs-`U;O- ztbw*?o6E&4d40t+;lB+U-mSLJ0!8OCr(~|T7K_X(FOi+#!)YORUo_S6u$M#al!inp zPlX-XLT@%?sUFPpb9uIGU4(}B_9)4oOA~J_l3A{u{+YEq;{Ku=_JI+Cps~75)D&&b=1O_96r>mdKI;Vst0Gs9L>Hq)$ delta 535 zcmV+y0_gqm1EmCz8Gi%-003dRp}YV90qjXcK~#9!&DR6W98na-@!73y+qM)twQbvO zTw76X+p$sGwr$S8(aRgY%>De^I43zfzSjyyj2cW}FW33RKYp{y5}*J*S;Z+{@tc2q z4vJ)EFc-0L+G<5YjArcP2QL0lNA9DEN+{1!Yyd+EIoY8@vVRg{4CD)dv4oObMiZ5g zjunK`u@cF#DijOu+cV>Sx}LSCun!65**9OZM03Kvjmuf_J~qpvA$@h$SkVJ z%O{kdGzbr#L4Wy04NHWvXtTm&mH3CU&JyA@%3E@V$3~;r)Dl({<`2puQ*Z~$4PwHQ zR%ne(!OJLXEFq?#*qq?7@7GcV-=jb? zL87LhrnzU37(hHYn8P;`ZJ=I)N20TI^^HWv;ciBx;chKnA34rE*Kn8kF_q;wm<|iEa!3FG002ovPDHLkV1mCf1jPUV diff --git a/lua/img/weee.png b/lua/img/weee.png index 5a695fb2f21c3137f00d0b7842ced5efa37928e1..ec15293dbc4227ffaf4e135003e2891908f0c0a2 100644 GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^azL!j!3-oLB2V-IDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}oCO|{#S9DruR)kGV9JXcprChvPl&5~fzN*`flEcl3V_B+lmz(&Gq{}H z)n3LPZpgQ3ilv6QLh5bb6${=xJo;nfCZI1EeLP(pLo808oqTgvvjR^mb7H)U$dvE( zml$tFX_w}upJSc>Fx|S7k$ry#&-z;|x^81%sBFf+404JIqEFhx0nBDbJos{`gO|j%J)Ov zQ#pRIO8+{s%RtE8>gaUoy~`&qvOII@4g0J9kgG@XA6_=mn($}q^v^QOxmlZvrys2C zeKTdIpX2irvm-WY`g47Cl<%D~Z$E>f?(=siTYuh5TlatUp$W73UdJvvk;^W``#*Z# oofjVqqVt~olPRuR9Cb}zomKLW_VkLKz_4fVboFyt=akR{0Ogt*k^lez delta 624 zcmV-$0+0Q&1pWk&8Gi%-006~~@HYSe0!2wgK~#9!?bSoHB})KB!Sij~wr$(CZQHhO z+qP}nwk<^0swZ7fyJOGF%#69xA}hwtW=sn#>#`WZ?WRlx#xhIUWa-0Ft}s{11kWIo<8P@RY0F?pvo>&j{&cF;^SB^BnFrPDPmyOKg3zuo4`!o z^PLwQlv?cTW`AcJC~*;h$J}Wxr=%X6+s#H!NUZM2vYWhMWEwx_eTeF}!Q(J`eFRm!=-0xz~+WN-x&*r72R2QQT`9yVxS#7}&-B$Hyj2HAZre z=@aYOFWp$(mv%1t%{#_UB}R0&nNqNXdu`sWTioqomwCfM?lWqo@9Ivob{^&{@7SZW z1O4Sx7is#@Sf+Eg5z?LE++mJ%a)G1Ljm6yTN;9Wmc6S&i9SrSO^QU3vc9S97cXf*e z)0A??7%YhyEtsZR(#RR0C8o4!la0`QifPtd{rAp$c(%!=OQ9d1=`AB0000< KMNUMnLSTY_p* Date: Sun, 9 Feb 2025 18:25:16 +1100 Subject: [PATCH 6/7] TTS: Avoid exhausting the WorkerPool with concurrent TTS playback. Reported in issue #258. As of v1.2.0, if /.tangara-tts/ samples are present on the SD card, and >= 4 menu items with matching TTS samples are highlighted in the UI, and no audio output (headphones or BT sink) is connected, the `tts::Player`'s invocation of lambdas on the WorkerPool will result in worker task exhaustion. This is because we get stuck in state where the `drivers::PcmBuffer` is not accepting any new samples, and the inner loop in `Player::decodeToSink` that pushes to the output isn't checking to see whether playback was cancelled. So the loop never terminates, and we consume that worker slot. Repeat with another 3 menu items, and, hey, all four worker threads are consumed with TTS that will not terminate until headphones/BT are connected. --- src/tangara/tts/player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tangara/tts/player.cpp b/src/tangara/tts/player.cpp index 46e8c48a..9cc7a1f7 100644 --- a/src/tangara/tts/player.cpp +++ b/src/tangara/tts/player.cpp @@ -174,7 +174,7 @@ auto Player::decodeToSink(const codecs::ICodec::OutputFormat& format, // The mixin PcmBuffer should almost always be draining, so we can force // samples into it more aggressively than with the main music PcmBuffer. - while (!stereo_buf.isEmpty()) { + while (!stereo_buf.isEmpty() && !stream_cancelled_) { size_t sent = output_.send(stereo_buf.readAcquire()); stereo_buf.readCommit(sent); } From 167fea6b5b87a1cd97165d4e425699c2ecdb2bbf Mon Sep 17 00:00:00 2001 From: Tursiae Date: Mon, 10 Feb 2025 00:02:57 +1100 Subject: [PATCH 7/7] TTS: Better document the ownership and task/control flow. --- src/tangara/tts/README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/tangara/tts/README.md b/src/tangara/tts/README.md index 63d587da..54aae8ef 100644 --- a/src/tangara/tts/README.md +++ b/src/tangara/tts/README.md @@ -47,3 +47,37 @@ logs a `WARN`ing each time it cannot find a TTS sample. You can enable these log messages on the console by using the command `loglevel warn`, and then manipulating the click wheel to move through the UI to discover other missing TTS samples. + +## Tasks and Event Passing + +### In the `ui` task + +There are two main threads involved with running TTS - firstly, the `ui` +task, which is rooted in `ui::UiTask::Main()` (`src/tangara/ui/lvgl_task.hpp)`. +By way of the LVGL stack, eventually navigation in the UI results in sending +a `tts::SelectionChanged` message from `input::TextToSpeech::describe()` +(`src/tangara/input/feedback_tts.cpp`) to `tts::Provider::feed()` +(`src/tangara/tts/provider.cpp`), all in the UI task. + +The `tts::Provider` is responsible for translating the UI string from a lump +of text to a TTS sample filename, which is then passed along to the player +in `tts::Player::playFile()` (`src/tangara/tts/player.cpp`), still on the UI +thread. + +The UI task has a smaller stack than the `worker_X` tasks, and are not +appropriate to use for audio decoding work, both because they would block any +UI updates, and also have insufficient stack space for audio decode activity. + +### Transitioning to the `WorkerPool` background threads + +`playFile()` uses `tasks::WorkerPool::Dispatch()` to fire off a lambda in a +different task - one of the background `worker_X` tasks, owned by `WorkerPool`. +Control returns to the UI thread in under 2ms, so it remains pretty responsive +throughout this flow. + +The background worker uses `tts::Player::openAndDecode` to do the bulk of the +decode/resample/playback work, and it is on this background task that the +majority of the work occurs. Note that there is nothing stopping the TTS worker +from consuming a number of worker tasks at once, but we rely on the interaction +of stream cancellation behaviour between the workers to ensure that previous +samples' playback is promptly terminated after a new sample is requested.