/* ĠCopyright Ġ( c ) Ġ 2 0 0 7 - 2 0 0 8 ĠC SI RO ĊĠĠ ĠCopyright Ġ( c ) Ġ 2 0 0 7 - 2 0 1 1 ĠX iph . Org ĠFoundation ĊĠĠ ĠOrigin ally Ġwritten Ġby ĠJean - Mar c ĠVal in , ĠG reg ory ĠMax well , ĠKo en ĠV os , ĊĠĠ ĠTim oth y ĠB . ĠTer rib erry , Ġand Ġthe ĠOp us Ġopen - source Ġcontributors ĊĠĠ ĠPort ed Ġto ĠJava Ġby ĠLog an ĠSt rom berg ĊĊĠĠ ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout ĊĠĠ Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions ĊĠĠ Ġare Ġmet : ĊĊĠĠ Ġ- ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright ĊĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . ĊĊĠĠ Ġ- ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright ĊĠĠ Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe ĊĠĠ Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . ĊĊĠĠ Ġ- ĠNeither Ġthe Ġname Ġof ĠInternet ĠSociety , ĠI ET F Ġor ĠI ET F ĠTrust , Ġnor Ġthe ĊĠĠ Ġnames Ġof Ġspecific Ġcontributors , Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote ĊĠĠ Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten ĊĠĠ Ġpermission . ĊĊĠĠ ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS ĊĠĠ Ġ`` AS ĠIS '' ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĊĠĠ ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĊĠĠ ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠOWNER ĊĠĠ ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĊĠĠ ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĊĠĠ ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĊĠĠ ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĊĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĊĠĠ ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĊĠĠ ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . so y wiz . kor au . format . org . con cent us Ċ Ċ class ĠOp us MS Decoder Ġprivate Ġconstructor ( nb _ streams : ĠInt , Ġnb _ coup led _ streams : ĠInt ) Ġ{ ĊĊĠĠĠ Ġinternal Ġvar Ġlayout Ġ= ĠChannel Layout () ĊĠĠĠ Ġinternal Ġvar Ġde coders : ĠArray < Op us Decoder >? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġbandwidth : ĠOp us Bandwidth ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de coders Ġ== Ġnull Ġ|| Ġde coders !!. size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Decoder Ġnot Ġinitialized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġde coders ! ![ 0 ]. bandwidth ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsample Rate : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de coders Ġ== Ġnull Ġ|| Ġde coders !!. size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Decoder Ġnot Ġinitialized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġde coders ! ![ 0 ]. sample Rate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġgain : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de coders Ġ== Ġnull Ġ|| Ġde coders !!. size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Decoder Ġnot Ġinitialized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġde coders ! ![ 0 ]. gain ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġ 0 Ġuntil Ġlayout . nb _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde coders ! ![ s ]. gain Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlast Packet Duration : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( de coders Ġ== Ġnull Ġ|| Ġde coders !!. size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOp us Error . OP US _ INVALID _ STATE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġde coders ! ![ 0 ]. last Packet Duration ĊĊĠĠĠ Ġval Ġfinal Range : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġ 0 Ġuntil Ġlayout . nb _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue Ġxor Ġde coders ! ![ s ]. final Range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġde coders Ġ= ĠArray ( nb _ streams ) Ġ{ ĠOp us Decoder () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġop us _ mult istream _ decoder _ init ( ĊĠĠĠĠĠĠĠ ĠFs : ĠInt , ĊĠĠĠĠĠĠĠ Ġchannels : ĠInt , ĊĠĠĠĠĠĠĠ Ġstreams : ĠInt , ĊĠĠĠĠĠĠĠ Ġcoup led _ streams : ĠInt , ĊĠĠĠĠĠĠĠ Ġmapping : ĠShort Array ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġret : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġdecoder _ ptr Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( channels Ġ> Ġ 2 5 5 Ġ|| Ġchannels Ġ< Ġ 1 Ġ|| Ġcoup led _ streams Ġ> Ġstreams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġstreams Ġ< Ġ 1 Ġ|| Ġcoup led _ streams Ġ< Ġ 0 Ġ|| Ġstreams Ġ> Ġ 2 5 5 Ġ- Ġcoup led _ streams ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġchannel Ġor Ġcoup led Ġstream Ġcount ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . layout . nb _ channels Ġ= Ġchannels ĊĠĠĠĠĠĠĠ Ġthis . layout . nb _ streams Ġ= Ġstreams ĊĠĠĠĠĠĠĠ Ġthis . layout . nb _ coup led _ streams Ġ= Ġcoup led _ streams ĊĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġthis . layout . nb _ channels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . layout . mapping [ i ] Ġ= Ġmapping [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Op us Mult istream . validate _ layout ( this . layout ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġsur round Ġchannel Ġlayout ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġthis . layout . nb _ coup led _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġthis . de coders ! ![ decoder _ ptr ]. opus _ decoder _ init ( Fs , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ!= ĠOp us Error . OP US _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecoder _ ptr ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġthis . layout . nb _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġthis . de coders ! ![ decoder _ ptr ]. opus _ decoder _ init ( Fs , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ!= ĠOp us Error . OP US _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecoder _ ptr ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ OK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġop us _ mult istream _ decode _ native ( ĊĠĠĠĠĠĠĠ Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġdata _ ptr : ĠInt , ĊĠĠĠĠĠĠĠ Ġlen : ĠInt , ĊĠĠĠĠĠĠĠ Ġp cm : ĠShort Array , ĊĠĠĠĠĠĠĠ Ġp cm _ ptr : ĠInt , ĊĠĠĠĠĠĠĠ Ġframe _ size : ĠInt , ĊĠĠĠĠĠĠĠ Ġdecode _ fec : ĠInt , ĊĠĠĠĠĠĠĠ Ġsoft _ clip : ĠInt ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdata _ ptr Ġ= Ġdata _ ptr ĊĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġlen ĊĠĠĠĠĠĠĠ Ġvar Ġframe _ size Ġ= Ġframe _ size ĊĠĠĠĠĠĠĠ Ġval ĠFs : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġs : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġc : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġdecoder _ ptr : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġdo _ pl c Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġbuf : ĠShort Array ĊĊĠĠĠĠĠĠĠ Ġ/* ĠLimit Ġframe _ size Ġto Ġavoid Ġexcess ive Ġstack Ġallocations . Ġ*/ ĊĠĠĠĠĠĠĠ ĠFs Ġ= Ġthis . sample Rate ĊĠĠĠĠĠĠĠ Ġframe _ size Ġ= ĠIn lines . IM IN ( frame _ size , ĠFs Ġ/ Ġ 2 5 Ġ* Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġbuf Ġ= ĠShort Array ( 2 Ġ* Ġframe _ size ) ĊĠĠĠĠĠĠĠ Ġdecoder _ ptr Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo _ pl c Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ BAD _ ARG ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( do _ pl c Ġ== Ġ 0 Ġ&& Ġlen Ġ< Ġ 2 Ġ* Ġthis . layout . nb _ streams Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ INVALID _ PACKET ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( do _ pl c Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġop us _ mult istream _ packet _ validate ( data , Ġdata _ ptr , Ġlen , Ġthis . layout . nb _ streams , ĠFs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ret Ġ> Ġframe _ size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ BUFFER _ TOO _ SMALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġs Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġthis . layout . nb _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdec : ĠOp us Decoder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdec Ġ= Ġthis . de coders ! ![ decoder _ ptr ++] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( do _ pl c Ġ== Ġ 0 Ġ&& Ġlen Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ INTERNAL _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpacket _ offset Ġ= ĠBox ed Value Int ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġdec . opus _ decode _ native ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , Ġdata _ ptr , Ġlen , Ġbuf , Ġ 0 , Ġframe _ size , Ġdecode _ fec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ!= Ġthis . layout . nb _ streams Ġ- Ġ 1 ) Ġ 1 Ġelse Ġ 0 , Ġpacket _ offset , Ġsoft _ clip ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata _ ptr Ġ+= Ġpacket _ offset . Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ-= Ġpacket _ offset . Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe _ size Ġ= Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ< Ġthis . layout . nb _ coup led _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchan : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠCopy Ġ" left " Ġaudio Ġto Ġthe Ġchannel ( s ) Ġwhere Ġit Ġbelongs Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ Ċĉĉĉĉ ĉ chan Ġ= ĠOp us Mult istream . get _ left _ channel ( this . layout , Ġs , Ġprev ) Ċĉĉĉĉ ĉ if Ġ( chan Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop us _ copy _ channel _ out _ short ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp cm , Ġp cm _ ptr , Ġthis . layout . nb _ channels , Ġchan , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf , Ġ 0 , Ġ 2 , Ġframe _ size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġchan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠCopy Ġ" right " Ġaudio Ġto Ġthe Ġchannel ( s ) Ġwhere Ġit Ġbelongs Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ Ċĉĉĉĉ ĉ chan Ġ= ĠOp us Mult istream . get _ right _ channel ( this . layout , Ġs , Ġprev ) Ċĉĉĉĉ ĉ if Ġ( chan Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop us _ copy _ channel _ out _ short ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp cm , Ġp cm _ ptr , Ġthis . layout . nb _ channels , Ġchan , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf , Ġ 1 , Ġ 2 , Ġframe _ size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġchan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchan : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠCopy Ġaudio Ġto Ġthe Ġchannel ( s ) Ġwhere Ġit Ġbelongs Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ Ċĉĉĉĉ ĉ chan Ġ= ĠOp us Mult istream . get _ mono _ channel ( this . layout , Ġs , Ġprev ) Ċĉĉĉĉ ĉ if Ġ( chan Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop us _ copy _ channel _ out _ short ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp cm , Ġp cm _ ptr , Ġthis . layout . nb _ channels , Ġchan , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf , Ġ 0 , Ġ 1 , Ġframe _ size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġchan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* ĠHandle Ġmut ed Ġchannels Ġ*/ ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( c Ġ< Ġthis . layout . nb _ channels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . layout . mapping [ c ]. toInt () Ġ== Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop us _ copy _ channel _ out _ short ( pcm , Ġp cm _ ptr , Ġthis . layout . nb _ channels , Ġc , Ġnull , Ġ 0 , Ġ 0 , Ġframe _ size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġframe _ size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode Mult istream ( ĊĠĠĠĠĠĠĠ Ġdata : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġdata _ offset : ĠInt , ĊĠĠĠĠĠĠĠ Ġlen : ĠInt , ĊĠĠĠĠĠĠĠ Ġout _ pcm : ĠShort Array , ĊĠĠĠĠĠĠĠ Ġout _ pcm _ offset : ĠInt , ĊĠĠĠĠĠĠĠ Ġframe _ size : ĠInt , ĊĠĠĠĠĠĠĠ Ġdecode _ fec : ĠInt ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġop us _ mult istream _ decode _ native ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , Ġdata _ offset , Ġlen , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout _ pcm , Ġout _ pcm _ offset , Ġframe _ size , Ġdecode _ fec , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠRe setState () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġ 0 Ġuntil Ġlayout . nb _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġde coders ! ![ s ]. reset State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠGet Mult istream Decoder State ( stream Id : ĠInt ): ĠOp us Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġde coders ! ![ stream Id ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/// Ġ< summary > ĊĠĠĠĠĠĠĠ Ġ/// ĠCreates Ġa Ġnew ĠMS Ġdecoder ĊĠĠĠĠĠĠĠ Ġ/// Ġ</ summary > ĊĠĠĠĠĠĠĠ Ġ/// Ġ< param Ġname =" Fs "></ param > ĊĠĠĠĠĠĠĠ Ġ/// Ġ< param Ġname =" channels "></ param > ĊĠĠĠĠĠĠĠ Ġ/// Ġ< param Ġname =" streams "></ param > ĊĠĠĠĠĠĠĠ Ġ/// Ġ< param Ġname =" coup led _ streams "></ param > ĊĠĠĠĠĠĠĠ Ġ/// Ġ< param Ġname =" mapping "> A Ġmapping Ġfamily Ġ( just Ġuse Ġ{ Ġ 0 , Ġ 1 , Ġ 2 5 5 Ġ}) </ param > ĊĠĠĠĠĠĠĠ Ġ/// Ġ< returns ></ returns > ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFs : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannels : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstreams : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoup led _ streams : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapping : ĠShort Array ĊĠĠĠĠĠĠĠ Ġ): ĠOp us MS Decoder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst : ĠOp us MS Decoder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channels Ġ> Ġ 2 5 5 Ġ|| Ġchannels Ġ< Ġ 1 Ġ|| Ġcoup led _ streams Ġ> Ġstreams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġstreams Ġ< Ġ 1 Ġ|| Ġcoup led _ streams Ġ< Ġ 0 Ġ|| Ġstreams Ġ> Ġ 2 5 5 Ġ- Ġcoup led _ streams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Invalid Ġchannel Ġ/ Ġstream Ġconfiguration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst Ġ= ĠOp us MS Decoder ( streams , Ġcoup led _ streams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= Ġst . opus _ mult istream _ decoder _ init ( Fs , Ġchannels , Ġstreams , Ġcoup led _ streams , Ġmapping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ!= ĠOp us Error . OP US _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ== ĠOp us Error . OP US _ BAD _ ARG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Bad Ġargument Ġwhile Ġcreating ĠMS Ġdecoder ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOp us Exception (" Could Ġnot Ġcreate ĠMS Ġdecoder ", Ġret ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġst ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġop us _ mult istream _ packet _ validate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠByteArray , Ġdata _ ptr : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlen : ĠInt , Ġnb _ streams : ĠInt , ĠFs : ĠInt ĊĠĠĠĠĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdata _ ptr Ġ= Ġdata _ ptr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġs : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoc Ġ= ĠBox ed Value Byte ( 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠShort Array ( 4 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsamples Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpacket _ offset Ġ= ĠBox ed Value Int ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdummy Ġ= ĠBox ed Value Int ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( s Ġ< Ġnb _ streams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp _ samples : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ INVALID _ PACKET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= ĠOp us Packet Info . opus _ packet _ parse _ impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , Ġdata _ ptr , Ġlen , Ġif Ġ( s Ġ!= Ġnb _ streams Ġ- Ġ 1 ) Ġ 1 Ġelse Ġ 0 , Ġtoc , Ġnull , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , Ġ 0 , Ġdummy , Ġpacket _ offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp _ samples Ġ= ĠOp us Packet Info . getNum Samples ( data , Ġdata _ ptr , Ġpacket _ offset . Val , ĠFs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s Ġ!= Ġ 0 Ġ&& Ġsamples Ġ!= Ġtmp _ samples ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠOp us Error . OP US _ INVALID _ PACKET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsamples Ġ= Ġtmp _ samples ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata _ ptr Ġ+= Ġpacket _ offset . Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ-= Ġpacket _ offset . Val ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsamples ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġop us _ copy _ channel _ out _ short ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst : ĠShort Array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst _ ptr : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst _ stride : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst _ channel : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc : ĠShort Array ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc _ ptr : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc _ stride : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe _ size : ĠInt ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġframe _ size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ i Ġ* Ġdst _ stride Ġ+ Ġdst _ channel Ġ+ Ġdst _ ptr ] Ġ= Ġsrc [ i Ġ* Ġsrc _ stride Ġ+ Ġsrc _ ptr ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġframe _ size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ i Ġ* Ġdst _ stride Ġ+ Ġdst _ channel Ġ+ Ġdst _ ptr ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