summaryrefslogtreecommitdiffstats
path: root/editor/import/resource_importer_wav.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/import/resource_importer_wav.cpp')
-rw-r--r--editor/import/resource_importer_wav.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp
index 7a6f39906c..f500ec4a07 100644
--- a/editor/import/resource_importer_wav.cpp
+++ b/editor/import/resource_importer_wav.cpp
@@ -94,7 +94,7 @@ void ResourceImporterWAV::get_import_options(const String &p_path, List<ImportOp
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "compress/mode", PROPERTY_HINT_ENUM, "PCM (Uncompressed),IMA ADPCM,Quite OK Audio"), 2));
}
-Error ResourceImporterWAV::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
+Error ResourceImporterWAV::import(ResourceUID::ID p_source_id, const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
/* STEP 1, READ WAVE FILE */
Error err;
@@ -112,7 +112,15 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
}
/* GET FILESIZE */
- file->get_32(); // filesize
+
+ // The file size in header is 8 bytes less than the actual size.
+ // See https://docs.fileformat.com/audio/wav/
+ const int FILE_SIZE_HEADER_OFFSET = 8;
+ uint32_t file_size_header = file->get_32() + FILE_SIZE_HEADER_OFFSET;
+ uint64_t file_size = file->get_length();
+ if (file_size != file_size_header) {
+ WARN_PRINT(vformat("File size %d is %s than the expected size %d. (%s)", file_size, file_size > file_size_header ? "larger" : "smaller", file_size_header, p_source_file));
+ }
/* CHECK WAVE */
@@ -198,11 +206,14 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
break;
}
+ uint64_t remaining_bytes = file_size - file_pos;
frames = chunksize;
-
- if (format_channels == 0) {
- ERR_FAIL_COND_V(format_channels == 0, ERR_INVALID_DATA);
+ if (remaining_bytes < chunksize) {
+ WARN_PRINT(vformat("Data chunk size is smaller than expected. Proceeding with actual data size. (%s)", p_source_file));
+ frames = remaining_bytes;
}
+
+ ERR_FAIL_COND_V(format_channels == 0, ERR_INVALID_DATA);
frames /= format_channels;
frames /= (format_bits >> 3);