From 8ea74456f6d8a4d690950cae7687976e0f0dc9f7 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 10 Jan 2026 18:19:57 +0100 Subject: [PATCH] Denoiser: complete features and added readme --- .github/workflows/sdrangel.yml | 2 + doc/img/DenoiserFeature_plugin.png | Bin 0 -> 69846 bytes doc/img/DenoiserFeature_plugin.xcf | Bin 0 -> 149526 bytes plugins/feature/denoiser/denoiser.cpp | 59 ++++++ plugins/feature/denoiser/denoiser.h | 2 + plugins/feature/denoiser/denoisergui.cpp | 54 +++++ plugins/feature/denoiser/denoisergui.h | 5 + plugins/feature/denoiser/denoisergui.ui | 32 ++- plugins/feature/denoiser/denoisersettings.cpp | 28 ++- plugins/feature/denoiser/denoisersettings.h | 2 + plugins/feature/denoiser/denoiserworker.cpp | 186 +++++++++++++++--- plugins/feature/denoiser/denoiserworker.h | 34 +++- plugins/feature/denoiser/readme.md | 104 ++++++++++ sdrbase/resources/webapi/doc/html2/index.html | 14 +- .../webapi/doc/swagger/include/Denoiser.yaml | 13 ++ .../api/swagger/include/Denoiser.yaml | 13 ++ swagger/sdrangel/code/html2/index.html | 14 +- .../code/qt5/client/SWGDenoiserSettings.cpp | 71 +++++++ .../code/qt5/client/SWGDenoiserSettings.h | 18 ++ 19 files changed, 605 insertions(+), 46 deletions(-) create mode 100644 doc/img/DenoiserFeature_plugin.png create mode 100644 doc/img/DenoiserFeature_plugin.xcf create mode 100644 plugins/feature/denoiser/readme.md diff --git a/.github/workflows/sdrangel.yml b/.github/workflows/sdrangel.yml index 79bd00b0a..823ee176e 100644 --- a/.github/workflows/sdrangel.yml +++ b/.github/workflows/sdrangel.yml @@ -7,6 +7,8 @@ on: branches: - master - mac_ci + - fix-* + - feature-* tags: - 'v*' pull_request: diff --git a/doc/img/DenoiserFeature_plugin.png b/doc/img/DenoiserFeature_plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef869fa222614e9d8621b8d9663493e32750b56 GIT binary patch literal 69846 zcmeFYbx@UG*Ef!|fOLbzq4Urk(k&rUf_P|+7VpE(*W=R~lJ4Junjpyrs9exhDy#(`VE2G3h4>FKoX**R(&5!a3|E+CYrlPE^&D zOqBgGV5@l$&P|DB)>HXz4sF7X_{!=d`Qz_$)O#pXLR>!5`Gg_qbDfOed|2bP8m>^U z{0Syhxp4JneSaR6%nC=|c1s5(NMz`?KB%XOXhGBDo5e5V)A5achknse8gYyOUDXw$ z4aKx477EG||umd~IG4zmVQBD)AgLd!=w@Gm8E$T(>H3uckheyb>e6{~7mX2|0%|dhldxQ{9Ne zC7g+cRvFpiA~rEpV zO=Hj3#)2jgaWOOzcOgK)#?%=`m=kZ3i(4<2z!`2z*&SvXGb5G(g8q%gt#*UWu&X#tzRQEJtMs_aFq7Voer~3Q; zZ0uE3{z2Z>>2F*B{D8W{?4g|O98en@=)bOTa+YxgMEp#aaF@~C2o7#Y>PT;Ma|Mp5b1r@b_thi@^xuuQ$pH+a_ z|2EUv((Iqi`nSE^kNi2#zitF9{|DWFoBj8*|CtPCsi+7^+ZnsuZ%;v56mtK5Arm`e zOB10#A30zge5Np7PBvaaBV#rmZZi%xK@MYXHUU8+0YNS!ZX;eJqkkc#VC&=zvo$uo zCk2SJTLL86Tf1zcII|Dc@haF) zlarrMfP;sJUjUpykdK@9pOdsq9i4zA-qYmdVCUxhGje||Lf|lfv9NnN1qA*)2WJtI zax{fG+c|35*;$K1?zcpBzw#f$DnOk~V9qdUn6oJ$%E84a#K9@V$)U-~CB)4w#KFq~ zzH`2NN)=-&EKd}h(KX@YYXTrZ28L;lJXTW#?TL}G!G5j0P?#<5s#h<_3 z#s9@O0Mh?`$^VMK|7F*I+4aBT!2fFUf2Hfc?D}7E;D0swztZ)8j9qB|Os7n3K@{W$ zlBM7ez1kqrLN-#8lm3%(!CgqT_<>Ik?d5fy;NY-u?|&aqXB~2bhbYbpDl#a)AE2RA zBR}y&EQN!kf>V%|&~%^K&hbcp{5e z;m^6x$Kxa%xKMUIfRXo)I^ZK}5k(XDy|b53{{ z4tbKj*vRn1()N8#Ty8n1k z@Mo566wzNJq--z$HuBN^uaUyus6T5+WBzmblFVO(|A*y&C;Xqw|3P^4KbHUJzW%ZN zKlk;I<^Q>_{}+xm+#cOj)tWFZ_xNew+h^~^VzeKkqDe`Aq9fDdw7@16%a2CoO!)jn zmR^=NLHbFs+8e~XWgIG8stNA6l6Yx&>7rZ*9_$vM+g;fyPI$&85SJ5dsq7 z34%v1udzcki$+xYuurnr7B>6O`s>AKZ}Y|vsMRHLBf{m8r6E03o#C{y7C4FdlE_Mz zjWKLGf>{sU;u-uJ)T7cwAG-Zk`0{4(Hb;&BiSD!SS$F~x2neW!=Ste{s7P9k%gC8? zD|gvA2i8kSk|lZX{TgqY!qY5g{ErQd`eS@9T?JJdm5B`f_S;<!pn!pX?M>k#cE9cO7B@CLdd0gY}%Y?Zs8B`(TTQ8DUhb_PVukm)G>nt* zk+SFtL7n^RkVw^Jd81Hzjfe0|<5@R(9$Rxe!!IGOEe0W@d8P*n!D&oiauAi6^%A2L z%gjHdZnJWg7~%_;<(PkT9xw=&I%bGSo7dIL#lksS*ZX?>R!(%csgT-4C{C6!93O`{ zhdnQL8j+KqBt+t!OUF#GfNYbL2MA(7;a<@}j+e0#83Spho)BU%euU#o2fY=~c`9 zjTmV8Tc>ii;hw1H-C*u6mL;H#;Y&j#Ww;(qqNdPVzo3&8?{v0K);MpE+iFfPQ79ax z!jLLpG_tpkFU|AKtgK{zH^E%Fg^T#0a!aE;bA(U_(}Q<3X&kcqIlS2H*F6^0dlj__Aaa70M@O+T2HvT4ZZS zj1(dk4hKxRR~!Y`zUC+y8d54U1yY6ET`T4%e{vuf8RI$NBq{Pby!)daKh zxQU}9&+d=0%n0^nq5A;BCLJXZcaH5kdb0hZ)s~qB-wS6~LTX&=`PP`*+?OTv#=nfE9bA)F z`|x^8RI&yL&`oM}LA-Ir3x7B*vg%0CU%lT-TA9-2s*~g+ zyK{9RVd19Jnb#iI2mKGbIdVoAWc%S5@zK6p)lGTQBFa&C(C)eS3#VshE;;30k+W!5 z_MG`3n`3;NofzKpZAlIY2+%y%N$uVLVY5<;B>S6!I8kw`z)KcOvGbkF)`o+lvsvx& zsjJ2eeY^{Yg^_|PaF1VGEkc5a=~vefi;)p!QAv{Y#`{r7)6XIB1Ra)!0VKUFXIevr zI@?7$A5o=3V5lM^43V8@QjSgV>WIBY3}k#Fy{#T7YE=y!Dp`ufApU#x>J{9=nI#V? zqC~K%-~oztpVe&rW1z*MFzVvLdYf)%mlL&e-Z8v62QCvXU0GRKfnUK%jf4_$i75<3eW)H4@mSVnhBNk@iF$fo?zbZ6t`};`mlMPfnOfAr zTh$?>1|eXk_kZu9oj17Q$>cq}fTSAN*v<=idU|ebZ_Db@cXxMVe94Z%XUlx~q)DTo zyd0%JRenNJ`W0~^N!v~Ory@1h4>q$Lz{WA+$9p6tByh406-=O|a~jiYD1K6deMWX# z`vN=pJs}V)1@zF^*cg~TwE;pk#d5ruwGc&Y>8X0M5rPtxassMgiMF3WF&yU{`W?Qj z%Q@_Kp&08D!ieGbd+=24?{3a&y)PX5`uk@g{RM@E2-Fxg)2#J78q6t6A$V#PKQxr0 zmIYRh1|i>piYMcma0!z410#onh=YKDAae4Zo-_tolK4w*8)YbLzl6UngYl9gPW)Ej zXl-~oUJCOUium~hxYBG#(sJ!8v-xHha@Q$X>p_eiBoCT6M1cK?3WK0BtGJ;dk0DQg zWO0!dSfL|tat0}U8T_c6Xcgsns4F(=!%rr?eKF+roevs)e1h9YPCwHI1qCgl{wCO$ zK`;%`Yu$EOl0j3R?D_C05EUM048y0$rT`;?YuHssmb{CNmKY|@o@DMWz=y>AX4+!W zYzdDxy3>UB*?!DVfdx>p5^~l)GF6h1zJ_y=BL)5SGi!sOCA(28f@d(D2C~qvV%Sfa$Y>Bn|siD#c|O^(k`l10&u$EtiNQTXco!JzBh7>ZLTZp=eaE84Hs|ks^PVfwP+;d9Uh*v zjazEcAcv61mun<+VsheFy`NK(mFSvVTFUq`qbFaJA1BfXo~D!@9_8I(D9Kn)x26z1 zZuFN&%ghhMdGcl{nwIV5DTkHs6MB3`+Oa@u_As8>@2^!LI9KE}()!8lh&ae^QR(UX zH#UB+yze!yUR*?ofDf@m4}UX_)_B`&$1Nn*_ub?ne^$O4tK;`k=-Rg+EZC3j2Nb^N zldLaJg>!$N<16~x=*f>$VbFYHJXO7f`IBUzN(CkpYp7LfS=NgbS#t4;^{u8EKBZ4v z{dCqrS=4!^rxW`K4ZfrI>gSy=e&oR@CwtrWa_iar9<1-ngI2~jqld(qqET5Lek?a_ zK8=+M#ro#mp^vFwxe-aO=J4mFUbya#iZ|RyWzQ zI3MGQTjPX$8=X)n)+?TxmTJ=Pcjdys__{Kl*BH$^}-W*e%psqY?)OFqTUcWXo z_UrDH+qPb^A|4MZ1rD{(4T9ztuTV=%yhb8)P50#75mWS7O=QG)yhPe=j$9c~6%fg7=eYY=}TwT@J(<1`z_6 zekOhncW+A2wb-kL_O^tONF|zvsb85UcFK(p08Dg z`!4)_mcp|%!@E!!feZ`@{6r|>!8Kw1mPQuysCC^FG|A$({A3_Va=aj_S~R9?Lma9W zJUXfBcYS==3rTuL7aS-lhcoWrK3^~y1Y6`K^FH{@GTrKeeqqi2m5U4Gn&Tx$Y;0Wh z{`s=U>_SHliO-El^{ztY`KMKkxY)&J_TKm19)51@VdUP7siqEl2I6b}2y4|oCh7TI z4?ZzUD#nM(H15qEo>31eG2$dhhrm~%4O<13y@Kx_q{bnJVE#@-d(YU336H48h#yh( zMz881>MC`A(FY6nEnFGxSfb9DWI9A_^!bx^oy8ACkNZ>>nj##VdJ6bk?`=i$uU{}K zS0W?{7Q%XmWggHN7p^#x?4JL^I`2feh2~Cva$wbZ@13nx z{!rd}c4eb5E`ODGb7yb4@3k#e)(9sT-)G;WwImi3%S$oiBxCOt8p>Y@VSc@x(Gsyf z(@IU3zsoPatcwk^@%!ajiv{HjYS{hwV4Y=EEIEudxW4p+NBoe4ob=V!DO-9;$Rws@ zup%1q@ zsbZ|62%Ypr1^25I%henN^9+@7u%*31eEgXY}$!tD;(g_z=QrDnRII%A({`36Vb+X41*5UvW|(Uki83;u7zdD4|X1k68SM=EX0mqloTA*K^MZA^5YQa!tSAL935PdGAltVm17OsScS^7?@lM1x^S`IYgRsvh3O-x^%e(FTN-3U(*}j zr1?oHCZR*Up;bQfuZgpW*G?(t`aUh+g)XZK#G0~D6zf$jnk-Fan3V_Y=&eKvW=E@F zU!WpjM~26T$LmuMNn4WBK`@jKBga*j-8x=;w)3sU@5cU4`aC;2hO!>K;%a0bYdpDi zrC6?TX0K4I3S{7Qvb-;&n+Yd8L-hF&I!F6k)2}GK{ckYSrHVBQr>$NI($~onSfXjN z7|n+=Oz(g9#1z|5`!ulLxJ<-V*b>e-nLa(KS}Pi81G)ZK97Sn(3Us5F|yI5O(*qiJOD zk)$P1d+4QR`5x+tJ${VTC)a;|du9i7^bRE9zI^-q9ndhU%33ZCjwjfNJfx43H9&qv z-mma1k-BmZB+Fy+F5^5Pm%_lnuxJk1LPotBkMAysk3c zEL0k7Bw@cgHzjxI!NK@SOl9GIu+^liI6<29%$PV-0)&UoCW*xzSG-PZdvP3(z6$T{ z39fWrw63L8Ej>5S?qaGEhziuz;O777P7?^?z#-EDhqU^Rut!YMt`5ri3>!rL~D0p5m zK0htxrV2gLOX{aIlqsT(yIyN(z50YTCd`44@;#Kzngk^^=kT+3ZQIgOcivoo&Yce> z`r6mhs+Op{pDrlxbk{ad%Fl1!EjX-1VXas5ZXM9{`iQ@f{P}t8*jpMd6}IdlHuhmD zMM+~?TiznAUG`(t)`R@`9Z45QBGF1Y(ccbslx?z6m9e(o&`xZ#OT3Sg?^a2tt#fB> z+j26v!%%O+^D}A%ju*RinjCp)X5}pTUL-3KkPr3NaZi;<)#(>@xFN^r>ECuG6G|$O z4;Aabqb?3WgWa|wc#LQLjNbEFaYTA5xM@OqLXYzGMQ4+pFZ!gR-(zX`XL^iuZFsh201jr#rRCS ze6xQ<9X>(=JJ@@5=8Boe+O}o{MUxOr@DfVcjRI5B;*i8LpaD)tf9um`3 zvrl?gMs3q|ZQgp)oimBL9K(xxYnaInGr1J*$4u;ysS=6uiJmjPsghm**btLt!O@jH z2M(AbMmDIuT}*kL)`EBX_*ho#^gv1Q?uN*zU%WMrpj_)9XRB&`^Q5D+qa*Ky-6chR z88K8PacgsZl7+(D+X%i$0$cj6mi41<4s1y(&Vh$^@$cvJt)uo&CRkofEr*j5X zR#E_r7KmPHt|!{$Fc%lskEb4lAU2F2GyxQqRa8btM<2xBQV<=#9~~bLg6VwUQb9&( zA$k1R{KtD;Mmi3RAhYrQnx*5-!9fK8)VSiW>?WD=^L& znJ((Zmz0!b*_BU)`hk^&P3O#-vAFT@GfUG(LDaqo)JJ6`3JC`k9y>WO^eVKnnbU_I zS5veLl8r!${|$=+(d02duZkA^mh-V|wf!##aHMLVE7yA4*-t5XS7>evUi<{G4-39m z>NDrGZN2cYHyjw~BS+JIw<7hnlzk550JW*cNYd}?awNCzr%iGop`4Ayj?`zDbF;%5 z(qdiD+4E+Qtxxh3xHDjV*_uvPb%m@da)6lTdmLn~(|}Bebn%nKdWx?v>ZPm5>Y=7p zjmlU-iUySt|BE6BC<>sbx#JLzAZREm?l^A>I<0*G5EjVm02W{IqQMd1NXs4+Za+O3 z+V@JMz7@s_p^Y2?Fi=tHjN!_eoS|ZE=gL=4q;k{(Tv+4pcjW>*AIGO^OwnKec>l{3 z>P2#&+TAZN*QziA7p7VM9N=TX5lz((>ze2EE-t=mRvoHoyt}>fIR6#)K;U8}N$^)N z-o6hw<&au*boBoGo^P62t%95!%893Fg+mJY>n8oRtc7d(UZZM*7}4?DXxe*}lJa6e z?)+R1+T~&(B!s4%S~`F)d^+tU)&30{%NVJ_kK=Eu+gPbIRq39k`Gt)z3JwSv$Lk-g zW?!>G0b;Qe0m}r40=OL*F>>Wr-&(U-?PJS!uT*w}&r(>T_@#>GT-o-Y9=6`>*fB&x zychbpb&m_G}S6ZCrNW zYgy>l?l^o7z#&z!rc~{=wTYD|B;?CWj|rBSgIk1b^tg%2?N4e~M-QcPJ+1ISl7y(< zbJ(xNAs{dS+`4j`-l|=!$3uzo!K98mQP|?MvdN7d%Ejg_yP}4wI4V?~hFzcn%{q0S zbkCkW%Xa+C)c7>jyM5s5rxUf`QKE5rW_nR+ISV0sD59}k({_=GtA_n=5}CYR^f#m1 zN5I#!r_o?YS8#%HUa_{DUmsgpALc%7z25Q$mPBT;Y zdb-`mD_eBB{%KapU{4QX?m87kU*O++0brSCqzvPuqZ0K7QA$j`pF+^5?K*CVDJj>h z`ze;q#ji*J(`U=ZY$284y&xlN-H?GUff!;H;Fc!8K84($!l5aaaVh!PQ`r4?_oWDO zukGr4gpt*-ot#=)Z<%@89OBEBfsuE2y}r4zK@|xB=qAxicWSb{8F}o!=OI|a+Z^o| z!**i}3nK#q@_OEOhO0<+9twdqxW!qBpW&;oWSD@y3+^^9H~tDGOHWUK)f-9By6aL^ zSXC8wwc8RGL&gu_yx8SenP%^H?~);}0WQjuHGC||tCA!WMaap+)3aeQ*W3!G8^;RL z`zS-2k&%(@4bsNGBg#w`#}C`jyG%ZFu1%JEp*&IUeO(iGIG%T#9{UCE?jp}{c`U9q zFYkJVfsuctFiz}qDf@*SID#)eteJ%CLZr>dC;2l$Ak`}Xw&?pzJlDS+F?^%8ZPFbY zwMsyG?Q(5cXwe7SqfPfzhgs}73&U{YM)_+>2xdbk4t((#vdbe(4hw$vM zf~;dGRVAw$-5?q(4)-Hj!j4Ly$-KDeMeDBJPxG~{mSou@Iaa7-_{S0b+Ub@1OG-0v zC5a+rTRNS!D=jYvXpg|*01b{LhmepWaVXGfLN>jg#YHOqIeV#0wFJZ-dNzb)4fouz zb&u~`C*OHB%QQjt1r*yr^{Czk05N_!Dp`ERqDvr5RTVwKN1^oQD6!-M)QUBJRkrLd zy|4YMI7>{+nfzqtQ>VkyyDjnCgE-xGZ$V&*kI&9PX=pg~5t+bRx^a4THYjMlJWNcx zPY#OmhI)w%zpM>sHEq`nozJa{b>BLzJ@^LZgJ8R7VBmC0XneZ3cc@*_=&AQce%RXy ztFmbh%YxM_F<`OsHOh*ZZvs##7J<4IOe-eXnG(EGz@?G|RHfEr5LaZRu%(4;sAj4W_ShUaM)!$_`viQtee?_)!~+Q~ zPS{AG^mu@^=ZzwIBkHccJ?Ro`q$tz+>pj0w3!%!0`B8mEw$s-I*fbxAI9hfuaXKz1 zs&wki*yJ9&@FW%Et~!SJT@Qq*pC~9lJ3O)T4vO<#s{NAf0{5sY1PuX*4A7?KKy>!b zv&_b6jENE~E#%r__w~CA6wO)%d}LH69A;an9WnA4NBEdYx404S6-zGvNZO)%dq})& zEfko(Iz2X9=_%{PVY6pj{UjhIT3Mkz`{@PM`1~C=hsWG|`1Q-~0-31B^;|D^V6X>G zxXPXvzO2Fvg=MligB$o@F$z&E#!WQ^HOm^-=H_N%V&YezK8GmL32r4}=j&+13!l^N zY3u2l5F~WM_>pzNm3XOpuc7g4N#H4SrhiVRyijcSW@+A6U|jC+Tpb@kMA@M<=j|iF zzT8W~=I-v=@wn=GBunLD1Ve5ohY|W6z~(zAw0$y~oYozO+&cOV+~#|~eN$#W$plsQ zA!k?D607+$A0UA3d&Zgcpdbu9D89^lgO=2QfCm5%Pa6XNzM+t>_6j5~%JiVtYpHNm zlx2yl-y(c?A&|b6`MUBK;Ort0PjE1?{Q#`(m93l4+U?TZ67TO z%NqP)=2gO;psRmi_b5L7VJcfY5$C z{ds_#n>JR`GdxhfMC*l5HRbf%y~VJbm(;eyDxtRc{&~e3g~9k)*#t2;dGyv}_eV7u zjXHVD0v}1AUtXDUhzUxVoAYPYV?O(+PhVn%KkQx*Utr^*F07^h<|Z?4F1mY%lB$h$bC4$kQrj8^$Ll2>9u0xs{XY zt8Ey*dRtvYPxLLF%|0*E%Y9;`#!C3`#iMtRC>P@P0|CsY#J*J!=+9{Vs|;?)HRGKo z&ZjqeWxbVL&>sA1j;O?RA|_A_jfS9h^T-SFQZvwXmlF7lRzovI73@V8BscuJ^%@vj z*hEJP)fkI*&o#=VLBymgc0oI-@ARkxI6r~qXl|X47C4n#iGw{8pC&6_^grUC>jc2T zeFYU@1ou(*$T}zjKY9rF=R(*T<|NBBAxVSV_)hE1?78a+mS-(d>oZer3l=;Zzke6# zRe&%T;IpkK6?Ue80tnaahj}OWf&V@L{`+2fM4(?O=0Cs??rq3DL@|_hUjSk^>We06 z-LbJ-{>)NkGV$&?@FBt20I=`#*`Enq0kMJ7GW_Fyv)Ou^`|5(tY`w$PPQ&>0^x*zJ zhmVh_{Og7Gwmt4WcJ!a5dpeOUf|$_Nf5MK9}eC03}nD**Sv&0n#m+uzr<+n~%s=C2=*}LlBzq z_FLS7IMpMBvL!2_1YA@pBPt7CpWyhZR2gC!)WV!oq8)5+b$pm24cpU(@>dbg6GFr2 z=|qvUTsR~pmi6PoUKVwFmKwcMSiLffpddD06zSOX1z5~gN0MGmPSCl^S~wlXX8Afqb|%iw|^+t5&6BJ$njRN7j|fls^I*ACgj1ha#W zdThY=0Ix2YA0LTE4K5|asxI?ucPQ-J^t1wBR?K>TJuh9xGT9F1I0}XPq7$Cq){o*< zz8^qM3AFXQqDi=?K3d`dEugH^+tKZv28hKyPCYm^MGVqCX;S}Ikms(AEab??%p4g8 zs~uF#sR`H1z-v|dz}s0x?#Aaxr-A0I^i{gV>Njf4_5R62k1mCTXLeEW3Jq)p)!W)B zHQ3X}h1eAo?xd+1BKZ%zNI|=dZrNuQMMbjEgpw{51_h_5@HT~vz#^!XX>M$6gx@4i zSdrf3GM-bRY8)iLhi4s9lu_3plgUH|fQN2X;KC;^Wq3(%Nl6h}c$^GkG)Wpl{dPnW z1vLr1MU@>|w33`T;S-F=l87{ED^z?l&j&ls>O0JQ>8Cse=J>K+N$49F`d!;f<@s$X zZ97-q`PqI7*@~bq1|%pLSXiY@U&e_d2UWQYcQcEVlaoQOZ&`7hK6@<)F4mpBK`4{c z(am83Iw;;7cH{zOXm;7kea;Gi& zRAeV^ILwCT=TkSYIsck`tuxl?Qu{HGs@Xp7Wf7znu|#CBO?OUr6t_6o8uc*sf zg(bCHeNQj1XDnCF)DzRw8G0LTUI=_Dpp^oIeIS>%vxBCZ7Rwwaas-QOx1OV7Om@e} zy5YKmP7MXS9v;qFI|htdhDJ>jE|Q`d^=oTST+upk76VI<^vK&Z0@`g@&J^h_rA9ni|W_6%(K2M!7qX6H&8- zKXk?Q2aJ;dy^AK&HUv*w*3}T87#|+t6(iO>)*jpc{gL$1;RS0-8S{m=7y;qn!|92M zlppE}PmiVLr|NSe^NVtaDrGit&th$6lZQ+}{ZeA(QX$^*C z=)7LiLgWjD3v%sOdmuk*yTi^|EG_${C|V^<1Ckt&j1wA(Er}bsnHq174IMDY=3pkI z@9AoR55SkWsS25g;AkUPgs~>(15b`!*i; zVLM)XJpBqSGOpqx>8$u-%P&vkQ?I$o;h0pt`heEHRMw91{G9I{#;)G)+qlz{4u@8+ zPwlyOB_rj7@J`K0)Dbe-w(9ad(b$ljhNK%>t;`jNh(!;vo;(<_C90%G{>^lcx`rps zroX69yI+Y~usHk68K+(LB^jorkar!0sPBNeE0AQcexcpzN?rqr!a#T`ct8v4w?PZ_ z??HJpbdol21X8W>>zg&-G=QwcF9ub|9KS1cPC0KW8^tOo`*HD+J^}?M1jnQ$7ht+U zV`NeCmn{A`jk4rszeHoz>l$I*#2E&?M6n!Yo`{M5VY9cFzO#n~OAx!an!_mS=mT{j zQV_8fN_{xtCH0lsX8W-nqf2pGg(??`xgdib+VDhDb_IL;k3%@yWGDJ&tXJ$!H?eYv zF^~B}wX9E{`$^8UnvE>cL@@|1PnlkyRT=g?Ul32e2%^3_{^8=iq0*86t0OuO+Hkh9 zoF{N<%qo8FjQR8U1+uT}!As$)J-ur0%e{!z<%~I51&QWOPOibzO|6}ENnG;m#y27( zO6%(YNhXcyv(3xHUtmcAxqO0_WdkeAu-Saf$JZmZ@cGdOtWbFBHzbHUJ&-k3rp$M} zLxv9~T{xd-hdis2nzH!D#cjft#62RCL=z_#%Ar1xN~?*ZA&m$JH`MJAAALZz@4>k(rt4SjnI$T8rbsy#^kdaY1J~4q< zqU;j6zjb@{y@xeP?Cbq@tk$$yzjK6Cv1?-3+nJ@J5PY;DR~%P;)ljn>c}b<_>Tfs? zQccG+kYBRE5u7b^$VihrlI0im;J+z)!c@4U2u}@pGw*94v(uPrVLtS^QUl_E#nj}4 zp=6bjLD5LI<1Dc=wZN_@FWsW!e7iq!X7+vu>s#GTK+f&tHn}u*!u&N^1@bA^+N0+d z7rN{nby}yRj$>f-&gbg*ds=krj3#=r_il7 zS(*HpmIPOrg2K*;97VfHnto&kYFkyCx~r6$MqAQb@0NWGBR;IUyR7d+*`t_5Pc4W@l-97NT>T@E_Y@-BuhkvK@ zQMH#mAND&LngPeo06C{M7D6Lwy!0kWmEe^P{x;+!LP6{xL&@D_x@w?Nu&5?NbFNG8 zqloo*f#r%N8quU$`ez1g%%-m|HQS`sk%>!GMB!##srSP(O}7WSU6n;TNYI%GjNEZq zoFB%-gT8!DoP+=p869RST%3IWw~s%Rr`x(rPss4F&C2&mv~6PHgk#eg<>R9%Fk(QW z>y;EB52Si+nafI0Zs@OO4{D+L+fVC91d%`a~%)_R|n z?Co`_uZ4E^87~ZN^PX*=EJ!$Z=e(qR-ArfJOki62+Ai~rLN51w4v#^P2xV%TG>Dwp zexG<|MjyOK&vjK+`u3Dw;XU6-+JO8F<+<;*-jzn*sF)#avW8Ww>g8~v;ca5lQ_&Q& z!hkFnY*Y-(MXv{y#&~ezcdI_i&sn~cx|m^ndDU^Vez;oRp-jve83KRC=Hc(6YWr&Z zwBmc_qo;y9JU=h$kE)C1Y`h=c9mMRZHDIn+*mr3rAG?9+*Dj{yU|_E)o~9bVcSztoZbEbSGT$>0d4VKse*I0U#2(x zpqVeau&j4)T^!;>cMsAGlAZWv@$hRjGCQ&`}mrWZ&)Z2NvZM)U&AJr3Do>9H+<+TiFsG{j`vYz z;rX!V>o}3GKfWngXB=smi5=5%u-^1qesrIHp&;aysz}%FGw%ZDpycoQNQzWm>YFvP z_g=}1GVOO?GPoIb2tAi$_#H z2G07$O<%o=M>t)GV?=v9nI(|HdZ8bx&mOkbtofQ3_&3l+OGZLYZUP!{LFq8ms9L^E z(`a|DDHt{|1iI|#&cyvKTR_LkH7iFAZX@lnjsCG8e=} zJMAq;cyw5}@71rnb+rM)vi0nBIe-@r11-KxS@UiF{{8E|UE^S>7hmX5_(C`Y`}!*F z?vZd7?B?=BfFvz9m!jTowhy%b^fgqq#Tw;zf;;`}wQwfZ%Gk-pM#w4<5891{bv|NO zaAqrGJr2Pr9(2H@%pTM%jwFit#rvB_6pJAX^e=OJSrCG@X=%tVxn9*I&RCIVm3DEr|B1yTxYpy`-W#LXK$CY-KTq3m}yqD45~VKVgN3AQoab_i&#uh`A{EU&POYA<#7M?B=$7B?eFr(A^eD1<$0@;VXJ~QCD@C+R&PEwdWU)&fe(%wbE7+2{c$% zOgz+-rcaC6LJB9kX4>zNO@6#Gm;^Px<2{Ri;nN*^N3>S+8{_d=4L`RY;oRk`P*nq> zvrJv*rDoCBxnx2q6}7QuYe9Df9jxHrEU(~Wmq8{uuzmzm1lzU~Ezr+GOh&0>%cg&~ z^ZKDw-cI)m2mL6k3T3`^$59!|rPY3@G^$J)PuFH?M_@OmcyP>C?#eAnD#zrtbz} zn!%S#-5bCkyEdJ6o+(wA#BTPWk82AaG={>Aeid7boIG==gAKnNdB=u)VuqsI&}tr0 z-c9(dx>ls-T-;-$wdMZzVrMfCZZSd^x|V;myEe!__qOB7uvoX)9-pG(5dz3?LFKH= z?`G2Pz)yVN7Zl31Z-&yAZb?o^xi2r7v{?Yxa(yo?#jftAh4lj>;&X24R-Lu6`44h_8vCTwsVkCiA3yNmaTye4)x8Es{#Y3IkaZRsJD$&RlZV z?3ryI_@_ZLH%B|%NNoHipO;k%r@LRje*Gfo^mSciWc@-U?d9ibbDxY_P{riYg#r9j z*ze2>;QC>tlNZw`;;XGkUun`J$H#Bb{CxH~Ly^67YtCiboiDTpS8A>oGZ)5MV4{=y zZjU-HSMP#dB8og+UN01La7ijDp|2{&(8{G`_+9r3k$iM(lL0Ldi|MQn<90}t8LumUxjSh0-%jv zyDQo@4Sq6S?fDDX8po|2KW>+A_6%lUZ*@0>_c?R^=B6gi3s-ZwePlHf9hBx*&HMXC zlbPVN={L40D#FMg&jFSj&-uHTP^lPqJ;#lrT)RzDU-g?BjkR^bZ9#%1D{qe(|MXk* zN~8yf0m}Yx`iQ%-qc@#Fo!#Y1T}TpYeyb8x`R}+=O+mj5341crBaruw_~jayKV4#& zyh*oqB5Pmwr=>ALnsiV%5|Vg>d(JMgD67ZjYY>4;g)MO-O_mor$#@aGuB$!#h*-7M zm%E;K{9FICnT3p`=lQw_LY~>-muIZo%qtk z<0Y52Qu<5QN2MOS4uqI4-`LImuB$5lKn9m;14{#SLhEN}EwdQz4+G(39&MqSa=kI< z($OPb;5x7l`~PS<%YZ7ku4^mZEg;<`(j_I`T>=71DcvX?(%mT_-67rGAl+=~lJ2f= z?eo3Q56=(Jfdltm_gZs~ImWf5l5^FH#wRC1%;YeyRu4$RP zKXJTHekkX+t#`%DcsQAHp_=}^CtEw^_z-b$--Av#?8UqM`&l$msbGSHSO7Le!l;F9 zLtsK`SO&r~edc;rE-4pome25Cw$dA@T%B{i@OFT@qEY&c=JyY+kD!1ik5aNU>EE4TSt71o(1mTw$ zo|mkm#-G-x*C;(+KS+3P7W&%lb^D{WDQY@s$?FD z3>}2gPbkC-3hCcS&JQ7n>xt80=FQY&iBq(mPBnAdM3Rmm8z*|cCw?YFWVKxeJ?=_O zKT-X2_!Y^q_XZDsi@$nf3$lyscB%>t@fd1j^hRyOayC3_{n2U9vLQOPjz6ed;B`NK zOd01&7`;9W%IYP2%}8bPx|@ydkm%F|X2tQOi~@!=r*kl|12xA-9=2t`7j^*7iw+Jx z8?FnvmCrYHv-bt^CzQ@G2_%Cb{4Nv5U{vc{n$_ntG(*%>9;Z~G18Gg2tx?L;qlp{z zcViQosfw9_OU3Ul)e>KhAl&j?=t8k1X|WRe2*-T49rp3i1x&~;ZWJGR>;KJK`bpZl zyR$5YdVZO3d4}Y7${&xjee>cLx9r1@@o3&&dqx@?o^2YJf(1Fo{YLFX$wsuZ6Sl61 z>h-PO+;wCcS<#5z-^^jDn((r#?n;}kr!PObZLHE_t+q3{RGtLD`063DuF7}fcZB)x zq|)FZOEKZgaHLYHS6i8IOXSVmkttDWi{$jtpZ-^Yx@W5{sOOYO+z>j+7QhXsWYNFG3?#VpW z=S;cnM@2)!y4e}59ZvM})CpnEc|uSHd-_MjY5;}E4Gss6T5G?I8j_jEOJ6KXA8bRG z7V;kj9Bl*bXpT6HzZZE9ZVekJ4F zRrx$iwm88)EfRip+JeIH`Z8TaB(sV=Jxq0H)3!W}W1EreQ6Q%xXCiND?iTV~fS7LY zeyy|d&MX`|;wy+$d#r#wh~W-7D6hdmUtBzKEk-#w=Os*pgO1MPyTLb56;)jP(++Jf z?hoDAX9^0!CB)wRp5eE!&+X|vUrUy9?9-F#$J@KCBHot1*e4S3tG^ZYEv_`qXIJ_Mg*}9DM*=7g;K?i^fxo2H)L(!#vP?O;#RS^d0cQz zbbuo^>vJc1~EqBY;4y}9LS3l1lZj%+#O->EqpL2qW1|H=H8?3{c1G6CKftCoZR0Cx&HJn^vPbalL73e;giL4Xz*!jMl`H?Y(-yV&)pZhE!FRmLO5P zTvSJeM^SF@*i;DIl6O&m5V~W191(AGJxP`wC8u^cjM9m2c_O@a^V$6M_|(vP=^8Yr zT~k@)o>%_RyS->w0eO0A;F+tNjr0316UKjY1BWC_ebUQN^TzsunM;t&Xdh4U!qZ!i z*70xOAv)~S_r7Y5ryd)5^?&VSCD_5Lp60ke{^WnwUJT@45|})%nsd7GUI}>o7BFo4 zjmoq-`&$GTk+dhrKB-b3A0n~d&$+0x-*ZonpFxouF?M5WME%z@K(#0FhKZY`- zRSy>OgtAar8|s~Zx+Zv3eYSCpzsRP3bVS|MKnWzrxYWqmKvu!yyY;wP$~g{ieu{); zP4Ys1+J{ql9^^ddE#YoB9sQ7wqN$p1yiJ2+%}6JYYpz5*pCOroQhp$L+AqcI=IGB9 zv6sANIYZ#oUPILXSG#cm7wd*hjsnTw|0Hh&q4@J3nz!w>{Zg?!=Pg`D_o3OqB6-3@ zVPxs+%TIXwwPQG6pN$Ih93L$1$2sb~rVWaJ?*{->BG6DmQpcB_DF-xu$hdUCvl`rM z)U#m^)~pXmKv%dv^a-OIfYfAf6*EczjF6DfgqNf6^}Kh_qwvkF_;T&e)BKEM-NLuq zReK6}TeKdM7UIpY@vF{CpY1#Wilo=qEmjlw%LwjAFT6d_=)QNkf4`%jI4&tQiEr@N zEXm?F$NPajq?O`JNkDmf6B{g3Axio#h@aK@NCCDNZjwO+mx{JGY2aJ_>p!+|NNvm~ zFrq3ea8wTlzwNVEQeT#LppNO_7}IY^aDb7q=?-w^ZOtGxiWu*a!rRU)-S!1rRA6Mr z&%OLm@%`a$ky>Ss@|{3SerAR#ZOY~T^d7}vxnEh}2P;8Er;j}PbEkq)p#0*zyk<%m zDinR!n=2cqqM2Y+8Eg#!k@HGziMh);+5WWZwwJw(Y!J+gO2Y%ss^y~JruyD$>CHCr z+I<%hBI~oLR>=%-9vTa>HkC&a#misDQjt+pQ-k`P0nLOEVaDQ;JIa=3T|4oWDPe*f zEtjG=+*&1XE#|}B@8CoVnCSgG5@Q0~oc{6;pK=4X+eUXPt{=;$p6hAHCZ!xM_nArd z<6n@gDu2GpVT*A|xF=#`^25W5xN^reyncaq~ z{k8uWhB+SZ=gFVTI)@jLXX(#|N=SNjeYwJm3KfB@jW@;eos2kytNkQQ**{7a-~xlF z=j>h)hY^(@WYcOKbo6yeDaiy&h)Bl&b|QYi&$)@IIx%$9q`a`u5IYr@m0EF(SXdS6 z-{GjoB}s`S=#R8Vi-xB+*UyFqBn0q+4|62Q1!yw|=9|ygk-qu~H_nBwsTo7VD0j?d zM8vL{^~FXo2#AL2>Zrtbh=mInatdL4{5pxRdN;Tg#ba|-@Gz;8-eK8)@yBW?4?DgG zlVGZtOfba|gwaW4Od3{AH8*Y#6lk?C56xC7(~>Qi`j4GbSghNQ$&(<5tUs5tZ)s-F z#fNIxsYt9i6>a)@&N-ylXyR5kF=GFwusGcCpNoNy={q>zpq+O;8^}K>m~m}%=qk0D zo9aWeGZ|38kMAN#rvK~s9u#Oavc@iG5$D9|S^{mYLLbF{!t;a{aW9rk;75Ej8-SC* zmBh;2=Ld#A58?L+f1`L5r|d`&yV)4 z^*ie;K>FxAs+e_kbr}fc%~B&btXPV%;b3&sDoHRY7%T^iB= zXc-Q>Ch9%QS~b%!hgYkXA~SyXc{+pS$3*yy9f`S`$|w}(;Se#S&{9cVuE-6E>)ca8 z?grtAG2+AVn@8}8n5RMnZ!|R%0JhaH8mA@VNPR>>e<9 zeiE!8wHMQ(ZtV%QTi0c2?9NHWw;>@(_|V_N#fFjd75auJ)F)4H<5J^da%<~Fb)ZV- zGdCi{ig4nEYK1JS@V3FqpxATEswo>T;@35^vt*1#WioO!It6w({Sy%gO*GCDc5%XX6x!aIi`NeAE>cto#K=l?u#s zIs5z}50+3yl6LlJ0u*?(?$49CvLLDmb}4ED38sWD z`!ur`Nv7{`xZJ6UC^oKUnUP@h<|6L0cU(b>NFxhQW>X!8P#oXI2_FY_w(8!ODynw+ zys7aUr!H`M#A6?*Vm^Z`#`gA?tG|xQ|NWUa#=JvBblEE^(5^Frw`^`!Wjv2~u&+viVc-f#))*6ephRO`R%Ug!*&cvJ-3!@p2Q~>er=TI9>xUQlk}T#xWb) zxV*e2Zseh4oIW#tj#^QsIT6$#Xu^O$TvJm69yo9jbP%|-iBrXh#6pd{PR`Df*G*a_ zl*4P)yG=GdMdzOH*Rg5i21hox>m|q1%l8Qbv6q?=3OU!Mv?X{GI_eZX#-N$~85`j zuGYVpDfvr;3l(~*Xr2WJAD0AE`5HgQ4MvgE52GTEZ=$Tr$w_65umVZ}U3%l1zpb>} z@Sk>`SL+rwR!#StqqF-K{vP5tUGIf9-oRZdIyztN{f*kd>!*Mg_*gHWY<>{7o_3x7`F9+P%+_OQG#TLhldj=^071|^m@H1 z`Le)=i39@--h(DM{q`~iQ{X|CX^E@yz>w+S#}7+_w=4g3)6^?T$|Os=Ut`Aqkc}z{ z%PoJLgdkJ%UxU?S;F|X{F%cj5W=I<}?bBd(orrW2!H`H|iVJuc{rtKoKBq^R+LN|t z@Uu=VF8&!G$5P9TQ=kj!H}zP_(k+^tp6&wPOI&&-6R;e)EoUWg*T8=RJii(xGwgAO zu;JYCn*E1|wFvKN@xx+dXt2a23{wLUGqJ18TUK5Sqq9}hiqtHuf6?eurG^x)xuX5> z(Pr)gUi$%H^^T;G1+N^~ct?v0yi&hr+#~Wn9rUT3jMlNE!D_~y9*hjOy_%AU)#SOj z;`AJ%vFLv6!2@A8-wx`80afOtLJg*13Xx)WK?MkM>kG}W@C!gv`0R}~Ypu=AL+BLs z=LUDq!Gq>crvs-Nz%8+Mc>mxQY|Yrgj_ThJn-=tO#60MB|Fw)Bo zFG@d#(RBMqVtCBu=&@`JurzMtTWrAqR3B*xFuZwACA=W>B+78Zwn;@-cd)xdw%ZF@ zd-gUi4pBg%KoYs6+05>_m`3|Hc;F-QIg>gE3r<)}#-(AN z&#Z0~m-%xCSr00+Q5CkEEnX{GEV8QgUzuza6^#ho_upX1Z%>dFQUn8xDu=3--w(Dv zU$?jXzL6YlU4@kHAMa$WEP-sy8#4=wY_P+62uIP#np7{C&Ag842lXU)h(MlV#1FHY z|LvQ&O=3{yZ~T)Xrz4C;w!t@Qqw&9JcUDeL97s_|U2W4%?$WdoD|Mk}cm*~eHHB%G zXn{uyl3c=FZTClEraFQTC*5E=8r0b-3Kq1rwKWiqHuwO-TgC$2Gjl>6VoIpoy0_ujKvqlxq$3P!(ko7 zE{!c-y=dCyb}OmzcKhckfTfRRI86>7RF5qWR4GVH6JL+DMZJr9OegsDsdMnx4Pk-j zlMBh1xQltQW>mrRDS=Jp%!!cI41sNj7EvZTP zbQ!N_YV;MR!o|4IkL0o7RJCi@Jl~ykz`nZ}7iUb66TF%?hW_EIuRFvPb9{(tjuuuA%z5B;(A9Uc#iI-zJNBR7~d=?rl*PF{L zDq=iaCIf!_G_SkecsbhC)M_ve2`Z^*Bcg;GG>HWpPup2S#RNzc*Fu&=ysa!OJJEB$iIsa)|8c*}Z#SCIi=fW^p#yB|JbIPEIzfXekJ&=!4N;~k& zz3st8!GRI=QAln%cn2d%orbjaf;=izKbx*tJ2iwnh{CQY`PI4<3d6LJh~eUK|NC!L z(q#68@9(|m&b!XT%&d=B)#*LMmA&t#^t`*r#;5t<3?Hi3G(jCBI>p7Mm;=JRdMpIJ z2jX+KF(9u3{-&rX#G+QBZ=CSpm^x)Sxts0{6_FK5f42h($LsML!VjN3-vS&!wi;S1 z;jf!bMvraIUu)}tyc8vL_4#abQ19D<%jX*PB=f z^z2@iy*>1}s{RFf;U|aZR)$asa3~iPAWm_muo=Qsw49-UELX;LOOQ_Wm&pb87~dyD zkWuUVW8QK$#AKoa<$wV%1uqzETh)bJAJ)JBU||0Wnk0i}L;b)<4ZaSV(Vc=o{ECOt z9FOL@Wb?4xer~h6#DW!su%<+jE_;?&LDJu^EF1%|{pn{d@bGx-y~F$LjvJYm)gKEY z7ZIFe4^$u`vI>YwAS??`$fc#Fn4J0%o`>doXW}(Y!R7I3wu;EGxQA((%2jbxvS^W#{V@VNZT(5_>443+f>O z9^Y(pBEN3&zaHl!Y0o3)3+4r+fPld6K%owf2jQW7d`>5$z|je5((cm3uanD@q4^9R z7dhmTbIwZdZfU|ze#o=5ra@gM4^QRI$voBw@`)^8GrfZ=ez{|$=p{}m-3y+&gb%ac zzZ_0%|C24r3WC)3Ld5;GGI=i|O)O zvw>+|qN-7~UgnCH<`dOP7s^=d$!P#;LxXP+mK2I(8GGy6 zJdE!niwUt^UWzisY!^~TZ35%cAIC9ffXMSZX#~L{mzDBn95@x088hqMRggzn_j$ZB z1s0jV4#RJu(N|y%`U&0YfUAaiSkHMz^I?nCdu;%Gr*O{E&mav!6DRvc@mJUJ(=k3- zvgi9w2Gur%A{AA<3zxLL6FX0sS>Wm&Lp^Env8WxIQhq-IbtN(58@E4RZGdc{3Glus zq;iD>k$WXW|5r05AF4qFI!-Pxne!{g{XsP*cufgG@)iWqK|Wo{(b2I+4p15A>jpvY zao%xENT<<(HiG~ws^9gbB8tPX3r?%d4gM`1r|X#sNDr{$g_&w7(xrq?O-;#{?b)q( zUW05OnAC99uXqXkh#vp@;@jh6tDfTsw^PmcN{bnbt9eKIa2IC1ba%2|u@v{?<{+qH zidgE&pSegOoj(B>;hoA-Vmw&ARwtK80}E4s{%lmv4>_>=}-ffj0M8}Zot-f@Ydd{&4F9ml=9d5up=Mnp3{xO;k)zSjs)58XyK zhy&RJ`|-j89t+kC=S`FJ`M?2(EjB(k*AJ2p+O-z1fEE{yhnjU=fDvy60fe@`=;r#( z-P;2K;W0;6!6+(0@SLQ8j{uxHAb}k#Lqj+i#m12)t!e5X4SiT~^vd~KCG24MnBlUH z48pn5rVZd7ns?nvhtB7zPxAKp!QL=mC!42c44&5(@lHlRruPlNPLhD7sU{T0)Dhf& zGpOt(R;eA{Wdp5*cPH}*13Lo<3R!^aLRPoYJ&50qnASOQ4a`M;l;a1suz01}+NPCHx0Pbbo##+el zJ4bhS`Zzkp_3Qd)1kE^C0JDO+-vkbR!&W#|MBT_oZm?OODYUs=rEr-}GP~S?<|;bu zYcmF*PXL}Er|F``nJ2Le@RKdr{%Y+vnQ7HL-=C(tCdFe+TAujqKZ1(do)U(AnH@%H zhs}`TzaF$I38V_!mt^c&68%_m40HSZ7-SfU#zwAm~prB{np+EHjRbxsi5rMdCTMLGmwc4yly@A1WjY*FiUf0F;hS3 zcM@n84C>aq0p7e}s1Xl@4o8O)-awxqfYEG0R-Smk`Na+0c^5!xz^Wa4R7JD4jb9Oa zDm)khg4n6~aWc7l2fw?u>upG5X(SCxB&dAg5i=+HGBIVyiffZv3 zxn2s+0kirahJ-+025X4(>!``y#cruyBhH*Nl(q^j;mmDpwu7l7p`lWv&L8mDMZ75r zQi32V#g>76!DHK0E-hiday{Xk4hlBmi!4lgz}z?wVD<2=2Jpr6QGuxcoY#?jKV;+R zW{@|jD~Ne4USvoW4md9{w7Nl8@n6TWtxP|R&=!n-GI!>kG)D~ZD?u}LxXOaq!yw7r zOF*p@ue!rx6@trcI>hx2;*6Q$e)P^s|Lfi~AQ+g2Qd2AZob6CW$5oe(R#J`hRVLFoY?ebQSlIvlKHOxIzq{^;FL#~Ph>XTtKw3@ z{GS(K+T0Lm)vdp+e;ysFwB)=TpjSxl0J&o5>j;WAJ(slrkB1HNuM^plf70H?X#f`! z9LVt6oOej7#FmydM6YsbU(ccLai^OK!iCmXroVa{=pV&gA|oc6n80Suj%D}`hOxt*r>}0Q zcrbocHXc=T5yHPPKBvrL!#2I5{MB7xD+?wTUp&Te)EKkUV^EEspYEg!b!=ifo;GE` zVX*fD)+&W8r9CeaOdta4rRZ@%x3riTqko5mGj^>Jn;n7Mpo?noB5b~f=i=tJ zU#oA2Z40B4z40B!_4ZB!Ma^r)slxc7%TC_Dj*b_R##szFb=FmGm&I#Fw{W8A>GE}3lF-$>U;4L&6tEGV{0(D00o8RZ+d3W!EogHR_bK8>ZdCvh7p407 zi~!+I?8no99od-k?TB^#X$}A~0F;7sh`Hd+T#)Ng;|@bYaZO!)3^_|?Ke~n{;LuDX z=Tdg^{37qP*Ta)Ur?1Sy2HO?L(yymEw)Gv>uZ)I;Wze6%gS`J%|NFK?C_%Qu^U$)U zhUXOYt`5KxJpo`BHqD9!;7LI00Lmr=m%geSL*V4$e2nw^5eYZ}vBbatZ2q^QP++BX zkYYE^8+HxN5>|gPyJB(85XVdCB0PzI?;AlIj46zE6Y$q=?r;zSWP!DuD=@kt zkCq|C{Bs8G=vs{;>P(|eGbIgYXJH@@MZDAD-G$6%jN@@C@$U$EOP=Kshs5y(+U8m@ zWci)-c_a+$`v(+{NA=8zbsy4OVeJQLmp%CT=L_$y5pKDfky9ZP$?h``8qMwtMJ~-w zXBxeaQVCOh3}*js1{z@S%yYv2Ai!{yTKM1<_9SrSsl~)&OUJ_bwoGuRCu$;SU9x4F z<0K-BB~}UoERg&NSBw!;72U>yq{#}+Yh{jD*6c!z!odX=&WEZ$fb zgN`2LsZ+tA^ zZ_iee-k%Ncdt$A;aJszUeWJDPoV$yxz&jXuRlRt2Hh zQ+5eHoepHQ=Hs9K#Eov92u2Ykvh*gHF48F)ZI23o^M%AsI`Fsua1H5K4%bBu{P))+ z-$q0~IBUrE*6KOEm7;v_pJiE7%VRvt#8)1`9OhQ|PZ|ye@Nb5sg*~`FJ>M;OJPSPg zS-X?CbWk3ELeWePw^uBo;FoKffY<$w8(sWJ7^`r9RCyarN$To(foDv4xe}njaY%jG zh928BQ%c5w&=T{e^`!==Lq5ij?XaU6w@_@io17tiD37?%SDb>L*PxPvM)<8jEzGP_ zPtpdk@QnwDe?R+cJZkZpb?D1VosDo{iU z2PMx4UO&oM2jkaG5B<1vy1-EbtPXyIC_`$a$*xg`>y}C ztxDwh6Snrq^@nTBr$7p#dXzt`t<50Sk#Y3yjG#z^>0vMblPVLQtf>PU=1vGA3~w~> z$V^SnDjf%U`D=EUX|Z#mj}-@OC{YZU{4CTGk2KO#ra*n&UnAS6-cT1-{+b~)P=`l# zn$U|vY!?mtb0X@)bsoX#bW8tW{>DLT|B;?uXMMxb-M&x1^h?5Lbl+t1XI78x?vwVU zZd-Vbw=Rb7^d970)&u^V_O2GJ)zvnCrVx|-+xKkXc}^>msKWgk{xvZH^6Q^3#1lmV zEk3U!Bg(={CS;-%Gv`ok%#tV+{m8aCz%Ir@v-)Rhea(;Y{(#}>;bbYfE@bD%iL3r} z0+W3B6M35AszCCVQTj!Sgenaf#)ATWYd$KYBjJOA>~-oExFx~MWh-h|XQe-P5El%2 z@xrK+XE@xCn%?|itNT>Vv-cK21w7`c6XaBx@dvh3RgIiuD>Nk&X|4JV0f5Bgp(jrJ zY(1>Uh#lB#m4VVX{DGxAxIa7mr$e5`FE}F^B)5CFd7C~o=;sHdZ^Rbc_lc}Jp~kaj zquYfuOwL)tQ8RBooG!OsnVj{o+_}xFv*7LOw@2!K`x|mt|Fcu*`?74Kc4zT|%q73F zoRDVo+a%*Lq3>T$*Cl&4_(@4g4Z`U6HEetdku4jYv?*J)A zyTygQ&bk^LX2AA=bi=3gPqyW1k^CHV8>udWo!=nV1g@#zZVa#)LDk6DoCWsaD;;~V z$v5lUAKwOaAr%*6x0Jva6HDSgD#l0f!cc^3Fdd3#X*-+Y zEKD(FX@59ldn1pe0LiZ{^8*rh>PHA0j;vO>O8}@LM6k5+tKj@#JqwG6lmrgDK=YDR zH;Vy&3SOJmEgp+nqQf#$?EW`;f&q+ooL`j06KB|R84yB<*%1&CWoU423_8-U@bM@Z z+{N)&z&s&Z$P;_8+GKj7h^F(I;fIR?c^u2X4feFLYBxn*^1G9X10XZV6nB-TR0A

cmzp4Qm6wq<}WD2Sd>h{T? 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%0DGEMJG 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 literal 0 HcmV?d00001 diff --git a/plugins/feature/denoiser/denoiser.cpp b/plugins/feature/denoiser/denoiser.cpp index 03a6d8a28..4df8d7cc3 100644 --- a/plugins/feature/denoiser/denoiser.cpp +++ b/plugins/feature/denoiser/denoiser.cpp @@ -146,6 +146,11 @@ void Denoiser::start() } } + if (m_levelMeter) { + connect(m_worker, SIGNAL(levelChanged(qreal, qreal, int)), m_levelMeter, SLOT(levelChanged(qreal, qreal, int))); + } + + m_running = true; } @@ -445,6 +450,15 @@ void Denoiser::webapiFormatFeatureSettings( SWGSDRangel::SWGFeatureSettings& response, const DenoiserSettings& settings) { + response.getDenoiserSettings()->setDenoiserType(static_cast(settings.m_denoiserType)); + response.getDenoiserSettings()->setEnableDenoiser(settings.m_enableDenoiser ? 1 : 0); + response.getDenoiserSettings()->setAudioMute(settings.m_audioMute ? 1 : 0); + response.getDenoiserSettings()->setVolumeTenths(settings.m_volumeTenths); + if (response.getDenoiserSettings()->getAudioDeviceName()) { + *response.getDenoiserSettings()->getAudioDeviceName() = settings.m_audioDeviceName; + } else { + response.getDenoiserSettings()->setAudioDeviceName(new QString(settings.m_audioDeviceName)); + } if (response.getDenoiserSettings()->getTitle()) { *response.getDenoiserSettings()->getTitle() = settings.m_title; } else { @@ -492,6 +506,21 @@ void Denoiser::webapiUpdateFeatureSettings( const QStringList& featureSettingsKeys, SWGSDRangel::SWGFeatureSettings& response) { + if (featureSettingsKeys.contains("DenoiserType")) { + settings.m_denoiserType = static_cast(response.getDenoiserSettings()->getDenoiserType()); + } + if (featureSettingsKeys.contains("enableDenoiser")) { + settings.m_enableDenoiser = response.getDenoiserSettings()->getEnableDenoiser() != 0; + } + if (featureSettingsKeys.contains("audioMute")) { + settings.m_audioMute = response.getDenoiserSettings()->getAudioMute() != 0; + } + if (featureSettingsKeys.contains("volumeTenths")) { + settings.m_volumeTenths = response.getDenoiserSettings()->getVolumeTenths(); + } + if (featureSettingsKeys.contains("audioDeviceName")) { + settings.m_audioDeviceName = *response.getDenoiserSettings()->getAudioDeviceName(); + } if (featureSettingsKeys.contains("title")) { settings.m_title = *response.getDenoiserSettings()->getTitle(); } @@ -535,6 +564,36 @@ void Denoiser::webapiReverseSendSettings(const QList& featureSettingsKe // transfer data that has been modified. When force is on transfer all data except reverse API data + if (featureSettingsKeys.contains("useReverseAPI") || force) { + swgDenoiserSettings->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); + } + if (featureSettingsKeys.contains("reverseAPIAddress") || force) { + swgDenoiserSettings->setReverseApiAddress(new QString(settings.m_reverseAPIAddress)); + } + if (featureSettingsKeys.contains("reverseAPIPort") || force) { + swgDenoiserSettings->setReverseApiPort(settings.m_reverseAPIPort); + } + if (featureSettingsKeys.contains("reverseAPIFeatureSetIndex") || force) { + swgDenoiserSettings->setReverseApiFeatureSetIndex(settings.m_reverseAPIFeatureSetIndex); + } + if (featureSettingsKeys.contains("reverseAPIFeatureIndex") || force) { + swgDenoiserSettings->setReverseApiFeatureIndex(settings.m_reverseAPIFeatureIndex); + } + if (featureSettingsKeys.contains("DenoiserType") || force) { + swgDenoiserSettings->setDenoiserType(static_cast(settings.m_denoiserType)); + } + if (featureSettingsKeys.contains("enableDenoiser") || force) { + swgDenoiserSettings->setEnableDenoiser(settings.m_enableDenoiser ? 1 : 0); + } + if (featureSettingsKeys.contains("audioMute") || force) { + swgDenoiserSettings->setAudioMute(settings.m_audioMute ? 1 : 0); + } + if (featureSettingsKeys.contains("volumeTenths") || force) { + swgDenoiserSettings->setVolumeTenths(settings.m_volumeTenths); + } + if (featureSettingsKeys.contains("audioDeviceName") || force) { + swgDenoiserSettings->setAudioDeviceName(new QString(settings.m_audioDeviceName)); + } if (featureSettingsKeys.contains("title") || force) { swgDenoiserSettings->setTitle(new QString(settings.m_title)); } diff --git a/plugins/feature/denoiser/denoiser.h b/plugins/feature/denoiser/denoiser.h index f95146995..63153233d 100644 --- a/plugins/feature/denoiser/denoiser.h +++ b/plugins/feature/denoiser/denoiser.h @@ -190,6 +190,7 @@ public: SWGSDRangel::SWGFeatureSettings& response); void getAvailableChannelsReport(); + void setLevelMeter(QObject *levelMeter) { m_levelMeter = levelMeter; } static const char* const m_featureIdURI; static const char* const m_featureId; @@ -205,6 +206,7 @@ private: ChannelAPI *m_selectedChannel; ObjectPipe *m_dataPipe; int m_sampleRate; + QObject *m_levelMeter = nullptr; QNetworkAccessManager *m_networkManager; QNetworkRequest m_networkRequest; diff --git a/plugins/feature/denoiser/denoisergui.cpp b/plugins/feature/denoiser/denoisergui.cpp index 58e398a3b..0041d2745 100644 --- a/plugins/feature/denoiser/denoisergui.cpp +++ b/plugins/feature/denoiser/denoisergui.cpp @@ -178,6 +178,7 @@ DenoiserGUI::DenoiserGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Featu DialPopup::addPopupsToChildDials(this); m_resizer.enableChildMouseTracking(); m_denoiser->getAvailableChannelsReport(); + m_denoiser->setLevelMeter(ui->volumeMeter); } DenoiserGUI::~DenoiserGUI() @@ -205,6 +206,12 @@ void DenoiserGUI::displaySettings() ui->record->setChecked(m_settings.m_recordToFile); ui->fileNameText->setText(m_settings.m_fileRecordName); ui->showFileDialog->setEnabled(!m_settings.m_recordToFile); + ui->denoiserType->setCurrentIndex(static_cast(m_settings.m_denoiserType)); + ui->enable->setChecked(m_settings.m_enableDenoiser); + ui->audioMute->setChecked(m_settings.m_audioMute); + ui->volume->setValue(m_settings.m_volumeTenths); + ui->volumeText->setText(QString::number(m_settings.m_volumeTenths / 10.0, 'f', 1)); + displayNRenabled(); getRollupContents()->restoreState(m_rollupState); blockApplySettings(false); } @@ -291,6 +298,10 @@ void DenoiserGUI::on_startStop_toggled(bool checked) { Denoiser::MsgStartStop *message = Denoiser::MsgStartStop::create(checked); m_denoiser->getInputMessageQueue()->push(message); + + if (checked && (ui->channels->count() > 0)) { + on_channels_currentIndexChanged(ui->channels->currentIndex()); + } } } @@ -347,6 +358,36 @@ void DenoiserGUI::on_showFileDialog_clicked(bool checked) } } +void DenoiserGUI::on_denoiserType_currentIndexChanged(int index) +{ + m_settings.m_denoiserType = static_cast(index); + m_settingsKeys.append("denoiserType"); + applySettings(); +} + +void DenoiserGUI::on_enable_toggled(bool checked) +{ + m_settings.m_enableDenoiser = checked; + displayNRenabled(); + m_settingsKeys.append("enableDenoiser"); + applySettings(); +} + +void DenoiserGUI::on_audioMute_toggled(bool checked) +{ + m_settings.m_audioMute = checked; + m_settingsKeys.append("audioMute"); + applySettings(); +} + +void DenoiserGUI::on_volume_valueChanged(int value) +{ + m_settings.m_volumeTenths = value; + ui->volumeText->setText(QString::number(value / 10.0, 'f', 1)); + m_settingsKeys.append("volumeTenths"); + applySettings(); +} + void DenoiserGUI::audioSelect(const QPoint& p) { qDebug("DenoiserGUI::audioSelect"); @@ -400,6 +441,15 @@ void DenoiserGUI::updateStatus() } } +void DenoiserGUI::displayNRenabled() +{ + if (m_settings.m_enableDenoiser) { + ui->enable->setStyleSheet("QToolButton { background-color : green; }"); + } else { + ui->enable->setStyleSheet("QToolButton { background-color : blue; }"); + } +} + void DenoiserGUI::applySettings(bool force) { if (m_doApplySettings) @@ -418,4 +468,8 @@ void DenoiserGUI::makeUIConnections() QObject::connect(ui->channelApply, &QPushButton::clicked, this, &DenoiserGUI::on_channelApply_clicked); QObject::connect(ui->record, &ButtonSwitch::toggled, this, &DenoiserGUI::on_record_toggled); QObject::connect(ui->showFileDialog, &QPushButton::clicked, this, &DenoiserGUI::on_showFileDialog_clicked); + QObject::connect(ui->denoiserType, qOverload(&QComboBox::currentIndexChanged), this, &DenoiserGUI::on_denoiserType_currentIndexChanged); + QObject::connect(ui->enable, &ButtonSwitch::toggled, this, &DenoiserGUI::on_enable_toggled); + QObject::connect(ui->audioMute, &ButtonSwitch::toggled, this, &DenoiserGUI::on_audioMute_toggled); + QObject::connect(ui->volume, &QDial::valueChanged, this, &DenoiserGUI::on_volume_valueChanged); } diff --git a/plugins/feature/denoiser/denoisergui.h b/plugins/feature/denoiser/denoisergui.h index 980a55464..afa3c8d32 100644 --- a/plugins/feature/denoiser/denoisergui.h +++ b/plugins/feature/denoiser/denoisergui.h @@ -78,6 +78,7 @@ private: void applySettings(bool force = false); void displaySettings(); void displaySampleRate(int sampleRate); + void displayNRenabled(); void updateChannelList(); bool handleMessage(const Message& message); void makeUIConnections(); @@ -91,6 +92,10 @@ private slots: void on_channelApply_clicked(); void on_record_toggled(bool checked); void on_showFileDialog_clicked(bool checked); + void on_denoiserType_currentIndexChanged(int index); + void on_enable_toggled(bool checked); + void on_audioMute_toggled(bool checked); + void on_volume_valueChanged(int value); void audioSelect(const QPoint& p); void updateStatus(); void tick(); diff --git a/plugins/feature/denoiser/denoisergui.ui b/plugins/feature/denoiser/denoisergui.ui index e708c6d14..b9e716f9b 100644 --- a/plugins/feature/denoiser/denoisergui.ui +++ b/plugins/feature/denoiser/denoisergui.ui @@ -120,14 +120,11 @@ - (Re) apply channel selection - - - + (Re) associate with channel - :/checkmark.png:/checkmark.png + :/link.png:/link.png @@ -190,7 +187,7 @@ 0 - + Noise reduction scheme @@ -206,6 +203,27 @@ + + + + + 0 + 22 + + + + Denoiser on/off + + + + + + + :/play.png + :/stop.png:/play.png + + + @@ -311,7 +329,7 @@ - Level (% full range) top trace: average, bottom trace: instantaneous peak, tip: peak hold + Input level (% full range) top trace: average, bottom trace: instantaneous peak, tip: peak hold diff --git a/plugins/feature/denoiser/denoisersettings.cpp b/plugins/feature/denoiser/denoisersettings.cpp index 701cfdd8b..e695554f6 100644 --- a/plugins/feature/denoiser/denoisersettings.cpp +++ b/plugins/feature/denoiser/denoisersettings.cpp @@ -43,7 +43,9 @@ void DenoiserSettings::resetToDefaults() { m_denoiserType = DenoiserType::DenoiserType_RNnoise; m_title = "Denoiser"; + m_enableDenoiser = true; m_audioMute = false; + m_volumeTenths = 10; m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; m_rgbColor = 0xffd700; // gold m_useReverseAPI = false; @@ -62,8 +64,6 @@ QByteArray DenoiserSettings::serialize() const SimpleSerializer s(1); s.writeS32(1, static_cast(m_denoiserType)); - s.writeBool(14, m_audioMute); - s.writeString(15, m_audioDeviceName); s.writeString(2, m_title); s.writeU32(3, m_rgbColor); s.writeBool(4, m_useReverseAPI); @@ -80,6 +80,11 @@ QByteArray DenoiserSettings::serialize() const s.writeBlob(13, m_rollupState->serialize()); } + s.writeBool(14, m_audioMute); + s.writeString(15, m_audioDeviceName); + s.writeBool(16, m_enableDenoiser); + s.writeS32(17, m_volumeTenths); + return s.final(); } @@ -101,8 +106,6 @@ bool DenoiserSettings::deserialize(const QByteArray& data) d.readS32(1, &itmp, 1); m_denoiserType = static_cast(itmp); - d.readBool(14, &m_audioMute, false); - d.readString(15, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName); d.readString(2, &m_title, "Denoiser"); d.readU32(3, &m_rgbColor, 0xffd700); // gold d.readBool(4, &m_useReverseAPI, false); @@ -130,6 +133,11 @@ bool DenoiserSettings::deserialize(const QByteArray& data) m_rollupState->deserialize(bytetmp); } + d.readBool(14, &m_audioMute, false); + d.readString(15, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName); + d.readBool(16, &m_enableDenoiser, true); + d.readS32(17, &m_volumeTenths, 10); + return true; } else @@ -144,9 +152,15 @@ void DenoiserSettings::applySettings(const QStringList& settingsKeys, const Deno if (settingsKeys.contains("denoiserType")) { m_denoiserType = settings.m_denoiserType; } + if (settingsKeys.contains("enableDenoiser")) { + m_enableDenoiser = settings.m_enableDenoiser; + } if (settingsKeys.contains("audioMute")) { m_audioMute = settings.m_audioMute; } + if (settingsKeys.contains("volumeTenths")) { + m_volumeTenths = settings.m_volumeTenths; + } if (settingsKeys.contains("audioDeviceName")) { m_audioDeviceName = settings.m_audioDeviceName; } @@ -189,9 +203,15 @@ QString DenoiserSettings::getDebugString(const QStringList& settingsKeys, bool f if (settingsKeys.contains("denoiserType") || force) { debugString += QString("DenoiserType: %1 ").arg(static_cast(m_denoiserType)); } + if (settingsKeys.contains("enableDenoiser") || force) { + debugString += QString("Denoiser Enable: %1 ").arg(m_enableDenoiser ? "true" : "false"); + } if (settingsKeys.contains("audioMute") || force) { debugString += QString("Audio Mute: %1 ").arg(m_audioMute ? "true" : "false"); } + if (settingsKeys.contains("volumeTenths") || force) { + debugString += QString("Volume : %1 ").arg(m_volumeTenths/10.0); + } if (settingsKeys.contains("audioDeviceName") || force) { debugString += QString("Audio Device Name: %1 ").arg(m_audioDeviceName); } diff --git a/plugins/feature/denoiser/denoisersettings.h b/plugins/feature/denoiser/denoisersettings.h index 01e57b6a6..e75a26728 100644 --- a/plugins/feature/denoiser/denoisersettings.h +++ b/plugins/feature/denoiser/denoisersettings.h @@ -32,7 +32,9 @@ struct DenoiserSettings }; DenoiserType m_denoiserType; + bool m_enableDenoiser; bool m_audioMute; + int m_volumeTenths; QString m_audioDeviceName; QString m_title; quint32 m_rgbColor; diff --git a/plugins/feature/denoiser/denoiserworker.cpp b/plugins/feature/denoiser/denoiserworker.cpp index 96040cced..dc5e4a41d 100644 --- a/plugins/feature/denoiser/denoiserworker.cpp +++ b/plugins/feature/denoiser/denoiserworker.cpp @@ -18,9 +18,12 @@ #include "dsp/wavfilerecord.h" #include "audio/audiodevicemanager.h" #include "dsp/dspengine.h" +#include "rnnoise.h" #include "denoiserworker.h" +const int DenoiserWorker::m_levelNbSamples = 480; // 10 ms at 48 kHz + MESSAGE_CLASS_DEFINITION(DenoiserWorker::MsgConfigureDenoiserWorker, Message) MESSAGE_CLASS_DEFINITION(DenoiserWorker::MsgConnectFifo, Message) @@ -35,18 +38,21 @@ DenoiserWorker::DenoiserWorker(QObject *parent) : m_wavFileRecord(nullptr), m_recordSilenceNbSamples(0), m_recordSilenceCount(0), - m_nbBytes(0) + m_nbBytes(0), + m_rnnoiseFill(0) { m_audioBuffer.resize(4800); m_audioBufferFill = 0; m_audioFifo.setSize(4800 * 4); DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(getAudioFifo(), getInputMessageQueue()); + m_rnnoiseState = rnnoise_create(nullptr); } DenoiserWorker::~DenoiserWorker() { m_inputMessageQueue.clear(); DSPEngine::instance()->getAudioDeviceManager()->removeAudioSink(getAudioFifo()); + rnnoise_destroy(m_rnnoiseState); } void DenoiserWorker::reset() @@ -112,11 +118,11 @@ void DenoiserWorker::feedPart( if (m_settings.m_recordToFile && m_wavFileRecord) { - for (int is = 0; is < countSamples; is++) - { - const Sample& sample = m_sampleBuffer[is]; + for (const auto& sample : m_sampleBuffer) { writeSampleToFile(sample); } + + m_sampleBuffer.clear(); } } @@ -200,6 +206,7 @@ bool DenoiserWorker::handleMessage(const Message& cmd) void DenoiserWorker::applySettings(const DenoiserSettings& settings, const QStringList& settingsKeys, bool force) { QMutexLocker mutexLocker(&m_mutex); + qDebug() << "DenoiserWorker::applySettings" << settings.getDebugString(settingsKeys, force) << " force: " << force; if (settingsKeys.contains("fileRecordName") || force) { @@ -261,6 +268,10 @@ void DenoiserWorker::applySettings(const DenoiserSettings& settings, const QStri // TODO: handle sample rate change } + if (settingsKeys.contains("enableDenoiser") || settingsKeys.contains("denoiserType") || force) { + m_rnnoiseFill = 0; + } + if (force) { m_settings = settings; } else { @@ -309,6 +320,11 @@ void DenoiserWorker::handleData() m_dataFifo->readCommit((unsigned int) count); } + + qreal rmsLevel, peakLevel; + int numSamples; + getLevels(rmsLevel, peakLevel, numSamples); + emit levelChanged(rmsLevel, peakLevel, numSamples); } void DenoiserWorker::processSample( @@ -317,32 +333,82 @@ void DenoiserWorker::processSample( int i ) { + // Periodic debug to verify runtime settings and branch selection + // static uint32_t s_dbgCount = 0; + // if ((s_dbgCount++ % 48000) == 0) { // approx. once per second at 48 kS/s + // qDebug() << "DenoiserWorker::processSample: dataType=" << (int)dataType + // << " enable=" << m_settings.m_enableDenoiser + // << " type=" << static_cast(m_settings.m_denoiserType); + // } + switch(dataType) { case DataFifo::DataTypeI16: { int16_t *s = (int16_t*) begin; double re = s[i] / (double) std::numeric_limits::max(); + calculateLevel(re * (m_settings.m_volumeTenths / 10.0)); m_magsq = re*re; m_channelPowerAvg(m_magsq); - m_sampleBuffer[i].setReal(re * SDR_RX_SCALEF); - m_sampleBuffer[i].setImag(0); - - m_audioBuffer[m_audioBufferFill].l = s[i]; - m_audioBuffer[m_audioBufferFill].r = s[i]; - ++m_audioBufferFill; - - if (m_audioBufferFill >= m_audioBuffer.size()) + if (!m_settings.m_enableDenoiser || m_settings.m_denoiserType == DenoiserSettings::DenoiserType::DenoiserType_None) { - std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + // if ((s_dbgCount % 48000) == 1) { + // qDebug() << "DenoiserWorker::processSample[I16]: passthrough branch"; + // } + m_sampleBuffer.push_back(Sample(re * SDR_RX_SCALEF, 0)); + m_audioBuffer[m_audioBufferFill].l = s[i]; + m_audioBuffer[m_audioBufferFill].r = s[i]; + ++m_audioBufferFill; - if (res != m_audioBufferFill) + if (m_audioBufferFill >= m_audioBuffer.size()) { - qDebug("DenoiserWorker::processSample: %lu/%lu audio samples written", res, m_audioBufferFill); - m_audioFifo.clear(); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + if (res != m_audioBufferFill) + { + qDebug("DenoiserWorker::processSample: %lu/%lu audio samples written", res, m_audioBufferFill); + m_audioFifo.clear(); + } + m_audioBufferFill = 0; } + } + else if (m_settings.m_denoiserType == DenoiserSettings::DenoiserType::DenoiserType_RNnoise) + { + // if ((s_dbgCount % 48000) == 1) { + // qDebug() << "DenoiserWorker::processSample[I16]: RNNoise branch"; + // } + // feed RNNoise input buffer + m_rnnoiseIn[m_rnnoiseFill] = static_cast(s[i])*(m_settings.m_volumeTenths / 10.0f); // already in [-32768..32767] range + m_rnnoiseFill++; - m_audioBufferFill = 0; + if (m_rnnoiseFill >= 480) + { + // process RNNoise frame + rnnoise_process_frame(m_rnnoiseState, m_rnnoiseOut, m_rnnoiseIn); + + // output RNNoise processed samples + for (int j = 0; j < 480; j++) + { + float outSample = m_rnnoiseOut[j]; + m_sampleBuffer.push_back(Sample(outSample, 0)); + int16_t audioSample = static_cast(outSample); + m_audioBuffer[m_audioBufferFill].l = audioSample; + m_audioBuffer[m_audioBufferFill].r = audioSample; + ++m_audioBufferFill; + + if (m_audioBufferFill >= m_audioBuffer.size()) + { + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + if (res != m_audioBufferFill) + { + qDebug("DenoiserWorker::processSample: %lu/%lu audio samples written", res, m_audioBufferFill); + m_audioFifo.clear(); + } + m_audioBufferFill = 0; + } + } + + m_rnnoiseFill = 0; + } } } break; @@ -350,29 +416,89 @@ void DenoiserWorker::processSample( int16_t *s = (int16_t*) begin; double re = s[2*i] / (double) std::numeric_limits::max(); double im = s[2*i+1] / (double) std::numeric_limits::max(); + calculateLevel((re + im) * (m_settings.m_volumeTenths / 20.0)); m_magsq = re*re + im*im; m_channelPowerAvg(m_magsq); - m_sampleBuffer[i].setReal(re * SDR_RX_SCALEF); - m_sampleBuffer[i].setImag(im * SDR_RX_SCALEF); - - m_audioBuffer[m_audioBufferFill].l = s[2*i]; - m_audioBuffer[m_audioBufferFill].r = s[2*i+1]; - ++m_audioBufferFill; - - if (m_audioBufferFill >= m_audioBuffer.size()) + if (!m_settings.m_enableDenoiser || m_settings.m_denoiserType == DenoiserSettings::DenoiserType::DenoiserType_None) { - std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + // if ((s_dbgCount % 48000) == 1) { + // qDebug() << "DenoiserWorker::processSample[CI16]: passthrough branch"; + // } + m_sampleBuffer.push_back(Sample(re * SDR_RX_SCALEF, im * SDR_RX_SCALEF)); + m_audioBuffer[m_audioBufferFill].l = s[2*i]; + m_audioBuffer[m_audioBufferFill].r = s[2*i+1]; + ++m_audioBufferFill; - if (res != m_audioBufferFill) + if (m_audioBufferFill >= m_audioBuffer.size()) { - qDebug("DenoiserWorker::processSample: %lu/%lu audio samples written", res, m_audioBufferFill); - m_audioFifo.clear(); + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + if (res != m_audioBufferFill) + { + qDebug("DenoiserWorker::processSample: %lu/%lu audio samples written", res, m_audioBufferFill); + m_audioFifo.clear(); + } + m_audioBufferFill = 0; } + } + else if (m_settings.m_denoiserType == DenoiserSettings::DenoiserType::DenoiserType_RNnoise) + { + // if ((s_dbgCount % 48000) == 1) { + // qDebug() << "DenoiserWorker::processSample[CI16]: RNNoise branch"; + // } + // feed RNNoise input buffer + m_rnnoiseIn[m_rnnoiseFill] = static_cast(s[2*i] + s[2*i+1]) * (m_settings.m_volumeTenths / 20.0f); // average I/Q in [-32768..32767] range + m_rnnoiseFill++; - m_audioBufferFill = 0; + if (m_rnnoiseFill >= 480) + { + // process RNNoise frame + rnnoise_process_frame(m_rnnoiseState, m_rnnoiseOut, m_rnnoiseIn); + + // output RNNoise processed samples + for (int j = 0; j < 480; j++) + { + float outSample = m_rnnoiseOut[j]; + m_sampleBuffer.push_back(Sample(outSample, outSample)); + int16_t audioSample = static_cast(outSample); + m_audioBuffer[m_audioBufferFill].l = audioSample; + m_audioBuffer[m_audioBufferFill].r = audioSample; + ++m_audioBufferFill; + + if (m_audioBufferFill >= m_audioBuffer.size()) + { + std::size_t res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); + if (res != m_audioBufferFill) + { + qDebug("DenoiserWorker::processSample: %lu/%lu audio samples written", res, m_audioBufferFill); + m_audioFifo.clear(); + } + m_audioBufferFill = 0; + } + } + + m_rnnoiseFill = 0; + } } } break; } } + +void DenoiserWorker::calculateLevel(const Real& sample) +{ + if (m_levelCalcCount < m_levelNbSamples) + { + m_peakLevel = std::max(std::fabs(m_peakLevel), sample); + m_levelSum += sample * sample; + m_levelCalcCount++; + } + else + { + m_rmsLevel = sqrt(m_levelSum / m_levelNbSamples); + m_peakLevelOut = m_peakLevel; + m_peakLevel = 0.0f; + m_levelSum = 0.0f; + m_levelCalcCount = 0; + } +} diff --git a/plugins/feature/denoiser/denoiserworker.h b/plugins/feature/denoiser/denoiserworker.h index 4c912ff26..6a4b8e995 100644 --- a/plugins/feature/denoiser/denoiserworker.h +++ b/plugins/feature/denoiser/denoiserworker.h @@ -32,6 +32,7 @@ #include "denoisersettings.h" class WavFileRecord; +class DenoiseState; class DenoiserWorker : public QObject { Q_OBJECT @@ -87,8 +88,23 @@ public: void applySettings(const DenoiserSettings& settings, const QStringList& settingsKeys, bool force = false); double getMagSq() const { return m_magsq; } double getMagSqAvg() const { return (double) m_channelPowerAvg; } + void getLevels(qreal& rmsLevel, qreal& peakLevel, int& numSamples) const + { + rmsLevel = m_rmsLevel; + peakLevel = m_peakLevelOut; + numSamples = m_levelNbSamples; + } - private: +signals: + /** + * Level changed + * \param rmsLevel RMS level in range 0.0 - 1.0 + * \param peakLevel Peak level in range 0.0 - 1.0 + * \param numSamples Number of audio samples analyzed + */ + void levelChanged(qreal rmsLevel, qreal peakLevel, int numSamples); + +private: DataFifo *m_dataFifo; int m_sinkSampleRate; MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication @@ -105,8 +121,21 @@ public: AudioVector m_audioBuffer; AudioFifo m_audioFifo; std::size_t m_audioBufferFill; + DenoiseState *m_rnnoiseState; + float m_rnnoiseIn[480]; + float m_rnnoiseOut[480]; + int m_rnnoiseFill; + + quint32 m_levelCalcCount = 0; + qreal m_rmsLevel; + qreal m_peakLevelOut; + Real m_peakLevel = 0.0f; + Real m_levelSum = 0.0f; + QRecursiveMutex m_mutex; + static const int m_levelNbSamples; + AudioFifo *getAudioFifo() { return &m_audioFifo; } void feedPart( const QByteArray::const_iterator& begin, @@ -116,13 +145,12 @@ public: bool handleMessage(const Message& cmd); void writeSampleToFile(const Sample& sample); - void processSample( DataFifo::DataType dataType, const QByteArray::const_iterator& begin, int i ); - + void calculateLevel(const Real& sample); private slots: void handleInputMessages(); diff --git a/plugins/feature/denoiser/readme.md b/plugins/feature/denoiser/readme.md new file mode 100644 index 000000000..b2b6acafc --- /dev/null +++ b/plugins/feature/denoiser/readme.md @@ -0,0 +1,104 @@ +

Demoiser

+ +

Introduction

+ +This audio denoiser plugin can be used to reduce or remove noise from audio. For now it only implements the RNNoise noise reduction (more details next) + +It connects to the "demod" stream of Rx channels similarly to the Demod analyzer plugin. Hence it covers: + + - AM demodulator + - Broadcast FM demodulator + - NFM demodulator + - SSB demodulator + - WFM demodulator + - WDSP plugin (multimode) + +The following noise reduction schemes are covered. It can be selected via the (6) combo box: + +

RNNoise

+ +Noise reduction based on the RNnoise library originally from J.M. Valin. It uses a fork for easier integration in the build system (Cmake support with download of the model file): https://github.com/f4exb/rnnoise + +The noise reduction is based on a mix of DSP functions and a recursive neural network (RNN). Basically the RNN helps the DSP functions to adjust the gain in various spectral bands thus very efficiently cancelling the background noise in many situations. Although the model was not particularly trained on radio transmissions it makes a pretty good job at AM and SSB noise reduction however you will need a reasonable SNR to get something out of it else it will consider the audio is just noise. Do not expect it to dig signals out of the noise the goal is to reduce ear fatigue by removing background white noise and other noises e.g birdies. It is not good at FM transmissions. + +You will find all the details about RNnoise here: https://jmvalin.ca/demo/rnnoise/ + +Please note the following points: + + - Audio sample rate must be 48 kS/s (check 4) + - When taking the audio source from the WDSP plugin it should be used without noise reduction + - You should have enough input level but not exceed 100% on peaks (check 9 and 10). An average level between 10 and 20% should already provide good results + - The model has been trained on human voice therefore anything else like music is considered to be noise. It may however be successful at selecting the voice from songs. + - It should have enough original spectral components therefore any noise processing before the input will only deteriorate its performance. It should also have enough bandwidth it is recommended to have at least 100-3000 Hz. It is not an issue to extend beyond 3000 Hz because any high frequency hiss will be cancelled and it may benefit from the extra bandwidth on some transmissions. + - With SSB transmisions the pitch should be as close as possible to the natural pitch of the voice. In any case prefer a higher pitch to a lower one. Note that some voices are better processed than others which may also depend on voice processing before transmission. + +

Interface

+ +![Denoiser plugin GUI](../../../doc/img/DenoiserFeature_plugin.png) + +

1: Start/Stop plugin

+ +This button starts or stops the plugin + +

2: Channel selection

+ +Use this combo to select which channel to use for display. Channel is selected at start time and upon change. You may use button (3) to force association with the channel if necessary. + +

3: (Re)apply channel selection

+ +Applies or re-applies channel association (2) so that the channel gets effectively (re)connected to the denoiser. Normally it should not be necessary to use it. + +

4: Input sample rate

+ +This is the input audio stream sample rate and for RNNoise it should always be 48 kS/s + +

5: Input power

+ +Indication of the input audio stream power + +

6: Noise reduction scheme

+ +Selects the noise reduction scheme + + - **None**: No noise reduction (passthrough) + - **RNnoise**: RNNoise (see introduction) + +

7: Noise reduction enable

+ +Enable or disable noise reduction. When disabled it just passes audio through + +

8: Audio mute and device selection

+ + - Left click: Mute or unmute audio + - Right click: opens a dialog to select audio output device + +

9: Input volume

+ +This button lets you adjust the input volume. Adjust for best dynamic but the peaks should not exceed 100% as displayed in the VU meter next (10) + +

10: Input VU meter

+ +This is the VU meter of the audio entering the noise reduction block. The peaks should not exceed 100% + +

11: Record audio output

+ +Start/stop recording. Each start -> stop creates a new record file (see next) + +

12: Select output record file

+ +Click on this icon to open a file selection dialog that lets you specify the location and name of the output files. + +Each recording is written in a new file with the starting timestamp before the `.wav` extension in `yyyy-MM-ddTHH_mm_ss_zzz` format. It keeps the first dot limited groups of the filename before the `.wav` extension if there are two such groups or before the two last groups if there are more than two groups. Examples: + + - Given file name: `test.wav` then a recording file will be like: `test.2020-08-05T21_39_07_974.wav` + - Given file name: `test.2020-08-05T20_36_15_974.wav` then a recording file will be like (with timestamp updated): `test.2020-08-05T21_41_21_173.wav` + - Given file name: `test.first.wav` then a recording file will be like: `test.2020-08-05T22_00_07_974.wav` + - Given file name: `record.test.first.wav` then a recording file will be like: `record.test.2020-08-05T21_39_52_974.wav` + +If a filename is given without `.wav` extension then the `.wav` extension is appended automatically before the above algorithm is applied. If a filename is given with an extension different of `.wav` then the extension is replaced by `.wav` automatically before the above algorithm is applied. + +The file path currently being written (or last closed) appears at the right of the button (13). + +

13: Output record file name

+ +File path currently being written (or last closed) diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 8504b3d9c..e995e1a89 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -5646,6 +5646,18 @@ margin-bottom: 20px; "type" : "integer", "description" : "Denoiser type\n * 0 - none\n * 1 - RNnoise\n" }, + "enableDenoiser" : { + "type" : "integer", + "description" : "Enable denoiser\n * 1 - enable\n * 0 - disable\n" + }, + "volumeTenths" : { + "type" : "integer", + "description" : "Output volume in tenths (e.g., 10 = 1.0)\n" + }, + "audioDeviceName" : { + "type" : "string", + "description" : "Audio output device name" + }, "audioMute" : { "type" : "integer", "description" : "Audio mute\n * 1 - mute\n * 0 - unmute\n" @@ -59720,7 +59732,7 @@ except ApiException as e:
- Generated 2026-01-06T07:31:33.605+01:00 + Generated 2026-01-10T11:16:10.140+01:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/Denoiser.yaml b/sdrbase/resources/webapi/doc/swagger/include/Denoiser.yaml index d0da09d97..3908b2c41 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/Denoiser.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/Denoiser.yaml @@ -7,6 +7,19 @@ DenoiserSettings: Denoiser type * 0 - none * 1 - RNnoise + enableDenoiser: + type: integer + description: > + Enable denoiser + * 1 - enable + * 0 - disable + volumeTenths: + type: integer + description: > + Output volume in tenths (e.g., 10 = 1.0) + audioDeviceName: + type: string + description: Audio output device name audioMute: type: integer description: > diff --git a/swagger/sdrangel/api/swagger/include/Denoiser.yaml b/swagger/sdrangel/api/swagger/include/Denoiser.yaml index 8739e4c56..dbc911e00 100644 --- a/swagger/sdrangel/api/swagger/include/Denoiser.yaml +++ b/swagger/sdrangel/api/swagger/include/Denoiser.yaml @@ -7,6 +7,19 @@ DenoiserSettings: Denoiser type * 0 - none * 1 - RNnoise + enableDenoiser: + type: integer + description: > + Enable denoiser + * 1 - enable + * 0 - disable + volumeTenths: + type: integer + description: > + Output volume in tenths (e.g., 10 = 1.0) + audioDeviceName: + type: string + description: Audio output device name audioMute: type: integer description: > diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 8504b3d9c..e995e1a89 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -5646,6 +5646,18 @@ margin-bottom: 20px; "type" : "integer", "description" : "Denoiser type\n * 0 - none\n * 1 - RNnoise\n" }, + "enableDenoiser" : { + "type" : "integer", + "description" : "Enable denoiser\n * 1 - enable\n * 0 - disable\n" + }, + "volumeTenths" : { + "type" : "integer", + "description" : "Output volume in tenths (e.g., 10 = 1.0)\n" + }, + "audioDeviceName" : { + "type" : "string", + "description" : "Audio output device name" + }, "audioMute" : { "type" : "integer", "description" : "Audio mute\n * 1 - mute\n * 0 - unmute\n" @@ -59720,7 +59732,7 @@ except ApiException as e:
- Generated 2026-01-06T07:31:33.605+01:00 + Generated 2026-01-10T11:16:10.140+01:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.cpp index dfcdf27c3..0c154a9d2 100644 --- a/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.cpp @@ -30,6 +30,12 @@ SWGDenoiserSettings::SWGDenoiserSettings(QString* json) { SWGDenoiserSettings::SWGDenoiserSettings() { denoiser_type = 0; m_denoiser_type_isSet = false; + enable_denoiser = 0; + m_enable_denoiser_isSet = false; + volume_tenths = 0; + m_volume_tenths_isSet = false; + audio_device_name = nullptr; + m_audio_device_name_isSet = false; audio_mute = 0; m_audio_mute_isSet = false; title = nullptr; @@ -62,6 +68,12 @@ void SWGDenoiserSettings::init() { denoiser_type = 0; m_denoiser_type_isSet = false; + enable_denoiser = 0; + m_enable_denoiser_isSet = false; + volume_tenths = 0; + m_volume_tenths_isSet = false; + audio_device_name = new QString(""); + m_audio_device_name_isSet = false; audio_mute = 0; m_audio_mute_isSet = false; title = new QString(""); @@ -90,6 +102,11 @@ void SWGDenoiserSettings::cleanup() { + + if(audio_device_name != nullptr) { + delete audio_device_name; + } + if(title != nullptr) { delete title; } @@ -123,6 +140,12 @@ void SWGDenoiserSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&denoiser_type, pJson["denoiserType"], "qint32", ""); + ::SWGSDRangel::setValue(&enable_denoiser, pJson["enableDenoiser"], "qint32", ""); + + ::SWGSDRangel::setValue(&volume_tenths, pJson["volumeTenths"], "qint32", ""); + + ::SWGSDRangel::setValue(&audio_device_name, pJson["audioDeviceName"], "QString", "QString"); + ::SWGSDRangel::setValue(&audio_mute, pJson["audioMute"], "qint32", ""); ::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString"); @@ -164,6 +187,15 @@ SWGDenoiserSettings::asJsonObject() { if(m_denoiser_type_isSet){ obj->insert("denoiserType", QJsonValue(denoiser_type)); } + if(m_enable_denoiser_isSet){ + obj->insert("enableDenoiser", QJsonValue(enable_denoiser)); + } + if(m_volume_tenths_isSet){ + obj->insert("volumeTenths", QJsonValue(volume_tenths)); + } + if(audio_device_name != nullptr && *audio_device_name != QString("")){ + toJsonValue(QString("audioDeviceName"), audio_device_name, obj, QString("QString")); + } if(m_audio_mute_isSet){ obj->insert("audioMute", QJsonValue(audio_mute)); } @@ -211,6 +243,36 @@ SWGDenoiserSettings::setDenoiserType(qint32 denoiser_type) { this->m_denoiser_type_isSet = true; } +qint32 +SWGDenoiserSettings::getEnableDenoiser() { + return enable_denoiser; +} +void +SWGDenoiserSettings::setEnableDenoiser(qint32 enable_denoiser) { + this->enable_denoiser = enable_denoiser; + this->m_enable_denoiser_isSet = true; +} + +qint32 +SWGDenoiserSettings::getVolumeTenths() { + return volume_tenths; +} +void +SWGDenoiserSettings::setVolumeTenths(qint32 volume_tenths) { + this->volume_tenths = volume_tenths; + this->m_volume_tenths_isSet = true; +} + +QString* +SWGDenoiserSettings::getAudioDeviceName() { + return audio_device_name; +} +void +SWGDenoiserSettings::setAudioDeviceName(QString* audio_device_name) { + this->audio_device_name = audio_device_name; + this->m_audio_device_name_isSet = true; +} + qint32 SWGDenoiserSettings::getAudioMute() { return audio_mute; @@ -329,6 +391,15 @@ SWGDenoiserSettings::isSet(){ if(m_denoiser_type_isSet){ isObjectUpdated = true; break; } + if(m_enable_denoiser_isSet){ + isObjectUpdated = true; break; + } + if(m_volume_tenths_isSet){ + isObjectUpdated = true; break; + } + if(audio_device_name && *audio_device_name != QString("")){ + isObjectUpdated = true; break; + } if(m_audio_mute_isSet){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.h b/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.h index e8d13a618..9fa837426 100644 --- a/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGDenoiserSettings.h @@ -46,6 +46,15 @@ public: qint32 getDenoiserType(); void setDenoiserType(qint32 denoiser_type); + qint32 getEnableDenoiser(); + void setEnableDenoiser(qint32 enable_denoiser); + + qint32 getVolumeTenths(); + void setVolumeTenths(qint32 volume_tenths); + + QString* getAudioDeviceName(); + void setAudioDeviceName(QString* audio_device_name); + qint32 getAudioMute(); void setAudioMute(qint32 audio_mute); @@ -86,6 +95,15 @@ private: qint32 denoiser_type; bool m_denoiser_type_isSet; + qint32 enable_denoiser; + bool m_enable_denoiser_isSet; + + qint32 volume_tenths; + bool m_volume_tenths_isSet; + + QString* audio_device_name; + bool m_audio_device_name_isSet; + qint32 audio_mute; bool m_audio_mute_isSet;