summaryrefslogtreecommitdiff
path: root/include/m_Do/m_Do_dvd_thread.h
blob: e43f707345246e586ae3ce58dcddc3e37cee1126 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#ifndef M_DO_M_DO_DVD_THREAD_H
#define M_DO_M_DO_DVD_THREAD_H

#include "JSystem/JKernel/JKRArchive.h"
#include "dolphin/os/OSMessage.h"
#include "dolphin/os/OSMutex.h"
#include "f_pc/f_pc_node.h"
#include "global.h"

class JKRHeap;
class JKRMemArchive;

typedef void* (*mDoDvdThd_callback_func)(void*);

class mDoDvdThd_command_c : public node_class {
public:
    /* 0x0C */ volatile bool mIsDone;
    /* 0x10  vtable*/
public:
    virtual ~mDoDvdThd_command_c();
    mDoDvdThd_command_c();
    inline BOOL sync() { return mIsDone; }
    inline void destroy() { delete this; }
    virtual BOOL execute() = 0;
};  // Size = 0x14

class mDoDvdThd_param_c {
public:
    mDoDvdThd_param_c();
    void kick();
    BOOL waitForKick();
    mDoDvdThd_command_c* getFirstCommand();
    void addition(mDoDvdThd_command_c*);
    void cut(mDoDvdThd_command_c*);
    void mainLoop();

private:
    /* 0x00 */ OSMessageQueue mMessageQueue;
    /* 0x20 */ OSMessage mMessageBuf[1];
    /* 0x24 */ node_list_class mCommandList;
    /* 0x30 */ OSMutex mMutex;
};  // Size = 0x48

class mDoDvdThd_callback_c : public mDoDvdThd_command_c {
public:
    virtual ~mDoDvdThd_callback_c();
    mDoDvdThd_callback_c(mDoDvdThd_callback_func, void*);
    static mDoDvdThd_callback_c* create(mDoDvdThd_callback_func, void*);
    virtual BOOL execute();

private:
    /* 0x14 */ mDoDvdThd_callback_func mFunc;
    /* 0x18 */ void* mUserData;
    /* 0x1C */ void* mResult;
};

class mDoDvdThd_mountArchive_c : public mDoDvdThd_command_c {
public:
    virtual ~mDoDvdThd_mountArchive_c();
    mDoDvdThd_mountArchive_c(u8);
    static mDoDvdThd_mountArchive_c* create(char const*, u8, JKRHeap*);
    virtual BOOL execute();

    JKRArchive* getArchive() const { return mArchive; }
    JKRHeap* getHeap() const { return mHeap; }

private:
    /* 0x14 */ u8 mMountDirection;
    /* 0x18 */ s32 mEntryNum;
    /* 0x1C */ JKRArchive* mArchive;
    /* 0x20 */ JKRHeap* mHeap;
};  // Size = 0x24

class mDoDvdThd_mountXArchive_c : public mDoDvdThd_command_c {
public:
    virtual ~mDoDvdThd_mountXArchive_c();
    mDoDvdThd_mountXArchive_c(u8 mountDirection, JKRArchive::EMountMode mountMode);
    static mDoDvdThd_mountXArchive_c* create(char const*, u8, JKRArchive::EMountMode);
    virtual BOOL execute();

    JKRArchive* getArchive() const { return mArchive; }

private:
    /* 0x14 */ u8 mMountDirection;
    /* 0x18 */ s32 mEntryNum;
    /* 0x1C */ JKRArchive* mArchive;
    /* 0x20 */ JKRArchive::EMountMode mMountMode;
};  // Size = 0x24

class mDoDvdThd_toMainRam_c : public mDoDvdThd_command_c {
public:
    mDoDvdThd_toMainRam_c(u8 direction);
    static mDoDvdThd_toMainRam_c* create(char const* path, u8 direction, JKRHeap* heap);
    virtual ~mDoDvdThd_toMainRam_c();
    virtual BOOL execute();

    void* getMemAddress() const { return mData; }
    s32 getMemSize() const { return mDataSize; }

private:
    /* 0x14 */ u8 mAllocDirection;
    /* 0x18 */ s32 mEntryNum;
    /* 0x1C */ void* mData;
    /* 0x20 */ s32 mDataSize;
    /* 0x24 */ JKRHeap* mHeap;
};  // Size = 0x28

struct mDoDvdThdStack {
    u8 stack[4096];
} ALIGN_DECL(32);

struct mDoDvdThd {
    static s32 main(void*);
    static void create(OSPriority);
    static void suspend();

    static OSThread l_thread;
    static mDoDvdThdStack l_threadStack;
    static mDoDvdThd_param_c l_param;
    static bool SyncWidthSound;
    static u8 sDefaultDirection;
};

#endif /* M_DO_M_DO_DVD_THREAD_H */