source: roaraudio/libroar/buffer.c @ 301:2f933e4c4f2b

Last change on this file since 301:2f933e4c4f2b was 301:2f933e4c4f2b, checked in by phi, 16 years ago

got roar_stream_add_data() working!

File size: 3.4 KB
Line 
1//buffer.c:
2
3#include "libroar.h"
4
5int roar_buffer_new      (struct roar_buffer ** buf, size_t len) {
6 struct roar_buffer * new;
7
8 ROAR_DBG("buffer_new(buf=%p, len=%i) = ?", buf, len);
9
10 if ((new = malloc(sizeof(struct roar_buffer))) == NULL) {
11  *buf = NULL;
12  return -1;
13 }
14
15 if ((new->data = malloc(len)) == NULL) {
16  free(new);
17  *buf = NULL;
18  return -1;
19 }
20
21 new->user_data = new->data;
22
23 new->next      = NULL;
24
25 new->len       = len;
26 new->user_len  = len;
27 *buf           = new;
28
29 ROAR_DBG("buffer_new(buf=%p, len=%i): New buffer at %p", buf, len, new);
30
31 return 0;
32}
33
34int roar_buffer_free     (struct roar_buffer * buf) {
35 struct roar_buffer * next;
36
37 if ( buf == NULL )
38  return -1;
39
40 while ((next = buf->next)) {
41  free(buf->data);
42  free(buf);
43  buf = next;
44 }
45
46 free(buf->data);
47 free(buf);
48
49 return 0;
50}
51
52int roar_buffer_delete   (struct roar_buffer * buf, struct roar_buffer ** next) {
53 if ( buf == NULL ) {
54  if ( next != NULL )
55   *next = NULL;
56  return -1;
57 }
58
59 ROAR_DBG("buffer_delete(buf=%p, next=%p) = ?", buf, next);
60
61 if ( next != NULL )
62  *next = buf->next;
63
64 free(buf->data);
65 free(buf);
66
67 ROAR_DBG("buffer_delete(buf=%p, next=%p) = 0", buf, next);
68 return 0;
69}
70
71int roar_buffer_add      (struct roar_buffer * buf, struct roar_buffer *  next) {
72 if ( buf == NULL )
73  return -1;
74
75 ROAR_DBG("buffer_add(buf=%p, next=%p) = ?", buf, next);
76
77 while ( buf->next != NULL ) {
78  ROAR_DBG("buffer_add(*): buf=%p, next=%p", buf, buf->next);
79//  ROAR_DBG("buffer_add(): buf=%p, buf->next=%p", buf, buf->next);
80  buf = buf->next;
81 }
82
83 buf->next = next;
84
85 return 0;
86}
87
88int roar_buffer_get_next (struct roar_buffer *  buf, struct roar_buffer ** next) {
89 if ( buf == NULL )
90  return -1;
91
92 *next = buf->next;
93
94 return 0;
95}
96
97int roar_buffer_get_data (struct roar_buffer *  buf, void   ** data) {
98 if ( buf == NULL )
99  return -1;
100
101 *data = buf->user_data;
102
103 return 0;
104}
105
106int roar_buffer_set_offset (struct roar_buffer *  buf, size_t off) {
107 if ( buf == NULL )
108  return -1;
109
110 buf->user_len  -= off;
111 buf->user_data += off;
112
113 return 0;
114}
115
116int roar_buffer_set_meta (struct roar_buffer * buf, void *  meta) {
117 if ( buf == NULL )
118  return -1;
119
120 buf->meta = meta;
121
122 return 0;
123}
124
125int roar_buffer_get_meta (struct roar_buffer * buf, void ** meta) {
126 if ( buf == NULL )
127  return -1;
128
129 *meta = buf->meta;
130
131 return 0;
132}
133
134int roar_buffer_set_len  (struct roar_buffer *  buf, size_t    len) {
135 if ( buf == NULL )
136  return -1;
137
138 buf->user_len = len;
139
140 return 0;
141}
142
143int roar_buffer_get_len  (struct roar_buffer *  buf, size_t *  len) {
144 if ( buf == NULL )
145  return -1;
146
147 *len = buf->user_len;
148
149 return 0;
150}
151
152int roar_buffer_duplicate (struct roar_buffer *  buf, struct roar_buffer ** copy) {
153 struct roar_buffer *  cur = buf;
154 struct roar_buffer *  new;
155 void * od, * nd;
156
157 *copy = NULL;
158
159 while (cur) {
160  if ( roar_buffer_new(&new, cur->user_len) == -1 ) {
161   roar_buffer_free(*copy);
162   return -1;
163  }
164
165  if ( *copy == NULL )
166   *copy = new;
167
168  roar_buffer_get_data(cur, &od);
169  roar_buffer_get_data(new, &nd);
170  memcpy(nd, od, cur->user_len);
171
172  roar_buffer_add(*copy, new);
173
174  cur = cur->next;
175 }
176 return 0;
177}
178
179int roar_buffer_ring_stats (struct roar_buffer *  buf, struct roar_buffer_stats * stats) {
180 if ( buf == NULL )
181  return -1;
182
183 stats->parts        = 0;
184 stats->bytes        = 0;
185 stats->memory_usage = 0;
186
187 while (buf) {
188  stats->parts++;
189  stats->bytes        += buf->user_len;
190  stats->memory_usage += buf->len + sizeof(struct roar_buffer);
191  buf = buf->next;
192 }
193
194 return 0;
195}
196
197//ll
Note: See TracBrowser for help on using the repository browser.