# HG changeset patch # User Sam Lantinga # Date 1147164774 0 # Node ID 5605a98201341a374371e3c8ec8cc6d89824e72c # Parent 4d66375c2012a0aab0761b967dd332daa7366d41 Fixed bug #137 If SDL_OpenAudio() is passed zero for the desired format fields, the following environment variables will be used to fill them in: SDL_AUDIO_FREQUENCY SDL_AUDIO_FORMAT SDL_AUDIO_CHANNELS SDL_AUDIO_SAMPLES If an environment variable is not specified, it will be set to a reasonable default value. diff -r 4d66375c2012 -r 5605a9820134 WhatsNew --- a/WhatsNew Tue May 09 07:52:04 2006 +0000 +++ b/WhatsNew Tue May 09 08:52:54 2006 +0000 @@ -4,6 +4,16 @@ Version 1.0: 1.2.10: + If SDL_OpenAudio() is passed zero for the desired format + fields, the following environment variables will be used + to fill them in: + SDL_AUDIO_FREQUENCY + SDL_AUDIO_FORMAT + SDL_AUDIO_CHANNELS + SDL_AUDIO_SAMPLES + If an environment variable is not specified, it will be set + to a reasonable default value. + Added support for the SDL_VIDEO_FULLSCREEN_HEAD environment variable, currently supported on X11 Xinerama configurations. diff -r 4d66375c2012 -r 5605a9820134 src/audio/SDL_audio.c --- a/src/audio/SDL_audio.c Tue May 09 07:52:04 2006 +0000 +++ b/src/audio/SDL_audio.c Tue May 09 08:52:54 2006 +0000 @@ -285,6 +285,51 @@ SDL_mutexV(audio->mixer_lock); } +static Uint16 SDL_ParseAudioFormat(const char *string) +{ + Uint16 format = 0; + + switch (*string) { + case 'U': + ++string; + format |= 0x0000; + break; + case 'S': + ++string; + format |= 0x8000; + break; + default: + return 0; + } + switch (SDL_atoi(string)) { + case 8: + string += 1; + format |= 8; + break; + case 16: + string += 2; + format |= 16; + if ( SDL_strcmp(string, "LSB") == 0 +#if SDL_BYTEORDER == SDL_LIL_ENDIAN + || SDL_strcmp(string, "SYS") == 0 +#endif + ) { + format |= 0x0000; + } + if ( SDL_strcmp(string, "MSB") == 0 +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + || SDL_strcmp(string, "SYS") == 0 +#endif + ) { + format |= 0x1000; + } + break; + default: + return 0; + } + return format; +} + int SDL_AudioInit(const char *driver_name) { SDL_AudioDevice *audio; @@ -386,6 +431,7 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) { SDL_AudioDevice *audio; + const char *env; /* Start up the audio driver, if necessary */ if ( ! current_audio ) { @@ -402,9 +448,35 @@ } /* Verify some parameters */ - if ( desired->callback == NULL ) { - SDL_SetError("SDL_OpenAudio() passed a NULL callback"); - return(-1); + if ( desired->freq == 0 ) { + env = SDL_getenv("SDL_AUDIO_FREQUENCY"); + if ( env ) { + desired->freq = SDL_atoi(env); + } + } + if ( desired->freq == 0 ) { + /* Pick some default audio frequency */ + desired->freq = 22050; + } + if ( desired->format == 0 ) { + env = SDL_getenv("SDL_AUDIO_FORMAT"); + if ( env ) { + desired->format = SDL_ParseAudioFormat(env); + } + } + if ( desired->format == 0 ) { + /* Pick some default audio format */ + desired->format = AUDIO_S16; + } + if ( desired->channels == 0 ) { + env = SDL_getenv("SDL_AUDIO_CHANNELS"); + if ( env ) { + desired->channels = SDL_atoi(env); + } + } + if ( desired->channels == 0 ) { + /* Pick a default number of channels */ + desired->channels = 2; } switch ( desired->channels ) { case 1: /* Mono */ @@ -416,6 +488,25 @@ SDL_SetError("1 (mono) and 2 (stereo) channels supported"); return(-1); } + if ( desired->samples == 0 ) { + env = SDL_getenv("SDL_AUDIO_SAMPLES"); + if ( env ) { + desired->samples = SDL_atoi(env); + } + } + if ( desired->samples == 0 ) { + /* Pick a default of ~46 ms at desired frequency */ + int samples = (desired->freq / 1000) * 46; + int power2 = 1; + while ( power2 < samples ) { + power2 *= 2; + } + desired->samples = power2; + } + if ( desired->callback == NULL ) { + SDL_SetError("SDL_OpenAudio() passed a NULL callback"); + return(-1); + } #if defined(__MACOS__) || (defined(__RISCOS__) && SDL_THREADS_DISABLED) /* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */