Commit 3f722efa authored by Sam Lantinga's avatar Sam Lantinga

Fixed audio format selection for OpenBSD (thanks Peter!)

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40132
parent 6bb44f76
...@@ -312,8 +312,7 @@ static int ...@@ -312,8 +312,7 @@ static int
OBSD_OpenAudio(_THIS, SDL_AudioSpec *spec) OBSD_OpenAudio(_THIS, SDL_AudioSpec *spec)
{ {
char audiodev[64]; char audiodev[64];
Uint16 setenc; Uint16 format;
audio_encoding_t enc;
audio_info_t info; audio_info_t info;
AUDIO_INITINFO(&info); AUDIO_INITINFO(&info);
...@@ -340,66 +339,58 @@ OBSD_OpenAudio(_THIS, SDL_AudioSpec *spec) ...@@ -340,66 +339,58 @@ OBSD_OpenAudio(_THIS, SDL_AudioSpec *spec)
} }
mixbuf = NULL; mixbuf = NULL;
setenc = 0; AUDIO_INITINFO(&info);
for (format = SDL_FirstAudioFormat(spec->format);
for(enc.index = 0; (ioctl(audio_fd, AUDIO_GETENC, &enc)>=0) format; format = SDL_NextAudioFormat())
&& (enc.encoding != setenc); enc.index++)
{ {
switch(spec->format) switch(format) {
{ case AUDIO_U8:
case AUDIO_U8: /* 8-bit unsigned linear */ info.play.encoding = AUDIO_ENCODING_ULINEAR;
setenc = AUDIO_ENCODING_PCM8; info.play.precision = 8;
break; break;
case AUDIO_S8: /* 8-bit signed linear */ case AUDIO_S8:
setenc = AUDIO_ENCODING_SLINEAR; info.play.encoding = AUDIO_ENCODING_SLINEAR;
break; info.play.precision = 8;
case AUDIO_U16LSB: /* 16-bit unsigned linear, LSB */ break;
setenc = AUDIO_ENCODING_ULINEAR_LE; case AUDIO_S16LSB:
break; info.play.encoding = AUDIO_ENCODING_SLINEAR_LE;
case AUDIO_U16MSB: /* 16-bit unsigned linear, MSB */ info.play.precision = 16;
setenc = AUDIO_ENCODING_ULINEAR_BE; break;
break; case AUDIO_S16MSB:
case AUDIO_S16LSB: /* 16-bit signed linear, LSB */ info.play.encoding = AUDIO_ENCODING_SLINEAR_BE;
setenc = AUDIO_ENCODING_SLINEAR_LE; info.play.precision = 16;
break; break;
case AUDIO_S16MSB: /* 16-bit signed linear, MSB */ case AUDIO_U16LSB:
setenc = AUDIO_ENCODING_SLINEAR_BE; info.play.encoding = AUDIO_ENCODING_ULINEAR_LE;
break; info.play.precision = 16;
break;
case AUDIO_U16MSB:
info.play.encoding = AUDIO_ENCODING_ULINEAR_BE;
info.play.precision = 16;
break;
default:
continue;
} }
#ifdef DEBUG_AUDIO if (ioctl(audio_fd, AUDIO_SETINFO, &info) == 0)
fprintf(stderr,"encoding #%i: \"%s\" %i-bit (0x%x) flags=%i...\n", break;
enc.index, enc.name, enc.precision, enc.encoding, enc.flags);
#endif
} }
if(!setenc) { if(!format) {
SDL_SetError("No supported encoding for 0x%x", spec->format); SDL_SetError("No supported encoding for 0x%x", spec->format);
return(-1); return(-1);
} }
/* Set audio encoding */ spec->format = format;
info.play.encoding = enc.encoding;
info.play.precision = enc.precision;
if((ioctl(audio_fd, AUDIO_SETINFO, &info) < 0)) {
SDL_SetError("Couldn't set encoding to 0x%x %i-bit",
enc.encoding, enc.precision);
return(-1);
}
/* Set audio channels */ AUDIO_INITINFO(&info);
info.play.channels = spec->channels; info.play.channels = spec->channels;
if(ioctl(audio_fd, AUDIO_SETINFO, &info) < 0) { if (ioctl(audio_fd, AUDIO_SETINFO, &info) == -1)
info.play.channels = (spec->channels > 1); spec->channels = 1;
ioctl(audio_fd, AUDIO_SETINFO, &info); AUDIO_INITINFO(&info);
}
/* Set the sample rate */
info.play.sample_rate = spec->freq; info.play.sample_rate = spec->freq;
if(ioctl(audio_fd, AUDIO_SETINFO, &info) < 0) { (void)ioctl(audio_fd, AUDIO_SETINFO, &info);
SDL_SetError("Couldn't set sample rate to %i Hz", spec->freq); (void)ioctl(audio_fd, AUDIO_GETINFO, &info);
return(-1); spec->freq = info.play.sample_rate;
}
/* Allocate mixing buffer */ /* Allocate mixing buffer */
mixlen = spec->size; mixlen = spec->size;
mixbuf = (Uint8*)SDL_AllocAudioMem(mixlen); mixbuf = (Uint8*)SDL_AllocAudioMem(mixlen);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment