Very simple ring buffer implementation (not tested yet)
[speexdsp.git] / libspeex / buffer.c
1
2 #include "os_support.h"
3 #include "misc.h"
4
5 struct SpeexBuffer_;
6 typedef struct SpeexBuffer_ SpeexBuffer;
7
8
9 struct SpeexBuffer_ {
10    void *data;
11    int   size;
12    int   read_ptr;
13    int   write_ptr;
14    int   available;
15 };
16
17 SpeexBuffer *speex_buffer_init(int size)
18 {
19    SpeexBuffer *st = speex_alloc(sizeof(SpeexBuffer));
20    st->data = speex_alloc(size);
21    st->size = size;
22    st->read_ptr = 0;
23    st->write_ptr = 0;
24    st->available = 0;
25    return st;
26 }
27
28 int speex_buffer_write(SpeexBuffer *st, void *data, int len)
29 {
30    int end;
31    int end1;
32    if (len > st->size)
33    {
34       data += len-st->size;
35       len = st->size;
36    }
37    end = st->write_ptr + len;
38    end1 = end;
39    if (end1 > st->size)
40       end1 = st->size;
41    speex_move(st->data + st->write_ptr, data, end1 - st->write_ptr);
42    if (end > st->size)
43    {
44       end -= st->size;
45       speex_move(st->data, data+end1 - st->write_ptr, end);
46    }
47    st->available += len;
48    if (st->available > st->size)
49    {
50       st->available = st->size;
51       st->read_ptr = st->write_ptr;
52    }
53    return len;
54 }
55
56 /*int speex_buffer_writezeros(SpeexBuffer *st, int len)
57 {
58    return len;
59 }*/
60
61 int speex_buffer_read(SpeexBuffer *st, void *data, int len)
62 {
63    int end, end1;
64    if (len > st->available)
65    {
66       speex_memset(data+st->available, 0, st->size-st->available);
67       len = st->available;
68    }
69    end = st->read_ptr + len;
70    end1 = end;
71    if (end1 > st->size)
72       end1 = st->size;
73    speex_move(data, st->data + st->read_ptr, end1 - st->read_ptr);
74
75    if (end > st->size)
76    {
77       end -= st->size;
78       speex_move(data+end1 - st->read_ptr, st->data, end);
79    }
80    st->available -= len;
81    return len;
82 }
83
84 int speex_buffer_get_available(SpeexBuffer *st)
85 {
86    return st->available;
87 }
88
89 int speex_buffer_resize(SpeexBuffer *st, void *data, int len)
90 {
91    return len;
92 }