Mercurial > hg > audiostuff
comparison intercom/cirbuf.cpp @ 2:13be24d74cd2
import intercom-0.4.1
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 09:57:52 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 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 } |
