Commit 2b167eb1 authored by David Reid's avatar David Reid

audioio: Fix unnecessarily inefficient device enumeration.

parent af3f01ca
...@@ -15398,7 +15398,7 @@ mal_result mal_context_enumerate_devices__sndio(mal_context* pContext, mal_enum_ ...@@ -15398,7 +15398,7 @@ mal_result mal_context_enumerate_devices__sndio(mal_context* pContext, mal_enum_
mal_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10); mal_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10);
struct stat st; struct stat st;
if (stat(devpath, &st) != 0) { if (stat(devpath, &st) < 0) {
break; break;
} }
...@@ -16095,46 +16095,48 @@ mal_result mal_context_enumerate_devices__audioio(mal_context* pContext, mal_enu ...@@ -16095,46 +16095,48 @@ mal_result mal_context_enumerate_devices__audioio(mal_context* pContext, mal_enu
mal_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10); mal_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10);
struct stat st; struct stat st;
if (stat(devpath, &st) == 0) { if (stat(devpath, &st) < 0) {
// The device exists, but we need to check if it's usable as playback and/or capture. break;
int fd; }
mal_bool32 isTerminating = MAL_FALSE;
// The device exists, but we need to check if it's usable as playback and/or capture.
// Playback. int fd;
if (!isTerminating) { mal_bool32 isTerminating = MAL_FALSE;
fd = open(devpath, O_RDONLY, 0);
if (fd >= 0) { // Playback.
// Supports playback. if (!isTerminating) {
mal_device_info deviceInfo; fd = open(devpath, O_RDONLY, 0);
mal_zero_object(&deviceInfo); if (fd >= 0) {
mal_construct_device_id__audioio(deviceInfo.id.audioio, sizeof(deviceInfo.id.audioio), "/dev/audio", iDevice); // Supports playback.
if (mal_context_get_device_info_from_fd__audioio(pContext, mal_device_type_playback, fd, &deviceInfo) == MAL_SUCCESS) { mal_device_info deviceInfo;
isTerminating = !callback(pContext, mal_device_type_playback, &deviceInfo, pUserData); mal_zero_object(&deviceInfo);
} mal_construct_device_id__audioio(deviceInfo.id.audioio, sizeof(deviceInfo.id.audioio), "/dev/audio", iDevice);
if (mal_context_get_device_info_from_fd__audioio(pContext, mal_device_type_playback, fd, &deviceInfo) == MAL_SUCCESS) {
close(fd); isTerminating = !callback(pContext, mal_device_type_playback, &deviceInfo, pUserData);
} }
close(fd);
} }
}
// Capture.
if (!isTerminating) { // Capture.
fd = open(devpath, O_WRONLY, 0); if (!isTerminating) {
if (fd >= 0) { fd = open(devpath, O_WRONLY, 0);
// Supports capture. if (fd >= 0) {
mal_device_info deviceInfo; // Supports capture.
mal_zero_object(&deviceInfo); mal_device_info deviceInfo;
mal_construct_device_id__audioio(deviceInfo.id.audioio, sizeof(deviceInfo.id.audioio), "/dev/audio", iDevice); mal_zero_object(&deviceInfo);
if (mal_context_get_device_info_from_fd__audioio(pContext, mal_device_type_capture, fd, &deviceInfo) == MAL_SUCCESS) { mal_construct_device_id__audioio(deviceInfo.id.audioio, sizeof(deviceInfo.id.audioio), "/dev/audio", iDevice);
isTerminating = !callback(pContext, mal_device_type_capture, &deviceInfo, pUserData); if (mal_context_get_device_info_from_fd__audioio(pContext, mal_device_type_capture, fd, &deviceInfo) == MAL_SUCCESS) {
} isTerminating = !callback(pContext, mal_device_type_capture, &deviceInfo, pUserData);
close(fd);
} }
close(fd);
} }
}
if (isTerminating) {
break; if (isTerminating) {
} break;
} }
} }
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