26 class BlockSimpleMulti :
public Block
29 float output_buffer_size_ratio[No];
33 uint32_t ibufs_sz[Ni];
36 uint32_t obufs_sz[No];
42 uint32_t max_buf_size = 0;
43 for (
int i = 0; i < Ni; i++)
45 iblk[i] = inputs[i].fifo->wait_dequeue();
47 if (iblk[i].isTerminator())
49 if (iblk[i].terminatorShouldPropagate())
50 for (
int o = 0; o < No; o++)
51 outputs[o].fifo->wait_enqueue(outputs[o].fifo->newBufferTerminator());
52 inputs[i].fifo->free(iblk[i]);
56 ibufs[i] = iblk[i].template getSamples<Ti>();
57 ibufs_sz[i] = iblk[i].size;
59 if (max_buf_size < iblk[i].max_size)
60 max_buf_size = iblk[i].max_size;
64 for (
int o = 0; o < No; o++)
66 oblk[o] = outputs[o].fifo->newBufferSamples(ceil(max_buf_size * output_buffer_size_ratio[o]),
sizeof(To));
67 obufs[o] = oblk[o].template getSamples<To>();
70 process(ibufs, ibufs_sz, obufs, obufs_sz);
72 for (
int o = 0; o < No; o++)
74 oblk[o].size = obufs_sz[o];
75 outputs[o].fifo->wait_enqueue(oblk[o]);
78 for (
int i = 0; i < Ni; i++)
79 inputs[i].fifo->free(iblk[i]);
85 BlockSimpleMulti(std::string
id, std::vector<BlockIO> in = {}, std::vector<BlockIO> out = {}) :
Block(
id, in, out)
87 for (
int o = 0; o < No; o++)
88 output_buffer_size_ratio[o] = 1;
103 virtual void process(Ti **input, uint32_t *nsamples, To **output, uint32_t *nsamples_out) = 0;
virtual void process(Ti **input, uint32_t *nsamples, To **output, uint32_t *nsamples_out)=0
Simplified "work" function, called automatically by work(). This takes away all boilerplate work usua...
Block(std::string id, std::vector< BlockIO > in={}, std::vector< BlockIO > out={})
Generic constructor, to be overloaded.
Definition block.h:208