citylimits/addons/sound_manager/abstract_audio_player_pool.gd
Tony Bark 2b41f84b05 Lots of stuff I forgot to commit because Holidays
- D&D dice engine (see README)
- Markdown support
- Phantom camera
2023-12-24 20:39:57 -05:00

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)