@@ -25,6 +25,7 @@ import funkin.util.TouchUtil;
2525import funkin .util .SwipeUtil ;
2626#end
2727import funkin .util .HapticUtil ;
28+ import lime .media .AudioManager ;
2829import lime .ui .WindowVSyncMode ;
2930
3031class PreferencesMenu extends Page <OptionsState . OptionsMenuPageName >
@@ -39,6 +40,10 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
3940 var hudCamera : FlxCamera ;
4041 var camFollow : FlxObject ;
4142
43+ #if desktop
44+ var audioDeviceItem : EnumPreferenceItem <String >;
45+ #end
46+
4247 public function new ()
4348 {
4449 super ();
@@ -170,6 +175,17 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
170175 }, Preferences .autoFullscreen );
171176 #end
172177
178+ #if desktop
179+ audioDeviceItem = createPrefItemEnum (' Audio Device' , ' What audio device should the game playbacks sounds to.' , generateAudioDeviceEnums (),
180+ (key : String , value : String ) ->
181+ {
182+ Preferences .audioDevice = value ;
183+ }, Preferences .audioDevice );
184+ AudioManager .onDefaultPlaybackDeviceChanged .add (refreshAudioDeviceItem );
185+ AudioManager .onPlaybackDeviceAdded .add (refreshAudioDeviceItem );
186+ AudioManager .onPlaybackDeviceRemoved .add (refreshAudioDeviceItem );
187+ #end
188+
173189 #if web
174190 createPrefItemCheckbox (' Unlocked Framerate' , ' When enabled, the framerate is unlocked.' , function (value : Bool ): Void {
175191 Preferences .unlockedFramerate = value ;
@@ -260,7 +276,7 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
260276 * @param onChange Gets called every time the player changes the value; use this to apply the value
261277 * @param defaultValue The value that is loaded in when the pref item is created (usually your Preferences.settingVariable)
262278 */
263- function createPrefItemCheckbox (prefName : String , prefDesc : String , onChange : Bool -> Void , defaultValue : Bool , available : Bool = true ): Void
279+ function createPrefItemCheckbox (prefName : String , prefDesc : String , onChange : Bool -> Void , defaultValue : Bool , available : Bool = true ): CheckboxPreferenceItem
264280 {
265281 var checkbox : CheckboxPreferenceItem = new CheckboxPreferenceItem (funkin.ui. FullScreenScaleMode .gameNotchSize .x , 120 * (items .length - 1 + 1 ),
266282 defaultValue , available );
@@ -273,6 +289,8 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
273289
274290 preferenceItems .add (checkbox );
275291 preferenceDesc .push (prefDesc );
292+
293+ return checkbox ;
276294 }
277295
278296 /**
@@ -286,13 +304,16 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
286304 * @param precision Rounds decimals up to a `precision` amount of digits (ex: 4 -> 0.1234, 2 -> 0.12)
287305 */
288306 function createPrefItemNumber (prefName : String , prefDesc : String , onChange : Float -> Void , ? valueFormatter : Float -> String , defaultValue : Float , min : Float ,
289- max : Float , step : Float = 0.1 , precision : Int ): Void
307+ max : Float , step : Float = 0.1 , precision : Int ): NumberPreferenceItem
290308 {
291309 var item = new NumberPreferenceItem (funkin.ui. FullScreenScaleMode .gameNotchSize .x , (120 * items .length ) + 30 , prefName , defaultValue , min , max , step ,
292310 precision , onChange , valueFormatter );
311+
293312 items .addItem (prefName , item );
294313 preferenceItems .add (item .lefthandText );
295314 preferenceDesc .push (prefDesc );
315+
316+ return item ;
296317 }
297318
298319 /**
@@ -302,19 +323,23 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
302323 * @param min Minimum value (default = 0)
303324 * @param max Maximum value (default = 100)
304325 */
305- function createPrefItemPercentage (prefName : String , prefDesc : String , onChange : Int -> Void , defaultValue : Int , min : Int = 0 , max : Int = 100 ): Void
326+ function createPrefItemPercentage (prefName : String , prefDesc : String , onChange : Int -> Void , defaultValue : Int , min : Int = 0 , max : Int = 100 ): NumberPreferenceItem
306327 {
307328 var newCallback = function (value : Float ) {
308329 onChange (Std .int (value ));
309330 };
310331 var formatter = function (value : Float ) {
311332 return ' ${value }%' ;
312333 };
334+
313335 var item = new NumberPreferenceItem (funkin.ui. FullScreenScaleMode .gameNotchSize .x , (120 * items .length ) + 30 , prefName , defaultValue , min , max , 10 , 0 ,
314336 newCallback , formatter );
337+
315338 items .addItem (prefName , item );
316339 preferenceItems .add (item .lefthandText );
317340 preferenceDesc .push (prefDesc );
341+
342+ return item ;
318343 }
319344
320345 /**
@@ -323,18 +348,44 @@ class PreferencesMenu extends Page<OptionsState.OptionsMenuPageName>
323348 * @param onChange Gets called every time the player changes the value; use this to apply the value
324349 * @param defaultValue The value that is loaded in when the pref item is created (usually your Preferences.settingVariable)
325350 */
326- function createPrefItemEnum <T >(prefName : String , prefDesc : String , values : Map <String , T >, onChange : String -> T -> Void , defaultKey : String ): Void
351+ function createPrefItemEnum <T >(prefName : String , prefDesc : String , values : Map <String , T >, onChange : String -> T -> Void , defaultKey : String ): EnumPreferenceItem < T >
327352 {
328353 var item = new EnumPreferenceItem <T >(funkin.ui. FullScreenScaleMode .gameNotchSize .x , (120 * items .length ) + 30 , prefName , values , defaultKey , onChange );
354+
329355 items .addItem (prefName , item );
330356 preferenceItems .add (item .lefthandText );
331357 preferenceDesc .push (prefDesc );
358+
359+ return item ;
360+ }
361+
362+ #if desktop
363+ function generateAudioDeviceEnums (): Map <String , String >
364+ {
365+ var enums = [' Default' => ' Default' ];
366+ var devices = AudioManager .getPlaybackDeviceNames ();
367+
368+ for (device in devices )
369+ {
370+ enums .set (device , device );
371+ }
372+
373+ return enums ;
374+ }
375+
376+ function refreshAudioDeviceItem (deviceName : String ): Void
377+ {
378+ audioDeviceItem .changeEnums (generateAudioDeviceEnums (), Preferences .audioDevice );
332379 }
380+ #end
333381
334382 override function exit (): Void
335383 {
336384 camFollow .setPosition (640 , 30 );
337385 menuCamera .snapToTarget ();
386+ AudioManager .onDefaultPlaybackDeviceChanged .remove (refreshAudioDeviceItem );
387+ AudioManager .onPlaybackDeviceAdded .remove (refreshAudioDeviceItem );
388+ AudioManager .onPlaybackDeviceRemoved .remove (refreshAudioDeviceItem );
338389 super .exit ();
339390 }
340391}
0 commit comments