Add a MIDI event queue
[openal-soft.git] / OpenAL32 / alMidi.c
blob773f4cac7017112882ae7cb3372e5621b3cdc8c9
2 #include "config.h"
4 #include <stdlib.h>
5 #include <string.h>
6 #include <limits.h>
8 #include "evtqueue.h"
11 void InitEvtQueue(EvtQueue *queue)
13 queue->events = NULL;
14 queue->maxsize = 0;
15 queue->size = 0;
16 queue->pos = 0;
19 void ResetEvtQueue(EvtQueue *queue)
21 free(queue->events);
22 queue->events = NULL;
23 queue->maxsize = 0;
24 queue->size = 0;
25 queue->pos = 0;
28 ALenum InsertEvtQueue(EvtQueue *queue, const MidiEvent *evt)
30 ALsizei pos;
32 if(queue->maxsize == queue->size)
34 if(queue->pos > 0)
36 /* Queue has some stale entries, remove them to make space for more
37 * events. */
38 memmove(&queue->events[0], &queue->events[queue->pos],
39 (queue->size-queue->pos)*sizeof(queue->events[0]));
40 queue->size -= queue->pos;
41 queue->pos = 0;
43 else
45 /* Queue is full, double the allocated space. */
46 void *temp = NULL;
47 ALsizei newsize;
49 newsize = (queue->maxsize ? (queue->maxsize<<1) : 16);
50 if(newsize > queue->maxsize)
51 temp = realloc(queue->events, newsize * sizeof(queue->events[0]));
52 if(!temp)
53 return AL_OUT_OF_MEMORY;
55 queue->events = temp;
56 queue->maxsize = newsize;
60 pos = queue->pos;
61 if(queue->size > 0)
63 ALsizei high = queue->size - 1;
64 while(pos < high)
66 ALsizei mid = pos + (high-pos)/2;
67 if(queue->events[mid].time < evt->time)
68 pos = mid + 1;
69 else
70 high = mid;
72 while(pos < queue->size && queue->events[pos].time <= evt->time)
73 pos++;
75 if(pos < queue->size)
76 memmove(&queue->events[pos+1], &queue->events[pos],
77 (queue->size-pos)*sizeof(queue->events[0]));
80 queue->events[pos] = *evt;
81 queue->size++;
83 return AL_NO_ERROR;