summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio/JASResArcLoader.cpp
blob: d78f5deaf95692bfe7cd5f2c56a8b9bf41a577f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//
// Generated by dtk
// Translation Unit: JASResArcLoader.cpp
//

#include "JSystem/JSystem.h" // IWYU pragma: keep

#include "JSystem/JAudio/JASResArcLoader.h"
#include "JSystem/JAudio/JASDvdThread.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "dolphin/os/OSMessage.h"

struct LoadResourceMsg {
    /* 0x00 */ JKRArchive* mArchive;
    /* 0x04 */ u16 mId;
    /* 0x08 */ u8* mBuffer;
    /* 0x0C */ u32 mSize;
    /* 0x10 */ void (*mCallback)(u32, u32);
    /* 0x14 */ u32 mCallbackParam;
    /* 0x18 */ OSMessageQueue* mMessageQueue;
};

/* 8027D4C8-8027D4FC       .text getResSize__Q28JASystem12ResArcLoaderFP10JKRArchiveUs */
u32 JASystem::ResArcLoader::getResSize(JKRArchive* archive, u16 param_2) {
    JKRArchive::SDIFileEntry* entry = archive->findIdResource(param_2);
    if (entry == NULL) {
        return 0;
    }
    return entry->data_size;
}

/* 8027D4FC-8027D5A0       .text loadResourceCallback__Q28JASystem12ResArcLoaderFPv */
s32 JASystem::ResArcLoader::loadResourceCallback(void* param_1) {
    LoadResourceMsg* msg = (LoadResourceMsg*)param_1;
    u32 var1 = msg->mArchive->readResource(msg->mBuffer, msg->mSize, msg->mId);
    if (msg->mCallback) {
        msg->mCallback(var1, msg->mCallbackParam);
    }
    if (var1 == 0) {
        if (msg->mMessageQueue) {
            OSSendMessage(msg->mMessageQueue, OSMessage(-1), OS_MESSAGE_BLOCK);
        }
        return -1;
    } else {
        if (msg->mMessageQueue) {
            OSSendMessage(msg->mMessageQueue, OSMessage(0), OS_MESSAGE_BLOCK);
        }
        return 0;
    }
}

/* 8027D5A0-8027D658       .text loadResource__Q28JASystem12ResArcLoaderFP10JKRArchiveUsPUcUl */
u32 JASystem::ResArcLoader::loadResource(JKRArchive* archive, u16 id, u8* buffer, u32 size) {
    OSMessageQueue queue;
    LoadResourceMsg msg;
    OSMessage queueMsg;
    OSMessage receiveMsg;
    OSInitMessageQueue(&queue, &queueMsg, 1);
    msg.mArchive = archive;
    msg.mId = id;
    msg.mBuffer = buffer;
    msg.mSize = size;
    msg.mCallback = NULL;
    msg.mCallbackParam = 0;
    msg.mMessageQueue = NULL;
    msg.mMessageQueue = &queue;
    if (!Dvd::sendCmdMsg(loadResourceCallback, &msg, sizeof(LoadResourceMsg))) {
        return 0;
    }
    OSReceiveMessage(&queue, &receiveMsg, OS_MESSAGE_BLOCK);
    return size & ~-(u32(receiveMsg) != 0);
}

/* 8027D658-8027D6B0       .text loadResourceAsync__Q28JASystem12ResArcLoaderFP10JKRArchiveUsPUcUlPFUlUl_vUl */
void JASystem::ResArcLoader::loadResourceAsync(JKRArchive* archive, u16 id, u8* buffer, u32 size, void (*cb)(u32, u32), u32 cbParam) {
    LoadResourceMsg msg;
    msg.mArchive = archive;
    msg.mId = id;
    msg.mBuffer = buffer;
    msg.mSize = size;
    msg.mCallback = NULL;
    msg.mCallbackParam = 0;
    msg.mMessageQueue = NULL;
    msg.mCallback = cb;
    msg.mCallbackParam = cbParam;
    Dvd::sendCmdMsg(loadResourceCallback, &msg, sizeof(LoadResourceMsg));
}