Files
ss/src/egg/audio/eggAudioArcPlayerMgr.cpp
T
Elijah Thomas 26af4db82d update from dtk-template - clangd :) (#66)
* update from dtk-template and start work towards using clangd

* include <a> -> "a"

* Update build.yml

* remove/add non-trivial class in union warning
2024-10-16 15:36:02 -04:00

293 lines
7.8 KiB
C++

#include "egg/audio/eggAudioArcPlayerMgr.h"
// #include "egg/audio/eggAudioMgr.h"
#include "nw4r/snd/snd_SoundPlayer.h"
namespace EGG {
using namespace nw4r;
ArcPlayer::ArcPlayer(snd::SoundArchivePlayer *player, snd::SoundHeap *heap)
: mIsOpeningArchive(false), mIsLoadingGroup(false), mLoadLabelStringData(true), mOpenSndArchive(NULL),
mActiveSndArchivePlayer(player), mSoundHeap(heap), mStorage(STORAGE_NONE), mSteamBlocks(1) {}
ArcPlayer::~ArcPlayer() {}
bool ArcPlayer::setSteamBlocks(u32 n) {
if (!mOpenSndArchive) {
mSteamBlocks = n;
return true;
}
return false;
}
UNKTYPE *ArcPlayer::openArchive(const char *name, snd::SoundHeap *heap, SARC_STORAGE storage) {
UNKTYPE *ret = NULL;
switch (storage) {
case STORAGE_DVD: ret = openDvdArchive(name, heap); break;
case STORAGE_NAND: ret = openNandArchive(name, heap); break;
default: break;
}
return ret;
}
UNKTYPE *ArcPlayer::openDvdArchive(const char *name, snd::SoundHeap *heap) {
u32 headerBufSize;
if (!heap) {
heap = mSoundHeap;
}
if (mOpenSndArchive) {
return mActiveSndArchivePlayer;
}
mOpenSndArchive = &mDvdSndArchive;
if (mDvdSndArchive.Open(name)) {
mIsOpeningArchive = true;
headerBufSize = mDvdSndArchive.GetHeaderSize();
mpHeaderBuf = heap->Alloc(headerBufSize, NULL, (void *)'ARCH');
if (!mDvdSndArchive.LoadHeader(mpHeaderBuf, headerBufSize)) {
mIsOpeningArchive = false;
return NULL;
}
if (mLoadLabelStringData) {
headerBufSize = mDvdSndArchive.GetLabelStringDataSize();
void *stringDataBuf = heap->Alloc(headerBufSize, NULL, (void *)'ARCL');
mDvdSndArchive.LoadLabelStringData(stringDataBuf, headerBufSize);
}
u32 setupBufSize = mActiveSndArchivePlayer->GetRequiredMemSize(mOpenSndArchive);
void *setupBuf = heap->Alloc(setupBufSize, NULL, (void *)'APLM');
u32 strmBufSize = mSteamBlocks * mActiveSndArchivePlayer->GetRequiredStrmBufferSize(mOpenSndArchive);
void *strmBuf = heap->Alloc(strmBufSize, NULL, (void *)'APLS');
if (!mActiveSndArchivePlayer->Setup(mOpenSndArchive, setupBuf, setupBufSize, strmBuf, strmBufSize)) {
mIsOpeningArchive = false;
return NULL;
}
mStorage = STORAGE_DVD;
mIsOpeningArchive = false;
return mActiveSndArchivePlayer;
}
return NULL;
}
UNKTYPE *ArcPlayer::openNandArchive(const char *name, snd::SoundHeap *heap) {
u32 headerBufSize;
if (!heap) {
heap = mSoundHeap;
}
if (mOpenSndArchive) {
return mActiveSndArchivePlayer;
}
mOpenSndArchive = &mNandSndArchive;
if (mNandSndArchive.Open(name)) {
mIsOpeningArchive = true;
headerBufSize = mNandSndArchive.GetHeaderSize();
void *headerBuf = heap->Alloc(headerBufSize, NULL, NULL);
if (!mNandSndArchive.LoadHeader(headerBuf, headerBufSize)) {
mIsOpeningArchive = false;
return NULL;
}
if (mLoadLabelStringData) {
headerBufSize = mNandSndArchive.GetLabelStringDataSize();
void *stringDataBuf = heap->Alloc(headerBufSize, NULL, NULL);
mNandSndArchive.LoadLabelStringData(stringDataBuf, headerBufSize);
}
u32 setupBufSize = mActiveSndArchivePlayer->GetRequiredMemSize(&mNandSndArchive);
void *setupBuf = heap->Alloc(setupBufSize, NULL, NULL);
u32 strmBufSize = mSteamBlocks * mActiveSndArchivePlayer->GetRequiredStrmBufferSize(&mNandSndArchive);
void *strmBuf = heap->Alloc(strmBufSize, NULL, NULL);
if (!mActiveSndArchivePlayer->Setup(&mNandSndArchive, setupBuf, setupBufSize, strmBuf, strmBufSize)) {
mIsOpeningArchive = false;
return NULL;
}
mStorage = STORAGE_NAND;
mIsOpeningArchive = false;
return mActiveSndArchivePlayer;
}
return NULL;
}
UNKTYPE *ArcPlayer::setupMemoryArchive(const void *work, snd::SoundHeap *heap) {
if (!heap) {
heap = mSoundHeap;
}
if (mOpenSndArchive) {
return mActiveSndArchivePlayer;
}
mOpenSndArchive = &mMemorySndArchive;
if (mMemorySndArchive.Setup(work)) {
mIsOpeningArchive = true;
u32 neededForMem = mActiveSndArchivePlayer->GetRequiredMemSize(&mMemorySndArchive);
void *memBuf = heap->Alloc(neededForMem, NULL, NULL);
u32 neededForStrm = mSteamBlocks * mActiveSndArchivePlayer->GetRequiredStrmBufferSize(&mMemorySndArchive);
void *strmBuf = heap->Alloc(neededForStrm, NULL, NULL);
if (!mActiveSndArchivePlayer->Setup(&mMemorySndArchive, memBuf, neededForMem, strmBuf, neededForStrm)) {
mIsOpeningArchive = false;
return NULL;
}
mStorage = STORAGE_MEM;
mIsOpeningArchive = false;
return mActiveSndArchivePlayer;
}
return NULL;
}
UNKTYPE ArcPlayer::closeArchive() {
if (!mOpenSndArchive) {
return;
}
switch (mStorage) {
case STORAGE_DVD: mDvdSndArchive.Close(); break;
case STORAGE_NAND: mNandSndArchive.Close(); break;
case STORAGE_CNT:
case STORAGE_MEM: mMemorySndArchive.Shutdown(); break;
}
mActiveSndArchivePlayer->Shutdown();
mStorage = STORAGE_NONE;
mOpenSndArchive = NULL;
}
bool ArcPlayer::loadGroup(unsigned int id, snd::SoundHeap *heap, u32 loadBlockSize) {
if (mStorage == STORAGE_NAND || mStorage == STORAGE_CNT) {
return true;
}
if (!heap) {
heap = mSoundHeap;
}
if (mIsOpeningArchive) {
return false;
} else {
if (!mActiveSndArchivePlayer->IsAvailable()) {
return false;
}
mIsLoadingGroup = true;
UNKWORD result = mActiveSndArchivePlayer->LoadGroup((u32)id, heap, loadBlockSize);
mIsLoadingGroup = false;
return (result != 0);
}
}
bool ArcPlayer::loadGroup(int id, snd::SoundHeap *heap, u32 loadBlockSize) {
if (mStorage == STORAGE_NAND || mStorage == STORAGE_CNT) {
return true;
}
if (!heap) {
heap = mSoundHeap;
}
if (mIsOpeningArchive) {
return false;
} else {
if (!mActiveSndArchivePlayer->IsAvailable()) {
return false;
}
mIsLoadingGroup = true;
UNKWORD result = mActiveSndArchivePlayer->LoadGroup((u32)id, heap, loadBlockSize);
mIsLoadingGroup = false;
return (result != 0);
}
}
bool ArcPlayer::loadGroup(u32 id, snd::SoundHeap *heap, u32 loadBlockSize) {
if (mStorage == STORAGE_NAND || mStorage == STORAGE_CNT) {
return true;
}
if (!heap) {
heap = mSoundHeap;
}
if (mIsOpeningArchive) {
return false;
} else {
if (!mActiveSndArchivePlayer->IsAvailable()) {
return false;
}
mIsLoadingGroup = true;
bool b = (mActiveSndArchivePlayer->LoadGroup(id, heap, loadBlockSize) != 0);
mIsLoadingGroup = false;
return b;
}
}
bool ArcPlayer::loadGroup(const char *name, snd::SoundHeap *heap, u32 loadBlockSize) {
if (mStorage == STORAGE_NAND || mStorage == STORAGE_CNT) {
return true;
}
if (!heap) {
heap = mSoundHeap;
}
if (mIsOpeningArchive) {
return false;
} else {
if (!mActiveSndArchivePlayer->IsAvailable()) {
return false;
}
mIsLoadingGroup = true;
bool b = (mActiveSndArchivePlayer->LoadGroup(name, heap, loadBlockSize) != 0);
mIsLoadingGroup = false;
return b;
}
}
void ArcPlayer::calc() {
if (!mIsOpeningArchive) {
mActiveSndArchivePlayer->Update();
}
}
void ArcPlayer::stopAllSound() {
for (int i = 0; i < mActiveSndArchivePlayer->GetSoundPlayerCount(); i++) {
mActiveSndArchivePlayer->GetSoundPlayer(i).StopAllSound(0);
}
}
} // namespace EGG