MythTV master
ringbuffer.h
Go to the documentation of this file.
1/*
2 * ringbuffer.h
3 *
4 *
5 * Copyright (C) 2003 Marcus Metzler <mocm@metzlerbros.de>
6 * Metzler Brothers Systementwicklung GbR
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * General Public License for more details.
18 *
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
24 *
25 */
26
27#ifndef RINGBUFFER_H
28#define RINGBUFFER_H
29
30#include <cstdio>
31#include <cstdint>
32#include <unistd.h>
33#include <vector>
34
35using peek_poke_vec = std::vector<uint8_t>;
36
37#define FULL_BUFFER (-1000)
38#define EMPTY_BUFFER (-1000)
39 struct ringbuffer {
42 uint32_t size;
43 uint8_t *buffer;
44 };
45
46
47#define DBUF_INDEX 10000
48
49 struct dummy_buffer {
50 uint32_t size;
51 uint32_t fill;
54 };
55
56
57 int ring_init (ringbuffer *rbuf, int size);
58 int ring_reinit (ringbuffer *rbuf, int size);
59 void ring_clear(ringbuffer *rbuf);
60 void ring_destroy(ringbuffer *rbuf);
61 int ring_write(ringbuffer *rbuf, uint8_t *data, int count);
62 int ring_read(ringbuffer *rbuf, uint8_t *data, int count);
63 int ring_write_file(ringbuffer *rbuf, int fd, int count);
64 int ring_read_file(ringbuffer *rbuf, int fd, int count);
65 int ring_peek(ringbuffer *rbuf, uint8_t *data, unsigned int count,
66 uint32_t off);
67 int ring_peek(ringbuffer *rbuf, peek_poke_vec& data, unsigned int count,
68 uint32_t off);
69 int ring_peek(ringbuffer *rbuf, peek_poke_vec& data, uint32_t off);
70 int ring_poke(ringbuffer *rbuf, uint8_t *data, unsigned int count,
71 uint32_t off);
72 int ring_poke(ringbuffer *rbuf, peek_poke_vec& data, unsigned int count,
73 uint32_t off);
74 int ring_poke(ringbuffer *rbuf, peek_poke_vec& data, uint32_t off);
75 int ring_skip(ringbuffer *rbuf, int count);
76
77 static inline int ring_wpos(ringbuffer *rbuf)
78 {
79 return rbuf->write_pos;
80 }
81
82 static inline int ring_rpos(ringbuffer *rbuf)
83 {
84 return rbuf->read_pos;
85 }
86
87 static inline int ring_posdiff(ringbuffer *rbuf, int pos1, int pos2){
88 int diff = (pos2%rbuf->size) - (pos1%rbuf->size);
89 if (diff < 0) diff += rbuf->size;
90 return diff;
91 }
92
93 static inline int ring_wdiff(ringbuffer *rbuf, int pos){
94 return ring_posdiff(rbuf, rbuf->write_pos,pos);
95 }
96
97 static inline int ring_rdiff(ringbuffer *rbuf, int pos){
98 return ring_posdiff(rbuf, rbuf->read_pos,pos);
99 }
100
101 static inline unsigned int ring_free(ringbuffer *rbuf){
102 int free = rbuf->read_pos - rbuf->write_pos;
103 if (free <= 0) free += rbuf->size;
104 //Note: free is gauranteed to be >=1 from the above
105 return free - 1;
106 }
107
108 static inline unsigned int ring_avail(ringbuffer *rbuf){
109 int avail = rbuf->write_pos - rbuf->read_pos;
110 if (avail < 0) avail += rbuf->size;
111
112 return avail;
113 }
114
115
116
117 static inline uint32_t dummy_space(dummy_buffer *dbuf)
118 {
119 return (dbuf->size - dbuf->fill);
120 }
121 int dummy_delete(dummy_buffer *dbuf, uint64_t time);
122 int dummy_add(dummy_buffer *dbuf, uint64_t time, uint32_t size);
123 void dummy_clear(dummy_buffer *dbuf);
124 int dummy_init(dummy_buffer *dbuf, int s);
125 void dummy_destroy(dummy_buffer *dbuf);
126 void ring_show(ringbuffer *rbuf, unsigned int count, uint32_t off);
127
128#endif /* RINGBUFFER_H */
static unsigned int ring_avail(ringbuffer *rbuf)
Definition: ringbuffer.h:108
int dummy_add(dummy_buffer *dbuf, uint64_t time, uint32_t size)
Definition: ringbuffer.cpp:426
static int ring_rpos(ringbuffer *rbuf)
Definition: ringbuffer.h:82
static int ring_wpos(ringbuffer *rbuf)
Definition: ringbuffer.h:77
void dummy_destroy(dummy_buffer *dbuf)
Definition: ringbuffer.cpp:413
int ring_read(ringbuffer *rbuf, uint8_t *data, int count)
Definition: ringbuffer.cpp:202
void ring_destroy(ringbuffer *rbuf)
Definition: ringbuffer.cpp:86
int ring_reinit(ringbuffer *rbuf, int size)
Definition: ringbuffer.cpp:58
int ring_write(ringbuffer *rbuf, uint8_t *data, int count)
Definition: ringbuffer.cpp:92
int ring_read_file(ringbuffer *rbuf, int fd, int count)
Definition: ringbuffer.cpp:302
static unsigned int ring_free(ringbuffer *rbuf)
Definition: ringbuffer.h:101
int dummy_init(dummy_buffer *dbuf, int s)
Definition: ringbuffer.cpp:401
static int ring_rdiff(ringbuffer *rbuf, int pos)
Definition: ringbuffer.h:97
static int ring_wdiff(ringbuffer *rbuf, int pos)
Definition: ringbuffer.h:93
std::vector< uint8_t > peek_poke_vec
Definition: ringbuffer.h:35
void ring_clear(ringbuffer *rbuf)
Definition: ringbuffer.cpp:78
void ring_show(ringbuffer *rbuf, unsigned int count, uint32_t off)
Definition: ringbuffer.cpp:373
static int ring_posdiff(ringbuffer *rbuf, int pos1, int pos2)
Definition: ringbuffer.h:87
int dummy_delete(dummy_buffer *dbuf, uint64_t time)
Definition: ringbuffer.cpp:444
int ring_peek(ringbuffer *rbuf, uint8_t *data, unsigned int count, uint32_t off)
Definition: ringbuffer.cpp:124
static uint32_t dummy_space(dummy_buffer *dbuf)
Definition: ringbuffer.h:117
int ring_write_file(ringbuffer *rbuf, int fd, int count)
Definition: ringbuffer.cpp:264
int ring_skip(ringbuffer *rbuf, int count)
Definition: ringbuffer.cpp:235
void dummy_clear(dummy_buffer *dbuf)
Definition: ringbuffer.cpp:419
int ring_poke(ringbuffer *rbuf, uint8_t *data, unsigned int count, uint32_t off)
Definition: ringbuffer.cpp:163
int ring_init(ringbuffer *rbuf, int size)
Definition: ringbuffer.cpp:38
ringbuffer data_index
Definition: ringbuffer.h:53
ringbuffer time_index
Definition: ringbuffer.h:52
uint32_t size
Definition: ringbuffer.h:50
uint32_t fill
Definition: ringbuffer.h:51
int read_pos
Definition: ringbuffer.h:40
int write_pos
Definition: ringbuffer.h:41
uint8_t * buffer
Definition: ringbuffer.h:43
uint32_t size
Definition: ringbuffer.h:42