mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
[sudio] Fix the SDL audio target
I forgot about SDL in my testing for #16. I do still need to fix the windows targets.
This commit is contained in:
parent
53a7fbfe95
commit
a66e6ad262
1 changed files with 32 additions and 33 deletions
|
@ -46,7 +46,6 @@
|
||||||
|
|
||||||
#include "snd_internal.h"
|
#include "snd_internal.h"
|
||||||
|
|
||||||
static dma_t sn;
|
|
||||||
static int snd_inited;
|
static int snd_inited;
|
||||||
static int snd_blocked;
|
static int snd_blocked;
|
||||||
|
|
||||||
|
@ -95,13 +94,13 @@ SNDDMA_Init_Cvars (void)
|
||||||
"sound sample depth. 0 is system default");
|
"sound sample depth. 0 is system default");
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile dma_t *
|
static int
|
||||||
SNDDMA_Init (void)
|
SNDDMA_Init (snd_t *snd)
|
||||||
{
|
{
|
||||||
SDL_AudioSpec desired, obtained;
|
SDL_AudioSpec desired, obtained;
|
||||||
|
|
||||||
if (snd_inited)
|
if (snd_inited)
|
||||||
return &sn;
|
return 1;
|
||||||
|
|
||||||
if (SDL_Init (SDL_INIT_AUDIO) < 0) {
|
if (SDL_Init (SDL_INIT_AUDIO) < 0) {
|
||||||
Sys_Printf ("Couldn't initialize SDL AUDIO: %s\n", SDL_GetError ());
|
Sys_Printf ("Couldn't initialize SDL AUDIO: %s\n", SDL_GetError ());
|
||||||
|
@ -165,17 +164,17 @@ SNDDMA_Init (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill the audio DMA information block */
|
/* Fill the audio DMA information block */
|
||||||
sn.samplebits = (obtained.format & 0xFF);
|
snd->samplebits = (obtained.format & 0xFF);
|
||||||
sn.speed = obtained.freq;
|
snd->speed = obtained.freq;
|
||||||
sn.channels = obtained.channels;
|
snd->channels = obtained.channels;
|
||||||
sn.frames = obtained.samples * 8; // 8 chunks in the buffer
|
snd->frames = obtained.samples * 8; // 8 chunks in the buffer
|
||||||
sn.framepos = 0;
|
snd->framepos = 0;
|
||||||
sn.submission_chunk = 1;
|
snd->submission_chunk = 1;
|
||||||
|
|
||||||
shm_buflen = sn.frames * sn.channels * (sn.samplebits / 8);
|
shm_buflen = snd->frames * snd->channels * (snd->samplebits / 8);
|
||||||
|
|
||||||
sn.buffer = calloc (shm_buflen, 1);
|
snd->buffer = calloc (shm_buflen, 1);
|
||||||
if (!sn.buffer)
|
if (!snd->buffer)
|
||||||
Sys_Error ("Failed to allocate buffer for sound!");
|
Sys_Error ("Failed to allocate buffer for sound!");
|
||||||
|
|
||||||
shm_buf = calloc (shm_buflen, 1);
|
shm_buf = calloc (shm_buflen, 1);
|
||||||
|
@ -189,28 +188,28 @@ SNDDMA_Init (void)
|
||||||
|
|
||||||
snd_inited = 1;
|
snd_inited = 1;
|
||||||
|
|
||||||
return &sn;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
SNDDMA_GetDMAPos (void)
|
SNDDMA_GetDMAPos (snd_t *snd)
|
||||||
{
|
{
|
||||||
if (!snd_inited)
|
if (!snd_inited)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
SDL_LockAudio ();
|
SDL_LockAudio ();
|
||||||
sn.framepos = shm_rpos / (sn.channels * (sn.samplebits / 8));
|
snd->framepos = shm_rpos / (snd->channels * (snd->samplebits / 8));
|
||||||
SDL_UnlockAudio ();
|
SDL_UnlockAudio ();
|
||||||
|
|
||||||
return sn.framepos;
|
return snd->framepos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SNDDMA_shutdown (void)
|
SNDDMA_shutdown (snd_t *snd)
|
||||||
{
|
{
|
||||||
if (snd_inited) {
|
if (snd_inited) {
|
||||||
SDL_CloseAudio ();
|
SDL_CloseAudio ();
|
||||||
free (sn.buffer);
|
free (snd->buffer);
|
||||||
free (shm_buf);
|
free (shm_buf);
|
||||||
snd_inited = 0;
|
snd_inited = 0;
|
||||||
}
|
}
|
||||||
|
@ -222,7 +221,7 @@ SNDDMA_shutdown (void)
|
||||||
Send sound to device if buffer isn't really the dma buffer
|
Send sound to device if buffer isn't really the dma buffer
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
SNDDMA_Submit (void)
|
SNDDMA_Submit (snd_t *snd)
|
||||||
{
|
{
|
||||||
static unsigned old_paintedtime;
|
static unsigned old_paintedtime;
|
||||||
unsigned len;
|
unsigned len;
|
||||||
|
@ -236,17 +235,17 @@ SNDDMA_Submit (void)
|
||||||
old_paintedtime = 0;
|
old_paintedtime = 0;
|
||||||
|
|
||||||
len = (*plugin_info_snd_output_data.paintedtime - old_paintedtime) *
|
len = (*plugin_info_snd_output_data.paintedtime - old_paintedtime) *
|
||||||
sn.channels * (sn.samplebits / 8);
|
snd->channels * (snd->samplebits / 8);
|
||||||
|
|
||||||
old_paintedtime = *plugin_info_snd_output_data.paintedtime;
|
old_paintedtime = *plugin_info_snd_output_data.paintedtime;
|
||||||
|
|
||||||
while (wpos + len > shm_buflen) {
|
while (wpos + len > shm_buflen) {
|
||||||
memcpy (shm_buf + wpos, sn.buffer + wpos, shm_buflen - wpos);
|
memcpy (shm_buf + wpos, snd->buffer + wpos, shm_buflen - wpos);
|
||||||
len -= shm_buflen - wpos;
|
len -= shm_buflen - wpos;
|
||||||
wpos = 0;
|
wpos = 0;
|
||||||
}
|
}
|
||||||
if (len) {
|
if (len) {
|
||||||
memcpy (shm_buf + wpos, sn.buffer + wpos, len);
|
memcpy (shm_buf + wpos, snd->buffer + wpos, len);
|
||||||
wpos += len;
|
wpos += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +253,7 @@ SNDDMA_Submit (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SNDDMA_BlockSound (void)
|
SNDDMA_BlockSound (snd_t *snd)
|
||||||
{
|
{
|
||||||
if (!snd_inited)
|
if (!snd_inited)
|
||||||
return;
|
return;
|
||||||
|
@ -264,7 +263,7 @@ SNDDMA_BlockSound (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SNDDMA_UnblockSound (void)
|
SNDDMA_UnblockSound (snd_t *snd)
|
||||||
{
|
{
|
||||||
if (!snd_inited || !snd_blocked)
|
if (!snd_inited || !snd_blocked)
|
||||||
return;
|
return;
|
||||||
|
@ -294,14 +293,14 @@ PLUGIN_INFO(snd_output, sdl)
|
||||||
plugin_info_funcs.input = NULL;
|
plugin_info_funcs.input = NULL;
|
||||||
plugin_info_funcs.snd_output = &plugin_info_snd_output_funcs;
|
plugin_info_funcs.snd_output = &plugin_info_snd_output_funcs;
|
||||||
|
|
||||||
plugin_info_general_funcs.p_Init = SNDDMA_Init_Cvars;
|
plugin_info_general_funcs.init = SNDDMA_Init_Cvars;
|
||||||
plugin_info_general_funcs.p_Shutdown = NULL;
|
plugin_info_general_funcs.shutdown = NULL;
|
||||||
plugin_info_snd_output_funcs.pS_O_Init = SNDDMA_Init;
|
plugin_info_snd_output_funcs.init = SNDDMA_Init;
|
||||||
plugin_info_snd_output_funcs.pS_O_Shutdown = SNDDMA_shutdown;
|
plugin_info_snd_output_funcs.shutdown = SNDDMA_shutdown;
|
||||||
plugin_info_snd_output_funcs.pS_O_GetDMAPos = SNDDMA_GetDMAPos;
|
plugin_info_snd_output_funcs.get_dma_pos = SNDDMA_GetDMAPos;
|
||||||
plugin_info_snd_output_funcs.pS_O_Submit = SNDDMA_Submit;
|
plugin_info_snd_output_funcs.submit = SNDDMA_Submit;
|
||||||
plugin_info_snd_output_funcs.pS_O_BlockSound = SNDDMA_BlockSound;
|
plugin_info_snd_output_funcs.block_sound = SNDDMA_BlockSound;
|
||||||
plugin_info_snd_output_funcs.pS_O_UnblockSound = SNDDMA_UnblockSound;
|
plugin_info_snd_output_funcs.unblock_sound = SNDDMA_UnblockSound;
|
||||||
|
|
||||||
return &plugin_info;
|
return &plugin_info;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue