Skip to content

Commit

Permalink
Fixed bug #572
Browse files Browse the repository at this point in the history
Please merge this patch for the PA driver in SDL.

http://0pointer.de/public/sdl-pulse-rework.patch

This patch:
- fixes buffering (i.e. reduces number of "fragments" to 2, doesn't defer
filling up of the buffer until the entire buffer ran completely empty.)
- drops $PASERVER and $PADEVICE env var support, since this is a duplication of
$PULSE_SERVER and $PULSE_SINK which the PA libs honor anyway.

This fixes the sound issues in all games I tested.
  • Loading branch information
slouken committed Sep 21, 2009
1 parent b4c9cdc commit 008fd30
Showing 1 changed file with 20 additions and 21 deletions.
41 changes: 20 additions & 21 deletions src/audio/pulse/SDL_pulseaudio.c
@@ -1,3 +1,4 @@
/* -*- Mode: C; c-basic-offset: 8; indent-tabs-mode: t -*- */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
Expand All @@ -18,7 +19,7 @@
Stéphan Kochen
stephan@kochen.nl
Based on parts of the ALSA and ESounD output drivers.
*/
#include "SDL_config.h"
Expand Down Expand Up @@ -78,14 +79,14 @@ static int (*SDL_NAME(pa_simple_write))(
pa_simple *s,
const void *data,
size_t length,
int *error
int *error
);
static pa_channel_map* (*SDL_NAME(pa_channel_map_init_auto))(
pa_channel_map *m,
unsigned channels,
pa_channel_map_def_t def
);


static struct {
const char *name;
Expand Down Expand Up @@ -158,16 +159,16 @@ static int Audio_Available(void)
if ( LoadPulseLibrary() < 0 ) {
return available;
}

/* Connect with a dummy format. */
paspec.format = PA_SAMPLE_U8;
paspec.rate = 11025;
paspec.channels = 1;
connection = SDL_NAME(pa_simple_new)(
SDL_getenv("PASERVER"), /* server */
NULL, /* server */
"Test stream", /* application name */
PA_STREAM_PLAYBACK, /* playback mode */
SDL_getenv("PADEVICE"), /* device on the server */
NULL, /* device on the server */
"Simple DirectMedia Layer", /* stream description */
&paspec, /* sample format spec */
NULL, /* channel map */
Expand All @@ -178,7 +179,7 @@ static int Audio_Available(void)
available = 1;
SDL_NAME(pa_simple_free)(connection);
}

UnloadPulseLibrary();
return(available);
}
Expand Down Expand Up @@ -233,7 +234,7 @@ static void PULSE_WaitAudio(_THIS)
{
/* Check to see if the thread-parent process is still alive */
{ static int cnt = 0;
/* Note that this only works with thread implementations
/* Note that this only works with thread implementations
that use a different process id for each thread.
*/
if (parent && (((++cnt)%10) == 0)) { /* Check every 10 loops */
Expand Down Expand Up @@ -302,7 +303,7 @@ static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec)
pa_sample_spec paspec;
pa_buffer_attr paattr;
pa_channel_map pacmap;

paspec.format = PA_SAMPLE_INVALID;
for ( test_format = SDL_FirstAudioFormat(spec->format); test_format; ) {
switch ( test_format ) {
Expand All @@ -324,7 +325,7 @@ static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec)
return(-1);
}
spec->format = test_format;

paspec.channels = spec->channels;
paspec.rate = spec->freq;

Expand All @@ -338,25 +339,24 @@ static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec)
return(-1);
}
SDL_memset(mixbuf, spec->silence, spec->size);

/* Reduced prebuffering compared to the defaults. */
paattr.tlength = mixlen;
paattr.tlength = mixlen*2;
paattr.minreq = mixlen;
paattr.fragsize = mixlen;
paattr.prebuf = mixlen;
paattr.maxlength = mixlen * 4;

paattr.prebuf = mixlen*2;
paattr.maxlength = mixlen*2;

/* The SDL ALSA output hints us that we use Windows' channel mapping */
/* http://bugzilla.libsdl.org/show_bug.cgi?id=110 */
SDL_NAME(pa_channel_map_init_auto)(
&pacmap, spec->channels, PA_CHANNEL_MAP_WAVEEX);

/* Connect to the PulseAudio server */
stream = SDL_NAME(pa_simple_new)(
SDL_getenv("PASERVER"), /* server */
NULL, /* server */
get_progname(), /* application name */
PA_STREAM_PLAYBACK, /* playback mode */
SDL_getenv("PADEVICE"), /* device on the server */
NULL, /* device on the server */
"Simple DirectMedia Layer", /* stream description */
&paspec, /* sample format spec */
&pacmap, /* channel map */
Expand All @@ -371,7 +371,6 @@ static int PULSE_OpenAudio(_THIS, SDL_AudioSpec *spec)

/* Get the parent process id (we're the parent of the audio thread) */
parent = getpid();

return(0);
}

0 comments on commit 008fd30

Please sign in to comment.