41 lines
1.3 KiB
C++
41 lines
1.3 KiB
C++
#include "porttypes.h"
|
|
using namespace Xybrid::Data;
|
|
|
|
#include "audio/audioengine.h"
|
|
using namespace Xybrid::Audio;
|
|
|
|
|
|
void AudioPort::pull() {
|
|
auto t = audioEngine->curTickId();
|
|
if (tickUpdatedOn == t) return;
|
|
tickUpdatedOn = t;
|
|
|
|
size_t ts = audioEngine->curTickSize();
|
|
size_t s = sizeof(float) * ts;
|
|
|
|
if (type == Input) {
|
|
bufL = static_cast<float*>(audioEngine->tickAlloc(s*2));
|
|
bufR = bufL + s;
|
|
memset(bufL, 0, s*2); // clear buffers
|
|
|
|
for (auto c : connections) { // mix
|
|
if (auto p = std::static_pointer_cast<AudioPort>(c.lock()); p && p->dataType() == Audio) {
|
|
p->pull();
|
|
for (size_t i = 0; i < ts; i++) {
|
|
bufL[i] += p->bufL[i];
|
|
bufR[i] += p->bufR[i];
|
|
}
|
|
}
|
|
}
|
|
} else if (auto pt = std::static_pointer_cast<AudioPort>(passthroughTo.lock()); pt && pt->dataType() == Audio) {
|
|
// passthrough; ports abound
|
|
pt->pull();
|
|
bufL = pt->bufL;
|
|
bufR = pt->bufR;
|
|
} else { // output without valid passthrough, just clear and prepare a blank buffer
|
|
bufL = static_cast<float*>(audioEngine->tickAlloc(s*2));
|
|
bufR = bufL + s;
|
|
memset(bufL, 0, s*2); // clear buffers
|
|
}
|
|
}
|