xybrid/xybrid/data/porttypes.cpp

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
}
}