#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(); 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(o.fifo->newBufferTerminator()); } vfos_mtx.unlock(); } inputs[0].fifo->free(iblk); return true; } vfos_mtx.lock(); for (auto &o : outputs) { IOInfo *i = ((IOInfo *)o.blkdata.get()); DSPBuffer oblk = o.fifo->newBufferSamples(iblk.max_size, sizeof(T)); memcpy(oblk.getSamples(), iblk.getSamples(), iblk.size * sizeof(T)); oblk.size = iblk.size; o.fifo->wait_enqueue(oblk); } vfos_mtx.unlock(); inputs[0].fifo->free(iblk); return false; } template class SplitterBlock; template class SplitterBlock; } // namespace ndsp } // namespace satdump