diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2023-09-03 20:11:35 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2023-09-03 20:11:35 -0600 |
| commit | 063224c69d564d6e10dd4febf25caa9f59fccfda (patch) | |
| tree | c1edbd90c120d7b846490159540f68adfddfbb5a /src/audio/AIFCWriter.cpp | |
| parent | 113472302904ac84d4ddf70df32ca245ad156bf2 (diff) | |
Fixed AIFC Extraction
Diffstat (limited to 'src/audio/AIFCWriter.cpp')
| -rw-r--r-- | src/audio/AIFCWriter.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
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<char> AIFCWriter::pack(const std::string& str) { + std::vector<char> result; + result.insert(result.end(), str.begin(), str.end()); + return result; +} + +std::vector<char> AIFCWriter::pstring(const std::vector<char>& data) { + std::vector<char> 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<char>& 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<char>& 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'); + } + } +} |
