fix devices race condition

This commit is contained in:
Andrew Kelley 2015-07-20 14:47:51 -07:00
parent 71a365ca1b
commit 20f3f76ef3

View file

@ -184,10 +184,11 @@ int soundio_connect_backend(SoundIo *soundio, SoundIoBackend backend) {
#endif #endif
case SoundIoBackendDummy: case SoundIoBackendDummy:
si->current_backend = SoundIoBackendDummy; si->current_backend = SoundIoBackendDummy;
err = soundio_dummy_init(si); if ((err = soundio_dummy_init(si))) {
if (err)
soundio_disconnect(soundio); soundio_disconnect(soundio);
return err; return err;
}
return 0;
case SoundIoBackendNone: case SoundIoBackendNone:
return SoundIoErrorInvalid; return SoundIoErrorInvalid;
} }
@ -229,35 +230,37 @@ void soundio_disconnect(struct SoundIo *soundio) {
void soundio_flush_events(struct SoundIo *soundio) { void soundio_flush_events(struct SoundIo *soundio) {
SoundIoPrivate *si = (SoundIoPrivate *)soundio; SoundIoPrivate *si = (SoundIoPrivate *)soundio;
assert(si->flush_events); si->flush_events(si);
if (si->flush_events)
si->flush_events(si);
} }
int soundio_get_input_device_count(struct SoundIo *soundio) { int soundio_get_input_device_count(struct SoundIo *soundio) {
SoundIoPrivate *si = (SoundIoPrivate *)soundio; SoundIoPrivate *si = (SoundIoPrivate *)soundio;
soundio_flush_events(soundio); if (!si->safe_devices_info)
soundio_flush_events(soundio);
assert(si->safe_devices_info); assert(si->safe_devices_info);
return si->safe_devices_info->input_devices.length; return si->safe_devices_info->input_devices.length;
} }
int soundio_get_output_device_count(struct SoundIo *soundio) { int soundio_get_output_device_count(struct SoundIo *soundio) {
SoundIoPrivate *si = (SoundIoPrivate *)soundio; SoundIoPrivate *si = (SoundIoPrivate *)soundio;
soundio_flush_events(soundio); if (!si->safe_devices_info)
soundio_flush_events(soundio);
assert(si->safe_devices_info); assert(si->safe_devices_info);
return si->safe_devices_info->output_devices.length; return si->safe_devices_info->output_devices.length;
} }
int soundio_get_default_input_device_index(struct SoundIo *soundio) { int soundio_get_default_input_device_index(struct SoundIo *soundio) {
SoundIoPrivate *si = (SoundIoPrivate *)soundio; SoundIoPrivate *si = (SoundIoPrivate *)soundio;
soundio_flush_events(soundio); if (!si->safe_devices_info)
soundio_flush_events(soundio);
assert(si->safe_devices_info); assert(si->safe_devices_info);
return si->safe_devices_info->default_input_index; return si->safe_devices_info->default_input_index;
} }
int soundio_get_default_output_device_index(struct SoundIo *soundio) { int soundio_get_default_output_device_index(struct SoundIo *soundio) {
SoundIoPrivate *si = (SoundIoPrivate *)soundio; SoundIoPrivate *si = (SoundIoPrivate *)soundio;
soundio_flush_events(soundio); if (!si->safe_devices_info)
soundio_flush_events(soundio);
assert(si->safe_devices_info); assert(si->safe_devices_info);
return si->safe_devices_info->default_output_index; return si->safe_devices_info->default_output_index;
} }