diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd index 2d59f1bb3..bd85ca919 100644 --- a/src/Autoload/Export.gd +++ b/src/Autoload/Export.gd @@ -539,11 +539,18 @@ func export_video(export_paths: PackedStringArray, project: Project) -> bool: var max_audio_duration := 0 var adelay_string := "" for layer in project.get_all_audio_layers(): - if layer.audio is AudioStreamMP3: - var temp_file_name := str(audio_layer_count + 1).pad_zeros(number_of_digits) + ".mp3" + if layer.audio is AudioStreamMP3 or layer.audio is AudioStreamWAV: + var temp_file_name := str(audio_layer_count + 1).pad_zeros(number_of_digits) + if layer.audio is AudioStreamMP3: + temp_file_name += ".mp3" + elif layer.audio is AudioStreamWAV: + temp_file_name += ".wav" var temp_file_path := temp_path_real.path_join(temp_file_name) - var temp_audio_file := FileAccess.open(temp_file_path, FileAccess.WRITE) - temp_audio_file.store_buffer(layer.audio.data) + if layer.audio is AudioStreamMP3: + var temp_audio_file := FileAccess.open(temp_file_path, FileAccess.WRITE) + temp_audio_file.store_buffer(layer.audio.data) + elif layer.audio is AudioStreamWAV: + layer.audio.save_to_wav(temp_file_path) ffmpeg_combine_audio.append("-i") ffmpeg_combine_audio.append(temp_file_path) var delay := floori(layer.playback_position * 1000) diff --git a/src/Autoload/OpenSave.gd b/src/Autoload/OpenSave.gd index d6d73b5d7..78c67ac60 100644 --- a/src/Autoload/OpenSave.gd +++ b/src/Autoload/OpenSave.gd @@ -53,7 +53,7 @@ func handle_loading_file(file: String, force_import_dialog_on_images := false) - var new_path := SHADERS_DIRECTORY.path_join(file.get_file()) DirAccess.copy_absolute(file, new_path) shader_copied.emit(new_path) - elif file_ext == "mp3": # Audio file + elif file_ext == "mp3" or file_ext == "wav": # Audio file open_audio_file(file) else: # Image files @@ -474,6 +474,12 @@ func save_pxo_file( zip_packer.start_file(audio_path) zip_packer.write_file(layer.audio.data) zip_packer.close_file() + elif layer.audio is AudioStreamWAV: + var tmp_wav := FileAccess.create_temp(FileAccess.READ, "tmp", "wav") + layer.audio.save_to_wav(tmp_wav.get_path()) + zip_packer.start_file(audio_path) + zip_packer.write_file(tmp_wav.get_buffer(tmp_wav.get_length())) + zip_packer.close_file() zip_packer.close() if temp_path != path: @@ -941,8 +947,11 @@ func set_new_imported_tab(project: Project, path: String) -> void: func open_audio_file(path: String) -> void: var audio_stream: AudioStream var file := FileAccess.open(path, FileAccess.READ) - audio_stream = AudioStreamMP3.new() - audio_stream.data = file.get_buffer(file.get_length()) + if path.get_extension().to_lower() == "mp3": + audio_stream = AudioStreamMP3.new() + audio_stream.data = file.get_buffer(file.get_length()) + elif path.get_extension().to_lower() == "wav": + audio_stream = AudioStreamWAV.load_from_buffer(file.get_buffer(file.get_length())) if not is_instance_valid(audio_stream): return var project := Global.current_project diff --git a/src/Classes/Project.gd b/src/Classes/Project.gd index 786669aa5..aca547992 100644 --- a/src/Classes/Project.gd +++ b/src/Classes/Project.gd @@ -380,6 +380,8 @@ func deserialize(dict: Dictionary, zip_reader: ZIPReader = null, file: FileAcces if saved_layer.get("audio_type", "") == "AudioStreamMP3": stream = AudioStreamMP3.new() stream.data = audio_data + elif saved_layer.get("audio_type", "") == "AudioStreamWAV": + stream = AudioStreamWAV.load_from_buffer(audio_data) layer.audio = stream layers.append(layer) audio_layers += 1 diff --git a/src/UI/Timeline/LayerButton.tscn b/src/UI/Timeline/LayerButton.tscn index 403ef7770..2ed708ae0 100644 --- a/src/UI/Timeline/LayerButton.tscn +++ b/src/UI/Timeline/LayerButton.tscn @@ -200,6 +200,7 @@ layout_mode = 2 disable_3d = true item_count = 2 item_0/text = "Properties" +item_0/id = 0 item_1/text = "Clipping mask" item_1/checkable = 1 item_1/id = 1 diff --git a/src/UI/Timeline/LayerProperties.gd b/src/UI/Timeline/LayerProperties.gd index 2c83e900a..411199c94 100644 --- a/src/UI/Timeline/LayerProperties.gd +++ b/src/UI/Timeline/LayerProperties.gd @@ -186,10 +186,13 @@ func _on_play_at_frame_slider_value_changed(value: float) -> void: func _on_audio_file_dialog_file_selected(path: String) -> void: var audio_stream: AudioStream - if path.get_extension() == "mp3": + if path.to_lower().get_extension() == "mp3": var file := FileAccess.open(path, FileAccess.READ) audio_stream = AudioStreamMP3.new() audio_stream.data = file.get_buffer(file.get_length()) + elif path.to_lower().get_extension() == "wav": + var file := FileAccess.open(path, FileAccess.READ) + audio_stream = AudioStreamWAV.load_from_buffer(file.get_buffer(file.get_length())) for layer_index in layer_indices: var layer := Global.current_project.layers[layer_index] if layer is AudioLayer: diff --git a/src/UI/Timeline/LayerProperties.tscn b/src/UI/Timeline/LayerProperties.tscn index fd0ed5061..1295d084f 100644 --- a/src/UI/Timeline/LayerProperties.tscn +++ b/src/UI/Timeline/LayerProperties.tscn @@ -119,7 +119,7 @@ always_on_top = true ok_button_text = "Open" file_mode = 0 access = 2 -filters = PackedStringArray("*.mp3 ; MP3 Audio") +filters = PackedStringArray("*.mp3 ; MP3 Audio", "*.wav; WAV Audio") [connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] [connection signal="text_changed" from="GridContainer/NameLineEdit" to="." method="_on_name_line_edit_text_changed"]