From e5dbac4345159a42bc2ddfaefd22667e0026814c Mon Sep 17 00:00:00 2001 From: Ryzerth Date: Mon, 30 Nov 2020 16:05:51 +0100 Subject: [PATCH] Finished sink module system + new icons --- core/src/gui/icons.cpp | 4 ++++ core/src/gui/icons.h | 2 ++ core/src/gui/main_window.cpp | 13 ++++++----- core/src/signal_path/sink.cpp | 40 +++++++++++++++++++++------------ core/src/signal_path/sink.h | 2 +- radio/src/path.cpp | 1 + root_dev/res/icons/menu.png | Bin 1813 -> 1434 bytes root_dev/res/icons/muted.png | Bin 0 -> 5895 bytes root_dev/res/icons/play.png | Bin 2676 -> 2014 bytes root_dev/res/icons/stop.png | Bin 1733 -> 1312 bytes root_dev/res/icons/unmuted.png | Bin 0 -> 5677 bytes 11 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 root_dev/res/icons/muted.png create mode 100644 root_dev/res/icons/unmuted.png diff --git a/core/src/gui/icons.cpp b/core/src/gui/icons.cpp index 84b98f91..bf0c6e5f 100644 --- a/core/src/gui/icons.cpp +++ b/core/src/gui/icons.cpp @@ -11,6 +11,8 @@ namespace icons { ImTextureID PLAY; ImTextureID STOP; ImTextureID MENU; + ImTextureID MUTED; + ImTextureID UNMUTED; GLuint loadTexture(std::string path) { int w,h,n; @@ -31,5 +33,7 @@ namespace icons { PLAY = (ImTextureID)(uintptr_t)loadTexture(ROOT_DIR "/res/icons/play.png"); STOP = (ImTextureID)(uintptr_t)loadTexture(ROOT_DIR "/res/icons/stop.png"); MENU = (ImTextureID)(uintptr_t)loadTexture(ROOT_DIR "/res/icons/menu.png"); + MUTED = (ImTextureID)(uintptr_t)loadTexture(ROOT_DIR "/res/icons/muted.png"); + UNMUTED = (ImTextureID)(uintptr_t)loadTexture(ROOT_DIR "/res/icons/unmuted.png"); } } \ No newline at end of file diff --git a/core/src/gui/icons.h b/core/src/gui/icons.h index 748be74c..e71ca59a 100644 --- a/core/src/gui/icons.h +++ b/core/src/gui/icons.h @@ -8,6 +8,8 @@ namespace icons { extern ImTextureID PLAY; extern ImTextureID STOP; extern ImTextureID MENU; + extern ImTextureID MUTED; + extern ImTextureID UNMUTED; GLuint loadTexture(std::string path); void load(); diff --git a/core/src/gui/main_window.cpp b/core/src/gui/main_window.cpp index 8633ab5c..7d300efd 100644 --- a/core/src/gui/main_window.cpp +++ b/core/src/gui/main_window.cpp @@ -305,20 +305,23 @@ void drawWindow() { int height = vMax.y - vMin.y; // To Bar - if (ImGui::ImageButton(icons::MENU, ImVec2(40, 40), ImVec2(0, 0), ImVec2(1, 1), 0)) { + ImGui::PushID(ImGui::GetID("sdrpp_menu_btn")); + if (ImGui::ImageButton(icons::MENU, ImVec2(30, 30), ImVec2(0, 0), ImVec2(1, 1), 5)) { showMenu = !showMenu; } ImGui::SameLine(); if (playing) { - if (ImGui::ImageButton(icons::STOP, ImVec2(40, 40), ImVec2(0, 0), ImVec2(1, 1), 0)) { + ImGui::PushID(ImGui::GetID("sdrpp_stop_btn")); + if (ImGui::ImageButton(icons::STOP, ImVec2(30, 30), ImVec2(0, 0), ImVec2(1, 1), 5)) { sigpath::sourceManager.stop(); playing = false; } } else { // TODO: Might need to check if there even is a device - if (ImGui::ImageButton(icons::PLAY, ImVec2(40, 40), ImVec2(0, 0), ImVec2(1, 1), 0)) { + ImGui::PushID(ImGui::GetID("sdrpp_play_btn")); + if (ImGui::ImageButton(icons::PLAY, ImVec2(30, 30), ImVec2(0, 0), ImVec2(1, 1), 5)) { sigpath::sourceManager.start(); // TODO: tune in module instead sigpath::sourceManager.tune(gui::waterfall.getCenterFrequency()); @@ -328,8 +331,8 @@ void drawWindow() { ImGui::SameLine(); - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 8); - sigpath::sinkManager.showVolumeSlider(gui::waterfall.selectedVFO, "##_sdrpp_main_volume_", 200); + //ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 8); + sigpath::sinkManager.showVolumeSlider(gui::waterfall.selectedVFO, "##_sdrpp_main_volume_", 248, 30, 5); ImGui::SameLine(); diff --git a/core/src/signal_path/sink.cpp b/core/src/signal_path/sink.cpp index 1922d61a..27222d3b 100644 --- a/core/src/signal_path/sink.cpp +++ b/core/src/signal_path/sink.cpp @@ -164,35 +164,35 @@ void SinkManager::setStreamSink(std::string name, std::string providerName) { spdlog::warn("setStreamSink is NOT implemented!!!"); } -void SinkManager::showVolumeSlider(std::string name, std::string prefix, float width) { +void SinkManager::showVolumeSlider(std::string name, std::string prefix, float width, float btnHeight, int btwBorder) { // TODO: Replace map with some hashmap for it to be faster float height = ImGui::GetTextLineHeightWithSpacing() + 2; + float sliderHeight = height; + if (btnHeight > 0) { + height = btnHeight; + } + + float ypos = ImGui::GetCursorPosY(); if (streams.find(name) == streams.end()) { float dummy = 0.0f; style::beginDisabled(); ImGui::SetNextItemWidth(width - height); - ImGui::SliderFloat((prefix + name).c_str(), &dummy, 0.0f, 1.0f, ""); - ImGui::SameLine(); ImGui::PushID(ImGui::GetID(("sdrpp_dummy_mute_btn_" + name).c_str())); - ImGui::ImageButton(icons::STOP, ImVec2(height, height), ImVec2(0, 0), ImVec2(1, 1), 0); + ImGui::ImageButton(icons::MUTED, ImVec2(height, height), ImVec2(0, 0), ImVec2(1, 1), btwBorder); ImGui::PopID(); + ImGui::SameLine(); + ImGui::SetCursorPosY(ypos - ((height - sliderHeight) / 2.0f)); + ImGui::SliderFloat((prefix + name).c_str(), &dummy, 0.0f, 1.0f, ""); + ImGui::SetCursorPosY(ypos); style::endDisabled(); } SinkManager::Stream* stream = streams[name]; - ImGui::SetNextItemWidth(width - height - 10); - if (ImGui::SliderFloat((prefix + name).c_str(), &stream->guiVolume, 0.0f, 1.0f, "")) { - stream->setVolume(stream->guiVolume); - core::configManager.aquire(); - saveStreamConfig(name); - core::configManager.release(true); - } - ImGui::SameLine(); if (stream->volumeAjust.getMuted()) { ImGui::PushID(ImGui::GetID(("sdrpp_unmute_btn_" + name).c_str())); - if (ImGui::ImageButton(icons::PLAY, ImVec2(height, height), ImVec2(0, 0), ImVec2(1, 1), 0)) { + if (ImGui::ImageButton(icons::MUTED, ImVec2(height, height), ImVec2(0, 0), ImVec2(1, 1), btwBorder)) { stream->volumeAjust.setMuted(false); core::configManager.aquire(); saveStreamConfig(name); @@ -202,7 +202,7 @@ void SinkManager::showVolumeSlider(std::string name, std::string prefix, float w } else { ImGui::PushID(ImGui::GetID(("sdrpp_mute_btn_" + name).c_str())); - if (ImGui::ImageButton(icons::STOP, ImVec2(height, height), ImVec2(0, 0), ImVec2(1, 1), 0)) { + if (ImGui::ImageButton(icons::UNMUTED, ImVec2(height, height), ImVec2(0, 0), ImVec2(1, 1), btwBorder)) { stream->volumeAjust.setMuted(true); core::configManager.aquire(); saveStreamConfig(name); @@ -210,6 +210,18 @@ void SinkManager::showVolumeSlider(std::string name, std::string prefix, float w } ImGui::PopID(); } + + ImGui::SameLine(); + + ImGui::SetNextItemWidth(width - height - 8); + ImGui::SetCursorPosY(ypos + ((height - sliderHeight) / 2.0f) + btwBorder); + if (ImGui::SliderFloat((prefix + name).c_str(), &stream->guiVolume, 0.0f, 1.0f, "")) { + stream->setVolume(stream->guiVolume); + core::configManager.aquire(); + saveStreamConfig(name); + core::configManager.release(true); + } + //ImGui::SetCursorPosY(ypos); } void SinkManager::loadStreamConfig(std::string name) { diff --git a/core/src/signal_path/sink.h b/core/src/signal_path/sink.h index d9840290..26e8ec43 100644 --- a/core/src/signal_path/sink.h +++ b/core/src/signal_path/sink.h @@ -99,7 +99,7 @@ public: void setStreamSink(std::string name, std::string providerName); - void showVolumeSlider(std::string name, std::string prefix, float width); + void showVolumeSlider(std::string name, std::string prefix, float width, float btnHeight = -1.0f, int btwBorder = 0); dsp::stream* bindStream(std::string name); void unbindStream(std::string name, dsp::stream* stream); diff --git a/radio/src/path.cpp b/radio/src/path.cpp index b87e4a6d..9ba59724 100644 --- a/radio/src/path.cpp +++ b/radio/src/path.cpp @@ -106,6 +106,7 @@ void SigPath::setDemodulator(int demId, float bandWidth) { demod.setDeviation(bandwidth / 2.0f); audioResamp.setInput(&demod.out); audioBw = std::min(bandwidth, outputSampleRate / 2.0f); + audioBw = std::min(audioBw, 16000.0f); audioResamp.setInSampleRate(200000); audioWin.setSampleRate(200000 * audioResamp.getInterpolation()); diff --git a/root_dev/res/icons/menu.png b/root_dev/res/icons/menu.png index 317cfdee929bc626c40a7b17f544b3a7461c2a69..b830b5b5051a7c5230bb27124ef593ec8ca1c8d1 100644 GIT binary patch literal 1434 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFNL{AsTkcv5PZ*N>Z_p9vj zkLQJjq8zU*>~Pjny5`t2r9<|Jj%Z221<#gOSN<=ke)-^?e8S5mt(Q(V@$J%*)iSTR z?&4zNEWnY}lXdg*ngZs43g|p8- z`~9z0>!h>iySY~4-|ncLeC}!I_33J_yx!?=*PlJPre1gbrAocer=&@{%L?S)?AG@D zH|@z(mFa5yv+9^CtWMsae8;wsPo~)2GtT2vp3!F(1IdQtllIJi@?1FGp>wt8JfETs z{)`qApVUk;7XG~OOyZ=?r#Hpi{`Nrlw%m{2`^P>V-ZtmtuHa~M(T4Q4XHKgp&Yi_| z;IDJ>!mB6zd|4k@?@wgfo|3YB8B;-GhTaybn=4l`{7HtfWYj9NGt9PBYQOf&z5B#< z!S6{m6TWI0e7GFr^{HagX<_lkW%C#&Jt>-0EU6_fVsU1d^YrC>H;&$JP@lYK&Xc8U zt~c)$XD~0H@|f6zrED@z+YSAK54%19Pa9O`#t{^Z|3j!W@wn7aDN{& zLtZfx!%-H7E=~p!VFnE~h5#Ri1v3~N3>h1e29v~_Cw=F48=urKt5JJ1S%1=>>hSir zN(|*{KbxUd&ZqD;DMxqU-Q!^@0s~zy72P@hTkJ6J)b?1ZKY8TBpthgokGGEfomJJF-d*Zg$zU__$(;*18O3^_ zcnD#bCp(LKty@`^76U)u+14;+>!(TrBD1*;9EV5i+l4zXWPxJ!!+DkWyl30Y-lyJO zxwcr4BQL+YTJS~Eq~)99(pmo1&riL(usfLD=Ra40-AQH7e^b7)vOhQ;dt#Sy|C8C@ z8J79%=P6NM&wQAF_siD@et$C(*x>s6n=C`Y?7-llM${vQee{{R5vH z;qIP%llDw}@>M0?Uv8TZ&)poe>;G#MPR{l`=QD@-_?<*x)YME;Ilbv`>0F)zwVrk! zMOBY@Gzv9OKK9h}XG!>E-C%$G)8VyNb4#bY`Peef@%;4gNRGzW*Qt?w+igo;aX#1y z5Bm=nVlqrO1qU-)n3{-3^}e|h!e9rFy7xTbs5AYleV|k2`C}%5oWt*dz|oP4v}fjzQ*mxYuKbKmC0YphEQN)LRw-SA$m(&S{e=Q^JGtjCW| zU1R+@Pwqe*(}SJx{5^koCiWLI5Z*(HLW2vXv<7G@{KKDN7kDlr2XL(=15+0k9? zHerR07d)Exrk%F6&cEKSUv&Xrg`;k#I^2FbES=`>t^N`l7gwG6aOlrRLhzK}J)xzg z_2~YA>5*5jS=-$)VfO!l)=j7~S3y6!ZC%x!JeNoKQe@rPz=+kzB{ER48(V8X}((t*5QIx8`|B}rkoK#+jB zROg}wH>`H}pl}Rd@{VwUAV_}GQUq~oPUC?0m=?W!+yn}2>{|nt`12`^IMCk3pM~(i zEKo;-&&Hc8>))C%Y&Z-xK~+vNsaFu3?aVg}TUJP>$eLKl-WiV2n4l&%++LP6~U7Jgdvv>=*UmTf;?GK7Dxf>9`4fkP|-|MCmJk-1EtS zyKgOcV<(5N`pWRY8hFF7WE8Lq5O1nR70&|UmY_8%i>Sh+KQEyVpfU?|lm$=>f4}vU z*1lL%)S4X2+Kzh6t_Yl%`#t>#J5#1+_|`XMoE#duqmrUge1{>){v%?se;P_flOl{_ z)tIE$N^GxMM4{08uCI!{&kLuj`I4e?AL+6dpZPp zhsF+50t?Kw9={W7HC%|Ek2orLrc7cnd%35Fi94e*vLTA_0RtgZRSSt2dJ1&1Jp7+X zxsNT+ceNcB@e2}-DHZY%Sd$U?+a@Irlo%RUZOx7eKI2$(^gO$3TkP7|(=m)O=+xd* z`37^M^o-29G;%J@6S}ryXnXP?ax*7v^9tRaF<-cnK4OZZP$@fSZ`hHDouB(TABvOn zSjLgUdtT8eq6tFZI&dK+%5%c>DmnoWO#T#L^;*0JoK|7n*lCOpnCg#rp@v2=v%5$8 zJrSkN(z)vBp$derS5h67@Y~lY?7m3<3v&n*fggS zRW6#b^!0Mqu5fX@G5?CJ=S~?9KiLqmLHK}-;LRRpI)_YAlt!z8=Od9NZy51(k+9d+ zUWw6Jj)G^5gynws>QISNZ0sI^)tA{q(dpgPN{Gyz-}}ci<6&KgI@+xYzep^elpEdt z2C+SLim1iGN)Gtw{xRG6h?yJ5=3B zHF)34k>H|aHe+?)u-3O~mhCJPMu2t^_+Y&J-TO%AQC=ykve{+x(pajJBV7gL zULvy044dm5$H}r&t`v8!(e0SUrb=(ZFvnM?6$d)Au*>|0ZB;JgWHdd3-Lfb-yUP31 zBC57+s>f5ORT?;KV)tyJEiCkZIXskotK_fyXwLvCK=D(Q-TF(d(|}}VnQIh+&?9<@ zd@9RiJ0-ogE0RsrR?r-7Ry->Lo*ox`hFLQTagOsp65h>PLY^AI1POVN8y%xBX@tRV zlPP+Yw2lnqbB);?f$;iio3~f!-C2J_ofZN8d_44Vm)<#_kz}?da)(wwV%0d=<1-Sp5|GaUjcd~4(duO=jeNd$ zfvP#95`X!jvp&dOBkGB8@JtfEy-_+yJCRoq)(&ZQNm)rd9>X9G4POp8GIyeZ?zv|{ z@>weaz@!mPu5kS2+bV;dl+P%DL#BQlss96b~grqn>XNyI@w)RqZVG?EC-MctxzE4iKlTo=r zo`}1To}-4BEP0)`r-ClCR_5YS_Ne%y^?w#lzP4G*5z7Pv)TfVCsG{JhonWMmcFBD_ zOESitZ5Xn*GRgbf@#A*&WbNiLh`xL@%4O+)dGITmO_(@`{1%%(Eo{1PCF!t*Xr$W1 z^}ihP3orf2fV5)CJ;ZD1OUH5qdsVd>WjVp$gfzy?X&h_CP29JZS=rT72Ar!MsT*3nAD25E1Vhril}{>Fh{(T6W~BjJpk z1`LfOU?Q_ zFTG2Qg5uF$jIjC@d8`gO{OZDtD_0}ep0Zj8VsDr^?l|6howUv}s%gm$WZlOh*^&%Z zNelnd;v{y#tK#g{TU5k_c~o;(L#KBUEXZbmBjjZg7N`n0(q>HJik(JuOgtl|jJ|Xv z^zKuyy2oH6^u(8693bv~i1lkv*CAJjeT@&PGMTjAZujcDli zueG>`^*Ch7O9V%}*SEvTGk}=V5|V$9Q$WvugK<4-1Gev98SyE21S_+I?m~4#s|K9} z_hUwl?2fHvY^OZS7$MrgZ%tKD%XP7e(LlS+n;V7&X$`4%T&yr(RCc(#?MmHEzgMcP zd&h~{-bhNayVRd2Sie3e4sI|EzxsopCgjPVgsQvc7n|@uiQMaH31nE$62eey18~g> z%*C2&U)+7WS3Iy~$W-}RX7wHnBS6(l$wt@sPlWl*xq@2nAJ-=3un)zgZwBE&6MXm0 zZw)tHdVv2cn;;_gWTUMLb*09- z?!C$FNZ!CwxuvH?%k5FSG1q!e{>8WbeAN!%Q9kya4}v8(JB@Zxo3hHfm$4V|^K~N3 zcnmW{_4t?l&sYc`J#Xr&wc1|QJv5L#^O zK>8K3LZ&;but7guaXl{Yka*xpJDdwhkB7vk+~jlj#dRt z)-``e-Z92r#ui2b{NK& zY|9_Yd2CK?OyO02z>&1U@sTdU_?8K7C3Mw_?5Quji(Qg5-@er>y%4AyF-iVYZfkW8 z@mzyac`lxt#0dO@?gX%&EZMH`n6(J?k3(;v@CMc`a-0Sz+DGgxi)R#yPdZJ>gv9Re z9n_a`0nYK{TwhY+NOeygBA@&5@gncKR=+Y9dZa3&!Ke8)8KFo`c z^hX_i_xY9TipAAPsZ>XkN`kkb8Nwi$Oj#*ah(6JNHYzZ;Gll*XWr+iyA7e-RJ$TO; zSoh>9O7AwtOTq2Ww#E#;rOJvHc{{2~@CE%$!6M7MJ!_TC(Br$-D z0^DG-oF*9G2Vb+>pf#xS!Tb*8Dc?n&8YKDu&@D9_ah(Sc>gv%|>Tm5)Qn$ zS#uS7mr%K@ujrlXMgQmACRYp?v%`}qy-@h`R398gyMAP0LW^Eq93>d7!8%!FW%pK& zhSZHWbO!Gdop+-Rm7<@o9WWJoPx0H|%hhgz&8KNzgKEVC3E{z!We6_Ybnvu{>g1?Mr zTP2Xb*5xrG8N6c$tx@z2fy#AD9vspTkt%poC3?yNl7a;6D$eYdrCr*lxPbn(SpcxQ zh2&gW~oD3v6L|>jZA8W55GcxqA)`o zI+qfYHR*UTSA@+xLVP05-sY#qNB@N=29aB z*Aiz|=Ckc0;AVn=8mCUZ?1ZCCiJ#i|?f?mA2$@{zr@*Sc%@FyOtrJaI-( ze3k2UAhxMZc46jNfVe|~#{M0MQ>jQ&A{UReN18~=BabHs{Y?w9p44*wa2f35%T(%e~o3Evx|_IZ%7qjuvaR7vpiB;5U8U0$NibNM1k#}x|O zBR5IkGYLbBJ2Db~mNsF4hFdE(L)hc@#Xg4^dhmhry0^txI9swXG*qr2kB@SA)hlU+ zXpRgDe`bYHc#p#)%6Gg9xYzTzI%mpn<-w^xczz zM-FNF$iwq!bx;W5=(&6b5xTSd=Ez)*nuF>+Nuw2CCl^-0-X>GJg;yQlqnD-4*UDS} zDmzF&;IEbH+RzF8UZ!C9GD%=+NqxWO5xB#4Zy8t=;@-2P?ocuW(%vTbvyO-k*gx8d zLw+#Is=jWq>)nOV-fbrI(pUpr<}W?u39W}u9zH|!{;NsA$cg;u9qtgdo<`Ty;I~S4 zZ5(u4F2es6g?53WQ4(+R{6G)W*&za+K^ZDB%<5YvzY%hX>7@mkimmEx6`bQ4MouzE zmHrx2Tof-?4Q(k8nQ!rn0$@$l;A=M2hY^OZzpx)yddAC+!c9fu8+oCxerf zt`fQ5h%E7$pYP079UxaGhHl>`5DtQloIH5TU^iL^?Q-33b0^>0q5vQ1_%z}tef}tH z$X1BakYF+?z zw$CzG#&GSW+Zl@%C+<-iAC%Y!cyW^rI3k!q)>lf8e~EQM)>=7Z61C@377FBB@g zZhQ?|gzObpm%*N{yt_6yQ1ah(5lK7PJKG)&G(Vz_7{nIi#O2k;zE=lsRUk7p%4wW@ z{-G$bQ>I#e>-KLQk{pwQdJXX6k{C@tGUy*~oTw+xflp`>yDu?~=k^G^E5*~COymP^ zj^`B-XJWWp<1eeGhS1FTNY&S&uj+pF*6qi%(Tk0~FE~!nIni~r6KH(-U$v#?u;j5V zj1tD7#sL!o5J;InUzei}hSuffh|6KHrCbcLQ|`g^L;;AsII5P2gj&KlsY3!VfT*)# zj7`39f&Sa0r!gv*Ql5dCdD+UB?;iCqdr03bDYAn^J%QD#JKjgM`RLD=*k1KzaDGu# zVTKr6re!|+e8Lkj^Oa#cW-2Wr*<9o*J~ zC3KK-klKKXE$SK~$@tGbIX=>?G2Mxg->K&%JdGXwAkgpH`4AjNhTp2 zF56QYuD&-)-jRpkm~Qk5z4j^jM-~ZVsWCJPg*5*2q|7hhaLI(NI=8rUOc)ax_S#4Uj-HS{J;JWLy}k;vT3 z>G7&JFBCdKK5GdZ35+=HFL=rZUgDfxH9Ec%4bNChI76G|6XRq|_&rNP1TucGib@;) z=a87LSHsl^cy~Zb60dzf9zcoZY4u2PMh`3f(?p1EGJhunBTPDwGT9s>Mq|`$3+a}K zy=){R0!RO*9CZM>nNgD**9Has_)1%*O+qRh>uihWxZGmvf57E@Yz!v^)$0xRL4rI^ zNvY9vJjamd?wxim>U&hl1!AZ4cUFEru0ZZX;w1Qie3oK4kk6onjT%{7@O(UlA|*3! z$LwxB@5^hRoOb@I0ig?OYd(LG4%gBGEC|bcR{3ql!KpJAVb4d#E4Pj2JQb^EG|4l}zT6 zHADVU&wXc{p7~}FmSagcmZE~z0k@wZjVwl0C~0_l;J$v{+{q6RHUQPFIyTnCNwQ zEK+@@r#+B3uUdJ3=B@O`lm{jFe$0HsCwrtMeb$)=Zw<{52Mf$OvT?IJOu|CM7i+mV z%D%VMJKywp*VXs7qj9>$NKbylro|tb%=Ts4?vsZ;rFDY;=ax8SZH@5c`i}8{n}YuE Pf*TyNvfE!uro{apG(B^a literal 0 HcmV?d00001 diff --git a/root_dev/res/icons/play.png b/root_dev/res/icons/play.png index 93684dd27ba610dd5c696e7c813c087b4760bbd1..a5bc44df471f632b59b2d91e27773c5f179023df 100644 GIT binary patch literal 2014 zcmZ{lTUZm<7RT3&0}c`}KvnQUh~!dl5QQ2Qfe=L)6oNvnRVgVT@m5g0aS1R$gz5p} zH?iP{g~Ve~qzL*60#!*gr_hKOj&h2%T1*LwwrYroL=nzJpSvH{@4wet`|_~X-iM;2 z!ki{ep9BC-MEJ^e00=D+!0l;lPOC`+2M;$ zx*3&R>X0x!7^IGPZXM5u`FX5>b!MErI2x zCq!GNXr(|!MPAt~Xt`WiMhFUb@d0*R<^279lWBHEB4PqL3_D>q%R^JHUtL%=@u z7s0QpgDfuQe>Mqx=Ip=I=(E}qeO(z${Bhj)F0X@LB}lsLxnmuH53G_PEw#gTi#eEo!)e&O_8q#(6|MMR z3}o^#|1da3+ZFK41+8@>-zv!Mm}Zt(XTmgrVqFrZi4*GvFio~tw-wW{#G>737mKZN zM+VB7yOPkZV77DzDqx9q?U*!2K{h$)4h)I$RbDW(3ZLW(nOw{chbwOR-b{Eb#xHuojS}Wg5gePx-cSI71L9pcBAug< zvQXU}{Avb9R=eioFn<|_LP2Pu2p)|um`m$-n^xi&I1B$`;!r0mV>992jXJRxoU8m& zK__kf$vF>19&z*nOb7E>My*%|Q$JsnBQ{)osA zuvAb*4lvYj{Rm&~WH%V-?E47)2Xw@%mansj5Hd#|Y;fdG{sac}T1tLl=mfoK%REDG z1ZysIwZ#xGSbb82yjU4&Im7WSv0dc-HVDx$(dbN~^SL5)(b0cmBPX z@|C5(W>pGdtNtlRxMk!$sVWX0w1=ijB27m1cBi)pp{8#QHJN7>%`LG-VggjADvq{3 zt0WI}{uR^54uh_xVx|pCDm-b3zKmn!hJvQJzEC?GcKOFS(=%y6++-X4F1Xt=Gm}3X zoq~}1=e$;LL&Ns?Bu36u7;ZjpI!Qz&pX!rbMsx@F`(1vfu9YhZ92iq=>C&fDm)dY< zYM>3<7~{)P-8%QNAdGDF8(o3Jo-HFg=mKju3+VzoXiN=(frq~_a=#dtHTmB04t5kZ z+~Qf&sTql*n_k(AQg88Eg@yu;oI|`Yx=^o~Y1??q97dP%bu*vV?Pfl$ubJmDVY}bx zVT|0!&?0mPFtlvC8yH%;8}3#8Vm|OXce*~c6a-~_O3pPXRhMI}J~Kt|=}mLMY&e=Q zGRqZ8ubTsSu(Q)F6T!Ws#@pZ0?Wb3>kw*!P+;)sCa34c)n6_w??$Py(+&qljL%b+9 z`cg2zr#u2l={@{Q~({q44;&dFc_jQEuF`78L{+-oB4XgBa=( z2hlh~ebzywWvIQ~$T9bzpK(zzL;WZHtmHI2DH6VQ9YbCEddS6#@VRM@)9stmVA)GG@U1D-c^p%a51}QKdls(>aqb;ycvA;j12$KOfJ{XnT-&J~Ma1lHNlc`h>ky zPs45#i+Z3o6)ntM_NTYbSjx}HrH=c_CA;=foqnT&|Eh?ba^t0f-f}IsxFPAEzrzm^ avg!S_zkoUR*%R8XHRu= zFd&|+}97A#^s(^GA75OwRYI~}jz3VtQs85xRajSYy!Izgmh4#D009esXyZ_fQZ z_jB*feeS*0#mnkdWS@3ESPqzL$1jJ?)<}O~fweexkvdzhP@$Y~0 z%kw90IX2atTX?JJ2JX!J$LyuYuX?wO{kb}oimUB-w7RC8BkP~qNqew%MC<-Lo${V9 zglWzPr}D(8CEKbptwhYR1th~X? zK&!(l;%m)8af2BFH6y)CCNHS4n)qJi@$zXk##g|%-;DJn$mjZH@Es;m2${YGP=4-* zTf;!Gaq?6ZO4e!cS{y1qH6v{)ls^(UgMo`^j`QelH{hTVcCid~O_2M^cQ8xvhtiRfYw#Aa{BhpA0mgR!fyE#%j!{nF8e%Khg>S z*BP}$k#tjhc{~Es{U}%tbdq)ri_EJA#Kgd^Dnm*#padwu0!>*Cft58>MhFTBlB|j2~&t~HSl&|9*jckg6n=Qi+DUj!SnU-C^ z=fp>kv6%S&M_$(Y(YhGuB9mAKTS_(ZBo_BC8Sspp<@<4)gvF0HNW4d43gCxanss5oqv|D}Rb?#EREM{QhMK9K#jL7KzDPW7D4Lk@eHVvV~G8eQbK30&esi*+S@WN%+`o$~rh;G7Aj*L;sNJl}S*7 zMH2@p;>6&Hm$q%w84!*-+tfO}Yl_N0CB9`-jMbuC^vn=Ag zr@Zd|_27y(r^20lKzvBrpIO9>RJe;>+G#5Ic6fwELwaNJ;dY^!LVCSn{4VjF=;+eE z$HP6vB4*PYdc8GN8ciWRzjeISGzoPLR|FbQvbQ8$L7i}>a^xbdm5xhY+FfJ3uH!;b z%h@2`FPg~ML9g<6BNtOx>?OtnF)$h|Vxy8TODT!Y%<3rYReH6iI4B#MtE}`MJ>)2f z-gjVN&*kkZzVSv-%UB_wtshU)Q8S$H(w^t3MJ!^ZMQkNuUA+rCre{y+8l#YKrB_=> zXuL&Cp*H7rL~Usl5^{Vmu}E zW=XiXo?5$dB&Tv>p%j?!5*OGR{I_BJs6H|WJOa%DABjU#;QPcQ7^s*}dWZJhONZ~n zD?;}dG<8hPRRI%&k#nIP-|{$dqf1*tbvkh^sJ-K0_q4OhpG}GGi7^H;WjVZrLSaC4;70#R!)}<@|1VjJs%~!FWK7490pw zSFu<_jGyV~L3@PES{IVkF0o?nBzV_8j{aDOmVF+<`YM#CbeWprX5T>cl0m((u|25W zUCPK$izcK@7WX!fa7i(!r>C(y74~e4sB3beG~FfE?To_L8Be*BG{bLpX^$l%u&uc& z(wv>-_asI2BSrPS4S~v3rbY8Ou43~DRh zkCHzxn!sDM5qk-xjacmw0*hIBZb=wfV|-m~_5`wQ=(ygi9ZaF!+FTXct+!f3j9LfB zcLUK0m-1!D-J$4&4p!Qd>Wr-A{pUhVWM>m&WM`B2fNBxzIQbts58Lveg#1g2n(NkdU zvITyJLwCeB>BYQz|6Ok0`Sjh_t1IhH|F(T!{mu|%9WL-K*|e%)Z`}K@?)_?(GoQFj zO7`TFzcTXy!yW%3>yukmwtxHOz5416@1jics|!_@PoCqw>FbN^8zttGV|3aR&123!_R9O) zJ@MeSNimr_m@7>6>TbL}({oXhu_E`7n$F#8U}hnR`Pp-xl&zIA!+F0OExsS_yf_F{ zQ*}r!r%BzN{~X7GDfZX!#S41Wv~g{QrHuCl*ZZmwX1 zwy;^^%YCyAfywQ@`p?osdOA15jos2&9=unH_qox!^q1kutCELTUu=H;)ylI^W#_~v zKVH;EEV%5cr+zZa^xLF4UmX|NPugRgDLw5;kX-B^<1>F$9+-RD&ECPk`R|k`YiF|0 z_{y=N_`lPn&5O@7PQL3^q;>M{-1|9|EEPF(pS)F(Px*b;F{8lrMSSv{^Z)=LDu8&%r*U-=X;yi?yf_es>Y`QN{%l;A36K;jL5f3lwr$Xfkr R!E{p)-_zC4Wt~$(69D|o#Iyha literal 1733 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4YzZe+UdOTemLn`LHy|z*Ckb}Sh zhk1o8f2Vf^UuIBzb}VB%Q|qp~K(!+V{7CR+|4@6paL+R7hV1BU+vU<0*Ue-PWXfG; zJdpbKGUJ^0cCri%f95eVG$=4LFgOAOvWbU*fkl#mfy0P_K_G>JLE!`ggTsVT1*73G unjS{;1tsOff?TVH%Wp0-j*!y#!})uKFE~_KzJ+W9`PkFd&t;ucLK6U2*S@v@ diff --git a/root_dev/res/icons/unmuted.png b/root_dev/res/icons/unmuted.png new file mode 100644 index 0000000000000000000000000000000000000000..64fcb987d24be050ee590db052262f69701beeee GIT binary patch literal 5677 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 O4A`EwKUHIayZwK6QfT%7 literal 0 HcmV?d00001