diff --git a/data/file_list.yml b/data/file_list.yml index cb22e0d80..2165b0431 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -224035,7 +224035,7 @@ Library/Audio/AudioEventController.o: label: - _ZN2al26AudioAddonSoundArchiveInfoC1Ev - _ZN2al26AudioAddonSoundArchiveInfoC2Ev - status: NotDecompiled + status: Matching - offset: 0x8118fc size: 8 label: @@ -224051,7 +224051,7 @@ Library/Audio/AudioEventController.o: - offset: 0x81190c size: 72 label: _ZN2al26AudioAddonSoundArchiveInfo10createInfoERKNS_9ByamlIterE - status: NotDecompiled + status: Matching - offset: 0x811954 size: 108 label: _ZN2al21AudioSoundArchiveInfo10createInfoERKNS_9ByamlIterE @@ -224068,7 +224068,7 @@ Library/Audio/AudioEventController.o: - offset: 0x811c64 size: 12 label: _ZN2al26AudioAddonSoundArchiveInfo11compareInfoEPKS0_S2_ - status: NotDecompiled + status: Matching - offset: 0x811c70 size: 104 label: _ZN2al26AudioInfoListCreateFunctorINS_26AudioAddonSoundArchiveInfoEE30tryCreateAudioInfoAndSetToListERKNS_9ByamlIterE diff --git a/lib/al/Library/Audio/AudioEventController.cpp b/lib/al/Library/Audio/AudioEventController.cpp new file mode 100644 index 000000000..cd4d662ba --- /dev/null +++ b/lib/al/Library/Audio/AudioEventController.cpp @@ -0,0 +1,23 @@ +#include "Library/Audio/AudioEventController.h" + +#include "Library/Yaml/ByamlIter.h" + +namespace al { + +AudioAddonSoundArchiveInfo::AudioAddonSoundArchiveInfo() = default; + +AudioAddonSoundArchiveInfo* AudioAddonSoundArchiveInfo::createInfo(const ByamlIter& iter) { + AudioAddonSoundArchiveInfo* info = new AudioAddonSoundArchiveInfo(); + + if (!iter.tryGetStringByKey(&info->name, "Name")) + return nullptr; + + return info; +} + +s32 AudioAddonSoundArchiveInfo::compareInfo(const AudioAddonSoundArchiveInfo* lhs, + const AudioAddonSoundArchiveInfo* rhs) { + return strcmp(lhs->name, rhs->name); +} + +} // namespace al diff --git a/lib/al/Library/Audio/AudioEventController.h b/lib/al/Library/Audio/AudioEventController.h new file mode 100644 index 000000000..691bc7fbd --- /dev/null +++ b/lib/al/Library/Audio/AudioEventController.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +namespace al { +class ByamlIter; + +struct AudioAddonSoundArchiveInfo { + AudioAddonSoundArchiveInfo(); + + static AudioAddonSoundArchiveInfo* createInfo(const ByamlIter& iter); + static s32 compareInfo(const AudioAddonSoundArchiveInfo* lhs, + const AudioAddonSoundArchiveInfo* rhs); + + const char* name = nullptr; +}; + +static_assert(sizeof(AudioAddonSoundArchiveInfo) == 0x8); + +} // namespace al diff --git a/lib/al/Library/Audio/AudioInfo.h b/lib/al/Library/Audio/AudioInfo.h new file mode 100644 index 000000000..925dc37f1 --- /dev/null +++ b/lib/al/Library/Audio/AudioInfo.h @@ -0,0 +1,100 @@ +#pragma once + +#include +#include + +#include "Library/Audio/System/System.h" + +namespace al { +class ByamlIter; +class AudioInfoListCreateFunctorBase; + +template +struct AudioInfoList; + +class AudioInfoListCreateFunctorBase { +public: + AudioInfoListCreateFunctorBase() = default; + + virtual bool tryCreateAudioInfoAndSetToList(const ByamlIter&) = 0; +}; + +template +class AudioInfoListCreateFunctor : public AudioInfoListCreateFunctorBase { +public: + using CreateInfoFunc = T* (*)(const ByamlIter&); + + AudioInfoListCreateFunctor(AudioInfoList* list, CreateInfoFunc fun) + : mCreateInfoFunc(fun), mAudioInfoList(list) {} + + bool tryCreateAudioInfoAndSetToList(const ByamlIter& iter) override { + T* info = mCreateInfoFunc(iter); + + if (!info) + return false; + + return mAudioInfoList->list->pushBack(info); + } + +private: + CreateInfoFunc mCreateInfoFunc; + AudioInfoList* mAudioInfoList; +}; + +template +struct AudioInfoList { + static s32 compareInfoAndKey(const T* info, const char* key) { return strcmp(info->name, key); } + + sead::PtrArray* list; +}; + +template +struct AudioInfoListWithParts : public AudioInfoList { + s32 tryGetInfoIndex(const char*) const; + T* tryFindInfo(const char*) const; + + s32 getPartsSize() const { + if (!parts) + return 0; + return parts->size(); + } + + bool _8; + sead::PtrArray>* parts; +}; + +template +AudioInfoListWithParts* createAudioInfoList(const ByamlIter& iter, s32 maxNumParts) { + AudioInfoListWithParts* audioInfoList = new AudioInfoListWithParts; + + s32 listSize = alAudioInfoListFunction::getCreateAudioInfoListSize(iter, 0); + audioInfoList->_8 = false; + + audioInfoList->list = new sead::PtrArray(); + audioInfoList->list->allocBuffer((listSize == 0) ? 1 : listSize, nullptr); + + audioInfoList->parts = nullptr; + if (maxNumParts != 0) { + audioInfoList->parts = new sead::PtrArray>(); + audioInfoList->parts->allocBuffer(maxNumParts, nullptr); + } + + AudioInfoListCreateFunctor functor(audioInfoList, T::createInfo); + alAudioInfoListFunction::createAudioInfoAndSetToList(&functor, iter); + + if (audioInfoList->list->size() >= 10) + audioInfoList->list->heapSort(T::compareInfo); + else + audioInfoList->list->sort(T::compareInfo); + + for (s32 i = 0; i < audioInfoList->getPartsSize(); i++) { + sead::PtrArray* partsList = audioInfoList->parts->at(i)->list; + if (partsList->size() >= 10) + partsList->heapSort(T::compareInfo); + else + partsList->sort(T::compareInfo); + } + return audioInfoList; +} + +} // namespace al diff --git a/lib/al/Library/Audio/System/System.h b/lib/al/Library/Audio/System/System.h new file mode 100644 index 000000000..be5fce8e7 --- /dev/null +++ b/lib/al/Library/Audio/System/System.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace al { +class ByamlIter; +class AudioInfoListCreateFunctorBase; +} // namespace al + +namespace alAudioInfoListFunction { +s32 getCreateAudioInfoListSize(const al::ByamlIter&, s32); +s32 getCreateAudioInfoListSize(const al::ByamlIter&, const al::ByamlIter&); +void createAudioInfoAndSetToList(al::AudioInfoListCreateFunctorBase*, const al::ByamlIter&); +} // namespace alAudioInfoListFunction