From d29dc082e24dea42f54482c06aa732595f25f2eb Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 26 Nov 2023 12:59:21 +0100 Subject: [PATCH] Improve sound bank code --- .../ObjContainer/SoundBank/SoundBank.cpp | 17 +++--- .../ObjContainer/SoundBank/SoundBank.h | 61 +++++++++---------- .../ObjContainer/SoundBank/SoundBankTypes.h | 44 ++++++------- .../T6/AssetDumpers/AssetDumperSndBank.cpp | 1 + 4 files changed, 61 insertions(+), 62 deletions(-) diff --git a/src/ObjLoading/ObjContainer/SoundBank/SoundBank.cpp b/src/ObjLoading/ObjContainer/SoundBank/SoundBank.cpp index 2c8a5e6a..3ab25c3a 100644 --- a/src/ObjLoading/ObjContainer/SoundBank/SoundBank.cpp +++ b/src/ObjLoading/ObjContainer/SoundBank/SoundBank.cpp @@ -1,6 +1,6 @@ #include "SoundBank.h" -#include "Utils/FileUtils.h" +#include "Utils/ObjStream.h" #include "zlib.h" #include @@ -114,7 +114,7 @@ SoundBankEntryInputStream::SoundBankEntryInputStream() { } -SoundBankEntryInputStream::SoundBankEntryInputStream(std::unique_ptr stream, SoundAssetBankEntry entry) +SoundBankEntryInputStream::SoundBankEntryInputStream(std::unique_ptr stream, const SoundAssetBankEntry& entry) : m_stream(std::move(stream)), m_entry(entry) { @@ -122,7 +122,7 @@ SoundBankEntryInputStream::SoundBankEntryInputStream(std::unique_ptr(m_stream); } bool SoundBank::ReadHeader() @@ -134,15 +134,15 @@ bool SoundBank::ReadHeader() return false; } - if (m_header.magic != MAGIC) + if (m_header.magic != sndbank_consts::MAGIC) { std::cout << "Invalid sndbank magic 0x" << std::hex << m_header.magic << std::endl; return false; } - if (m_header.version != VERSION) + if (m_header.version != sndbank_consts::VERSION) { - std::cout << "Unsupported sndbank version " << m_header.version << " (should be " << VERSION << ")" << std::endl; + std::cout << "Unsupported sndbank version " << m_header.version << " (should be " << sndbank_consts::VERSION << ")" << std::endl; return false; } @@ -159,13 +159,14 @@ bool SoundBank::ReadHeader() return false; } - if (m_header.entryCount && (m_header.entryOffset <= 0 || m_header.entryOffset + sizeof(SoundAssetBankEntry) * m_header.entryCount > m_file_size)) + if (m_header.entryCount + && (m_header.entryOffset <= 0 || m_header.entryOffset + static_cast(sizeof(SoundAssetBankEntry) * m_header.entryCount) > m_file_size)) { std::cout << "Invalid sndbank entry offset " << m_header.entryOffset << " (filesize is " << m_file_size << ")" << std::endl; return false; } - if (m_header.checksumOffset <= 0 || m_header.checksumOffset + sizeof(SoundAssetBankChecksum) * m_header.entryCount > m_file_size) + if (m_header.checksumOffset <= 0 || m_header.checksumOffset + static_cast(sizeof(SoundAssetBankChecksum) * m_header.entryCount) > m_file_size) { std::cout << "Invalid sndbank checksum offset " << m_header.checksumOffset << " (filesize is " << m_file_size << ")" << std::endl; return false; diff --git a/src/ObjLoading/ObjContainer/SoundBank/SoundBank.h b/src/ObjLoading/ObjContainer/SoundBank/SoundBank.h index c95586f9..1d71d032 100644 --- a/src/ObjLoading/ObjContainer/SoundBank/SoundBank.h +++ b/src/ObjLoading/ObjContainer/SoundBank/SoundBank.h @@ -3,10 +3,7 @@ #include "ObjContainer/ObjContainerReferenceable.h" #include "ObjContainer/ObjContainerRepository.h" #include "ObjContainer/SoundBank/SoundBankTypes.h" -#include "SearchPath/ISearchPath.h" #include "Utils/ClassUtils.h" -#include "Utils/FileUtils.h" -#include "Utils/ObjStream.h" #include "Zone/Zone.h" #include @@ -14,20 +11,42 @@ class SoundBankEntryInputStream { public: - std::unique_ptr m_stream; - SoundAssetBankEntry m_entry; - SoundBankEntryInputStream(); - SoundBankEntryInputStream(std::unique_ptr stream, SoundAssetBankEntry entry); + SoundBankEntryInputStream(std::unique_ptr stream, const SoundAssetBankEntry& entry); _NODISCARD bool IsOpen() const; + + std::unique_ptr m_stream; + SoundAssetBankEntry m_entry; }; class SoundBank final : public ObjContainerReferenceable { - static constexpr uint32_t MAGIC = FileUtils::MakeMagic32('2', 'U', 'X', '#'); - static constexpr uint32_t VERSION = 14u; + bool ReadHeader(); + bool ReadEntries(); + bool ReadChecksums(); +public: + SoundBank(std::string fileName, std::unique_ptr stream, int64_t fileSize); + ~SoundBank() override = default; + SoundBank(const SoundBank& other) = delete; + SoundBank(SoundBank&& other) noexcept = default; + SoundBank& operator=(const SoundBank& other) = delete; + SoundBank& operator=(SoundBank&& other) noexcept = default; + + static std::string GetFileNameForDefinition(bool streamed, const char* zone, const char* language); + + std::string GetName() override; + + bool Initialize(); + _NODISCARD const std::vector& GetDependencies() const; + + _NODISCARD bool VerifyChecksum(const SoundAssetBankChecksum& checksum) const; + _NODISCARD SoundBankEntryInputStream GetEntryStream(unsigned int id) const; + + static ObjContainerRepository Repository; + +private: std::string m_file_name; std::unique_ptr m_stream; int64_t m_file_size; @@ -38,28 +57,4 @@ class SoundBank final : public ObjContainerReferenceable std::vector m_entries; std::vector m_checksums; std::unordered_map m_entries_by_id; - - bool ReadHeader(); - bool ReadEntries(); - bool ReadChecksums(); - -public: - static ObjContainerRepository Repository; - - static std::string GetFileNameForDefinition(bool streamed, const char* zone, const char* language); - - SoundBank(std::string fileName, std::unique_ptr stream, int64_t fileSize); - ~SoundBank() override = default; - SoundBank(const SoundBank& other) = delete; - SoundBank(SoundBank&& other) noexcept = default; - SoundBank& operator=(const SoundBank& other) = delete; - SoundBank& operator=(SoundBank&& other) noexcept = default; - - std::string GetName() override; - - bool Initialize(); - _NODISCARD const std::vector& GetDependencies() const; - - _NODISCARD bool VerifyChecksum(const SoundAssetBankChecksum& checksum) const; - _NODISCARD SoundBankEntryInputStream GetEntryStream(unsigned int id) const; }; diff --git a/src/ObjLoading/ObjContainer/SoundBank/SoundBankTypes.h b/src/ObjLoading/ObjContainer/SoundBank/SoundBankTypes.h index 27a30539..09b18e4a 100644 --- a/src/ObjLoading/ObjContainer/SoundBank/SoundBankTypes.h +++ b/src/ObjLoading/ObjContainer/SoundBank/SoundBankTypes.h @@ -1,30 +1,32 @@ #pragma once +#include "Utils/FileUtils.h" + #include -class SoundBankConsts +namespace sndbank_consts { - SoundBankConsts() = default; + static constexpr uint32_t MAGIC = FileUtils::MakeMagic32('2', 'U', 'X', '#'); + static constexpr uint32_t VERSION = 14u; -public: static constexpr unsigned OFFSET_DATA_START = 0x800; -}; +}; // namespace sndbank_consts struct SoundAssetBankChecksum { - char checksumBytes[16]; + uint8_t checksumBytes[16]; }; struct SoundAssetBankHeader { - unsigned int magic; // + 0x0 - unsigned int version; // + 0x4 - unsigned int entrySize; // + 0x8 - unsigned int checksumSize; // + 0xC - unsigned int dependencySize; // + 0x10 - unsigned int entryCount; // + 0x14 - unsigned int dependencyCount; // + 0x18 - unsigned int pad32; // + 0x1C + uint32_t magic; // + 0x0 + uint32_t version; // + 0x4 + uint32_t entrySize; // + 0x8 + uint32_t checksumSize; // + 0xC + uint32_t dependencySize; // + 0x10 + uint32_t entryCount; // + 0x14 + uint32_t dependencyCount; // + 0x18 + uint32_t pad32; // + 0x1C int64_t fileSize; // + 0x20 int64_t entryOffset; // + 0x28 int64_t checksumOffset; // + 0x30 @@ -34,12 +36,12 @@ struct SoundAssetBankHeader struct SoundAssetBankEntry { - unsigned int id; - unsigned int size; - unsigned int offset; - unsigned int frameCount; - unsigned char frameRateIndex; - unsigned char channelCount; - unsigned char looping; - unsigned char format; + uint32_t id; + uint32_t size; + uint32_t offset; + uint32_t frameCount; + uint8_t frameRateIndex; + uint8_t channelCount; + uint8_t looping; + uint8_t format; }; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperSndBank.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperSndBank.cpp index b72dabfa..ce606f0a 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperSndBank.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperSndBank.cpp @@ -5,6 +5,7 @@ #include "Sound/WavWriter.h" #include "Utils/ClassUtils.h" +#include #include #include #include