诗词
字典
板报
句子
名言
励志
学校
友答
搜索
首页
中考频道
作文频道
公务员频道
出国留学
医药考试
司法考试
图书频道
外语考试
建筑工程
成人高考
故事频道
教程频道
文档频道
早教
星座频道
校园
求职招聘
考研频道
职业资格
自考频道
计算机考试
财会考试
高考频道
当前位置:
首页
>
教程频道
>
开发语言
>
编程
>
环形字符源缓存代码
2012-06-20
环形字符流缓存代码对于频繁读写的字节流缓存,环形字节流可以重复使用空闲的内存,原理类于环形队列。代码参
环形字符流缓存代码
对于频繁读写的字节流缓存,环形字节流可以重复使用空闲的内存,原理类似于环形队列。
代码参考speex,代码已经经过测试使用
。
/** * @filecircular_buffer.cpp * @brief * * * * @authoryswang * @version1.0 * @date2012年6月18日 * * @see * * @par 版本记录: * <table border=1> * <tr> <th>版本<th>日期<th>作者<th>备注 </tr> * <tr> <td>1.0<td>2012年6月18日<td>yswang<td>创建 </tr> * </table> */#include <stdlib.h>#include "circular_buffer.h"#define dsound_alloc(size)\calloc(size, 1);\#define dsound_realloc(ptr, size)\realloc(ptr, size);\#define dsound_free(ptr)\free(ptr);\#define DSOUND_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))#define DSOUND_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))#define DSOUND_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst))))//////////////////////////////////////////////////////////////////////////struct circular_buffer_{char *data;int size; // 内存大小int read_ptr; // 读指针int write_ptr; // 写指针int available; // 可读字节数(实际字节 write_ptr - read_ptr )};//////////////////////////////////////////////////////////////////////////circular_buffer * circular_buffer_init(int size){circular_buffer * st = dsound_alloc(sizeof(circular_buffer)); st->data = dsound_alloc(size);st->size = size;st->read_ptr = 0;st->write_ptr = 0;st->available = 0;return st;}void circular_buffer_destroy(circular_buffer *st){dsound_free(st->data);dsound_free(st);}int circular_buffer_write(circular_buffer *st, void * _data, int len){int end, end1; // 写后的位置int newlen;char * data = _data;if (len > st->size - st->available) // 大于剩余的空间(剩余空间不足,重新分配){newlen = st->available + len;newlen *= 2; // 2倍空间,预留circular_buffer_resize(st, newlen);}end = st->write_ptr + len;end1 = end;if (end1 > st->size)end1 = st->size;DSOUND_COPY(st->data + st->write_ptr, data, end1 - st->write_ptr);if (end > st->size){end -= st->size;DSOUND_COPY(st->data, data + end1 - st->write_ptr, end);}st->available += len;st->write_ptr += len;if (st->write_ptr > st->size) // 保证指针在有效范围内st->write_ptr -= st->size;return len;}int circular_buffer_read(circular_buffer *st, void * _data, int len){int end, end1; // 读取后的位置char * data = _data;if (len > st->available) // 读取有效的直接{//DSOUND_MEMSET(data + st->available, 0, st->size - st->available);len = st->available;}end = st->read_ptr + len;end1 = end;/* *||-------------|----------------------|| * &######################& * read_ptr end1 *####&#####& *end write_ptr **/if (end1 > st->size)end1 = st->size;DSOUND_COPY(data, st->data + st->read_ptr, end1 - st->read_ptr);if (end > st->size){end -= st->size;DSOUND_COPY(data + end1 - st->read_ptr, st->data, end);}st->available -= len;st->read_ptr += len;if (st->read_ptr > st->size) // 保证指针在有效范围内st->read_ptr -= st->size;return len;}int circular_buffer_get_available(circular_buffer *st){return st->available;}int circular_buffer_resize(circular_buffer *st, int len){int end, end1; char * data;int oldlen = st->size;data = dsound_alloc(len);if (!data)return -1;// 拷贝内存end = st->read_ptr + st->available;end1 = end;if (end1 > st->size)end1 = st->size;DSOUND_COPY(data, st->data + st->read_ptr, end1 - st->read_ptr);if (end > st->size){end -= st->size;DSOUND_COPY(data + end1 - st->read_ptr, st->data, end);}// 更新状态free(st->data);st->data = data;st->size = len;st->read_ptr = 0;st->write_ptr = st->available; return 0;}