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.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401753
This commit is contained in:
Sam Lantinga 2006-05-09 08:52:54 +00:00
parent 782736f3f9
commit 3761c04c87
2 changed files with 104 additions and 3 deletions

View File

@ -4,6 +4,16 @@ This is a list of API changes in SDL's version history.
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.

View File

@ -285,6 +285,51 @@ static void SDL_UnlockAudio_Default(SDL_AudioDevice *audio)
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 @@ char *SDL_AudioDriverName(char *namebuf, int maxlen)
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 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
}
/* 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 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
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() */