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. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401753
This commit is contained in:
parent
782736f3f9
commit
3761c04c87
2 changed files with 104 additions and 3 deletions
10
WhatsNew
10
WhatsNew
|
@ -4,6 +4,16 @@ This is a list of API changes in SDL's version history.
|
||||||
Version 1.0:
|
Version 1.0:
|
||||||
|
|
||||||
1.2.10:
|
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
|
Added support for the SDL_VIDEO_FULLSCREEN_HEAD environment
|
||||||
variable, currently supported on X11 Xinerama configurations.
|
variable, currently supported on X11 Xinerama configurations.
|
||||||
|
|
||||||
|
|
|
@ -285,6 +285,51 @@ static void SDL_UnlockAudio_Default(SDL_AudioDevice *audio)
|
||||||
SDL_mutexV(audio->mixer_lock);
|
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)
|
int SDL_AudioInit(const char *driver_name)
|
||||||
{
|
{
|
||||||
SDL_AudioDevice *audio;
|
SDL_AudioDevice *audio;
|
||||||
|
@ -386,6 +431,7 @@ char *SDL_AudioDriverName(char *namebuf, int maxlen)
|
||||||
int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
{
|
{
|
||||||
SDL_AudioDevice *audio;
|
SDL_AudioDevice *audio;
|
||||||
|
const char *env;
|
||||||
|
|
||||||
/* Start up the audio driver, if necessary */
|
/* Start up the audio driver, if necessary */
|
||||||
if ( ! current_audio ) {
|
if ( ! current_audio ) {
|
||||||
|
@ -402,9 +448,35 @@ int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify some parameters */
|
/* Verify some parameters */
|
||||||
if ( desired->callback == NULL ) {
|
if ( desired->freq == 0 ) {
|
||||||
SDL_SetError("SDL_OpenAudio() passed a NULL callback");
|
env = SDL_getenv("SDL_AUDIO_FREQUENCY");
|
||||||
return(-1);
|
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 ) {
|
switch ( desired->channels ) {
|
||||||
case 1: /* Mono */
|
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");
|
SDL_SetError("1 (mono) and 2 (stereo) channels supported");
|
||||||
return(-1);
|
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)
|
#if defined(__MACOS__) || (defined(__RISCOS__) && SDL_THREADS_DISABLED)
|
||||||
/* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */
|
/* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue