audiosettings.gd 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. extends Window
  2. @onready var item_list = $VBoxContainer/ItemList
  3. @onready var device_timer = $DevicePollTimer
  4. var last_known_devices = []
  5. func _on_item_list_item_selected(index: int) -> void:
  6. var device = item_list.get_item_text(index)
  7. AudioServer.set_output_device(device)
  8. ConfigHandler.save_audio_settings("device", device)
  9. func _on_about_to_popup() -> void:
  10. $VBoxContainer/DeviceInfo.text = "Current Device: " + AudioServer.get_output_device()
  11. update_device_list() # Initial fetch
  12. device_timer.start()
  13. func _on_close_requested() -> void:
  14. device_timer.stop()
  15. func update_device_list():
  16. var audio_settings = ConfigHandler.load_audio_settings()
  17. var last_selected_device = audio_settings.device
  18. var devices = AudioServer.get_output_device_list()
  19. var device = AudioServer.get_output_device()
  20. item_list.clear()
  21. last_known_devices = devices
  22. for item in AudioServer.get_output_device_list():
  23. item_list.add_item(item)
  24. #check if the users last selected device has now become available if not set to default to reset audio server to default so it reports properly
  25. if device != last_selected_device and devices.has(last_selected_device):
  26. AudioServer.set_output_device("Default") #hacky fix because the audio server doesn't work properly when hot swapping outputs
  27. await get_tree().create_timer(0.1).timeout # Wait 100 ms
  28. AudioServer.set_output_device(last_selected_device)
  29. elif !devices.has(last_selected_device):
  30. AudioServer.set_output_device("Default")
  31. await get_tree().create_timer(0.1).timeout # Wait 100 ms
  32. device = AudioServer.get_output_device()
  33. #highlight the currently selected device
  34. for i in range(item_list.get_item_count()):
  35. if device == item_list.get_item_text(i):
  36. item_list.select(i)
  37. break
  38. func _on_device_poll_timer_timeout() -> void:
  39. var current_devices = AudioServer.get_output_device_list()
  40. if current_devices != last_known_devices:
  41. last_known_devices = current_devices
  42. update_device_list()
  43. $VBoxContainer/DeviceInfo.text = "Current Device: " + AudioServer.get_output_device()