64 lines
1.5 KiB
GDScript3
Raw Normal View History

2025-03-22 19:16:52 -06:00
class_name VolumeSlider extends VBoxContainer
## Input element for adjusting the volume of a single bus.
const VOLUME_FACTOR := 50.0
@export var bus_idx: int
var value: float:
get:
return slider.value
set(v):
slider.set_value_no_signal(v)
spin_box.set_value_no_signal(v)
_set_bus_volume(v)
var _applied_value: float
@onready var bus_name: Label = %BusName
@onready var slider: VSlider = %Slider
@onready var spin_box: SpinBox = %SpinBox
@onready var audio_demo: AudioStreamPlayer = %AudioDemo
func _ready() -> void:
bus_name.text = AudioServer.get_bus_name(bus_idx)
audio_demo.bus = bus_name.text
_applied_value = _db_to_volume(AudioServer.get_bus_volume_db(bus_idx))
value = _applied_value
func _exit_tree() -> void:
# Revert volume to the value from the last time `apply` was called
_set_bus_volume(_applied_value)
func _db_to_volume(db: float) -> float:
return db_to_linear(db) * VOLUME_FACTOR
func _volume_to_db(volume: float) -> float:
return linear_to_db(volume / VOLUME_FACTOR)
func _on_component_value_changed(new_value: float) -> void:
value = new_value
func _set_bus_volume(new_value: float) -> void:
AudioServer.set_bus_volume_db(bus_idx, _volume_to_db(new_value))
func apply() -> void:
# Prevent value from being reverted during destructor.
_applied_value = value
func _on_slider_drag_ended(value_changed: bool) -> void:
if value_changed:
audio_demo.play()
func _on_spin_box_value_changed(_new_value: float) -> void:
audio_demo.play()