vdr-plugin-softhddevice-drm-gles 1.6.7
ringbuffer.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
16#include <atomic>
17#include <cstddef>
18#include <cstdio>
19#include <cstdint>
20#include <cstdlib>
21#include <cstring>
22
23#include "logger.h"
24#include "ringbuffer.h"
25
34 : m_buffer(size),
35 m_pBuffer(m_buffer.data()),
36 m_size(size),
37 m_pBufferEnd(m_pBuffer + size),
38 m_pReadPointer(m_pBuffer),
39 m_pWritePointer(m_pBuffer),
40 m_filled(0)
41{
42}
43
48{
51 m_filled.store(0, std::memory_order_release);
52}
53
62{
63 size_t n;
64
65 n = m_size - m_filled.load(std::memory_order_acquire);
66 if (cnt > n) { // not enough space
67 cnt = n;
68 }
69 //
70 // Hitting end of buffer?
71 //
73 if (n > cnt) { // don't cross the end
75 } else { // reached or cross the end
77 if (n < cnt) {
78 n = cnt - n;
80 }
81 }
82
83 //
84 // Only atomic modification!
85 //
86 m_filled.fetch_add(cnt, std::memory_order_release);
87 return cnt;
88}
89
98size_t cSoftHdRingbuffer::Write(const void *buf, size_t cnt)
99{
100 size_t n;
101
102 n = m_size - m_filled.load(std::memory_order_acquire);
103 if (cnt > n) { // not enough space
104 cnt = n;
105 }
106 //
107 // Hitting end of buffer?
108 //
110 if (n > cnt) { // don't cross the end
113 } else { // reached or cross the end
116 if (n < cnt) {
117 buf = (uint8_t *)buf + n;
118 n = cnt - n;
121 }
122 }
123
124 //
125 // Only atomic modification!
126 //
127 m_filled.fetch_add(cnt, std::memory_order_release);
128 return cnt;
129}
130
140{
141 size_t n;
142 size_t cnt;
143
144 // Total free bytes available in ring buffer
145 cnt = m_size - m_filled.load(std::memory_order_acquire);
146
148
149 //
150 // Hitting end of buffer?
151 //
153 if (n <= cnt) { // reached or cross the end
154 return n;
155 }
156 return cnt;
157}
158
167{
168 size_t n;
169
170 n = m_filled.load(std::memory_order_acquire);
171 if (cnt > n) { // not enough filled
172 cnt = n;
173 }
174 //
175 // Hitting end of buffer?
176 //
178 if (n > cnt) { // don't cross the end
180 } else { // reached or cross the end
182 if (n < cnt) {
183 n = cnt - n;
184 m_pReadPointer += n;
185 }
186 }
187
188 //
189 // Only atomic modification!
190 //
191 m_filled.fetch_sub(cnt, std::memory_order_release);
192 return cnt;
193}
194
203size_t cSoftHdRingbuffer::Read(void *buf, size_t cnt)
204{
205 size_t n;
206
207 n = m_filled.load(std::memory_order_acquire);
208 if (cnt > n) { // not enough filled
209 cnt = n;
210 }
211 //
212 // Hitting end of buffer?
213 //
215 if (n > cnt) { // don't cross the end
218 } else { // reached or cross the end
221 if (n < cnt) {
222 buf = (uint8_t *)buf + n;
223 n = cnt - n;
225 m_pReadPointer += n;
226 }
227 }
228
229 //
230 // Only atomic modification!
231 //
232 m_filled.fetch_sub(cnt, std::memory_order_release);
233 return cnt;
234}
235
245{
246 size_t n;
247 size_t cnt;
248
249 // Total used bytes in ring buffer
250 cnt = m_filled.load(std::memory_order_acquire);
251
253
254 //
255 // Hitting end of buffer?
256 //
258 if (n <= cnt) { // reached or cross the end
259 return n;
260 }
261 return cnt;
262}
263
270{
271 return m_size - m_filled.load(std::memory_order_acquire);
272}
273
280{
281 return m_filled.load(std::memory_order_acquire);
282}
size_t GetWritePointer(void **)
Get write pointer and free bytes at this position of ring buffer.
size_t m_size
bytes in buffer (for faster calc)
Definition ringbuffer.h:43
char * m_pWritePointer
only used by writer
Definition ringbuffer.h:47
std::atomic< size_t > m_filled
how many of the buffer is used
Definition ringbuffer.h:50
size_t Read(void *, size_t)
Read from a ring buffer.
size_t UsedBytes(void)
Get used bytes in ring buffer.
size_t WriteAdvance(size_t)
Advance write pointer in ring buffer.
size_t FreeBytes(void)
Get free bytes in ring buffer.
cSoftHdRingbuffer(size_t)
cSoftHdRingbuffer constructor
size_t ReadAdvance(size_t)
Advance read pointer in ring buffer.
const char * m_pReadPointer
only used by reader
Definition ringbuffer.h:46
size_t GetReadPointer(const void **)
Get read pointer and used bytes at this position of ring buffer.
const char * m_pBufferEnd
end of buffer
Definition ringbuffer.h:45
size_t Write(const void *, size_t)
Write to a ring buffer.
char * m_pBuffer
pointer ring buffer data
Definition ringbuffer.h:41
void Reset(void)
Reset ring buffer pointers.
Logger Header File.
Audio Ringbuffer Header File.