2
|
1 /* cirbuf.cpp
|
|
2 *
|
|
3 * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005).
|
|
4 * All Rights Reserved.
|
|
5 *
|
|
6 * Circular buffers
|
|
7 *
|
|
8 * Version 0.2
|
|
9 */
|
|
10
|
|
11 #include <string.h>
|
|
12 #include <strings.h>
|
|
13
|
|
14 #include "oss.h"
|
|
15 #include "cirbuf.h"
|
|
16 #include "intercomd.h"
|
|
17
|
|
18 CIRBUF::CIRBUF()
|
|
19 {
|
|
20 bzero(buf, CIRBUFSIZE);
|
|
21 in = out = len = 0;
|
|
22 }
|
|
23
|
|
24 void CIRBUF::init()
|
|
25 {
|
|
26 bzero(buf, CIRBUFSIZE);
|
|
27 in = out = len = 0;
|
|
28 }
|
|
29
|
|
30 int CIRBUF::push(char *from, int size)
|
|
31 {
|
|
32 memcpy(buf + in, from, size);
|
|
33 in += size;
|
|
34 if (in >= CIRBUFSIZE) {
|
|
35 in -= CIRBUFSIZE;
|
|
36 }
|
|
37 len += size;
|
|
38 if (len > CIRBUFSIZE) {
|
|
39 int oversize = (((len - CIRBUFSIZE) / FRAGSIZE)) * FRAGSIZE;
|
|
40 if (oversize < len - CIRBUFSIZE) {
|
|
41 oversize += FRAGSIZE;
|
|
42 }
|
|
43 // delete oldest if overrun
|
|
44 out += oversize;
|
|
45 if (out >= CIRBUFSIZE) {
|
|
46 out -= CIRBUFSIZE;
|
|
47 }
|
|
48 len -= oversize;
|
|
49 return -oversize;
|
|
50 } else {
|
|
51 return OKAY;
|
|
52 }
|
|
53 }
|
|
54
|
|
55 int CIRBUF::pop(char *to, int size)
|
|
56 {
|
|
57 if (len < size) {
|
|
58 // play out silence if underrun
|
|
59 bzero(to, size);
|
|
60 return ERROR;
|
|
61 }
|
|
62 memcpy(to, buf + out, size);
|
|
63 out += size;
|
|
64 if (out >= CIRBUFSIZE) {
|
|
65 out -= CIRBUFSIZE;
|
|
66 }
|
|
67 len -= size;
|
|
68 return OKAY;
|
|
69 }
|