SDL  2.0
SDL_dataqueue.h File Reference
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

SDL_DataQueueSDL_NewDataQueue (const size_t packetlen, const size_t initialslack)
 
void SDL_FreeDataQueue (SDL_DataQueue *queue)
 
void SDL_ClearDataQueue (SDL_DataQueue *queue, const size_t slack)
 
int SDL_WriteToDataQueue (SDL_DataQueue *queue, const void *data, const size_t len)
 
size_t SDL_ReadFromDataQueue (SDL_DataQueue *queue, void *buf, const size_t len)
 
size_t SDL_PeekIntoDataQueue (SDL_DataQueue *queue, void *buf, const size_t len)
 
size_t SDL_CountDataQueue (SDL_DataQueue *queue)
 
voidSDL_ReserveSpaceInDataQueue (SDL_DataQueue *queue, const size_t len)
 

Function Documentation

◆ SDL_ClearDataQueue()

void SDL_ClearDataQueue ( SDL_DataQueue queue,
const size_t  slack 
)

Definition at line 97 of file SDL_dataqueue.c.

98 {
99  const size_t packet_size = queue ? queue->packet_size : 1;
100  const size_t slackpackets = (slack + (packet_size-1)) / packet_size;
101  SDL_DataQueuePacket *packet;
102  SDL_DataQueuePacket *prev = NULL;
103  size_t i;
104 
105  if (!queue) {
106  return;
107  }
108 
109  packet = queue->head;
110 
111  /* merge the available pool and the current queue into one list. */
112  if (packet) {
113  queue->tail->next = queue->pool;
114  } else {
115  packet = queue->pool;
116  }
117 
118  /* Remove the queued packets from the device. */
119  queue->tail = NULL;
120  queue->head = NULL;
121  queue->queued_bytes = 0;
122  queue->pool = packet;
123 
124  /* Optionally keep some slack in the pool to reduce malloc pressure. */
125  for (i = 0; packet && (i < slackpackets); i++) {
126  prev = packet;
127  packet = packet->next;
128  }
129 
130  if (prev) {
131  prev->next = NULL;
132  } else {
133  queue->pool = NULL;
134  }
135 
136  SDL_FreeDataQueueList(packet); /* free extra packets */
137 }
static void SDL_FreeDataQueueList(SDL_DataQueuePacket *packet)
Definition: SDL_dataqueue.c:44
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define NULL
Definition: begin_code.h:163
SDL_DataQueuePacket * pool
Definition: SDL_dataqueue.c:38
size_t queued_bytes
Definition: SDL_dataqueue.c:40
SDL_DataQueuePacket * tail
Definition: SDL_dataqueue.c:37
size_t packet_size
Definition: SDL_dataqueue.c:39
SDL_DataQueuePacket * head
Definition: SDL_dataqueue.c:36
struct SDL_DataQueuePacket * next
Definition: SDL_dataqueue.c:30

References SDL_DataQueue::head, i, SDL_DataQueuePacket::next, NULL, SDL_DataQueue::packet_size, SDL_DataQueue::pool, SDL_DataQueue::queued_bytes, SDL_FreeDataQueueList(), and SDL_DataQueue::tail.

Referenced by SDL_AudioStreamClear(), and SDL_ClearQueuedAudio().

◆ SDL_CountDataQueue()

size_t SDL_CountDataQueue ( SDL_DataQueue queue)

Definition at line 293 of file SDL_dataqueue.c.

294 {
295  return queue ? queue->queued_bytes : 0;
296 }

References SDL_DataQueue::queued_bytes.

Referenced by SDL_AudioStreamAvailable(), SDL_BufferQueueDrainCallback(), and SDL_GetQueuedAudioSize().

◆ SDL_FreeDataQueue()

void SDL_FreeDataQueue ( SDL_DataQueue queue)

Definition at line 87 of file SDL_dataqueue.c.

88 {
89  if (queue) {
92  SDL_free(queue);
93  }
94 }
#define SDL_free

References SDL_DataQueue::head, SDL_DataQueue::pool, SDL_free, and SDL_FreeDataQueueList().

Referenced by close_audio_device(), and SDL_FreeAudioStream().

◆ SDL_NewDataQueue()

SDL_DataQueue* SDL_NewDataQueue ( const size_t  packetlen,
const size_t  initialslack 
)

Definition at line 57 of file SDL_dataqueue.c.

