SatDump 2.0.0-alpha-76a915210
Loading...
Searching...
No Matches
stream.h
1#pragma once
2
3#include "dsp_buffer.h"
4#include "readerwritercircularbuffer.h"
5
6namespace satdump
7{
8 namespace ndsp
9 {
10 class DSPStream
11 {
12 private:
15
16 public:
17 DSPStream(int size) : fifo(size), ufifo(size)
18 {
19 for (int i = 0; i < size; i++)
20 {
21 DSPBuffer b;
22 ufifo.wait_enqueue(b);
23 }
24 }
25
26 ~DSPStream()
27 {
28 DSPBuffer b;
29 while (fifo.try_dequeue(b))
30 if (b.ptr != nullptr)
31 volk_free(b.ptr);
32 while (ufifo.try_dequeue(b))
33 if (b.ptr != nullptr)
34 volk_free(b.ptr);
35 }
36
37 inline void wait_enqueue(DSPBuffer b) { fifo.wait_enqueue(b); }
38
39 inline DSPBuffer wait_dequeue()
40 {
41 DSPBuffer b;
42 fifo.wait_dequeue(b);
43 return b;
44 }
45
46 DSPBuffer alloc(size_t size)
47 {
48 DSPBuffer b;
49 ufifo.wait_dequeue(b);
50 if (b.ptr == nullptr)
51 {
52 b.ptr = volk_malloc(size, volk_get_alignment());
53 b.ptr_size = size;
54 printf("Alloc\n");
55 }
56 else if (b.ptr_size < size)
57 {
58 volk_free(b.ptr);
59 b.ptr = volk_malloc(size, volk_get_alignment());
60 b.ptr_size = size;
61 printf("Realloc\n");
62 }
63 return b;
64 }
65
66 inline void free(DSPBuffer &b) { ufifo.wait_enqueue(b); }
67
68 size_t size_approx() { return fifo.size_approx(); }
69 size_t max_capacity() { return fifo.max_capacity(); }
70
71 public:
72 DSPBuffer newBufferTerminator(bool prop = true)
73 {
74 DSPBuffer b = alloc(0);
75 b.type = prop ? DSP_BUFFER_TYPE_TERMINATOR_PROPAGATING : DSP_BUFFER_TYPE_TERMINATOR_NON_PROPAGATING;
76 return b;
77 }
78
79 template <typename T>
80 DSPBuffer newBufferSamples(uint32_t size)
81 {
82 DSPBuffer b = alloc(size * sizeof(T));
83 b.type = DSP_BUFFER_TYPE_SAMPLES;
84 b.max_size = size;
85 return b;
86 }
87 };
88 } // namespace ndsp
89} // namespace satdump
Definition readerwritercircularbuffer.h:29
DSP Buffer class.
Definition dsp_buffer.h:52