00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _RINGBUFFER_H_
00028 #define _RINGBUFFER_H_
00029
00030 #include <stdio.h>
00031 #include <stdint.h>
00032 #include <unistd.h>
00033
00034 #ifdef __cplusplus
00035 extern "C" {
00036 #endif
00037
00038 #define FULL_BUFFER -1000
00039 #define EMPTY_BUFFER -1000
00040 typedef struct ringbuffer {
00041 int read_pos;
00042 int write_pos;
00043 uint32_t size;
00044 uint8_t *buffer;
00045 } ringbuffer;
00046
00047
00048 #define DBUF_INDEX 10000
00049
00050 typedef struct dummy_buffer_s {
00051 uint32_t size;
00052 uint32_t fill;
00053 ringbuffer time_index;
00054 ringbuffer data_index;
00055 } dummy_buffer;
00056
00057
00058 int ring_init (ringbuffer *rbuf, int size);
00059 int ring_reinit (ringbuffer *rbuf, int size);
00060 void ring_clear(ringbuffer *rbuf);
00061 void ring_destroy(ringbuffer *rbuf);
00062 int ring_write(ringbuffer *rbuf, uint8_t *data, int count);
00063 int ring_read(ringbuffer *rbuf, uint8_t *data, int count);
00064 int ring_write_file(ringbuffer *rbuf, int fd, int count);
00065 int ring_read_file(ringbuffer *rbuf, int fd, int count);
00066 int ring_peek(ringbuffer *rbuf, uint8_t *data, unsigned int count,
00067 uint32_t off);
00068 int ring_poke(ringbuffer *rbuf, uint8_t *data, unsigned int count,
00069 uint32_t off);
00070 int ring_skip(ringbuffer *rbuf, int count);
00071
00072 static inline int ring_wpos(ringbuffer *rbuf)
00073 {
00074 return rbuf->write_pos;
00075 }
00076
00077 static inline int ring_rpos(ringbuffer *rbuf)
00078 {
00079 return rbuf->read_pos;
00080 }
00081
00082 static inline int ring_posdiff(ringbuffer *rbuf, int pos1, int pos2){
00083 int diff;
00084
00085 diff = (pos2%rbuf->size) - (pos1%rbuf->size);
00086 if (diff < 0) diff += rbuf->size;
00087 return diff;
00088 }
00089
00090 static inline int ring_wdiff(ringbuffer *rbuf, int pos){
00091 return ring_posdiff(rbuf, rbuf->write_pos,pos);
00092 }
00093
00094 static inline int ring_rdiff(ringbuffer *rbuf, int pos){
00095 return ring_posdiff(rbuf, rbuf->read_pos,pos);
00096 }
00097
00098 static inline unsigned int ring_free(ringbuffer *rbuf){
00099 int free;
00100 free = rbuf->read_pos - rbuf->write_pos;
00101 if (free <= 0) free += rbuf->size;
00102
00103 return free - 1;
00104 }
00105
00106 static inline unsigned int ring_avail(ringbuffer *rbuf){
00107 int avail;
00108 avail = rbuf->write_pos - rbuf->read_pos;
00109 if (avail < 0) avail += rbuf->size;
00110
00111 return avail;
00112 }
00113
00114
00115
00116 static inline uint32_t dummy_space(dummy_buffer *dbuf)
00117 {
00118 return (dbuf->size - dbuf->fill);
00119 }
00120 int dummy_delete(dummy_buffer *dbuf, uint64_t time);
00121 int dummy_add(dummy_buffer *dbuf, uint64_t time, uint32_t size);
00122 void dummy_clear(dummy_buffer *dbuf);
00123 int dummy_init(dummy_buffer *dbuf, int s);
00124 void dummy_destroy(dummy_buffer *dbuf);
00125 void ring_show(ringbuffer *rbuf, unsigned int count, uint32_t off);
00126
00127 #ifdef __cplusplus
00128 }
00129 #endif
00130 #endif