1
0
Fork 0
forked from fte/fteqw
fteqw/engine/client/snd_sdl.c

118 lines
2.6 KiB
C

#include "quakedef.h"
#include "winquake.h"
#include <SDL.h>
extern cvar_t snd_khz;
#define SOUND_BUFFER_SIZE 0x0400
int snd_inited;
soundcardinfo_t *sndcardinfo;
int snd_firsttime = 0;
int aimedforguid;
//lamocodec.
static char buffer[SOUND_BUFFER_SIZE];
int sndpos;
void SNDDMA_Submit(soundcardinfo_t *sc)
{ //We already wrote it into the 'dma' buffer (heh, the closest we can get to it at least)
//so we now wait for sdl to request it.
//yes, this can result in slow sound.
}
void SNDDMA_Shutdown(soundcardinfo_t *sc)
{
if (snd_inited)
{
snd_inited = false;
SDL_CloseAudio();
}
}
int SNDDMA_GetDMAPos(soundcardinfo_t *sc)
{
sc->sn.samplepos = (sndpos / (sc->sn.samplebits/8)) % sc->sn.samples;
return sc->sn.samplepos;
}
void SNDDMA_Paint(void *userdata, qbyte *stream, int len)
{
if (len > SOUND_BUFFER_SIZE)
len = SOUND_BUFFER_SIZE; //whoa nellie!
if (len > SOUND_BUFFER_SIZE - sndpos)
{ //buffer will wrap, fill in the rest
memcpy(stream, buffer + sndpos, SOUND_BUFFER_SIZE - sndpos);
len -= SOUND_BUFFER_SIZE - sndpos;
sndpos = 0;
} //and finish from the start
memcpy(stream, buffer + sndpos, len);
sndpos += len;
}
void S_UpdateCapture(void) //any ideas how to get microphone input?
{
}
int SNDDMA_Init(soundcardinfo_t *sc)
{
SDL_AudioSpec desired, obtained;
if (snd_inited)
{ //our init code actually calls this function multiple times, in the case that the user has multiple sound cards
// Con_Printf("Sound was already inited\n");
return 2; //erm. SDL won't allow multiple sound cards anyway.
}
Con_Printf("SDL AUDIO INITING\n");
if(SDL_InitSubSystem(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE))
{
Con_Print("Couldn't initialize SDL audio subsystem\n");
return false;
}
memset(&desired, 0, sizeof(desired));
if (!sc->sn.speed)
{
if (snd_khz.value >= 45)
sc->sn.speed = 48000;
else if (snd_khz.value >= 30) //set by a slider
sc->sn.speed = 44100;
else if (snd_khz.value >= 20)
sc->sn.speed = 22050;
else
sc->sn.speed = 11025;
}
desired.freq = sc->sn.speed;
desired.channels = 2;
desired.samples = SOUND_BUFFER_SIZE;
desired.format = AUDIO_S16;
desired.callback = SNDDMA_Paint;
desired.userdata = sc;
if ( SDL_OpenAudio(&desired, &obtained) < 0 )
{
Con_Printf("SDL: SNDDMA_Init: couldn't open sound device (%s).\n", SDL_GetError());
return false;
}
sc->sn.numchannels = obtained.channels;
sc->sn.speed = desired.freq;
sc->sn.samplebits = 16;
sc->sn.samples = SOUND_BUFFER_SIZE;
sc->sn.buffer = buffer;
Con_Printf("Got sound %i-%i\n", obtained.freq, obtained.format);
snd_inited = true;
SDL_PauseAudio(0);
return true;
}
void SNDDMA_SetUnderWater(qboolean underwater)
{
}