package Ġm vp . audio Ċ Ċ import Ġcom . j fo enix . utils . J FX Utilities . run In FX And Wait Ċ import Ġcom . sun . j na . Pointer Ċ import Ġcom . sun . j na . ptr . Float By Reference Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . util . Timer Ċ import Ġjavafx . application . Platform . run Later Ċ import Ġjavafx . beans . property . Boolean Property Ċ import Ġjavafx . beans . property . Double Property Ċ import Ġjavafx . beans . property . ReadOnly ObjectProperty Ċ import Ġjavafx . beans . property . ReadOnly Object Wrapper Ċ import Ġjavafx . beans . property . ReadOnly String Property Ċ import Ġjavafx . beans . property . ReadOnly String Wrapper Ċ import Ġjavafx . beans . property . Simple Boolean Property Ċ import Ġjavafx . beans . property . Simple Double Property Ċ import Ġjavafx . concurrent . Service Ċ import Ġjavafx . concurrent . Task Ċ import Ġkotlin . concurrent . timer Ċ import Ġm vp . n ativ el ib s . Channel Info Ċ import Ġm vp . n ativ el ib s . DeviceInfo Ċ import Ġm vp . n ativ el ib s . Lib B ASS Ċ import Ġm vp . n ativ el ib s . NULL _ PTR Ċ import Ġm vp . n ativ el ib s . SYNC PROC Ċ import Ġm vp . n ativ el ib s . Tag CAC ode c Ċ Ċ private Ġdata Ġclass ĠDevice ( val Ġid : ĠInt , Ġval Ġname : ĠString , Ġval Ġflags : ĠInt ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject ĠUtils Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Device ( deviceId : ĠInt ): ĠDevice ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deviceId Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDevice Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ ĠLib B ASS . B ASS _ GetDevice Info ( deviceId , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠDevice ( deviceId , Ġit . name , Ġit . flags ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Device ( channel : ĠPointer ): ĠDevice ? Ġ= Ġget Device ( Lib B ASS . B ASS _ Channel GetDevice ( channel )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġset Stream Volume ( stream : ĠPointer , Ġvolume : ĠDouble ) Ġ{ ĊĠĠĠ ĠLib B ASS . B ASS _ Channel Set Attribute ( stream , ĠLib B ASS . B ASS _ ATTRIB _ VOL , Ġ( volume Ġ/ Ġ 1 0 0 . 0 ). toFloat ()) Ċ } Ċ Ċ private Ġfun ĠtoString Sequence ( strings : ĠPointer , Ġcharset : ĠCharset Ġ= ĠChar sets . UTF _ 8 ): ĠSequence < String > Ġ= ĊĠĠĠ Ġsequence Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġstrings . getString ( offset , Ġcharset . name ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġstr . toByteArray ( charset ). size Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ data Ġclass ĠTrack Info ( val Ġcodec : ĠString , Ġval Ġbit rate : ĠInt ) Ċ Ċ object ĠPlayer Ġ{ ĊĠĠĠ Ġenum Ġclass ĠStatus Ġ{ ĠERROR , ĠLO ADING , ĠP LAY ING , ĠST AN DBY Ġ} ĊĊĠĠĠ Ġval Ġinst a Pause Property : ĠBoolean Property Ġ= ĠSimple Boolean Property ( this , Ġthis :: inst a Pause . name , Ġtrue ) ĊĠĠĠ Ġval Ġinst a Pause : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġinst a Pause Property . get () ĊĊĠĠĠ Ġprivate Ġval Ġ_ status Property Ġ= ĠReadOnly Object Wrapper ( this , Ġthis :: status . name , ĠStatus . ST AN DBY ) ĊĠĠĠ Ġval Ġstatus Property : ĠReadOnly ObjectProperty < Status > Ġ= Ġ_ status Property . readOnly Property ĊĠĠĠ Ġval Ġstatus : ĠStatus ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstatus Property . get () ĊĊĠĠĠ Ġprivate Ġval Ġ_ status Message Property Ġ= ĠReadOnly String Wrapper ( this , Ġthis :: status Message . name , Ġ"") ĊĠĠĠ Ġval Ġstatus Message Property : ĠReadOnly String Property Ġ= Ġ_ status Message Property . readOnly Property ĊĠĠĠ Ġval Ġstatus Message : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstatus Message Property . get () ĊĊĠĠĠ Ġprivate Ġval Ġ_ track Property Ġ= ĠReadOnly Object Wrapper ( this , Ġthis :: track . name , ĠUNKNOWN _ TRACK ) ĊĠĠĠ Ġval Ġtrack Property : ĠReadOnly ObjectProperty < Track > Ġ= Ġ_ track Property . readOnly Property ĊĠĠĠ Ġval Ġtrack : ĠTrack ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtrack Property . get () ĊĊĠĠĠ Ġval Ġvolume Property : ĠDouble Property Ġ= ĠSimple Double Property ( this , Ġthis :: volume . name , Ġ 1 0 0 . 0 ) ĊĠĠĠ Ġval Ġvolume : ĠDouble ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġvolume Property . get () ĊĊĠĠĠ Ġprivate Ġval Ġend Sync : ĠSY NC PROC Ġ= ĠSY NC PROC Ġ{ Ġ_, Ġ_, Ġ_, Ġ_ Ġ-> Ġrun Later (:: stop ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġmeta Sync : ĠSY NC PROC Ġ= ĠSY NC PROC Ġ{ Ġ_, Ġchannel , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġmsg Ġ= Ġ"" ĊĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Get Tags ( channel , ĠLib B ASS . B ASS _ TAG _ META )?. let Ġ{ Ġmeta Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmetadata Ġis Ġa Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ= Ġmeta . getString ( 0 , ĠChar sets . UTF _ 8 . name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After (" Stream Title =' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring Before (" '; ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Get Tags ( channel , ĠLib B ASS . B ASS _ TAG _ O GG )?. let Ġ{ Ġcomments Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠO GG Ġcomments Ġis Ġa Ġseries Ġof Ġnull - terminated ĠUTF - 8 Ġstrings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtags Ġ= ĠtoString Sequence ( comments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġcomment Ġ-> Ġcomment . split (" =", Ġlimit Ġ= Ġ 2 ). take If Ġ{ Ġit . size Ġ== Ġ 2 Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate By ({ Ġit [ 0 ]. lowercase () Ġ}, Ġ{ Ġit [ 1 ] Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Ġ= ĠlistOf NotNull ( tags [" artist "], Ġtags [" title "]). join ToString (" Ġ- Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrun Later Ġ{ Ġ_ status Message Property . set ( msg ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġst all Sync : ĠSY NC PROC Ġ= ĠSY NC PROC Ġ{ Ġ_, Ġ_, Ġdata , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġnew Status Ġ= Ġwhen Ġ( data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠStatus . LOADING ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠStatus . PLAY ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn @ SYNC PROC ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Later Ġ{ Ġ_ status Property . set ( new Status ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstream Service : ĠService < Pointer ?> Ġ= Ġobject Ġ: ĠService < Pointer ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Task (): ĠTask < Pointer ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Url Ġ= Ġtrack . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠTask < Pointer ?> () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠPointer ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( Lib B ASS . B ASS _ Init (- 1 , Ġ- 1 , Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Couldn 't Ġinit Ġoutput Ġdevice , Ġerror Ġcode Ġ${ Lib B ASS . B ASS _ Error Get Code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠLib B ASS . B ASS _ Stream Create URL ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Url . to ASCII String (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ STREAM _ BLOCK Ġor ĠLib B ASS . B ASS _ STREAM _ STATUS Ġor ĠLib B ASS . B ASS _ STREAM _ AUT OF REE Ġor ĠLib B ASS . B ASS _ SAMPLE _ FLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNULL _ PTR Ġ== Ġstream Ġ-> Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Couldn 't Ġcreate Ġstream Ġfrom Ġ$ track Url , Ġerror Ġcode Ġ${ Lib B ASS . B ASS _ Error Get Code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cancelled Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Free ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Stream Volume ( stream , Ġvolume ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Set Sync ( stream , ĠLib B ASS . B ASS _ SYNC _ META , Ġ 0 , Ġmeta Sync ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Set Sync ( stream , ĠLib B ASS . B ASS _ SYNC _ O GG _ CHANGE , Ġ 0 , Ġmeta Sync ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Set Sync ( stream , ĠLib B ASS . B ASS _ SYNC _ END , Ġ 0 , Ġend Sync ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Set Sync ( stream , ĠLib B ASS . B ASS _ SYNC _ ST ALL , Ġ 0 , Ġst all Sync ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Lib B ASS . B ASS _ Channel Play ( stream , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Free ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Couldn 't Ġplay Ġstream , Ġerror Ġcode Ġ${ Lib B ASS . B ASS _ Error Get Code () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcancelled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġready () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Property . set ( Status . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Message Property . set ( exception . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġready () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Property . set ( Status . ST AN DBY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Message Property . set ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrunning () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Property . set ( Status . LOADING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Message Property . set ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsucceeded () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Property . set ( Status . PLAY ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status Message Property . set ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġinst a Pause Timer : ĠTimer Ġ= Ġtimer ( daemon Ġ= Ġtrue , Ġinitial Delay Ġ= Ġ 1 0 0 , Ġperiod Ġ= Ġ 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmaybe Stream : ĠPointer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun In FX And Wait Ġ{ Ġmaybe Stream Ġ= Ġstream Service . value Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġmaybe Stream Ġ?: Ġreturn @ timer ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Device Ġ= ĠDevice . getDevice ( stream ) Ġ?: Ġreturn @ timer ĊĠĠĠĠĠĠĠ Ġval Ġdefault Device Ġ= Ġgenerate Sequence ( 1 , ĠInt :: inc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( Device . Utils :: getDevice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . flags Ġand ĠLib B ASS . B ASS _ DEVICE _ DEFAULT Ġ!= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ timer ĊĊĠĠĠĠĠĠĠ Ġif Ġ( default Device Ġ!= Ġcurrent Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġre assign Devices Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun In FX And Wait Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre assign Devices Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ!= ĠStatus . PLAY ING Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinst a Pause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re assign Devices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Init ( default Device . id , Ġ- 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Set Device ( stream , Ġdefault Device . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Play ( stream , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Set Device ( current Device . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Free () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Set Config ( Lib B ASS . B ASS _ CONFIG _ NET _ PLAY LIST , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Set Config ( Lib B ASS . B ASS _ CONFIG _ DEV _ DEFAULT , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Set Config ( Lib B ASS . B ASS _ CONFIG _ NET _ PRE BUF _ WAIT , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġvolume Property . addListener Ġ{ Ġ_, Ġ_, Ġvolume Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream Service . value ?. let Ġ{ Ġset Stream Volume ( it , Ġvolume . toDouble ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMust Ġbe Ġcalled Ġfrom ĠFX ĠApp Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( track : ĠTrack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĊĠĠĠĠĠĠĠ Ġ_ track Property . set ( track ) ĊĠĠĠĠĠĠĠ Ġstream Service . restart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMust Ġbe Ġcalled Ġfrom ĠFX ĠApp Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġstream Service . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let ( Lib B ASS :: B ASS _ Channel Free ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġstream Service . cancel () ĊĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Free () ĊĠĠĠĠĠĠĠ Ġstream Service . reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrack Info (): ĠTrack Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmaybe Stream : ĠPointer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun In FX And Wait Ġ{ Ġmaybe Stream Ġ= Ġstream Service . value Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmaybe Stream ?. let Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodec Ġ= ĠChannel Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ ĠLib B ASS . B ASS _ Channel Get Info ( stream , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . ctype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ CTYPE _ STREAM _ O GG Ġ-> Ġ" O gg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ CTYPE _ STREAM _ MP 3 Ġ-> Ġ" MP 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ CTYPE _ STREAM _ OP US Ġ-> Ġ" Op us " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ CTYPE _ STREAM _ FL AC , ĠLib B ASS . B ASS _ CTYPE _ STREAM _ FL AC _ O GG Ġ-> Ġ" FL AC " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ CTYPE _ STREAM _ CA Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCore Audio Ġcodec ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel Get Tags ( stream , ĠLib B ASS . B ASS _ TAG _ CA _ CODEC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġtags Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodec Ġ= ĠTag CAC ode c ( tags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / mono / mac core / blob / b 3 c 1 8 aa 8 8 c / src / Audio Toolbox / Audio Type . cs # L 4 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( codec . atype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 6 1 6 1 6 3 2 0 Ġ-> Ġ" AAC " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 e 6 d 7 0 3 3 Ġ-> Ġ" MP 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 6 1 6 1 6 3 6 8 Ġ-> Ġ" AAC +" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 6 1 6 1 6 3 7 0 Ġ-> Ġ" e AAC +" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit rate Ġ= ĠFloat By Reference () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ ĠLib B ASS . B ASS _ Channel Get Attribute ( stream , ĠLib B ASS . B ASS _ ATTRIB _ BIT RATE , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrack Info ( codec , Ġbit rate . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġspectrum (): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmaybe Stream : ĠPointer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrun In FX And Wait Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaybe Stream Ġ= ĠcheckNotNull ( stream Service . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Player Ġmust Ġhave Ġ${ Status . PLAY ING } Ġstatus , Ġbut Ġhas Ġ$ status Ġinstead " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠFloat Array ( 1 0 2 4 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLib B ASS . B ASS _ Channel GetData ( maybe Stream !! , Ġthis , ĠLib B ASS . B ASS _ DATA _ FFT 2 0 4 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMust Ġbe Ġcalled Ġfrom ĠFX ĠApp Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġinst a Pause Timer . cancel () ĊĠĠĠ Ġ} Ċ } Ċ