summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/snd_sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/sdl/progs/quake/snd_sdl.c')
-rw-r--r--apps/plugins/sdl/progs/quake/snd_sdl.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/quake/snd_sdl.c b/apps/plugins/sdl/progs/quake/snd_sdl.c
new file mode 100644
index 0000000..8540554
--- /dev/null
+++ b/apps/plugins/sdl/progs/quake/snd_sdl.c
@@ -0,0 +1,112 @@
+
+#include <stdio.h>
+#include "SDL_audio.h"
+#include "SDL_byteorder.h"
+#include "quakedef.h"
+
+static dma_t the_shm;
+static int snd_inited;
+
+extern int desired_speed;
+extern int desired_bits;
+
+static void paint_audio(void *unused, Uint8 *stream, int len)
+{
+ if ( shm ) {
+ shm->buffer = stream;
+ shm->samplepos += len/(shm->samplebits/8)/2;
+ // Check for samplepos overflow?
+ S_PaintChannels (shm->samplepos);
+ }
+}
+
+qboolean SNDDMA_Init(void)
+{
+ SDL_AudioSpec desired, obtained;
+
+ snd_inited = 0;
+
+ /* Set up the desired format */
+ desired.freq = desired_speed;
+ switch (desired_bits) {
+ case 8:
+ desired.format = AUDIO_U8;
+ break;
+ case 16:
+ if ( SDL_BYTEORDER == SDL_BIG_ENDIAN )
+ desired.format = AUDIO_S16MSB;
+ else
+ desired.format = AUDIO_S16LSB;
+ break;
+ default:
+ Con_Printf("Unknown number of audio bits: %d\n",
+ desired_bits);
+ return 0;
+ }
+ desired.channels = 2;
+ desired.samples = 512;
+ desired.callback = paint_audio;
+
+ /* Open the audio device */
+ if ( SDL_OpenAudio(&desired, &obtained) < 0 ) {
+ Con_Printf("Couldn't open SDL audio: %s\n", SDL_GetError());
+ return 0;
+ }
+
+ /* Make sure we can support the audio format */
+ switch (obtained.format) {
+ case AUDIO_U8:
+ /* Supported */
+ break;
+ case AUDIO_S16LSB:
+ case AUDIO_S16MSB:
+ if ( ((obtained.format == AUDIO_S16LSB) &&
+ (SDL_BYTEORDER == SDL_LIL_ENDIAN)) ||
+ ((obtained.format == AUDIO_S16MSB) &&
+ (SDL_BYTEORDER == SDL_BIG_ENDIAN)) ) {
+ /* Supported */
+ break;
+ }
+ /* Unsupported, fall through */;
+ default:
+ /* Not supported -- force SDL to do our bidding */
+ SDL_CloseAudio();
+ if ( SDL_OpenAudio(&desired, NULL) < 0 ) {
+ Con_Printf("Couldn't open SDL audio: %s\n",
+ SDL_GetError());
+ return 0;
+ }
+ memcpy(&obtained, &desired, sizeof(desired));
+ break;
+ }
+ SDL_PauseAudio(0);
+
+ /* Fill the audio DMA information block */
+ shm = &the_shm;
+ shm->splitbuffer = 0;
+ shm->samplebits = (obtained.format & 0xFF);
+ shm->speed = obtained.freq;
+ shm->channels = obtained.channels;
+ shm->samples = obtained.samples*shm->channels;
+ shm->samplepos = 0;
+ shm->submission_chunk = 1;
+ shm->buffer = NULL;
+
+ snd_inited = 1;
+ return 1;
+}
+
+int SNDDMA_GetDMAPos(void)
+{
+ return shm->samplepos;
+}
+
+void SNDDMA_Shutdown(void)
+{
+ if (snd_inited)
+ {
+ SDL_CloseAudio();
+ snd_inited = 0;
+ }
+}
+