/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAnt on ĠTr ush kov Ċ Ġ* Ċ Ġ* Ġ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 . ks df v . the le ma . lwjgl 3 . audio Ċ Ċ import Ġorg . ks df v . the le ma . audio . IAL Ċ import Ġorg . ks df v . the le ma . audio . I Audio Device Ċ import Ġorg . ks df v . the le ma . audio . I Audio Recorder Ċ import Ġorg . ks df v . the le ma . fs . I File Ċ import Ġorg . ks df v . the le ma . math . MATH Ċ import Ġorg . lwjgl . Buffer Utils Ċ import Ġorg . lwjgl . open al . AL Ċ import Ġorg . lwjgl . open al . AL 1 0 Ċ import Ġorg . lwjgl . open al . AL C Ċ import Ġorg . lwjgl . open al . AL C 1 0 Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Float Buffer Ċ import Ġjava . nio . Int Buffer ĊĊ Ċ /** Ġ@ author ĠN athan ĠS weet Ċ Ġ*/ Ċ class ĠOpen AL Ġ( sim ultaneous Sources : ĠInt Ġ= Ġ 1 6 , Ġprivate Ġval Ġdevice Buffer Count : ĠInt Ġ= Ġ 9 , Ġprivate Ġval Ġdevice BufferSize : ĠInt Ġ= Ġ 5 1 2 ) Ġ: ĠI AL Ġ{ ĊĠĠĠ Ġprivate Ġval Ġidle Sources Ġ= ĠArrayList < Int >() ĊĠĠĠ Ġprivate Ġval Ġall Sources Ġ= ĠArrayList < Int >() ĊĠĠĠ Ġprivate Ġval Ġsound Id To Source Ġ= ĠHashMap < Int , ĠInt >() ĊĠĠĠ Ġprivate Ġval Ġsource To Sound Id Ġ= ĠHashMap < Int , ĠInt >() ĊĠĠĠ Ġprivate Ġvar Ġnext Sound Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġrecent Sounds Ġ= ĠArrayList < Open AL Sound ?> () ĊĠĠĠ Ġprivate Ġvar Ġmost Recent Sound Ġ= Ġ- 1 ĊĠĠĠ Ġval Ġmusic : ĠArrayList < Open AL Music > Ġ= ĠArrayList () ĊĠĠĠ Ġval Ġdevice : ĠLong Ġ= ĠAL C 1 0 . al c Open Device ( null Ġas ĠByteBuffer ?) ĊĠĠĠ Ġvar Ġcontext : ĠLong ĊĠĠĠ Ġvar Ġno Device Ġ= Ġfalse ĊĠĠĠ Ġvar Ġcheck And Validate Playing Music Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġnew Sound ( file : ĠI File ): ĠOpen AL Sound Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠOpen AL Code cs . sound [ file . extension . toLowerCase ()] Ġ?: ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Sound Ġfile Ġextension Ġis Ġunknown ") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . invoke ( this , Ġfile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Music ( file : ĠI File ): ĠOpen AL Music Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠOpen AL Code cs . music [ file . extension . toLowerCase ()] Ġ?: ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Music Ġfile Ġextension Ġis Ġunknown ") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . invoke ( this , Ġfile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobtain Source ( is Music : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġidle Sources . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġidle Sources [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠAL 1 0 . al Get Source i ( source Id , ĠAL 1 0 . AL _ SOURCE _ STATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠAL 1 0 . AL _ PLAY ING Ġ&& Ġstate Ġ!= ĠAL 1 0 . AL _ PA USED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Music ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidle Sources . remove ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source To Sound Id . contains ( source Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsound Id Ġ= Ġsource To Sound Id [ source Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource To Sound Id . remove ( source Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Id To Source . remove ( sound Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsound Id Ġ= Ġnext Sound Id ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource To Sound Id [ source Id ] Ġ= Ġsound Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Id To Source [ sound Id ] Ġ= Ġsource Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source Stop ( source Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source i ( source Id , ĠAL 1 0 . AL _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source f ( source Id , ĠAL 1 0 . AL _ GAIN , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source f ( source Id , ĠAL 1 0 . AL _ P ITCH , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source 3 f ( source Id , ĠAL 1 0 . AL _ POSITION , Ġ 0 f , Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsource Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfree Source ( source ID : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source Stop ( source ID ) ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source i ( source ID , ĠAL 1 0 . AL _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( source To Sound Id . containsKey ( source ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsound Id Ġ= Ġsource To Sound Id . remove ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsound Id To Source . remove ( sound Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġidle Sources . add ( source ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfree Buffer ( buffer ID : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġidle Sources . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ID Ġ= Ġidle Sources [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al Get Source i ( source ID , ĠAL 1 0 . AL _ BUFFER ) Ġ== Ġbuffer ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source To Sound Id . containsKey ( source ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsound Id Ġ= Ġsource To Sound Id . remove ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Id To Source . remove ( sound Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source Stop ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source i ( source ID , ĠAL 1 0 . AL _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Sources With Buffer ( buffer ID : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġidle Sources . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ID Ġ= Ġidle Sources [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al Get Source i ( source ID , ĠAL 1 0 . AL _ BUFFER ) Ġ== Ġbuffer ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source To Sound Id . containsKey ( source ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsound Id Ġ= Ġsource To Sound Id . remove ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsound Id To Source . remove ( sound Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Source Stop ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause Sources With Buffer ( buffer ID : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġidle Sources . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ID Ġ= Ġidle Sources [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al Get Source i ( source ID , ĠAL 1 0 . AL _ BUFFER ) Ġ== Ġbuffer ID ) ĠAL 1 0 . al Source Pause ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Sources With Buffer ( buffer ID : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġidle Sources . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ID Ġ= Ġidle Sources [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al Get Source i ( source ID , ĠAL 1 0 . AL _ BUFFER ) Ġ== Ġbuffer ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al Get Source i ( source ID , ĠAL 1 0 . AL _ SOURCE _ STATE ) Ġ== ĠAL 1 0 . AL _ PA USED ) ĠAL 1 0 . al Source Play ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( check And Validate Playing Music ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Music . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmusic Ġ= Ġmusic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmusic . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmus Ġ= Ġmusic [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mus . remove Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Music . add ( mus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmus . remove Request Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtmp Music . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . remove ( tmp Music [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Music . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck And Validate Playing Music Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmusic . size ) Ġmusic [ i ]. update () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sound Id ( source Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! source To Sound Id . containsKey ( source Id )) Ġ- 1 Ġelse Ġsource To Sound Id [ source Id ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Sound ( sound Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] !! ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source Stop ( source Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause Sound ( sound Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] !! ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source Pause ( source Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Sound ( sound Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] ĊĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al Get Source i ( source Id !! , ĠAL 1 0 . AL _ SOURCE _ STATE ) Ġ== ĠAL 1 0 . AL _ PA USED ) ĠAL 1 0 . al Source Play ( source Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Gain ( sound Id : ĠInt , Ġvolume : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source f ( source Id !! , ĠAL 1 0 . AL _ GAIN , Ġvolume ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Loop ing ( sound Id : ĠInt , Ġlooping : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source i ( source Id !! , ĠAL 1 0 . AL _ LOOP ING , Ġif Ġ( loop ing ) ĠAL 1 0 . AL _ TRUE Ġelse ĠAL 1 0 . AL _ FALSE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Pitch ( sound Id : ĠInt , Ġpitch : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source f ( source Id !! , ĠAL 1 0 . AL _ P ITCH , Ġpitch ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sound Pan ( sound Id : ĠInt , Ġpan : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! sound Id To Source . containsKey ( sound Id )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsource Id Ġ= Ġsound Id To Source [ sound Id ] ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Source 3 f ( source Id !! , ĠAL 1 0 . AL _ POSITION , ĠM ATH . cos (( pan Ġ- Ġ 1 ) Ġ* ĠM ATH . PI Ġ/ Ġ 2 ), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ATH . sin (( pan Ġ+ Ġ 1 ) Ġ* ĠM ATH . PI Ġ/ Ġ 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no Device ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġall Sources . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ID Ġ= Ġall Sources [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠAL 1 0 . al Get Source i ( source ID , ĠAL 1 0 . AL _ SOURCE _ STATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠAL 1 0 . AL _ STOP PED ) ĠAL 1 0 . al Source Stop ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAL 1 0 . al Delete Sources ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsource To Sound Id . clear () ĊĠĠĠĠĠĠĠ Ġsound Id To Source . clear () ĊĠĠĠĠĠĠĠ ĠAL C 1 0 . al c Destroy Context ( context ) ĊĠĠĠĠĠĠĠ ĠAL C 1 0 . al c Close Device ( device ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Audio Device ( sampling Rate : ĠInt , Ġchannels Num : ĠInt ): ĠI Audio Device Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( no Device ) Ġobject Ġ: ĠI Audio Device Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġchannels Num : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġchannels Num ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite Samples ( samples : ĠFloat Array , Ġoffset : ĠInt , Ġnum Samples : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite Samples ( samples : ĠShort Array , Ġoffset : ĠInt , Ġnum Samples : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Volume ( volume : ĠFloat ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdestroy () Ġ{} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠOpen AL Audio Device ( this , Ġsampling Rate , Ġchannels Num , Ġdevice BufferSize , Ġdevice Buffer Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnew Audio Recorder ( sampling Rate : ĠInt , Ġis Mono : ĠBoolean ): ĠI Audio Recorder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( no Device ) Ġobject Ġ: ĠI Audio Recorder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread ( samples : ĠShort Array , Ġoffset : ĠInt , Ġnum Samples : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠJava Sound Audio Recorder ( sampling Rate , Ġis Mono ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Version ( param : ĠInt ): ĠString Ġ= ĠAL 1 0 . al GetString ( param ) Ġ?: Ġ"" ĊĊĠĠĠ Ġ/** ĠRet ains Ġa Ġlist Ġof Ġthe Ġmost Ġrecently Ġplayed Ġsounds Ġand Ġstops Ġthe Ġsound Ġplayed Ġleast Ġrecently Ġif Ġnecessary Ġfor Ġa Ġnew Ġsound Ġto ĊĠĠĠĠ Ġ* Ġplay Ġ Ġ*/ ĊĠĠĠ Ġfun Ġretain ( sound : ĠOpen AL Sound ?, Ġstop : ĠBoolean ) Ġ{ Ġ// ĠMove Ġthe Ġpointer Ġahead Ġand Ġwrap ĊĠĠĠĠĠĠĠ Ġmost Recent Sound ++ ĊĠĠĠĠĠĠĠ Ġmost Recent Sound Ġ% = Ġrecent Sounds . size ĊĠĠĠĠĠĠĠ Ġif Ġ( stop ) Ġ{ Ġ// ĠStop Ġthe Ġleast Ġrecent Ġsound Ġ( the Ġone Ġwe Ġare Ġabout Ġto Ġbump Ġoff Ġthe Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recent Sounds [ most Recent Sound ] Ġ!= Ġnull ) Ġrecent Sounds [ most Recent Sound ] !!. stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrecent Sounds [ most Recent Sound ] Ġ= Ġsound ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemoves Ġthe Ġdisposed Ġsound Ġfrom Ġthe Ġleast Ġrecently Ġplayed Ġlist Ġ Ġ*/ ĊĠĠĠ Ġfun Ġforget ( sound : ĠOpen AL Sound ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrecent Sounds . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recent Sounds [ i ] Ġ=== Ġsound ) Ġrecent Sounds [ i ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( device Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Device Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdevice Capabilities Ġ= ĠAL C . create Capabilities ( device ) ĊĠĠĠĠĠĠĠ Ġcontext Ġ= ĠAL C 1 0 . al c Create Context ( device , Ġnull Ġas ĠInt Buffer ?) ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAL C 1 0 . al c Close Device ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Device Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! AL C 1 0 . al c Make Context Current ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Device Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠAL . create Capabilities ( device Capabilities ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsimultaneous Sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ID Ġ= ĠAL 1 0 . al Gen Sources () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( AL 1 0 . al GetError () Ġ!= ĠAL 1 0 . AL _ NO _ ERROR ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Sources . add ( source ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidle Sources . add ( source ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= ĠBuffer Utils . create Float Buffer ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( float ArrayOf ( 0 . 0 f , Ġ 0 . 0 f , Ġ- 1 . 0 f , Ġ 0 . 0 f , Ġ 1 . 0 f , Ġ 0 . 0 f )). flip () Ġas ĠFloat Buffer ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Listener fv ( AL 1 0 . AL _ OR IENTATION , Ġorientation ) ĊĠĠĠĠĠĠĠ Ġval Ġvelocity Ġ= ĠBuffer Utils . create Float Buffer ( 3 ). put ( float ArrayOf ( 0 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f )). flip () Ġas ĠFloat Buffer ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Listener fv ( AL 1 0 . AL _ VE LOC ITY , Ġvelocity ) ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠBuffer Utils . create Float Buffer ( 3 ). put ( float ArrayOf ( 0 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f )). flip () Ġas ĠFloat Buffer ĊĠĠĠĠĠĠĠ ĠAL 1 0 . al Listener fv ( AL 1 0 . AL _ POSITION , Ġposition ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecent Sounds . add ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Music Ġ= ĠArrayList < Open AL Music >() ĊĠĠĠ Ġ} Ċ } Ċ