+====================
+Snd_CreateRingBuffer
+
+If "buffer" is NULL, the function allocates one buffer of "sampleframes" sample frames itself
+(if "sampleframes" is 0, the function chooses the size).
+====================
+*/
+snd_ringbuffer_t *Snd_CreateRingBuffer (const snd_format_t* format, unsigned int sampleframes, void* buffer)
+{
+ snd_ringbuffer_t *ringbuffer;
+
+ // If the caller provides a buffer, it must give us its size
+ if (sampleframes == 0 && buffer != NULL)
+ return NULL;
+
+ ringbuffer = (snd_ringbuffer_t*)Mem_Alloc(snd_mempool, sizeof (*ringbuffer));
+ memset(ringbuffer, 0, sizeof(*ringbuffer));
+ memcpy(&ringbuffer->format, format, sizeof(ringbuffer->format));
+
+ // If we haven't been given a buffer
+ if (buffer == NULL)
+ {
+ unsigned int maxframes;
+ size_t memsize;
+
+ if (sampleframes == 0)
+ maxframes = (format->speed + 1) / 2; // Make the sound buffer large enough for containing 0.5 sec of sound
+ else
+ maxframes = sampleframes;
+
+ memsize = maxframes * format->width * format->channels;
+ ringbuffer->ring = Mem_Alloc(snd_mempool, memsize);
+ ringbuffer->maxframes = maxframes;
+ }
+ else
+ {
+ ringbuffer->ring = buffer;
+ ringbuffer->maxframes = sampleframes;
+ }
+
+ return ringbuffer;
+}
+
+
+/*
+====================
+Snd_CreateSndBuffer
+====================