#include "splitter.h" namespace satdump { namespace ndsp { template SplitterBlock::SplitterBlock() : Block(std::is_same_v ? "splitter_cc" : "splitter_ff", {{"in", std::is_same_v ? DSP_SAMPLE_TYPE_CF32 : DSP_SAMPLE_TYPE_F32}}, {/*{"out", std::is_same_v ? DSP_SAMPLE_TYPE_CF32 : DSP_SAMPLE_TYPE_F32}*/}) { } template SplitterBlock::~SplitterBlock() { } template bool SplitterBlock::work() { DSPBuffer iblk; inputs[0].fifo->wait_dequeue(iblk); if (iblk.isTerminator()) { if (iblk.terminatorShouldPropagate()) { vfos_mtx.lock(); for (auto &o : outputs) { IOInfo *i = ((IOInfo *)o.blkdata.get()); if (i->forward_terminator) o.fifo->wait_enqueue(DSPBuffer::newBufferTerminator()); } vfos_mtx.unlock(); } iblk.free(); return true; } vfos_mtx.lock(); for (auto &o : outputs) { IOInfo *i = ((IOInfo *)o.blkdata.get()); DSPBuffer oblk = DSPBuffer::newBufferSamples(iblk.max_size); memcpy(oblk.getSamples(), iblk.getSamples(), iblk.size * sizeof(T)); oblk.size = iblk.size; o.fifo->wait_enqueue(oblk); } vfos_mtx.unlock(); iblk.free(); return false; } template class SplitterBlock; template class SplitterBlock; } // namespace ndsp } // namespace satdump