Godot provides a powerful and flexible audio system built around the AudioServer, which handles all audio processing, mixing, and output. The system supports multiple audio formats, real-time effects, and spatial audio for 2D and 3D games.
The AudioServer uses a bus-based architecture similar to professional audio software, allowing complex audio routing and effects chains.
# Get bus countvar bus_count = AudioServer.bus_countprint("Number of buses: ", bus_count)# Get bus by namevar bus_idx = AudioServer.get_bus_index("Music")# Set bus volume (in dB)AudioServer.set_bus_volume_db(bus_idx, -10.0)# Mute a busAudioServer.set_bus_mute(bus_idx, true)# Solo a busAudioServer.set_bus_solo(bus_idx, true)
// Get bus countint busCount = AudioServer.BusCount;GD.Print($"Number of buses: {busCount}");// Get bus by nameint busIdx = AudioServer.GetBusIndex("Music");// Set bus volume (in dB)AudioServer.SetBusVolumeDb(busIdx, -10.0f);// Mute a busAudioServer.SetBusMute(busIdx, true);// Solo a busAudioServer.SetBusSolo(busIdx, true);
# Set volume in dB (-80 to 24)var bus_idx = AudioServer.get_bus_index("Master")AudioServer.set_bus_volume_db(bus_idx, 0.0) # 0 dB = no change# Convert between linear and dBvar linear_volume = 0.5 # 50%var db_volume = linear_to_db(linear_volume)AudioServer.set_bus_volume_db(bus_idx, db_volume)# Get volume as linear valuevar current_linear = AudioServer.get_bus_volume_linear(bus_idx)
0 dB represents no change in volume. Negative values reduce volume, positive values amplify (but may cause clipping).
The AudioStreamPlayer node plays audio streams without positional audio:
var player = AudioStreamPlayer.new()player.stream = load("res://sounds/music.ogg")player.bus = "Music"player.volume_db = -5.0add_child(player)player.play()
var player = new AudioStreamPlayer();player.Stream = ResourceLoader.Load<AudioStream>("res://sounds/music.ogg");player.Bus = "Music";player.VolumeDb = -5.0f;AddChild(player);player.Play();
Key Properties:
stream - The AudioStream resource to play
volume_db - Volume in decibels (offset from stream volume)
pitch_scale - Playback speed/pitch multiplier
bus - Target audio bus name
autoplay - Start playing when entering the tree
max_polyphony - Maximum simultaneous sounds
Key Methods:
play(from_position) - Start playback
stop() - Stop playback
seek(to_position) - Jump to a position in seconds
get_playback_position() - Get current position in seconds
var player2d = AudioStreamPlayer2D.new()player2d.stream = load("res://sounds/explosion.wav")player2d.position = Vector2(100, 200)player2d.max_distance = 500.0 # Audio fades out at this distanceadd_child(player2d)player2d.play()
var player = AudioStreamPlayer.new()player.stream = load("res://sounds/effect.wav")add_child(player)# Play from beginningplayer.play()# Play from specific position (in seconds)player.play(2.5)# Stop playbackplayer.stop()# Pause/unpauseplayer.stream_paused = trueplayer.stream_paused = false
Play multiple sounds simultaneously from one player:
var player = AudioStreamPlayer.new()player.stream = load("res://sounds/gunshot.wav")player.max_polyphony = 8 # Allow up to 8 simultaneous playsadd_child(player)# Each call to play() creates a new playback instancefor i in range(3): player.play() await get_tree().create_timer(0.1).timeout
# Send "SFX" bus to "Master" busvar sfx_bus = AudioServer.get_bus_index("SFX")AudioServer.set_bus_send(sfx_bus, "Master")# You can also route to custom busesAudioServer.set_bus_send(sfx_bus, "Reverb")
func _process(delta): var master_idx = AudioServer.get_bus_index("Master") var peak_left = AudioServer.get_bus_peak_volume_left_db(master_idx, 0) var peak_right = AudioServer.get_bus_peak_volume_right_db(master_idx, 0) # Convert to linear for visualization var left_linear = db_to_linear(peak_left) var right_linear = db_to_linear(peak_right) # Update volume meters update_volume_meter(left_linear, right_linear)