zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
alcRing.c
Go to the documentation of this file.
1 
21 #include "config.h"
22 
23 #include <string.h>
24 #include <stdlib.h>
25 
26 #include "alMain.h"
27 
28 
29 struct RingBuffer {
30  ALubyte *mem;
31 
32  ALsizei frame_size;
34  ALint read_pos;
35  ALint write_pos;
36 
38 };
39 
40 
42 {
43  RingBuffer *ring = calloc(1, sizeof(*ring) + ((length+1) * frame_size));
44  if(ring)
45  {
46  ring->mem = (ALubyte*)(ring+1);
47 
48  ring->frame_size = frame_size;
49  ring->length = length+1;
50  ring->read_pos = 0;
51  ring->write_pos = 0;
52 
53  InitializeCriticalSection(&ring->cs);
54  }
55  return ring;
56 }
57 
59 {
60  if(ring)
61  {
62  DeleteCriticalSection(&ring->cs);
63  free(ring);
64  }
65 }
66 
68 {
69  ALsizei s;
70 
71  EnterCriticalSection(&ring->cs);
72  s = (ring->write_pos-ring->read_pos+ring->length) % ring->length;
73  LeaveCriticalSection(&ring->cs);
74 
75  return s;
76 }
77 
79 {
80  int remain;
81 
82  EnterCriticalSection(&ring->cs);
83 
84  remain = (ring->read_pos-ring->write_pos-1+ring->length) % ring->length;
85  if(remain < len) len = remain;
86 
87  if(len > 0)
88  {
89  remain = ring->length - ring->write_pos;
90  if(remain < len)
91  {
92  memcpy(ring->mem+(ring->write_pos*ring->frame_size), data,
93  remain*ring->frame_size);
94  memcpy(ring->mem, data+(remain*ring->frame_size),
95  (len-remain)*ring->frame_size);
96  }
97  else
98  memcpy(ring->mem+(ring->write_pos*ring->frame_size), data,
99  len*ring->frame_size);
100 
101  ring->write_pos += len;
102  ring->write_pos %= ring->length;
103  }
104 
105  LeaveCriticalSection(&ring->cs);
106 }
107 
109 {
110  int remain;
111 
112  EnterCriticalSection(&ring->cs);
113 
114  remain = ring->length - ring->read_pos;
115  if(remain < len)
116  {
117  memcpy(data, ring->mem+(ring->read_pos*ring->frame_size), remain*ring->frame_size);
118  memcpy(data+(remain*ring->frame_size), ring->mem, (len-remain)*ring->frame_size);
119  }
120  else
121  memcpy(data, ring->mem+(ring->read_pos*ring->frame_size), len*ring->frame_size);
122 
123  ring->read_pos += len;
124  ring->read_pos %= ring->length;
125 
126  LeaveCriticalSection(&ring->cs);
127 }
unsigned char ALubyte
Definition: al.h:47
GLdouble s
Definition: glew.h:1376
int ALsizei
Definition: al.h:62
SDL_EventEntry * free
Definition: SDL_events.c:80
int ALint
Definition: al.h:56
GLenum GLsizei len
Definition: glew.h:7035
ALsizei RingBufferSize(RingBuffer *ring)
Definition: alcRing.c:67
#define calloc
Definition: SDL_malloc.c:636
void InitializeCriticalSection(CRITICAL_SECTION *cs)
Definition: helpers.c:334
struct RingBuffer RingBuffer
Definition: alMain.h:750
GLsizei GLsizei * length
Definition: gl2ext.h:792
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl2ext.h:848
RingBuffer * CreateRingBuffer(ALsizei frame_size, ALsizei length)
Definition: alcRing.c:41
pthread_mutex_t CRITICAL_SECTION
Definition: alMain.h:101
void EnterCriticalSection(CRITICAL_SECTION *cs)
Definition: helpers.c:359
void DeleteCriticalSection(CRITICAL_SECTION *cs)
Definition: helpers.c:353
#define memcpy
Definition: SDL_malloc.c:634
void ReadRingBuffer(RingBuffer *ring, ALubyte *data, ALsizei len)
Definition: alcRing.c:108
void LeaveCriticalSection(CRITICAL_SECTION *cs)
Definition: helpers.c:365
void DestroyRingBuffer(RingBuffer *ring)
Definition: alcRing.c:58
void WriteRingBuffer(RingBuffer *ring, const ALubyte *data, ALsizei len)
Definition: alcRing.c:78