summaryrefslogtreecommitdiff
path: root/include/egg/audio/eggAudioHeapMgr.h
blob: 9fd269cc54a2b002626ed294fcbe7d610c87f6b3 (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
#ifndef EGG_AUDIO_HEAP_MANAGER_H
#define EGG_AUDIO_HEAP_MANAGER_H

#include "egg/core/eggAllocator.h"
#include "nw4r/snd/snd_SoundHeap.h"

namespace EGG {

class SoundMessageQueue {
public:
    SoundMessageQueue() {
        OSInitMessageQueue(&mQueue, mBuffer, 4);
    }

    OSMessageQueue mQueue;
    OSMessage mBuffer[4];
};

class SoundHeapMgr {
public:
    ~SoundHeapMgr() {
        destroySoundHeap();
    }
    int saveState() {
        return mSoundHeap.SaveState();
    }
    virtual bool loadState(s32 id) {
        s32 level = mSoundHeap.GetCurrentLevel();
        if (id > 0 && level >= id) {
            mSoundHeap.LoadState(id);
            return true;
        } else {
            return false;
        }
    }
    virtual int getCurrentLevel() {
        return mSoundHeap.GetCurrentLevel();
    }
    virtual void stateProc() {
        OSMessage msg;
        if (OSReceiveMessage(&mQueue1.mQueue, &msg, 0)) {
            bool ok = loadState((s32)msg);
            OSSendMessage(&mQueue3.mQueue, (OSMessage)ok, 0);
        }

        if (OSReceiveMessage(&mQueue2.mQueue, &msg, 0)) {
            int ok = mSoundHeap.SaveState();
            OSSendMessage(&mQueue3.mQueue, (OSMessage)ok, 0);
        }

        if (OSReceiveMessage(&mQueue, &msg, 0)) {
            int level = getCurrentLevel();
            OSSendMessage(&mQueue3.mQueue, (OSMessage)level, 0);
        }
    }

    void createSoundHeap(Allocator *allocator, u32 size);
    void destroySoundHeap();

    nw4r::snd::SoundHeap *getSoundHeap() {
        return &mSoundHeap;
    }

private:
    nw4r::snd::SoundHeap mSoundHeap;
    // I guess we're not initializing this queue?
    OSMessageQueue mQueue;
    OSMessage mBuffer[4];
    SoundMessageQueue mQueue1;
    SoundMessageQueue mQueue2;
    SoundMessageQueue mQueue3;
};

} // namespace EGG

#endif