From dcf916e7159c6fd4e9224d963f37a8661e1dfdc2 Mon Sep 17 00:00:00 2001 From: Jiri Mencak Date: Sat, 20 Feb 2021 13:29:16 +0100 Subject: [PATCH] Add distinct audio notification with rate-limiting. Introducing optionally configurable distinct audio notification with an optional delay between them. This is configurable in app/public/config/config.js via the "notificationSounds" object. Added two sample audio files. - notify-chat.mp3: from sound-theme-freedesktop (Debian) package; Copyright: Ivica Bukvic; License: CC-BY-SA-3.0 - notify-hand.mp3: from https://samplefocus.com/collections/notification-sounds License: Public Domain --- app/public/config/config.example.js | 20 +++++++++++++ app/public/sounds/notify-chat.mp3 | Bin 0 -> 6104 bytes app/public/sounds/notify-hand.mp3 | Bin 0 -> 17135 bytes app/src/RoomClient.js | 42 +++++++++++++++++++++------- 4 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 app/public/sounds/notify-chat.mp3 create mode 100644 app/public/sounds/notify-hand.mp3 diff --git a/app/public/config/config.example.js b/app/public/config/config.example.js index 71e2645c..33ddfaa8 100644 --- a/app/public/config/config.example.js +++ b/app/public/config/config.example.js @@ -153,6 +153,26 @@ var config = drawerOverlayed : true, // Position of notifications notificationPosition : 'right', + /** + * Set the notificationSounds. Valid keys are: + * 'parkedPeer', 'parkedPeers', 'raisedHand', 'chatMessage', + * 'sendFile', 'newPeer' and 'default'. + * + * Not defining a key is equivalent to using the default notification sound. + * Setting 'play' to null disables the sound notification. + */ + notificationSounds : { + chatMessage : { + play : '/sounds/notify-chat.mp3', + }, + raisedHand : { + play : '/sounds/notify-hand.mp3', + }, + default : { + delay : 5000, // minimum delay between alert sounds [ms] + play : '/sounds/notify.mp3', + }, + }, // Timeout for autohiding topbar and button control bar hideTimeout : 3000, // max number of participant that will be visible in diff --git a/app/public/sounds/notify-chat.mp3 b/app/public/sounds/notify-chat.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8de9039f05c2ae73fb2fbcc9de49d54e3eeb4694 GIT binary patch literal 6104 zcmeI0XHXQ)x`1bw1(scM&RJOU5(PvhE;&jTkPMPDf?-#JfG!9K2PU{<=?1b-z8`HPiDxHPbVrtu74%&fzn?aYN&*rUC#W zJ%J1UHOB)95;kosvZU9=L@~fpHjJ<2t2^{I-9M z5(?nB;Y4QZ5i^C(7oZ zqtapv3MP(beiTlz1%X}vK*QfHm-7n&pHL(+HKM=F^BzgTlR@*#RT*`QDR2KTI2#wu;UNj;=Jz~f5-#Op30sGnx|wgk z3Ju4>++z?lal8ehz|$zKFChtF{Fd0Sp%}#nL1F-Mgp~`4D~9+o#4BTirI0_v?{3~o zU#-UgJxP2ajkfD^McvdVc`r9V2SxMW6nNkjQhQjHVQn4WZrsDSHel@J@gd`}TAgit zi1RQ*+K;9u^y9aFccV)SkmSD2lqY3NheK=1@P$$1)u zD{jm6GbVdMs?IGcruyA!p~^+$C-tLqLrk%e$~-zw+S1CpE@49M?^E>ZXSm3{NmZuSnBRG=Wh<#cuSp&_HBbE{NVy1~=m0{o%&l|jnPh~FXZ(s<`;=W2R z^u$2Ec*!H=_K7Y)WIU9}TQMyudLV5)2M=ZEwO@`AQj|+5KwBVKH?CTR+!?<&wcsHH zm;~s>_7gB0i`v;HDakEQ?6LOGevs|iH2 zIcrCjRr3L)q(o-LUoXkj9*9V`S_d)URw;ATugYX*7ezdEWi>T^we_VB@fZ%BKZp&F zFM6)?z$C7;bkQZ0Yqjf$@ex#yF}!$jMy_7rhPr!8nv{}Kt9yO2Es#QT;sh0C-_v-acLPa8>iSL0jL;OV*eB{0 zQ+>BJK`dDMbGdaJv<4C(O8cVyaVTn>qkX;#xjS^11G?B+I*Mn3@~x6)bs!=yC3TT0 zAY?lS*dKE^{3N&v*J+njM-s{~=yOAyu|yO+-6Gm*%DT>E`YuH77yVF)w;Y@J3VhWW5;Qmx|K3PUhYStv1PKgK#zm)rWx^f;G&GMjlpp z>?hDLpn;tgLAv`yxA9$9WY+E{?|o~;=oSITDX zk<6A0s<0CkAj&9NW;~%>Ay@zO`uE@6!4TgzU+}n29m*+&usriwgU5V8Y7&d{}J4V-V`%yq>SeI;6YdEQE1)_?! z&<641_qRKCj6>Rs7>93ETbI9kcYU?#6a-JY=sK-UWKPoK)Hf~d)$g_jVvCn0EdlDJ zi0wPWEPB&L59ad1H#yx;<1Hj!+6{2ZY_Z37s@2giv+52HJPrQA4yHov}Ua z>H8Ik5iLM)c*NdTxcrU+=;lU9*`<*~{rDiHxnUzCbv&^QGFD>Fez_KVVCQ@hA2=E) zdx+<(tMa!@pH6Q)c~Ti~v-?`e-@>pQ+`)oRgaIj{xb06;t|}F(0>{1VOq~8Ay0us` zjUVz>>wPto>ibKPQ|E?g0qC53j}x3-S%Y6e*tyf4N{oq7>=K3YpTzthk@4x&M;0}A zAN-^zgE1c^7Qn1*+bu1wjy&ZEUbKT=TB7e~Fy*VYP%~G6Z+wf^hNWNn| zJkm4SD>?N=^`G>$!cM3!E1e!v+)wE=6Nlel<%agYl>Mou`m&W2WoBqB6G++1tF2k-#%M6CuQtoyo8(}TrR?7>t);~*lwAw4W5IHn+f`fmC;s6! zN0N`4Tj{!nyUJrCou^jd>t=l>Z@u5P>I`n(W9OIDj!hB5NN|j{CY>I_AbA*oo@axz zUPhJSO&@E3A61G(;O%FwR9(9*o$E#FK9t2okq?zuF^xB>HLm9vick8>#JNC$h{(ypC`FJie9j3QLoj7?kU!T^F-#6wv6k-tL0;WRF&P6F$(#H&}eO&HFs@*>iE$DZOro%TB9OmAs@S7`1I;$>eA= z`RXWoC5$PCNv@0X#mS`j^Ov`*O%p_?6^k^LKUZW45>>FJePWa3(IbD;oehMmbYI^h z!e+jWBth7Z7--$^sdIDL-kWR}kc}7B_$@nLlYILS3xau8ZL|2?a=QBfL`OrJWF$1I zmGlPsr`0L_a?D~T^Js7O;pG=Wk6Mcy7#rL3rC`-{?}yPp*Q1L;u;I&%*Kcj3pc~Mx zu5MZgy^>Hvr;SdBmE;lwE2)ENQc#3q$mt95nYJMkCVj>de%aG%(`u1WTS8-|*IcBi zmXJ1pX)OqHI3R*bmL#7WQU-`fcrbnPXnSQxtpj_MBO<+-OO)ADg+I~h%utE(5n|qU zhh9QD>+VFZsgV{7P1A=kUN3pn;No+d`SP2>_f)3K#IE&kD@(-{;cwDq{1jtuv9k;vloAqHCPOZ24AR`Z#Hsq_hZ}F% zz5QHixCOSY!FSBJ?Kcz}t1RA*K2BzJbKgA{f2dEwvgasc9@1SxLP{%?ytKNHgzK}O%gs%zoG@?euRuXt<0?Wl#H{=^P;#KrHy$k z)%rBBXR&Vqh8socnCG1vx`m@{MR)5`vF51qGZXB2y%75ie0a16Zku@Caw{I!86dzL zfRrUyip&Vwl{ajPd!Eemio1OijIRaS34QBEK^^wOA?j`5-u>_s>>+SPr@h%k zkjE~1pX!4=oX5{xUsFS0rF5>q$%&k%W*)aH7n0`66f~$>@>OKodO3K39AKg}4$1SCczClcN@_}BO^fyZ?{a}&n5u?HjmMklit4}1r z$Dw6v3c+DpJumjzwS9BLxmmun{6VnNlsI)#Qp}pYMOD8xbAcR5W+mOpFlFw%=Tk^6 ztu3wZa$MsSqnT$YE}DbMNh2nYwz1t%M#Cvw7clga0^KFYwtT|K*G{V5HB+*$73vq} z+4gqcmKs65ptwt&w!%;vwGwZ!5MGKNLd=9BJGHExj`-LI6#;u&q-TnXBP`C%QnFUI zL^C%-3{u?bFC5xQV)Uhl8|}yO6m>M*FZMmoGx}!pZ{PE`$Pp;*iH7iW*J0jDG$P*E`(U?;VCx)TW zV&n=DHR|dqzw_&eCyvoA6YqA8@jDGikA_Qc zH`mt;YVWZGYs`ulr)m^VP0_=sbW)(u+6-L;A-9?6)4oi-`b`bzhtpQwGut@+@A?8| z4x3Ur<9;|+;oT>LYKCf^Qx#^9Id+o_w}J^`=4x;i=XZo>=!rV~eEQDau@%NdgVt~^ zY?~PXk4!}o^~%jUZ##aEc@{0tVDhWHtb-6JWAt})TBo)<$D{6?JJe1ebak`Uwu+ZF z*UCZga5pz|yt#;@3LrB}0w@!0=6)9WYTWivP3bX7&VV*cjA>P>6!tfWH9U(c6i;Xx zFH+0j6Zb28u0OPSZm1T3hO=quQc>IMT1)_cYg-8*cuswUD}r2eL`KtZDDuEhYzq-Mfe48tr74>A1NMQ1|3v)Y$bq z0+QrUa!m7z7~p+w4BZS@K9C?7P~Wyxro}4Ew`aCS19EcMg@s2&Gheq z4Z%IrqGYlh1rNshD#x#e^DW*p6Mdo(fV|L*?`jxJaL;c`+o&iX=qJ}>nVydx_Hz>q z;-5n%D;`($gb+(@m$Lc#NcD@i=-}y-K%5a0s~kBr;mGQ5BHrQnlkz6>A>5_Rvkq8EzggN zucZyc-SSzH@xSv+7nG7eE1@viN8&YHz8eNb>T0hNS5;C`Ed*3hZ^(=Mi5X8}_2-FN zqT?>q(^-GvO0lFdC_6Y+2AT3hHpF<4o)S;8WyRa3P2v5heLJHo< zJkSbkpc;6`l5`p6S(eN4OW*eIm=+nunM-qY_)24|$4ei}icgNs_Dc0ERNlUPO zzvtGb<4f7Jxrouo=(D%_5~_|YtFjUeylSmRqJxG?pKc6?KtoHJq@1K~zmRJ0EelJ# z6pSeu%wTk(jd2-1lXEK$gSkT8BfSR!s zdL57D>}hcETmO}lqh%6fbq%7cx>)LL?-!&l=1FP2%*%3&$aHVbR71d-QrB z!*d{6T?4|!#6&p|);3y)ot&J%vN*tMZ2tN4=YcTrkLlXln$_b724y0$8YAtZm{*q8 zMOd)<#11t(eJ9^FI{d|{#Df2=9k9gq|G>e2&hNRQl&9M)UQ$FvG6DQKq^z*Bk758) XbXIT!fJ{38!2a_Q{=fIXn}L4-8#}17 literal 0 HcmV?d00001 diff --git a/app/public/sounds/notify-hand.mp3 b/app/public/sounds/notify-hand.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1fc9438d50aa640c18a9c77d3c67d22ed80b6b96 GIT binary patch literal 17135 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 j4j=ew@MGi@0FcTa-yWYw6nZ>>{