mirror of
https://github.com/tonytins/citylimits
synced 2025-05-06 22:54:48 -04:00
84 lines
2.1 KiB
GDScript
84 lines
2.1 KiB
GDScript
extends Node
|
|
|
|
|
|
@export var default_busses := []
|
|
@export var default_pool_size := 8
|
|
|
|
|
|
var available_players: Array[AudioStreamPlayer] = []
|
|
var busy_players: Array[AudioStreamPlayer] = []
|
|
var bus: String = "Master"
|
|
|
|
|
|
func _init(possible_busses: PackedStringArray = default_busses, pool_size: int = default_pool_size) -> void:
|
|
bus = get_possible_bus(possible_busses)
|
|
|
|
for i in pool_size:
|
|
increase_pool()
|
|
|
|
func get_possible_bus(possible_busses: PackedStringArray) -> String:
|
|
for possible_bus in possible_busses:
|
|
var cases: PackedStringArray = [
|
|
possible_bus,
|
|
possible_bus.to_lower(),
|
|
possible_bus.to_camel_case(),
|
|
possible_bus.to_pascal_case(),
|
|
possible_bus.to_snake_case()
|
|
]
|
|
for case in cases:
|
|
if AudioServer.get_bus_index(case) > -1:
|
|
return case
|
|
return "Master"
|
|
|
|
func prepare(resource: AudioStream, override_bus: String = "") -> AudioStreamPlayer:
|
|
var player: AudioStreamPlayer
|
|
|
|
if resource is AudioStreamRandomizer:
|
|
player = get_player_with_resource(resource)
|
|
|
|
if player == null:
|
|
player = get_available_player()
|
|
|
|
player.stream = resource
|
|
player.bus = override_bus if override_bus != "" else bus
|
|
player.volume_db = linear_to_db(1.0)
|
|
player.pitch_scale = 1
|
|
return player
|
|
|
|
|
|
func get_available_player() -> AudioStreamPlayer:
|
|
if available_players.size() == 0:
|
|
increase_pool()
|
|
var player = available_players.pop_front()
|
|
busy_players.append(player)
|
|
return player
|
|
|
|
|
|
func get_player_with_resource(resource: AudioStream) -> AudioStreamPlayer:
|
|
for player in busy_players + available_players:
|
|
if player.stream == resource:
|
|
return player
|
|
return null
|
|
|
|
|
|
func mark_player_as_available(player: AudioStreamPlayer) -> void:
|
|
if busy_players.has(player):
|
|
busy_players.erase(player)
|
|
|
|
if not available_players.has(player):
|
|
available_players.append(player)
|
|
|
|
|
|
func increase_pool() -> void:
|
|
var player := AudioStreamPlayer.new()
|
|
add_child(player)
|
|
available_players.append(player)
|
|
player.bus = bus
|
|
player.finished.connect(_on_player_finished.bind(player))
|
|
|
|
|
|
### SIGNALS
|
|
|
|
|
|
func _on_player_finished(player: AudioStreamPlayer) -> void:
|
|
mark_player_as_available(player)
|