WASAPI: shared mode devices support any sample rate

This commit is contained in:
Andrew Kelley 2015-08-12 18:57:34 -07:00
parent c420bf9e71
commit ba65bdb131
6 changed files with 13 additions and 9 deletions

View file

@ -29,7 +29,7 @@ behavior on every platform.
* Supports optimal usage of each supported backend. The same API does the * Supports optimal usage of each supported backend. The same API does the
right thing whether the backend has a fixed buffer size, such as on JACK and right thing whether the backend has a fixed buffer size, such as on JACK and
CoreAudio, or whether it allows directly managing the buffer, such as on CoreAudio, or whether it allows directly managing the buffer, such as on
ALSA or PulseAudio. ALSA, PulseAudio, and WASAPI.
* C library. Depends only on the respective backend API libraries and libc. * C library. Depends only on the respective backend API libraries and libc.
Does *not* depend on libstdc++, and does *not* have exceptions, run-time type Does *not* depend on libstdc++, and does *not* have exceptions, run-time type
information, or [setjmp](http://latentcontent.net/2007/12/05/libpng-worst-api-ever/). information, or [setjmp](http://latentcontent.net/2007/12/05/libpng-worst-api-ever/).
@ -251,7 +251,6 @@ view `coverage/index.html` in a browser.
0. implement WASAPI (Windows) backend, get examples working 0. implement WASAPI (Windows) backend, get examples working
- list devices - list devices
- buffer duration
- raw mode - raw mode
- watching - watching
- sine wave - sine wave

View file

@ -358,6 +358,7 @@ struct SoundIoDevice {
// are used. You may check that the current backend is PulseAudio and // are used. You may check that the current backend is PulseAudio and
// ignore these min/max values. // ignore these min/max values.
// For JACK and CoreAudio, buffer duration and period duration are the same. // For JACK and CoreAudio, buffer duration and period duration are the same.
// For WASAPI, buffer duration is unknown.
double buffer_duration_min; double buffer_duration_min;
double buffer_duration_max; double buffer_duration_max;
double buffer_duration_current; double buffer_duration_current;

View file

@ -367,8 +367,8 @@ static void set_all_device_sample_rates(SoundIoDevice *device) {
SoundIoDevicePrivate *dev = (SoundIoDevicePrivate *)device; SoundIoDevicePrivate *dev = (SoundIoDevicePrivate *)device;
device->sample_rate_count = 1; device->sample_rate_count = 1;
device->sample_rates = &dev->prealloc_sample_rate_range; device->sample_rates = &dev->prealloc_sample_rate_range;
device->sample_rates[0].min = 8000; device->sample_rates[0].min = SOUNDIO_MIN_SAMPLE_RATE;
device->sample_rates[0].max = 5644800; device->sample_rates[0].max = SOUNDIO_MAX_SAMPLE_RATE;
} }
static int set_all_device_channel_layouts(SoundIoDevice *device) { static int set_all_device_channel_layouts(SoundIoDevice *device) {

View file

@ -296,8 +296,8 @@ static void sink_info_callback(pa_context *pulse_context, const pa_sink_info *in
// some reasonable min and max values. // some reasonable min and max values.
device->sample_rate_count = 1; device->sample_rate_count = 1;
device->sample_rates = &dev->prealloc_sample_rate_range; device->sample_rates = &dev->prealloc_sample_rate_range;
device->sample_rates[0].min = min(8000, device->sample_rate_current); device->sample_rates[0].min = min(SOUNDIO_MIN_SAMPLE_RATE, device->sample_rate_current);
device->sample_rates[0].max = max(5644800, device->sample_rate_current); device->sample_rates[0].max = max(SOUNDIO_MAX_SAMPLE_RATE, device->sample_rate_current);
device->current_format = from_pulseaudio_format(info->sample_spec); device->current_format = from_pulseaudio_format(info->sample_spec);
// PulseAudio performs sample format conversion, so any PulseAudio // PulseAudio performs sample format conversion, so any PulseAudio

View file

@ -169,5 +169,7 @@ struct SoundIoDevicePrivate {
void soundio_destroy_devices_info(struct SoundIoDevicesInfo *devices_info); void soundio_destroy_devices_info(struct SoundIoDevicesInfo *devices_info);
static const int SOUNDIO_MIN_SAMPLE_RATE = 8000;
static const int SOUNDIO_MAX_SAMPLE_RATE = 5644800;
#endif #endif

View file

@ -353,11 +353,13 @@ static int refresh_devices(SoundIoPrivate *si) {
deinit_refresh_devices(&rd); deinit_refresh_devices(&rd);
return SoundIoErrorOpeningDevice; return SoundIoErrorOpeningDevice;
} }
rd.device->sample_rate_current = rd.wave_format->Format.nSamplesPerSec;
// WASAPI performs resampling in shared mode, so any value is valid.
// Let's pick some reasonable min and max values.
rd.device->sample_rate_count = 1; rd.device->sample_rate_count = 1;
rd.device->sample_rates = &dev->prealloc_sample_rate_range; rd.device->sample_rates = &dev->prealloc_sample_rate_range;
rd.device->sample_rate_current = rd.wave_format->Format.nSamplesPerSec; rd.device->sample_rates[0].min = min(SOUNDIO_MIN_SAMPLE_RATE, rd.device->sample_rate_current);
rd.device->sample_rates[0].min = rd.device->sample_rate_current; rd.device->sample_rates[0].max = max(SOUNDIO_MAX_SAMPLE_RATE, rd.device->sample_rate_current);
rd.device->sample_rates[0].max = rd.device->sample_rate_current;
rd.device->current_format = from_wave_format_format(rd.wave_format); rd.device->current_format = from_wave_format_format(rd.wave_format);
rd.device->format_count = 1; rd.device->format_count = 1;