summaryrefslogtreecommitdiff
path: root/src/Z2AudioCS/SpkMixingBuffer.cpp
blob: 3118f07f94a2d141f1985d89b7c095f0c0e40168 (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
#include "Z2AudioCS/SpkMixingBuffer.h"

#include "Z2AudioCS/SpkSound.h"
#include "JSystem/JAudio2/JASCalc.h"
#include "JSystem/JAudio2/JASGadget.h"
#include "JSystem/JAudio2/JASHeapCtrl.h"

SpkMixingBuffer::SpkMixingBuffer(JKRHeap* heap) {
    JUT_ASSERT(25, heap);
    for (s32 chan = 0; chan < ARRAY_SIZE(mBuffer); chan++) {
        mBuffer[chan] = new (heap, 0) s16[cSamplesPerAudioPacket];
        JUT_ASSERT(29, mBuffer[chan]);
        bzeroBuffer(chan);
    }
}

void SpkMixingBuffer::mix(s32 chan, s16* src, s32 len, f32 weight,
                          s32 offset) {
    JUT_ASSERT(61, chan < 4);
    JUT_ASSERT(62, mBuffer[chan]);
    JUT_ASSERT(63, src);
    JUT_ASSERT(64, offset >= 0);
    JUT_ASSERT(65, (offset+len) <= cSamplesPerAudioPacket);

    for (s32 i = 0; i < len; i++) {
        s32 sample = mBuffer[chan][i + offset];
        s16 srcSample = src[i];
        sample += (s32)(srcSample * weight);
        mBuffer[chan][i + offset] = JASCalc::clamp<s16, s32>(sample);
    }
}

s16* SpkMixingBuffer::getSamples(s32 chan) const {
    JUT_ASSERT(97, chan < 4);
    JUT_ASSERT(98, mBuffer[chan]);
    return mBuffer[chan];
}

bool SpkMixingBuffer::update(s32 chan) {
    bzeroBuffer(chan);
    SpkSoundHolder* sound_holder = JASGlobalInstance<SpkSoundHolder>::getInstance();
    JUT_ASSERT(121, sound_holder);
    bool result = sound_holder->update(chan);
    return result;
}

void SpkMixingBuffer::bzeroBuffer(s32 chan) {
    JUT_ASSERT(143, chan < 4);
    JUT_ASSERT(144, mBuffer[chan]);
    JASCalc::bzero(mBuffer[chan], cSamplesPerAudioPacket * sizeof(s16));
}