From 4b95b79f27cda2560f014f7b15e81f7dcb71e461 Mon Sep 17 00:00:00 2001 From: Jacques Heunis Date: Sat, 4 Jun 2016 14:38:11 +0200 Subject: [PATCH] WASAPI: Correctly handle no input or output devices instead of crashing. --- src/wasapi.c | 60 +++++++++++++++++++++++++++++----------------------- src/wasapi.h | 2 ++ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/wasapi.c b/src/wasapi.c index 8cff4bf..a120aa9 100644 --- a/src/wasapi.c +++ b/src/wasapi.c @@ -666,40 +666,48 @@ static int refresh_devices(struct SoundIoPrivate *si) { if (FAILED(hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(siw->device_enumerator, eRender, eMultimedia, &rd.default_render_device))) { - deinit_refresh_devices(&rd); - return SoundIoErrorOpeningDevice; + if(hr != E_NOTFOUND) { + deinit_refresh_devices(&rd); + return SoundIoErrorOpeningDevice; + } } - if (rd.lpwstr) { - CoTaskMemFree(rd.lpwstr); - rd.lpwstr = NULL; - } - if (FAILED(hr = IMMDevice_GetId(rd.default_render_device, &rd.lpwstr))) { - deinit_refresh_devices(&rd); - return SoundIoErrorOpeningDevice; - } - if ((err = from_lpwstr(rd.lpwstr, &rd.default_render_id, &rd.default_render_id_len))) { - deinit_refresh_devices(&rd); - return err; + if(rd.default_render_device) { + if (rd.lpwstr) { + CoTaskMemFree(rd.lpwstr); + rd.lpwstr = NULL; + } + if (FAILED(hr = IMMDevice_GetId(rd.default_render_device, &rd.lpwstr))) { + deinit_refresh_devices(&rd); + return SoundIoErrorOpeningDevice; + } + if ((err = from_lpwstr(rd.lpwstr, &rd.default_render_id, &rd.default_render_id_len))) { + deinit_refresh_devices(&rd); + return err; + } } if (FAILED(hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(siw->device_enumerator, eCapture, eMultimedia, &rd.default_capture_device))) { - deinit_refresh_devices(&rd); - return SoundIoErrorOpeningDevice; + if(hr != E_NOTFOUND) { + deinit_refresh_devices(&rd); + return SoundIoErrorOpeningDevice; + } } - if (rd.lpwstr) { - CoTaskMemFree(rd.lpwstr); - rd.lpwstr = NULL; - } - if (FAILED(hr = IMMDevice_GetId(rd.default_capture_device, &rd.lpwstr))) { - deinit_refresh_devices(&rd); - return SoundIoErrorOpeningDevice; - } - if ((err = from_lpwstr(rd.lpwstr, &rd.default_capture_id, &rd.default_capture_id_len))) { - deinit_refresh_devices(&rd); - return err; + if(rd.default_capture_device) { + if (rd.lpwstr) { + CoTaskMemFree(rd.lpwstr); + rd.lpwstr = NULL; + } + if (FAILED(hr = IMMDevice_GetId(rd.default_capture_device, &rd.lpwstr))) { + deinit_refresh_devices(&rd); + return SoundIoErrorOpeningDevice; + } + if ((err = from_lpwstr(rd.lpwstr, &rd.default_capture_id, &rd.default_capture_id_len))) { + deinit_refresh_devices(&rd); + return err; + } } diff --git a/src/wasapi.h b/src/wasapi.h index 5860f86..968c401 100644 --- a/src/wasapi.h +++ b/src/wasapi.h @@ -24,6 +24,8 @@ #include #include +#define E_NOTFOUND 0x80070490 + struct SoundIoPrivate; int soundio_wasapi_init(struct SoundIoPrivate *si);