khanat-client/scenes/interfaces/music_manager/music_manager.gd
2021-06-22 18:22:58 +02:00

540 lines
14 KiB
GDScript

extends WindowDialog
signal mute_pressed
signal musicplayer_pressed
onready var music_player = $music
var playlist_music = { 'player': [], 'global': ["res://assets/musics/sangakanat_ames_voyageuses.ogg"] }
var lastdomain = "global"
var currentmusic = ""
var numberchannelplayeraudio = 1
var cacheplayeraudio = []
var music_play = false
var bus = "master"
var next_id = 0
var pause = false
var disable_execution_mute:bool = false
var playback_position_before_pause = 0
var last_update_playermusic = false
func _ready():
var directory = Directory.new()
get_tree().paused = false
Config.msg_debug("Load MusicManager")
self.last_update_playermusic = Config.get_playermusic()
if not directory.dir_exists( "user://musics/" ):
directory.make_dir_recursive( "user://musics/" )
directory.open( "user://musics/" )
directory.list_dir_begin()
var files = []
while true:
var file = directory.get_next()
if file == "":
break
elif not file.begins_with(".") and not directory.current_is_dir() and not file.ends_with( ".import" ):
files.append(file)
directory.list_dir_end()
# for file in files:
# var button = preload( "res://scenes/interfaces/music_manager/music_button.tscn" ).instance()
# button.music_filename = "res://assets/musics/" + file
# button.text = file
# button.connect( "music_selected", self, "_on_music_pressed" )
# $window_box/scroll_box/musics_box.add_child( button )
for file in Config.queuemusic:
# # Config.msg_debug(str(file))
add_music( file )
update_volume_db()
#musicplayer = AudioStreamPlayer.new()
#self.add_child(music_player)
# update_playermusic()
if Config.mute:
set_mute_on()
else:
set_mute_off()
music_player.connect("finished", self, "_on_stream_finished", [])
func connect_ext( signal_name, target ):
Config.msg_debug("Connect external [signal:" + signal_name + ", func:" + "_on_signal_" + signal_name + "]")
target.connect( signal_name, self, "_on_signal_" + signal_name )
func _on_stream_finished():
# When finished playing a stream, make the player available again.
Config.msg_debug("_on_stream_finished")
music_play = false
func play_music(filename: String):
Config.msg_debug("path:" + str(filename))
music_player.stream = load_music( filename )
music_player.play()
currentmusic = filename
music_play = true
for child in $window_box/scroll_box/musics_box.get_children():
if Config.mute:
child.set_disabled()
elif child.get_music() == filename or not Config.playermusic :
child.set_play()
else:
child.set_unplay()
func load_playlist():
Config.msg_debug("load_playlist")
var domain="global"
var pos = 0
var posmusic = -1
# if Config.mute:
# if music_play:
# Config.msg_debug("mute")
# music_player.set_pause_mode(true)
# return
if music_play:
music_player.set_pause_mode(false)
# music_player.queue_free()
if Config.playermusic:
domain="player"
if domain != lastdomain:
Config.msg_debug("Change domain:" + domain)
currentmusic = ""
posmusic = -1
lastdomain = domain
if len(playlist_music[domain]) == 0:
Config.msg_debug("No musique on" + domain)
music_player.stop()
return
for path in playlist_music[domain]:
if Config.playermusic:
if currentmusic == path.get_music():
posmusic = pos
Config.msg_debug("Change domain:" + domain + " posmusic:" + str(posmusic))
break
else:
if currentmusic == path:
posmusic = pos
Config.msg_debug("Change domain:" + domain + " posmusic:" + str(posmusic))
break
pos += 1
Config.msg_debug("Change domain:" + domain + " posmusic" + str(posmusic))
if posmusic == -1:
posmusic = 0
Config.msg_debug("init:" + str(posmusic) + " / " + str(len(playlist_music[domain])))
else:
posmusic = (posmusic + 1) % len(playlist_music[domain])
Config.msg_debug("next:" + str(posmusic))
var path = playlist_music[domain][posmusic]
if Config.playermusic:
currentmusic = path.get_music()
else:
currentmusic = path
play_music(currentmusic)
# Config.msg_debug("path:" + str(currentmusic))
# music_player.stream = load_music( currentmusic )
# music_player.play()
# play_music = true
#audio_player.add_child()
func _process(_delta):
if not pause and not music_play and not Config.mute:
Config.msg_debug("next")
load_playlist()
# music_player.stream = load_music(queuemusic.pop_front())
# music_player.play()
# music_play = true
func load_external_music(filepath):
var stream = null
Config.msg_debug("load_external_music")
var file = File.new()
file.open(filepath, file.READ)
var ext = filepath.split(".")[-1].to_lower()
var buffer = file.get_buffer(file.get_len())
Config.msg_debug(ext)
match ext:
"ogg":
stream = AudioStreamOGGVorbis.new()
"mp3":
stream = AudioStreamMP3.new()
#"wav":
# # We need decode message to get format (Stero/size bit/ ...
# stream = AudioStreamSample.new()
# stream.format = AudioStreamSample.FORMAT_16_BITS
# #stream.stereo = true
_:
Config.msg_error("Impossible to identify type of file (file:" + filepath + ", ext:" + ext + ")")
return
stream.data = buffer
Config.msg_debug("load_external_music : End")
return stream
func load_music(filepath: String):
if filepath.left(5) == "res:/":
return load( filepath )
return load_external_music(filepath)
func reinitialize():
pass
func play_next_music(stream):
Config.msg_debug("play_next_music")
func update_volume_db():
Config.msg_debug("update_volume_db")
if Config.mute:
music_player.set_volume_db(linear2db(0.0))
music_player.set_pause_mode(true)
#update_playermusic()
return
var lvl = Config.sound_lvl_global * Config.sound_lvl_music / 10000.0
music_player.set_volume_db(linear2db(lvl))
music_player.set_pause_mode(false)
#update_playermusic()
func set_sound_mute(value: bool):
Config.msg_debug("set_sound_mute")
Config.set_sound_mute(value)
update_volume_db()
Config.save_config()
func set_level_global(value: int):
Config.msg_debug("set_level_global")
Config.sound_lvl_global = value
update_volume_db()
func set_level_music(value: int):
Config.msg_debug("set_level_music")
Config.sound_lvl_music = value
update_volume_db()
func set_level_effect(value: int):
Config.msg_debug("set_level_effect")
Config.sound_lvl_effect = value
update_volume_db()
func clear_music():
pass
func load_music_to_config():
Config.msg_debug("load_music_to_config")
Config.queuemusic = []
for child in $window_box/scroll_box/musics_box.get_children():
Config.queuemusic.append( child.get_music() )
Config.save_config()
func add_music(file: String):
var music_box = preload( "res://scenes/interfaces/music_manager/music_button.tscn" ).instance()
music_box.set_music( file, self.next_id )
music_box.connect( "del_pressed", self, "_on_music_box_delete_pressed" )
music_box.connect( "down_pressed", self, "_on_music_box_down_pressed" )
music_box.connect( "up_pressed", self, "_on_music_box_up_pressed" )
$window_box/scroll_box/musics_box.add_child( music_box )
self.next_id += 1
playlist_music['player'] = $window_box/scroll_box/musics_box.get_children()
load_music_to_config()
auto_sizing_windows()
func _on_music_box_delete_pressed( id ):
Config.msg_debug("_on_music_box_delete_pressed")
for child in $window_box/scroll_box/musics_box.get_children():
if child.id == id:
child.queue_free()
auto_sizing_windows()
func _on_music_box_down_pressed( id ):
Config.msg_debug("_on_music_box_down_pressed")
var pos = 0
for child in $window_box/scroll_box/musics_box.get_children():
if child.id == id:
break
pos += 1
if pos >= $window_box/scroll_box/musics_box.get_child_count():
Config.msg_error("Out of range : " + "pos:" + str(pos) + " count:" + str($window_box/scroll_box/musics_box.get_child_count()))
return
self.move_child_id(id, pos + 1)
func _on_music_box_up_pressed( id ):
Config.msg_debug("_on_music_box_up_pressed")
var pos = 0
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_id() == id:
break
pos += 1
if pos <= 0:
Config.msg_error("Out of range : " + "pos:" + str(pos))
return
self.move_child_id(id, pos - 1)
func move_child(music_filename, pos):
var ele = null
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_music() == music_filename:
ele = child
break
if ele:
$window_box/scroll_box/musics_box.move_child(ele, pos)
playlist_music['player'] = $window_box/scroll_box/musics_box.get_children()
func move_child_id(id, pos):
var ele = null
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_id() == id:
ele = child
break
if ele:
$window_box/scroll_box/musics_box.move_child(ele, pos)
playlist_music['player'] = $window_box/scroll_box/musics_box.get_children()
load_music_to_config()
func auto_sizing_windows():
Config.msg_debug("Auto sizing Jukebox")
var max_x = 0
var max_y = $window_box/controls_box.rect_size.y
for child in $window_box/scroll_box/musics_box.get_children():
var x = 0
for child2 in child.get_children():
x += child2.rect_size.x
if max_x < x:
max_x += x
max_y += 24
var tx = int( (get_viewport().size.x - max_x) / 2 )
var ty = int( (get_viewport().size.y - max_y) / 2 )
if tx <= 20:
max_x = get_viewport().size.x - 20
tx = 10
if ty <= 20:
max_y = get_viewport().size.y - 20
ty = 10
self.rect_size.x = max_x
self.rect_position.x = tx
self.rect_size.y = max_y
self.rect_position.y = ty
func open():
Config.msg_debug("Open")
update_playermusic()
# auto_sizing_windows()
self.popup()
func close():
Config.msg_debug("Close")
self.hide()
func toggle():
Config.msg_debug("toggle")
if self.visible:
self.close()
else:
self.open()
func _on_music_pressed():
Config.msg_debug("Music")
func _on_music_bis_pressed( p_filename ):
Config.msg_debug(p_filename)
func _on_previous_pressed():
Config.msg_debug("Previous")
var previous = null
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_music() == currentmusic:
if previous != null:
pause = false
play_music(previous.get_music())
return
previous = child
func _on_pause_pressed():
Config.msg_debug("Pause")
if pause:
return
pause = true
playback_position_before_pause = music_player.get_playback_position( )
#music_player.stop()
func _on_play_pressed():
Config.msg_debug("Play")
if not pause:
return
music_player.play(playback_position_before_pause)
pause = false
func _on_next_pressed():
Config.msg_debug("Next")
var detected = false
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_music() == currentmusic:
detected = true
break
if detected:
pause = false
play_music(child.get_music())
return
func _on_sound_pressed():
Config.msg_debug("Music")
func _on_soundeffect_pressed():
Config.msg_debug("Sound Effect")
func _on_auto_pressed():
Config.msg_debug("Auto")
Config.set_playermusic(not Config.get_playermusic())
Config.save_config()
emit_signal( "musicplayer_pressed" )
func _on_mute_toggled(button_pressed):
Config.msg_debug("Mute")
MusicManager.set_sound_mute(button_pressed)
emit_signal( "mute_pressed" )
func _on_mute_pressed():
Config.msg_debug("Button JukeBox Mute")
MusicManager.set_sound_mute(not Config.mute)
emit_signal( "mute_pressed" )
func set_playermusic_on():
Config.msg_debug("playermusic on")
$window_box/controls_box/h_box_container_3/auto.texture_normal = load ( "res://assets/interfaces/jukebox/auto_on.png")
func set_playermusic_off():
Config.msg_debug("playermusic off")
$window_box/controls_box/h_box_container_3/auto.texture_normal = load ( "res://assets/interfaces/jukebox/auto_off.png")
Config.msg_debug("playermusic off : End")
func set_mute_on():
Config.msg_debug("mute on")
self.disable_execution_mute = true
$window_box/controls_box/h_box_container/mute.texture_normal = load ( "res://assets/interfaces/jukebox/sound_off.png")
self.disable_execution_mute = false
func set_mute_off():
Config.msg_debug("mute off")
self.disable_execution_mute = true
$window_box/controls_box/h_box_container/mute.texture_normal = load ( "res://assets/interfaces/jukebox/sound_on.png")
self.disable_execution_mute = false
func _on_add_pressed():
Config.msg_debug("")
$file_dialog.show()
func _on_file_dialog_files_selected(paths):
Config.msg_debug("multi files")
#if self.slots_number > 0:
# self.slots[self.slots_number - 1].disable_down()
for path in paths:
var found = false
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_music() == path:
found = true
break
if found:
continue
Config.msg_debug("file: "+ path)
MusicManager.add_music(path)
self.next_id += 1
self.open()
func update_playermusic():
Config.msg_debug("update_playermusic")
if Config.get_playermusic():
#Config.msg_debug("update_playermusic: player music")
set_playermusic_on()
for child in $window_box/scroll_box/musics_box.get_children():
if child.get_music() == currentmusic:
#Config.msg_debug("update_playermusic: player music : on " + child.get_music())
child.set_play()
elif Config.mute:
child.set_disabled()
else:
#Config.msg_debug("update_playermusic: player music : off " + child.get_music())
child.set_unplay()
else:
#Config.msg_debug("update_playermusic: khanat music")
set_playermusic_off()
for child in $window_box/scroll_box/musics_box.get_children():
child.set_disabled()
if last_update_playermusic != Config.get_playermusic():
Config.msg_debug("*** last_update_playermusic different ***")
load_playlist()
last_update_playermusic = Config.get_playermusic()
Config.msg_debug("update_playermusic : End")
func _on_check_button_toggled(button_pressed):
Config.msg_debug("_on_check_button_toggled")
#Config.set_playermusic(not Config.get_playermusic())
Config.set_playermusic(button_pressed)
emit_signal( "musicplayer_toggled" , not Config.playermusic )
func _on_music_manager_musicplayer_pressed():
Config.msg_debug("Signal musicplayer_pressed recieved on MusicManager")
update_playermusic()
func _on_music_manager_mute_pressed():
Config.msg_debug("Signal mute_pressed")
update_playermusic()
if Config.mute:
set_mute_on()
else:
set_mute_off()
func _on_signal_mute_pressed():
Config.msg_debug("<MusicManager> Received signal mute")
update_playermusic()
if Config.mute:
set_mute_on()
else:
set_mute_off()
func _on_signal_musicplayer_pressed():
Config.msg_debug("<MusicManager> Received signal musicplayer")
update_playermusic()