From 063224c69d564d6e10dd4febf25caa9f59fccfda Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sun, 3 Sep 2023 20:11:35 -0600 Subject: Fixed AIFC Extraction --- src/audio/AIFCWriter.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/audio/AIFCWriter.cpp (limited to 'src/audio/AIFCWriter.cpp') diff --git a/src/audio/AIFCWriter.cpp b/src/audio/AIFCWriter.cpp new file mode 100644 index 0000000..1df5813 --- /dev/null +++ b/src/audio/AIFCWriter.cpp @@ -0,0 +1,48 @@ +#include "AIFCWriter.h" + +#include "hj/pyutils.h" + +#define ALIGN(val, al) (size_t) ((val + (al - 1)) & -al) + +std::vector AIFCWriter::pack(const std::string& str) { + std::vector result; + result.insert(result.end(), str.begin(), str.end()); + return result; +} + +std::vector AIFCWriter::pstring(const std::vector& data) { + std::vector result; + result.insert(result.end(), data.begin(), data.end()); + if (data.size() % 2 == 0) { + result.push_back('\0'); + } + return result; +} + +void AIFCWriter::add_section(AIFC::MagicValues magic, const std::vector& data) { + sections.emplace_back(magic, data); + total_size += ALIGN(data.size(), 2) + 8; +} + +void AIFCWriter::add_custom_section(const std::string& section, const std::vector& data) { + this->add_section(AIFC::MagicValues::AAPL, pack("stoc") + pstring(pack(section)) + data); +} + +void AIFCWriter::finish() { + // total_size isn't used and is regularly wrong. + // In particular, vadpcm_enc preserves the size of the input file... + total_size += 4; + + out.Write(BSWAP32(AIFC::MagicValues::FORM)); + out.Write((uint32_t) BSWAP32(total_size)); + out.Write(BSWAP32(AIFC::MagicValues::AIFC)); + + for (const auto& section : sections) { + out.Write((uint32_t) BSWAP32(section.first)); + out.Write((uint32_t) BSWAP32(section.second.size())); + out.Write((char*) section.second.data(), section.second.size()); + if(section.second.size() % 2) { + out.Write('\0'); + } + } +} -- cgit v1.2.3