package Ġal n Ċ Ċ import Ġal n . identifiers . Al Buffer Ċ import Ġal n . identifiers . Al Source Ċ import Ġglm _. func . cos Ċ import Ġglm _. func . sin Ċ import Ġglm _. glm Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. vec 3 . Vec 3 Ċ import Ġio . kot lint est . specs . String Spec Ċ import Ġk ool . Int Buffer Ċ import Ġk ool . lib . isEmpty Ċ import Ġk ool . set Ċ import Ġorg . lwjgl . open al . AL C 1 0 . AL C _ TRUE Ċ import Ġorg . lwjgl . open al . S OF TH RT F .* Ċ import Ġkotlin . system . exit Process Ċ Ċ /* Ċ Ġ* ĠOpen AL ĠH RT F ĠExample Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 5 Ġby ĠChris ĠRob in son Ġ< chr is . k cat @ gmail . com > Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ // ĠThis Ġfile Ġcontains Ġan Ġexample Ġfor Ġselecting Ġan ĠH RT F . Ċ Ċ class ĠH RT F Ġ: ĠString Spec () Ġ{ ĊĊ Ċ } Ċ Ċ fun Ġh rtf ( sound Name : ĠString ) Ġ= Ġh rtf ( null , Ġsound Name ) Ċ Ċ fun Ġh rtf ( hrt f Name : ĠString ?, Ġsound Name : ĠString ) Ġ{ Ċ Ċ // ĠĠĠ ĠAL uint Ġsource , Ġbuffer Ċ // ĠĠĠ ĠAL double Ġangle Ċ // ĠĠĠ ĠAL enum Ġstate ĊĊĠĠĠ Ġ// ĠPrint Ġout Ġusage Ġif Ġno Ġarguments Ġwere Ġspecified Ċ // ĠĠĠ Ġif ( argc Ġ< Ġ 2 ) Ċ // ĠĠĠ Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġfprintf ( stderr , Ġ" Usage : Ġ% s Ġ[- device Ġ< name >] Ġ[- hrt f Ġ< name >] Ġ< sound file >\ n ", Ġargv [ 0 ]); Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġ 1 ; Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠInitialize ĠOpen AL , Ġand Ġcheck Ġfor ĠH RT F Ġsupport . ĊĠĠĠ Ġif Ġ(! al . init ()) ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĊĠĠĠ Ġval Ġdevice Ġ= Ġal c . current Context . device ĊĠĠĠ Ġif Ġ(! device . is Extension Present (" AL C _ SOFT _ H RT F ")) Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : ĠAL C _ SOFT _ H RT F Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠ Ġal . close () ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġfor Ġthe ĠAL _ EXT _ STER EO _ ANG LES Ġextension Ġto Ġbe Ġable Ġto Ġalso Ġrotate Ġst ereo Ġsources . ĊĠĠĠ Ġval Ġhas Angle Ext Ġ= Ġal Ġis Extension Present Ġ" AL _ EXT _ STER EO _ ANG LES " ĊĠĠĠ Ġprintln (" AL _ EXT _ STER EO _ ANG LES ${ if Ġ( has Angle Ext ) Ġ"" Ġelse Ġ" Ġnot "} Ġfound ") ĊĊĠĠĠ Ġ// ĠCheck Ġfor Ġuser - preferred ĠH RT F Ċ // ĠĠĠ Ġif Ġ( strcmp ( argv [ 0 ], Ġ"- hrt f ") Ġ== Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġh rt fname Ġ= Ġargv [ 1 ] Ċ // ĠĠĠĠĠĠĠ Ġsound name Ġ= Ġargv [ 2 ] Ċ // ĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġh rt fname Ġ= ĠNULL Ċ // ĠĠĠĠĠĠĠ Ġsound name Ġ= Ġargv [ 0 ] Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠEnum erate Ġavailable ĠH RT Fs , Ġand Ġreset Ġthe Ġdevice Ġusing Ġone . ĊĠĠĠ Ġval Ġnum H rtf Ġ= Ġdevice . NUM _ H RT F _ SPECI FI ERS _ SOFT ĊĠĠĠ Ġif Ġ( num H rtf Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġprintln (" No ĠH RT Fs Ġfound ") ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattr Ġ= ĠInt Buffer ( 5 ) ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġprintln (" Available ĠH RT Fs :") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum H rtf ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdevice . getString SOFT ( AL C _ H RT F _ SPECI FIER _ SOFT , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠ Ġ$ i : Ġ$ name ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthis Ġis Ġthe ĠH RT F Ġthe Ġuser Ġrequested . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hrt f Name ?. equals ( name ) Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġattr [ i ++] Ġ= ĠAL C _ H RT F _ SOFT ĊĠĠĠĠĠĠĠ Ġattr [ i ++] Ġ= ĠAL C _ TRUE ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hrt f Name Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" H RT F Ġ\"$ hrt f Name \" Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Using Ġdefault ĠH RT F ...") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Select ing ĠH RT F Ġ$ index ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattr [ i ++] Ġ= ĠAL C _ H RT F _ ID _ SOFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattr [ i ++] Ġ= Ġindex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġattr [ i ] Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! device . reset SOFT ( attr )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Failed Ġto Ġreset Ġdevice : Ġ${ device . error }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġif ĠH RT F Ġis Ġenabled , Ġand Ġshow Ġwhich Ġis Ġbeing Ġused . ĊĠĠĠ Ġval Ġh rtf State Ġ= Ġdevice Ġget Boolean ĠAL C _ H RT F _ SOFT ĊĠĠĠ Ġif Ġ(! hrt f State ) ĊĠĠĠĠĠĠĠ Ġprintln (" H RT F Ġnot Ġenabled !") ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdevice ĠgetString ĠAL C _ H RT F _ SPECI FIER _ SOFT ĊĠĠĠĠĠĠĠ Ġprintln (" H RT F Ġenabled , Ġusing Ġ$ name ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠLoad Ġthe Ġsound Ġinto Ġa Ġbuffer . ĊĠĠĠ Ġval Ġbuffer Ġ= ĠAl Buffer . gen () ĊĠĠĠ Ġval Ġ( vor bis , Ġsample Rate ) Ġ= Ġread Vor bis ( sound Name ) ĊĠĠĠ Ġif Ġ( vor bis . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġal . close () ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbuffer . data ( Al Format . MON O 1 6 , Ġvor bis , Ġsample Rate ) ĊĊĠĠĠ Ġ// ĠCreate Ġthe Ġsource Ġto Ġplay Ġthe Ġsound Ġwith . ĊĠĠĠ Ġval Ġsource Ġ= ĠAl Source . gen (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġrelative Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġposition Ġ= ĠVec 3 ( 0 f , Ġ 0 f , Ġ- 1 f ) ĊĠĠĠĠĠĠĠ Ġthis . buffer Ġ= Ġbuffer ĊĠĠĠ Ġ} ĊĠĠĠ Ġassert ( al . error Ġ== ĠAl Error . NONE ) Ġ{ Ġ" Failed Ġto Ġsetup Ġsound Ġsource " Ġ} ĊĊĠĠĠ Ġ// ĠPlay Ġthe Ġsound Ġuntil Ġit Ġfinishes . ĊĠĠĠ Ġvar Ġangle Ġ= Ġ 0 . 0 ĊĠĠĠ Ġsource . play () ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRotate Ġthe Ġsource Ġaround Ġthe Ġlistener Ġby Ġabout Ġ 1 / 4 Ġcycle Ġper Ġsecond , Ġand Ġkeep Ġit Ġwithin Ġ- pi ... + pi . ĊĠĠĠĠĠĠĠ Ġangle Ġ+= Ġ 0 . 0 1 Ġ* Ġglm . PI f Ġ* Ġ 0 . 5 ĊĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ> Ġglm . PI f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ-= Ġglm . PI f Ġ* Ġ 2 . 0 ĊĊĠĠĠĠĠĠĠ Ġ/* ĠThis Ġonly Ġrot ates Ġmono Ġsounds . Ġ*/ ĊĠĠĠĠĠĠĠ Ġsource . position Ġ= ĠVec 3 ( angle . sin , Ġ 0 f , Ġ-( angle . cos )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Angle Ext ) ĊĠĠĠĠĠĠĠ Ġ/* ĠThis Ġrot ates Ġst ereo Ġsounds Ġwith Ġthe ĠAL _ EXT _ STER EO _ ANG LES ĊĠĠĠĠĠĠĠĠ Ġ* Ġextension . ĠAng les Ġare Ġspecified Ġcounter - clock wise Ġin Ġradians . ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . stere o Angles Ġ= ĠVec 2 ( glm . PI f Ġ/ Ġ 6 Ġ- Ġangle , Ġ- glm . PI f Ġ/ Ġ 6 . 0 Ġ- Ġangle ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġsource . state ĊĊĠĠĠ Ġ} Ġwhile Ġ( al . error Ġ== ĠAl Error . NONE Ġ&& Ġstate Ġ== ĠSource State . PLAY ING ) ĊĊĠĠĠ Ġ/* ĠAll Ġdone . ĠDelete Ġresources , Ġand Ġclose Ġdown ĠSDL _ sound Ġand ĠOpen AL . Ġ*/ ĊĠĠĠ Ġsource . delete () ĊĠĠĠ Ġbuffer . delete () ĊĊĠĠĠ Ġal . close () Ċ }