58 {
59  SDL_DataQueue *queue = (SDL_DataQueue *) SDL_malloc(sizeof (SDL_DataQueue));
60 
61  if (!queue) {
63  return NULL;
64  } else {
65  const size_t packetlen = _packetlen ? _packetlen : 1024;
66  const size_t wantpackets = (initialslack + (packetlen - 1)) / packetlen;
67  size_t i;
68 
69  SDL_zerop(queue);
70  queue->packet_size = packetlen;
71 
72  for (i = 0; i < wantpackets; i++) {
73  SDL_DataQueuePacket *packet = (SDL_DataQueuePacket *) SDL_malloc(sizeof (SDL_DataQueuePacket) + packetlen);
74  if (packet) { /* don't care if this fails, we'll deal later. */
75  packet->datalen = 0;
76  packet->startpos = 0;
77  packet->next = queue->pool;
78  queue->pool = packet;
79  }
80  }
81  }
82 
83  return queue;
84 }
#define SDL_malloc
#define SDL_OutOfMemory()
Definition: SDL_error.h:88
#define SDL_zerop(x)
Definition: SDL_stdinc.h:427

References SDL_DataQueuePacket::datalen, i, SDL_DataQueuePacket::next, NULL, SDL_DataQueue::packet_size, SDL_DataQueue::pool, SDL_malloc, SDL_OutOfMemory, SDL_zerop, and SDL_DataQueuePacket::startpos.

Referenced by open_audio_device(), and SDL_NewAudioStream().

◆ SDL_PeekIntoDataQueue()

size_t SDL_PeekIntoDataQueue ( SDL_DataQueue queue,
void buf,
const size_t  len 
)

Definition at line 228 of file SDL_dataqueue.c.

229 {
230  size_t len = _len;
231  Uint8 *buf = (Uint8 *) _buf;
232  Uint8 *ptr = buf;
233  SDL_DataQueuePacket *packet;
234 
235  if (!queue) {
236  return 0;
237  }
238 
239  for (packet = queue->head; len && packet; packet = packet->next) {
240  const size_t avail = packet->datalen - packet->startpos;
241  const size_t cpy = SDL_min(len, avail);
242  SDL_assert(queue->queued_bytes >= avail);
243 
244  SDL_memcpy(ptr, packet->data + packet->startpos, cpy);
245  ptr += cpy;
246  len -= cpy;
247  }
248 
249  return (size_t) (ptr - buf);
250 }
#define SDL_assert(condition)
Definition: SDL_assert.h:171
#define SDL_memcpy
GLenum GLsizei len
GLenum GLuint GLenum GLsizei const GLchar * buf
uint8_t Uint8
Definition: SDL_stdinc.h:185
#define SDL_min(x, y)
Definition: SDL_stdinc.h:412
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF ptr
Uint8 data[SDL_VARIABLE_LENGTH_ARRAY]
Definition: SDL_dataqueue.c:31

References SDL_DataQueuePacket::data, SDL_DataQueuePacket::datalen, SDL_DataQueue::head, SDL_DataQueuePacket::next, ptr, SDL_DataQueue::queued_bytes, SDL_assert, SDL_memcpy, SDL_min, and SDL_DataQueuePacket::startpos.

◆ SDL_ReadFromDataQueue()

size_t SDL_ReadFromDataQueue ( SDL_DataQueue queue,
void buf,
const size_t  len 
)

Definition at line 253 of file SDL_dataqueue.c.

254 {
255  size_t len = _len;
256  Uint8 *buf = (Uint8 *) _buf;
257  Uint8 *ptr = buf;
258  SDL_DataQueuePacket *packet;
259 
260  if (!queue) {
261  return 0;
262  }
263 
264  while ((len > 0) && ((packet = queue->head) != NULL)) {
265  const size_t avail = packet->datalen - packet->startpos;
266  const size_t cpy = SDL_min(len, avail);
267  SDL_assert(queue->queued_bytes >= avail);
268 
269  SDL_memcpy(ptr, packet->data + packet->startpos, cpy);
270  packet->startpos += cpy;
271  ptr += cpy;
272  queue->queued_bytes -= cpy;
273  len -= cpy;
274 
275  if (packet->startpos == packet->datalen) { /* packet is done, put it in the pool. */
276  queue->head = packet->next;
277  SDL_assert((packet->next != NULL) || (packet == queue->tail));
278  packet->next = queue->pool;
279  queue->pool = packet;
280  }
281  }
282 
283  SDL_assert((queue->head != NULL) == (queue->queued_bytes != 0));
284 
285  if (queue->head == NULL) {
286  queue->tail = NULL; /* in case we drained the queue entirely. */
287  }
288 
289  return (size_t) (ptr - buf);
290 }

References SDL_DataQueuePacket::data, SDL_DataQueuePacket::datalen, SDL_DataQueue::head, SDL_DataQueuePacket::next, NULL, SDL_DataQueue::pool, ptr, SDL_DataQueue::queued_bytes, SDL_assert, SDL_memcpy, SDL_min, SDL_DataQueuePacket::startpos, and SDL_DataQueue::tail.

