#include <math.h>
#include <SDL.h>
-#include "quakedef.h"
+#include "darkplaces.h"
+#include "vid.h"
#include "snd_main.h"
factor = snd_renderbuffer->format.channels * snd_renderbuffer->format.width;
if ((unsigned int)len % factor != 0)
- Sys_Error("SDL sound: invalid buffer length passed to Buffer_Callback (%d bytes)\n", len);
+ Sys_Abort("SDL sound: invalid buffer length passed to Buffer_Callback (%d bytes)\n", len);
RequestedFrames = (unsigned int)len / factor;
PartialLength2 = FrameCount * factor - PartialLength1;
memcpy(&stream[PartialLength1], &snd_renderbuffer->ring[0], PartialLength2);
+
+ // As of SDL 2.0 buffer needs to be fully initialized, so fill leftover part with silence
+ // FIXME this is another place that assumes 8bit is always unsigned and others always signed
+ memset(&stream[PartialLength1 + PartialLength2], snd_renderbuffer->format.width == 1 ? 0x80 : 0, len - (PartialLength1 + PartialLength2));
}
else
+ {
memcpy(stream, &snd_renderbuffer->ring[StartOffset * factor], FrameCount * factor);
+ // As of SDL 2.0 buffer needs to be fully initialized, so fill leftover part with silence
+ // FIXME this is another place that assumes 8bit is always unsigned and others always signed
+ memset(&stream[FrameCount * factor], snd_renderbuffer->format.width == 1 ? 0x80 : 0, len - (FrameCount * factor));
+ }
+
snd_renderbuffer->startframe += FrameCount;
if (FrameCount < RequestedFrames && developer_insane.integer && vid_activewindow)
May return a suggested format if the requested format isn't available
====================
*/
-qboolean SndSys_Init (snd_format_t* fmt)
+qbool SndSys_Init (snd_format_t* fmt)
{
unsigned int buffersize;
SDL_AudioSpec wantspec;
wantspec.samples = CeilPowerOf2(buffersize); // needs to be a power of 2 on some platforms.
Con_Printf("Wanted audio Specification:\n"
- "\tChannels : %i\n"
- "\tFormat : 0x%X\n"
- "\tFrequency : %i\n"
- "\tSamples : %i\n",
+ " Channels : %i\n"
+ " Format : 0x%X\n"
+ " Frequency : %i\n"
+ " Samples : %i\n",
wantspec.channels, wantspec.format, wantspec.freq, wantspec.samples);
if ((audio_device = SDL_OpenAudioDevice(NULL, 0, &wantspec, &obtainspec, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE)) == 0)
{
- Con_Printf( "Failed to open the audio device! (%s)\n", SDL_GetError() );
+ Con_Printf(CON_ERROR "Failed to open the audio device! (%s)\n", SDL_GetError() );
return false;
}
Con_Printf("Obtained audio specification:\n"
- "\tChannels : %i\n"
- "\tFormat : 0x%X\n"
- "\tFrequency : %i\n"
- "\tSamples : %i\n",
+ " Channels : %i\n"
+ " Format : 0x%X\n"
+ " Frequency : %i\n"
+ " Samples : %i\n",
obtainspec.channels, obtainspec.format, obtainspec.freq, obtainspec.samples);
fmt->speed = obtainspec.freq;
Get the exclusive lock on "snd_renderbuffer"
====================
*/
-qboolean SndSys_LockRenderBuffer (void)
+qbool SndSys_LockRenderBuffer (void)
{
SDL_LockAudioDevice(audio_device);
return true;