SatDump 2.0.0-alpha-520736c72
Loading...
Searching...
No Matches
block_simple_multi.h
Go to the documentation of this file.
1#pragma once
2
6
7#include "dsp/block.h"
8#include <cstdint>
9
10namespace satdump
11{
12 namespace ndsp
13 {
25 template <typename Ti, typename To, int Ni, int No>
26 class BlockSimpleMulti : public Block
27 {
28 protected:
29 float output_buffer_size_ratio[No];
30
31 private:
32 Ti *ibufs[Ni];
33 uint32_t ibufs_sz[Ni];
34
35 To *obufs[No];
36 uint32_t obufs_sz[No];
37
38 private:
39 bool work()
40 {
41 DSPBuffer iblk[Ni];
42 uint32_t max_buf_size = 0;
43 for (int i = 0; i < Ni; i++)
44 {
45 iblk[i] = inputs[i].fifo->wait_dequeue();
46
47 if (iblk[i].isTerminator())
48 {
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]);
53 return true;
54 }
55
56 ibufs[i] = iblk[i].template getSamples<Ti>();
57 ibufs_sz[i] = iblk[i].size;
58
59 if (max_buf_size < iblk[i].max_size)
60 max_buf_size = iblk[i].max_size;
61 }
62
63 DSPBuffer oblk[No];
64 for (int o = 0; o < No; o++)
65 {
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>();
68 }
69
70 process(ibufs, ibufs_sz, obufs, obufs_sz);
71
72 for (int o = 0; o < No; o++)
73 {
74 oblk[o].size = obufs_sz[o];
75 outputs[o].fifo->wait_enqueue(oblk[o]);
76 }
77
78 for (int i = 0; i < Ni; i++)
79 inputs[i].fifo->free(iblk[i]);
80
81 return false;
82 }
83
84 public:
85 BlockSimpleMulti(std::string id, std::vector<BlockIO> in = {}, std::vector<BlockIO> out = {}) : Block(id, in, out)
86 {
87 for (int o = 0; o < No; o++)
88 output_buffer_size_ratio[o] = 1;
89 }
90
103 virtual void process(Ti **input, uint32_t *nsamples, To **output, uint32_t *nsamples_out) = 0;
104 };
105 } // namespace ndsp
106} // namespace satdump
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...
virtual bool work()=0
The actual looping work function meant to handle all the DSP (well, in most blocks)
Block(std::string id, std::vector< BlockIO > in={}, std::vector< BlockIO > out={})
Generic constructor, to be overloaded.
Definition block.h:208
DSP Buffer class.
Definition dsp_buffer.h:52