Referenced by SDL_AudioStreamGet(), SDL_BufferQueueDrainCallback(), and SDL_DequeueAudio().

◆ SDL_ReserveSpaceInDataQueue()

void* SDL_ReserveSpaceInDataQueue ( SDL_DataQueue queue,
const size_t  len 
)

Definition at line 299 of file SDL_dataqueue.c.

300 {
301  SDL_DataQueuePacket *packet;
302 
303  if (!queue) {
304  SDL_InvalidParamError("queue");
305  return NULL;
306  } else if (len == 0) {
307  SDL_InvalidParamError("len");
308  return NULL;
309  } else if (len > queue->packet_size) {
310  SDL_SetError("len is larger than packet size");
311  return NULL;
312  }
313 
314  packet = queue->head;
315  if (packet) {
316  const size_t avail = queue->packet_size - packet->datalen;
317  if (len <= avail) { /* we can use the space at end of this packet. */
318  void *retval = packet->data + packet->datalen;
319  packet->datalen += len;
320  queue->queued_bytes += len;
321  return retval;
322  }
323  }
324 
325  /* Need a fresh packet. */
326  packet = AllocateDataQueuePacket(queue);
327  if (!packet) {
328  SDL_OutOfMemory();
329  return NULL;
330  }
331 
332  packet->datalen = len;
333  queue->queued_bytes += len;
334  return packet->data;
335 }
static SDL_DataQueuePacket * AllocateDataQueuePacket(SDL_DataQueue *queue)
#define SDL_SetError
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:90
SDL_bool retval

References AllocateDataQueuePacket(), SDL_DataQueuePacket::data, SDL_DataQueuePacket::datalen, SDL_DataQueue::head, NULL, SDL_DataQueue::packet_size, SDL_DataQueue::queued_bytes, retval, SDL_InvalidParamError, SDL_OutOfMemory, and SDL_SetError.

◆ SDL_WriteToDataQueue()

int SDL_WriteToDataQueue ( SDL_DataQueue queue,
const void data,
const size_t  len 
)

Definition at line 174 of file SDL_dataqueue.c.

175 {
176  size_t len = _len;
177  const Uint8 *data = (const Uint8 *) _data;
178  const size_t packet_size = queue ? queue->packet_size : 0;
179  SDL_DataQueuePacket *orighead;
180  SDL_DataQueuePacket *origtail;
181  size_t origlen;
182  size_t datalen;
183 
184  if (!queue) {
185  return SDL_InvalidParamError("queue");
186  }
187 
188  orighead = queue->head;
189  origtail = queue->tail;
190  origlen = origtail ? origtail->datalen : 0;
191 
192  while (len > 0) {
193  SDL_DataQueuePacket *packet = queue->tail;
194  SDL_assert(!packet || (packet->datalen <= packet_size));
195  if (!packet || (packet->datalen >= packet_size)) {
196  /* tail packet missing or completely full; we need a new packet. */
197  packet = AllocateDataQueuePacket(queue);
198  if (!packet) {
199  /* uhoh, reset so we've queued nothing new, free what we can. */
200  if (!origtail) {
201  packet = queue->head; /* whole queue. */
202  } else {
203  packet = origtail->next; /* what we added to existing queue. */
204  origtail->next = NULL;
205  origtail->datalen = origlen;
206  }
207  queue->head = orighead;
208  queue->tail = origtail;
209  queue->pool = NULL;
210 
211  SDL_FreeDataQueueList(packet); /* give back what we can. */
212  return SDL_OutOfMemory();
213  }
214  }
215 
216  datalen = SDL_min(len, packet_size - packet->datalen);
217  SDL_memcpy(packet->data + packet->datalen, data, datalen);
218  data += datalen;
219  len -= datalen;
220  packet->datalen += datalen;
221  queue->queued_bytes += datalen;
222  }
223 
224  return 0;
225 }
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974

References AllocateDataQueuePacket(), SDL_DataQueuePacket::data, SDL_DataQueuePacket::datalen, SDL_DataQueue::head, SDL_DataQueuePacket::next, NULL, SDL_DataQueue::packet_size, SDL_DataQueue::pool, SDL_DataQueue::queued_bytes, SDL_assert, SDL_FreeDataQueueList(), SDL_InvalidParamError, SDL_memcpy, SDL_min, SDL_OutOfMemory, and SDL_DataQueue::tail.

Referenced by SDL_AudioStreamPut(), SDL_AudioStreamPutInternal(), SDL_BufferQueueFillCallback(), and SDL_QueueAudio().