Skip to content

Commit 641cccb

Browse files
committed
Implemented XML Audio Sequences
1 parent 0d9aa9d commit 641cccb

5 files changed

Lines changed: 51 additions & 2 deletions

File tree

config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
binary: sm64.o2r
1313
code: code/jp
1414
headers: include/assets
15+
modding: mods/assets
1516
segments:
1617
- 0x000000
1718
- 0x000000
@@ -48,6 +49,7 @@
4849
output:
4950
binary: sm64.o2r
5051
code: code/us
52+
modding: mods/assets
5153
headers: include/assets
5254
segments:
5355
- 0x000000

src/port/Engine.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ void GameEngine::FinishInit() {
290290
"AudioSample", static_cast<uint32_t>(SM64::ResourceType::Sample), 0);
291291
loader->RegisterResourceFactory(std::make_shared<SM64::AudioSequenceFactoryV0>(), RESOURCE_FORMAT_BINARY,
292292
"AudioSequence", static_cast<uint32_t>(SM64::ResourceType::Sequence), 0);
293+
loader->RegisterResourceFactory(std::make_shared<SM64::AudioSequenceXMLFactoryV0>(), RESOURCE_FORMAT_XML,
294+
"Sequence", static_cast<uint32_t>(SM64::ResourceType::Sequence), 0);
293295
loader->RegisterResourceFactory(std::make_shared<SM64::DialogFactoryV0>(), RESOURCE_FORMAT_BINARY, "Dialog",
294296
static_cast<uint32_t>(SM64::ResourceType::SDialog), 0);
295297
loader->RegisterResourceFactory(std::make_shared<SM64::DictionaryFactoryV0>(), RESOURCE_FORMAT_BINARY, "Dictionary",
@@ -916,6 +918,9 @@ void GameEngine::AudioInit() {
916918
}
917919

918920
for (auto& sequence : *sequences_files) {
921+
if(sequence.find(".m64") != std::string::npos) {
922+
continue;
923+
}
919924
auto path = "__OTR__" + sequence;
920925
auto seq = static_cast<AudioSequenceData*>(ResourceGetDataByName(path.c_str()));
921926
Instance->sequenceTable[seq->id] = path;

src/port/importer/AudioSequenceFactory.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "port/importer/types/AudioSequence.h"
33
#include "spdlog/spdlog.h"
44
#include "port/Engine.h"
5+
#include <tinyxml2.h>
56
#include "port/importer/types/AudioBank.h"
67

78
std::shared_ptr<Ship::IResource>
@@ -32,4 +33,38 @@ SM64::AudioSequenceFactoryV0::ReadResource(std::shared_ptr<Ship::File> file,
3233
bank->mData.id = id;
3334

3435
return bank;
35-
}
36+
}
37+
38+
39+
std::shared_ptr<Ship::IResource>
40+
SM64::AudioSequenceXMLFactoryV0::ReadResource(std::shared_ptr<Ship::File> file,
41+
std::shared_ptr<Ship::ResourceInitData> initData) {
42+
if (!FileHasValidFormatAndReader(file, initData)) {
43+
return nullptr;
44+
}
45+
46+
std::shared_ptr<AudioSequence> seq = std::make_shared<AudioSequence>(initData);
47+
auto child =
48+
std::get<std::shared_ptr<tinyxml2::XMLDocument>>(file->Reader)->FirstChildElement();
49+
50+
auto m64File = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->LoadFile(child->Attribute("Path"));
51+
52+
tinyxml2::XMLElement* banksRoot = child->FirstChildElement("Banks");
53+
tinyxml2::XMLElement* banks = banksRoot->FirstChildElement();
54+
while (banks != nullptr) {
55+
auto path = banks->Attribute("Path");
56+
seq->banks.push_back(GameEngine::GetBankIdByName(path));
57+
banks = banks->NextSiblingElement();
58+
}
59+
60+
// Copy m64 to sampleData
61+
for(size_t i = 0; i < m64File->Buffer->size(); i++) {
62+
seq->sampleData.push_back((uint8_t) m64File->Buffer->at(i));
63+
}
64+
65+
seq->mData.id = child->IntAttribute("ID");
66+
seq->mData.banks = seq->banks.data();
67+
seq->mData.bankCount = seq->banks.size();
68+
seq->mData.data = seq->sampleData.data();
69+
return seq;
70+
}

src/port/importer/AudioSequenceFactory.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <ship/resource/Resource.h>
4+
#include <ship/resource/ResourceFactoryXML.h>
45
#include <ship/resource/ResourceFactoryBinary.h>
56

67
namespace SM64 {
@@ -9,4 +10,10 @@ class AudioSequenceFactoryV0 : public Ship::ResourceFactoryBinary {
910
std::shared_ptr<Ship::IResource> ReadResource(std::shared_ptr<Ship::File> file,
1011
std::shared_ptr<Ship::ResourceInitData> initData) override;
1112
};
13+
14+
class AudioSequenceXMLFactoryV0 : public Ship::ResourceFactoryXML {
15+
public:
16+
std::shared_ptr<Ship::IResource> ReadResource(std::shared_ptr<Ship::File> file,
17+
std::shared_ptr<Ship::ResourceInitData> initData) override;
18+
};
1219
}

0 commit comments

Comments
 (0)