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
|