audioplayer.gd 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. extends Control
  2. @onready var audio_player = $AudioStreamPlayer
  3. @onready var file_dialog = $FileDialog
  4. @onready var waveform_display = $WaveformPreview
  5. var outfile_path = "not_loaded"
  6. #signal recycle_outfile_trigger
  7. #Used for waveform preview
  8. var voice_preview_generator : Node = null
  9. var stream : AudioStreamWAV = null
  10. func _ready():
  11. #Setup file dialogue to access system files and only accept wav files
  12. #get_window().files_dropped.connect(_on_files_dropped)
  13. file_dialog.access = FileDialog.ACCESS_FILESYSTEM
  14. file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
  15. file_dialog.filters = ["*.wav ; WAV audio files"]
  16. file_dialog.connect("file_selected", Callable(self, "_on_file_selected"))
  17. if get_meta("loadenable") == true:
  18. $RecycleButton.hide()
  19. $LoadButton.show()
  20. else:
  21. $LoadButton.hide()
  22. $RecycleButton.show()
  23. $WavError.hide()
  24. # Load the voice preview generator for waveform visualization
  25. voice_preview_generator = preload("res://addons/audio_preview/voice_preview_generator.tscn").instantiate()
  26. add_child(voice_preview_generator)
  27. voice_preview_generator.texture_ready.connect(_on_texture_ready)
  28. #func _on_files_dropped(files):
  29. #if files[0].get_extension() == "wav" or files[0].get_extension() == "WAV":
  30. #audio_player.stream = AudioStreamWAV.load_from_file(files[0])
  31. #if audio_player.stream.stereo == true: #checks if stream is stereo, not sure what this will do with a surround sound file
  32. #audio_player.stream = null #empties audio stream so stereo audio cant be played back
  33. #$WavError.show()
  34. #else:
  35. #voice_preview_generator.generate_preview(audio_player.stream) #this generates the waveform graphic
  36. #Global.infile = files[0] #this sets the global infile variable to the audio file path
  37. #print(Global.infile)
  38. #else:
  39. #$WavError.show()
  40. func _on_close_button_button_down() -> void:
  41. $WavError.hide()
  42. func _on_load_button_button_down() -> void:
  43. file_dialog.popup_centered()
  44. func _on_file_selected(path: String):
  45. audio_player.stream = AudioStreamWAV.load_from_file(path)
  46. Global.infile_stereo = audio_player.stream.stereo
  47. #if audio_player.stream.stereo == true:
  48. ##audio_player.stream = null
  49. ##$WavError.show()
  50. voice_preview_generator.generate_preview(audio_player.stream)
  51. Global.infile = path
  52. print("Infile set: " + Global.infile)
  53. func play_outfile(path: String):
  54. outfile_path = path
  55. audio_player.stream = AudioStreamWAV.load_from_file(path)
  56. voice_preview_generator.generate_preview(audio_player.stream)
  57. func recycle_outfile(path: String):
  58. audio_player.stream = AudioStreamWAV.load_from_file(path)
  59. Global.infile_stereo = audio_player.stream.stereo
  60. #if audio_player.stream.stereo == true:
  61. ##audio_player.stream = null
  62. ##$WavError.show()
  63. voice_preview_generator.generate_preview(audio_player.stream)
  64. Global.infile = path
  65. print("Infile set: " + Global.infile)
  66. func _on_play_button_button_down() -> void:
  67. if audio_player.stream:
  68. audio_player.play()
  69. $Playhead.position.x = 0
  70. func _on_stop_button_button_down() -> void:
  71. if audio_player.playing:
  72. audio_player.stop()
  73. $Playhead.position.x = 0
  74. # This function will be called when the waveform texture is ready
  75. func _on_texture_ready(image_texture: ImageTexture):
  76. # Set the generated texture to the TextureRect (waveform display node)
  77. waveform_display.texture = image_texture
  78. # Called every frame. 'delta' is the elapsed time since the previous frame.
  79. func _process(delta: float) -> void:
  80. if $AudioStreamPlayer.playing:
  81. var length = $AudioStreamPlayer.stream.get_length()
  82. var total_distance = 399.0
  83. var speed = total_distance / length
  84. $Playhead.position.x += speed * delta
  85. if $Playhead.position.x >= 399:
  86. $Playhead.position.x = 0
  87. #func _on_recycle_button_button_down() -> void:
  88. #if outfile_path != "not_loaded":
  89. #recycle_outfile_trigger.emit(outfile_path)