首页
诗词
字典
板报
句子
名言
友答
励志
学校
网站地图
编程
C++
C语言
C++ Builder
VB
PB
Ruby Rails
perl python
编程
其他开发语言
VBA
VC/MFC
当前位置:
首页
>
教程频道
>
开发语言
>
编程
>
环形字符源缓存代码
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;}
查看更多
下一篇
本文网址:
https://www.reader8.net/jiaocheng/20120620/1835924.html
读书人精选
热点排行
maven 项目平添Maven Dependencies Libr
java类静态域、块,非静态域、块,结构函
Golang的slice圈套
Spring2 兑现AOP编程的两种实现方法
树的底层实现(下)
多线程程序的评量基准
struts2札记之第七讲
jquery 用ID取某个元素上的某个ID元素
scoket创设多线程服务器
基于glut的OpenGL框架(1)