diff -r 5b7e1fc67f6a src/audio/netbsd/SDL_netbsdaudio.c --- a/src/audio/netbsd/SDL_netbsdaudio.c Tue Apr 07 23:34:41 2020 -0400 +++ b/src/audio/netbsd/SDL_netbsdaudio.c Wed Apr 08 15:17:33 2020 +0100 @@ -205,7 +205,7 @@ NETBSDAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture) { SDL_AudioFormat format = 0; - audio_info_t info; + audio_info_t info, hwinfo; struct audio_prinfo *prinfo = iscapture ? &info.record : &info.play; /* We don't care what the devname is...we'll try to open anything. */ @@ -232,8 +232,16 @@ } AUDIO_INITINFO(&info); + AUDIO_INITINFO(&hwinfo); + + if (ioctl(this->hidden->audio_fd, AUDIO_GETFORMAT, &hwinfo) == -1) { + return SDL_SetError("Couldn't get format for %s: %s", devname, strerror(errno)); + } prinfo->encoding = AUDIO_ENCODING_NONE; + prinfo->channels = this->spec.channels; + prinfo->sample_rate = this->spec.freq = iscapture ? + hwinfo.record.sample_rate : hwinfo.play.sample_rate; for (format = SDL_FirstAudioFormat(this->spec.format); format;) { switch (format) { @@ -282,21 +290,19 @@ this->spec.format = format; - /* Calculate spec parameters based on our chosen format */ - SDL_CalculateAudioSpec(&this->spec); - info.mode = iscapture ? AUMODE_RECORD : AUMODE_PLAY; info.blocksize = this->spec.size; info.hiwat = 5; info.lowat = 3; - prinfo->sample_rate = this->spec.freq; - prinfo->channels = this->spec.channels; (void) ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info); (void) ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info); this->spec.freq = prinfo->sample_rate; this->spec.channels = prinfo->channels; + /* Calculate spec parameters based on our chosen format */ + SDL_CalculateAudioSpec(&this->spec); + if (!iscapture) { /* Allocate mixing buffer */ this->hidden->mixlen = this->spec.size;