summaryrefslogtreecommitdiff
path: root/src/nw4r/snd/snd_RemoteSpeakerManager.cpp
blob: cbfd9d2ac562170c88c84eb1ea927043efe2d2a8 (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
#include "nw4r/snd/snd_RemoteSpeakerManager.h"
#include "rvl/AX/AXOut.h"


namespace nw4r {
namespace snd {
namespace detail {

RemoteSpeakerManager& RemoteSpeakerManager::GetInstance() {
    static RemoteSpeakerManager instance;
    return instance;
}

RemoteSpeakerManager::RemoteSpeakerManager() : mInitialized(false) {
    for (int i = 0; i < WPAD_MAX_CONTROLLERS; i++) {
        mSpeaker[i].SetChannelIndex(i);
    }
}

RemoteSpeaker& RemoteSpeakerManager::GetRemoteSpeaker(int idx) {
    return mSpeaker[idx];
}

void RemoteSpeakerManager::Setup() {
    if (mInitialized) {
        return;
    }

    OSCreateAlarm(&mRemoteSpeakerAlarm);

    OSSetPeriodicAlarm(&mRemoteSpeakerAlarm, OSGetTime(),
                       OS_NSEC_TO_TICKS(SPEAKER_ALARM_PERIOD_NSEC),
                       RemoteSpeakerAlarmProc);

    mInitialized = true;
}

void RemoteSpeakerManager::Shutdown() {
    if (!mInitialized) {
        return;
    }

    OSCancelAlarm(&mRemoteSpeakerAlarm);
    mInitialized = false;
}

void RemoteSpeakerManager::RemoteSpeakerAlarmProc(OSAlarm* pAlarm,
                                                  OSContext* pCtx) {
#pragma unused(pAlarm)
#pragma unused(pCtx)

    RemoteSpeakerManager& r = GetInstance();

    s16 samples[RemoteSpeaker::SAMPLES_PER_AUDIO_PACKET];
    if (AXRmtGetSamplesLeft() < RemoteSpeaker::SAMPLES_PER_AUDIO_PACKET) {
        return;
    }

    for (int i = 0; i < WPAD_MAX_CONTROLLERS; i++) {
        if (r.mSpeaker[i].IsAvailable()) {
            AXRmtGetSamples(i, samples,
                            RemoteSpeaker::SAMPLES_PER_AUDIO_PACKET);

            r.mSpeaker[i].UpdateStreamData(samples);
        }

        r.mSpeaker[i].Update();
    }

    AXRmtAdvancePtr(RemoteSpeaker::SAMPLES_PER_AUDIO_PACKET);
}

} // namespace detail
} // namespace snd
} // namespace nw4r