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
78std::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+ }
0 commit comments