# HG changeset patch # User Sam Lantinga # Date 1253520180 0 # Node ID 3ce5bfddbaf6b99d247b6ceea5f1563f924c6aa2 # Parent 8f501bbc3bf1c9adea5fcfe71a0d4243bc699078 Fixed bug #572 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. diff -r 8f501bbc3bf1 -r 3ce5bfddbaf6 src/audio/pulse/SDL_pulseaudio.c --- a/src/audio/pulse/SDL_pulseaudio.c Mon Sep 21 07:59:44 2009 +0000 +++ b/src/audio/pulse/SDL_pulseaudio.c Mon Sep 21 08:03:00 2009 +0000 @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset: 8; indent-tabs-mode: t -*- */ /* SDL - Simple DirectMedia Layer Copyright (C) 1997-2009 Sam Lantinga @@ -18,7 +19,7 @@ Stéphan Kochen stephan@kochen.nl - + Based on parts of the ALSA and ESounD output drivers. */ #include "SDL_config.h" @@ -78,14 +79,14 @@ 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; @@ -158,16 +159,16 @@ 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 */ @@ -178,7 +179,7 @@ available = 1; SDL_NAME(pa_simple_free)(connection); } - + UnloadPulseLibrary(); return(available); } @@ -233,7 +234,7 @@ { /* 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 */ @@ -302,7 +303,7 @@ 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 ) { @@ -324,7 +325,7 @@ return(-1); } spec->format = test_format; - + paspec.channels = spec->channels; paspec.rate = spec->freq; @@ -338,25 +339,24 @@ 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 */ @@ -371,7 +371,6 @@ /* Get the parent process id (we're the parent of the audio thread) */ parent = getpid(); - + return(0); } -