/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 Ġ- ĠPresent , Ġ 8 x 8 ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . j its i . nl j . transform . node . incoming Ċ Ċ import Ġorg . j its i . nl j . Audio Level Listener Ċ import Ġorg . j its i . nl j . Packet Info Ċ import Ġorg . j its i . nl j . rtp . Audio R tp Packet Ċ import Ġorg . j its i . nl j . rtp . R tp Extension Type . SS RC _ AUDIO _ LEVEL Ċ import Ġorg . j its i . nl j . stats . Node Stats Block Ċ import Ġorg . j its i . nl j . transform . node . Observer Node Ċ import Ġorg . j its i . nl j . util . ReadOnly Stream Information Store Ċ import Ġorg . j its i . rtp . extensions . unsigned . to Positive Long Ċ import Ġorg . j its i . rtp . rtp . header _ extensions . Audio Level Header Extension Ċ Ċ /** Ċ Ġ* Ġhttps :// tools . ietf . org / html / rfc 6 4 6 4 # section - 3 Ċ Ġ*/ Ċ class ĠAudio Level Reader ( ĊĠĠĠ Ġstream Information Store : ĠReadOnly Stream Information Store Ċ ) Ġ: ĠObserver Node (" Audio Ġlevel Ġreader ") Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġaudio Level Ext Id : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġaudio Level Listener : ĠAudio Level Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnum Sil ence Packets Dis carded Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġor Ġnot Ġwe Ġshould Ġfor c ibly Ġmute Ġthis Ġaudio Ġstream Ġ( by Ġsetting Ġshould Discard Ġto Ġtrue ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġforce Mute : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstream Information Store . on R tp Extension Mapping ( SS RC _ AUDIO _ LEVEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Level Ext Id Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve ( packet Info : ĠPacket Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaudio R tp Packet Ġ= Ġpacket Info . packet Ġas ? ĠAudio R tp Packet Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġaudio Level Ext Id ?. let Ġ{ Ġaudio Level Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio R tp Packet . getHeader Extension ( audio Level Id )?. let Ġ{ Ġext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= ĠAudio Level Header Extension . get Audio Level ( ext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( level Ġ== ĠMUT ED _ LEVEL Ġ|| Ġthis . force Mute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpacket Info . should Discard Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Sil ence Packets Dis carded ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Level Listener ?. on Level Received ( audio R tp Packet . ss rc , Ġ( 1 2 7 Ġ- Ġlevel ). to Positive Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetNode Stats (): ĠNode Stats Block Ġ= Ġsuper . getNode Stats (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd String (" audio _ level _ ext _ id ", Ġaudio Level Ext Id . toString ()) ĊĠĠĠĠĠĠĠ Ġadd Number (" num _ sil ence _ packets _ dis carded ", Ġnum Sil ence Packets Dis carded ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtrace ( f : Ġ() Ġ-> ĠUnit ) Ġ= Ġf . invoke () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMUT ED _ LEVEL Ġ= Ġ 1 2 7 ĊĠĠĠ Ġ} Ċ } Ċ