API CHANGE: Change return type of device enumeration callback.

The callback passed into `ma_context_enumerate_devices()` would
previously return a boolean, with true telling miniaudio to continue
enumeration, and false to abort. This got a bit confusing to read at
times, so I've decided to make this more explicit.

The new return type is an enum called `ma_device_enumeration_result`.
Instead of returning true to continue enumeration, the new return value
is `MA_DEVICE_ENUMERATION_CONTINUE`. Similarly, instead of returning
false to abort enumeration, `MA_DEVICE_ENUMERATION_ABORT` should be
returned instead.
This commit is contained in:
David Reid
2025-07-21 11:33:15 +10:00
parent 5d86a6ef82
commit 2b81f75cca
3 changed files with 106 additions and 138 deletions
@@ -363,7 +363,7 @@ static void ma_context_uninit__pipewire(ma_context* pContext)
ma_free(pContextStatePipeWire, ma_context_get_allocation_callbacks(pContext));
}
static ma_bool32 ma_context_enumerate_device_from_type__pipewire(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_type__pipewire(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_device_info deviceInfo;
@@ -396,7 +396,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__pipewire(ma_context* pCo
static ma_result ma_context_enumerate_devices__pipewire(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_context_state_pipewire* pContextStatePipeWire = ma_context_get_backend_state__pipewire(pContext);
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
MA_PIPEWIRE_ASSERT(pContextStatePipeWire != NULL);
MA_PIPEWIRE_ASSERT(callback != NULL);
@@ -404,12 +404,12 @@ static ma_result ma_context_enumerate_devices__pipewire(ma_context* pContext, ma
/* TODO: Proper device enumeration. */
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__pipewire(pContext, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__pipewire(pContext, ma_device_type_capture, callback, pUserData);
}
+5 -8
View File
@@ -292,14 +292,13 @@ static void ma_add_native_format_from_AudioSpec__sdl(ma_device_info* pDeviceInfo
static ma_result ma_context_enumerate_devices__sdl(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pCallbackUserData)
{
ma_context_state_sdl* pContextStateSDL = ma_context_get_backend_state__sdl(pContext);
ma_bool32 isTerminated = MA_FALSE;
ma_bool32 cbResult;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
int iDevice;
MA_SDL_ASSERT(pContextStateSDL != NULL);
/* Playback */
if (!isTerminated) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
int deviceCount = pContextStateSDL->SDL_GetNumAudioDevices(0);
for (iDevice = 0; iDevice < deviceCount; ++iDevice) {
ma_device_info deviceInfo;
@@ -324,15 +323,14 @@ static ma_result ma_context_enumerate_devices__sdl(ma_context* pContext, ma_enum
}
cbResult = callback(ma_device_type_playback, &deviceInfo, pCallbackUserData);
if (cbResult == MA_FALSE) {
isTerminated = MA_TRUE;
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
break;
}
}
}
/* Capture */
if (!isTerminated) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
int deviceCount = pContextStateSDL->SDL_GetNumAudioDevices(1);
for (iDevice = 0; iDevice < deviceCount; ++iDevice) {
ma_device_info deviceInfo;
@@ -357,8 +355,7 @@ static ma_result ma_context_enumerate_devices__sdl(ma_context* pContext, ma_enum
}
cbResult = callback(ma_device_type_capture, &deviceInfo, pCallbackUserData);
if (cbResult == MA_FALSE) {
isTerminated = MA_TRUE;
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
break;
}
}
+97 -126
View File
@@ -7553,6 +7553,13 @@ struct ma_device_config
};
typedef enum ma_device_enumeration_result
{
MA_DEVICE_ENUMERATION_ABORT = 0,
MA_DEVICE_ENUMERATION_CONTINUE = 1
} ma_device_enumeration_result;
/*
The callback for handling device enumeration. This is fired from `ma_context_enumerate_devices()`.
@@ -7569,8 +7576,13 @@ pInfo (in)
pUserData (in)
The user data pointer passed into `ma_context_enumerate_devices()`.
Return Value
------------
Implementations should return `MA_DEVICE_ENUMERATION_CONTINUE` to continue enumeration, or `MA_DEVICE_ENUMERATION_ABORT` to abort enumeration.
*/
typedef ma_bool32 (* ma_enum_devices_callback_proc)(ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData);
typedef ma_device_enumeration_result (* ma_enum_devices_callback_proc)(ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData);
/* TODO: THIS SECTION NEEDS TO BE UPDATED FOR THE NEW BACKEND SYSTEM. */
@@ -20732,7 +20744,7 @@ static void ma_context_uninit__null(ma_context* pContext)
ma_free(pContextStateNull, ma_context_get_allocation_callbacks(pContext));
}
static ma_bool32 ma_context_enumerate_device_from_type__null(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_type__null(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_device_info deviceInfo;
@@ -20766,7 +20778,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__null(ma_context* pContex
static ma_result ma_context_enumerate_devices__null(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_context_state_null* pContextStateNull = ma_context_get_backend_state__null(pContext);
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
MA_ASSERT(pContextStateNull != NULL);
MA_ASSERT(callback != NULL);
@@ -20774,12 +20786,12 @@ static ma_result ma_context_enumerate_devices__null(ma_context* pContext, ma_enu
(void)pContextStateNull;
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__null(pContext, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__null(pContext, ma_device_type_capture, callback, pUserData);
}
@@ -23014,8 +23026,8 @@ static ma_result ma_context_enumerate_devices_by_type__wasapi(ma_context* pConte
ma_IMMDevice_Release(pMMDevice);
if (result == MA_SUCCESS) {
ma_bool32 cbResult = callback(deviceType, &deviceInfo, pUserData);
if (cbResult == MA_FALSE) {
ma_device_enumeration_result cbResult = callback(deviceType, &deviceInfo, pUserData);
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
break;
}
}
@@ -23436,7 +23448,7 @@ static void ma_context_uninit__wasapi(ma_context* pContext)
}
#if defined(MA_WIN32_UWP)
static ma_bool32 ma_context_enumerate_device_from_type_UWP__wasapi(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_type_UWP__wasapi(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_device_info deviceInfo;
ma_IAudioClient* pAudioClient;
@@ -23493,17 +23505,19 @@ static ma_result ma_context_enumerate_devices__wasapi(ma_context* pContext, ma_e
Hint: DeviceInformation::FindAllAsync() with DeviceClass.AudioCapture/AudioRender. https://blogs.windows.com/buildingapps/2014/05/15/real-time-audio-in-windows-store-and-windows-phone-apps/
*/
if (callback) {
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type_UWP__wasapi(pContext, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type_UWP__wasapi(pContext, ma_device_type_capture, callback, pUserData);
}
(void)cbResult;
}
}
#endif
@@ -25870,7 +25884,7 @@ static BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(GUID* lpGuid,
/* Call the callback function, but make sure we stop enumerating if the callee requested so. */
MA_ASSERT(pData != NULL);
pData->terminated = (pData->callback(pData->deviceType, &deviceInfo, pData->pUserData) == MA_FALSE);
pData->terminated = (pData->callback(pData->deviceType, &deviceInfo, pData->pUserData) == MA_DEVICE_ENUMERATION_ABORT);
if (pData->terminated) {
return FALSE; /* Stop enumeration. */
} else {
@@ -25907,39 +25921,6 @@ static ma_result ma_context_enumerate_devices__dsound(ma_context* pContext, ma_e
}
typedef struct
{
const ma_device_id* pDeviceID;
ma_device_info* pDeviceInfo;
ma_bool32 found;
} ma_context_get_device_info_callback_data__dsound;
static BOOL CALLBACK ma_context_get_device_info_callback__dsound(GUID* lpGuid, const char* lpcstrDescription, const char* lpcstrModule, void* lpContext)
{
ma_context_get_device_info_callback_data__dsound* pData = (ma_context_get_device_info_callback_data__dsound*)lpContext;
MA_ASSERT(pData != NULL);
if ((pData->pDeviceID == NULL || ma_is_guid_null(pData->pDeviceID->dsound)) && (lpGuid == NULL || ma_is_guid_null(lpGuid))) {
/* Default device. */
ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1);
pData->pDeviceInfo->isDefault = MA_TRUE;
pData->found = MA_TRUE;
return FALSE; /* Stop enumeration. */
} else {
/* Not the default device. */
if (lpGuid != NULL && pData->pDeviceID != NULL) {
if (memcmp(pData->pDeviceID->dsound, lpGuid, sizeof(pData->pDeviceID->dsound)) == 0) {
ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1);
pData->found = MA_TRUE;
return FALSE; /* Stop enumeration. */
}
}
}
(void)lpcstrModule;
return TRUE;
}
static ma_result ma_config_to_WAVEFORMATEXTENSIBLE(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* pChannelMap, MA_WAVEFORMATEXTENSIBLE* pWF)
{
GUID subformat;
@@ -27430,8 +27411,8 @@ static ma_result ma_context_enumerate_devices__winmm(ma_context* pContext, ma_en
/* Name and Data Format. */
if (ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) {
ma_bool32 cbResult = callback(ma_device_type_playback, &deviceInfo, pUserData);
if (cbResult == MA_FALSE) {
ma_device_enumeration_result cbResult = callback(ma_device_type_playback, &deviceInfo, pUserData);
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
return MA_SUCCESS; /* Enumeration was stopped. */
}
}
@@ -27463,8 +27444,8 @@ static ma_result ma_context_enumerate_devices__winmm(ma_context* pContext, ma_en
/* Name and Data Format. */
if (ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) {
ma_bool32 cbResult = callback(ma_device_type_capture, &deviceInfo, pUserData);
if (cbResult == MA_FALSE) {
ma_device_enumeration_result cbResult = callback(ma_device_type_capture, &deviceInfo, pUserData);
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
return MA_SUCCESS; /* Enumeration was stopped. */
}
}
@@ -29232,7 +29213,7 @@ static ma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enu
{
ma_context_state_alsa* pContextStateALSA = ma_context_get_backend_state__alsa(pContext);
int resultALSA;
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
char** ppDeviceHints;
ma_device_id* pUniqueIDs = NULL;
ma_uint32 uniqueIDCount = 0;
@@ -29484,7 +29465,7 @@ static ma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enu
again for the other device type in this case. We do this for known devices and where the IOID hint is NULL, which
means both Input and Output.
*/
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
if (ma_is_common_device_name__alsa(NAME) || IOID == NULL) {
if (deviceType == ma_device_type_playback) {
if (!ma_is_capture_device_blacklisted__alsa(NAME)) {
@@ -29498,7 +29479,7 @@ static ma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enu
}
}
if (cbResult == MA_FALSE) {
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
stopEnumeration = MA_TRUE;
}
@@ -31943,7 +31924,7 @@ static void ma_context_enumerate_devices_sink_callback__pulseaudio(ma_pa_context
deviceInfo.nativeDataFormats[0].flags = 0;
deviceInfo.nativeDataFormatCount = 1;
pData->isTerminated = !pData->callback(ma_device_type_playback, &deviceInfo, pData->pUserData);
pData->isTerminated = (pData->callback(ma_device_type_playback, &deviceInfo, pData->pUserData) == MA_DEVICE_ENUMERATION_ABORT);
(void)pPulseContext; /* Unused. */
}
@@ -31983,7 +31964,7 @@ static void ma_context_enumerate_devices_source_callback__pulseaudio(ma_pa_conte
deviceInfo.nativeDataFormats[0].flags = 0;
deviceInfo.nativeDataFormatCount = 1;
pData->isTerminated = !pData->callback(ma_device_type_capture, &deviceInfo, pData->pUserData);
pData->isTerminated = (pData->callback(ma_device_type_capture, &deviceInfo, pData->pUserData) == MA_DEVICE_ENUMERATION_ABORT);
(void)pPulseContext; /* Unused. */
}
@@ -33205,7 +33186,7 @@ static void ma_context_uninit__jack(ma_context* pContext)
ma_free(pContextStateJACK, ma_context_get_allocation_callbacks(pContext));
}
static ma_bool32 ma_context_enumerate_device_from_client__jack(ma_context* pContext, ma_jack_client_t* pClient, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_client__jack(ma_context* pContext, ma_jack_client_t* pClient, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_context_state_jack* pContextStateJACK = ma_context_get_backend_state__jack(pContext);
ma_device_info deviceInfo;
@@ -33239,7 +33220,7 @@ static ma_result ma_context_enumerate_devices__jack(ma_context* pContext, ma_enu
ma_context_state_jack* pContextStateJACK = ma_context_get_backend_state__jack(pContext);
ma_jack_client_t* pClient;
ma_result result;
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
MA_ASSERT(callback != NULL);
(void)pContext;
@@ -33252,12 +33233,12 @@ static ma_result ma_context_enumerate_devices__jack(ma_context* pContext, ma_enu
}
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_client__jack(pContext, pClient, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_client__jack(pContext, pClient, ma_device_type_capture, callback, pUserData);
}
@@ -35452,7 +35433,7 @@ static void ma_AVAudioSessionPortDescription_to_device_info(AVAudioSessionPortDe
#endif
#if defined(MA_APPLE_DESKTOP)
static ma_bool32 ma_context_enumerate_device_by_AudioObjectID__coreaudio(ma_context* pContext, AudioObjectID deviceObjectID, AudioObjectID defaultDeviceObjectID, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_by_AudioObjectID__coreaudio(ma_context* pContext, AudioObjectID deviceObjectID, AudioObjectID defaultDeviceObjectID, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_device_info deviceInfo;
@@ -35465,12 +35446,12 @@ static ma_bool32 ma_context_enumerate_device_by_AudioObjectID__coreaudio(ma_cont
/* ID. */
if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(deviceInfo.id.coreaudio), deviceInfo.id.coreaudio) != MA_SUCCESS) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
/* Name. */
if (ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(deviceInfo.name), deviceInfo.name) != MA_SUCCESS) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
/* Data Format. */
@@ -35496,13 +35477,13 @@ static ma_bool32 ma_context_enumerate_device_by_AudioObjectID__coreaudio(ma_cont
/* Channels. */
result = ma_get_AudioObject_channel_count(pContext, deviceObjectID, deviceType, &channels);
if (result != MA_SUCCESS) {
return MA_TRUE; /* Failed to get channel count. */
return MA_DEVICE_ENUMERATION_CONTINUE; /* Failed to get channel count. */
}
/* Formats. */
result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &streamDescriptionCount, &pStreamDescriptions);
if (result != MA_SUCCESS) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
for (iStreamDescription = 0; iStreamDescription < streamDescriptionCount; ++iStreamDescription) {
@@ -35539,7 +35520,7 @@ static ma_bool32 ma_context_enumerate_device_by_AudioObjectID__coreaudio(ma_cont
/* Sample Rates */
result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges);
if (result != MA_SUCCESS) {
return MA_TRUE; /* Failed to retrieve sample rates. */
return MA_DEVICE_ENUMERATION_CONTINUE; /* Failed to retrieve sample rates. */
}
/*
@@ -35578,7 +35559,7 @@ static ma_bool32 ma_context_enumerate_device_by_AudioObjectID__coreaudio(ma_cont
return callback(deviceType, &deviceInfo, pUserData);
}
#else
static ma_bool32 ma_context_enumerate_device_by_AVAudioSessionPortDescription__coreaudio(ma_context* pContext, AVAudioSessionPortDescription* pPortDesc, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_by_AVAudioSessionPortDescription__coreaudio(ma_context* pContext, AVAudioSessionPortDescription* pPortDesc, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_context_state_coreaudio* pContextStateCoreAudio = ma_context_get_backend_state__coreaudio(pContext);
ma_device_info deviceInfo;
@@ -35617,12 +35598,12 @@ static ma_bool32 ma_context_enumerate_device_by_AVAudioSessionPortDescription__c
component = pContextStateCoreAudio->AudioComponentFindNext(NULL, &desc);
if (component == NULL) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
status = pContextStateCoreAudio->AudioComponentInstanceNew(component, &audioUnit);
if (status != noErr) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
formatScope = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output;
@@ -35632,7 +35613,7 @@ static ma_bool32 ma_context_enumerate_device_by_AVAudioSessionPortDescription__c
status = pContextStateCoreAudio->AudioUnitGetProperty(audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, &propSize);
if (status != noErr) {
pContextStateCoreAudio->AudioComponentInstanceDispose(audioUnit);
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
pContextStateCoreAudio->AudioComponentInstanceDispose(audioUnit);
@@ -35643,7 +35624,7 @@ static ma_bool32 ma_context_enumerate_device_by_AVAudioSessionPortDescription__c
result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &deviceInfo.nativeDataFormats[0].format);
if (result != MA_SUCCESS) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
deviceInfo.nativeDataFormats[0].channels = bestFormat.mChannelsPerFrame;
@@ -35686,15 +35667,15 @@ static ma_result ma_context_enumerate_devices__coreaudio(ma_context* pContext, m
AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice];
if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) {
ma_bool32 cbResult = ma_context_enumerate_device_by_AudioObjectID__coreaudio(pContext, deviceObjectID, defaultDeviceObjectIDPlayback, ma_device_type_playback, callback, pUserData);
if (cbResult == MA_FALSE) {
ma_device_enumeration_result cbResult = ma_context_enumerate_device_by_AudioObjectID__coreaudio(pContext, deviceObjectID, defaultDeviceObjectIDPlayback, ma_device_type_playback, callback, pUserData);
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
break;
}
}
if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) {
ma_bool32 cbResult = ma_context_enumerate_device_by_AudioObjectID__coreaudio(pContext, deviceObjectID, defaultDeviceObjectIDCapture, ma_device_type_capture, callback, pUserData);
if (cbResult == MA_FALSE) {
ma_device_enumeration_result cbResult = ma_context_enumerate_device_by_AudioObjectID__coreaudio(pContext, deviceObjectID, defaultDeviceObjectIDCapture, ma_device_type_capture, callback, pUserData);
if (cbResult == MA_DEVICE_ENUMERATION_ABORT) {
break;
}
}
@@ -35708,27 +35689,13 @@ static ma_result ma_context_enumerate_devices__coreaudio(ma_context* pContext, m
NSArray *pOutputs = [[[AVAudioSession sharedInstance] currentRoute] outputs];
for (AVAudioSessionPortDescription* pPortDesc in pOutputs) {
ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, &info);
/* I'm not sure how to check for default devices. I'm just going to assume the first one is the default. */
if (pPortDesc == pOutputs[0]) {
info.isDefault = MA_TRUE;
}
if (!callback(ma_device_type_playback, &info, pUserData)) {
if (ma_context_enumerate_device_by_AVAudioSessionPortDescription__coreaudio(pContext, pPortDesc, ma_device_type_playback, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT) {
return MA_SUCCESS;
}
}
for (AVAudioSessionPortDescription* pPortDesc in pInputs) {
ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, &info);
/* I'm not sure how to check for default devices. I'm just going to assume the first one is the default. */
if (pPortDesc == pInputs[0]) {
info.isDefault = MA_TRUE;
}
if (!callback(ma_device_type_capture, &info, pUserData)) {
if (ma_context_enumerate_device_by_AVAudioSessionPortDescription__coreaudio(pContext, pPortDesc, ma_device_type_capture, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT) {
return MA_SUCCESS;
}
}
@@ -37480,7 +37447,7 @@ static ma_uint32 ma_find_best_sample_rate_from_sio_cap__sndio(struct ma_sio_cap*
return bestSampleRate;
}
static ma_bool32 ma_context_enumeate_device_from_handle__sndio(ma_context* pContext, struct ma_sio_hdl* handle, const char* name, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_handle__sndio(ma_context* pContext, struct ma_sio_hdl* handle, const char* name, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_context_state_sndio* pContextStateSndio = ma_context_get_backend_state__sndio(pContext);
ma_device_info deviceInfo;
@@ -37507,7 +37474,7 @@ static ma_bool32 ma_context_enumeate_device_from_handle__sndio(ma_context* pCont
/* Format. */
if (pContextStateSndio->sio_getcap(handle, &caps) == 0) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
deviceInfo.nativeDataFormatCount = 0;
@@ -37591,7 +37558,7 @@ static ma_result ma_context_enumerate_devices__sndio(ma_context* pContext, ma_en
if (!isTerminating) {
handle = pContextStateSndio->sio_open(MA_SIO_DEVANY, MA_SIO_PLAY, 0);
if (handle != NULL) {
isTerminating = !ma_context_enumeate_device_from_handle__sndio(pContext, handle, MA_SIO_DEVANY, ma_device_type_playback, callback, pUserData);
isTerminating = (ma_context_enumerate_device_from_handle__sndio(pContext, handle, MA_SIO_DEVANY, ma_device_type_playback, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
pContextStateSndio->sio_close(handle);
}
}
@@ -37600,7 +37567,7 @@ static ma_result ma_context_enumerate_devices__sndio(ma_context* pContext, ma_en
if (!isTerminating) {
handle = pContextStateSndio->sio_open(MA_SIO_DEVANY, MA_SIO_REC, 0);
if (handle != NULL) {
isTerminating = !ma_context_enumeate_device_from_handle__sndio(pContext, handle, MA_SIO_DEVANY, ma_device_type_capture, callback, pUserData);
isTerminating = (ma_context_enumerate_device_from_handle__sndio(pContext, handle, MA_SIO_DEVANY, ma_device_type_capture, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
pContextStateSndio->sio_close(handle);
}
}
@@ -38295,14 +38262,14 @@ static ma_result ma_context_get_device_info_from_fd__audio4(int fd, int deviceIn
return MA_SUCCESS;
}
static ma_bool32 ma_context_enumerate_device_from_fd___audio4(int fd, int deviceIndex, struct stat* stDevice, struct stat* stDefault, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_fd___audio4(int fd, int deviceIndex, struct stat* stDevice, struct stat* stDefault, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_result result;
ma_device_info deviceInfo;
result = ma_context_get_device_info_from_fd__audio4(fd, deviceIndex, stDevice, stDefault, deviceType, &deviceInfo);
if (result != MA_SUCCESS) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
return callback(deviceType, &deviceInfo, pUserData);
@@ -38345,7 +38312,7 @@ static ma_result ma_context_enumerate_devices__audio4(ma_context* pContext, ma_e
if (!isTerminating) {
fd = open(devpath, O_RDONLY, 0);
if (fd >= 0) {
isTerminating = !ma_context_enumerate_device_from_fd___audio4(fd, iDevice, &st, &stDefault, ma_device_type_playback, callback, pUserData);
isTerminating = (ma_context_enumerate_device_from_fd___audio4(fd, iDevice, &st, &stDefault, ma_device_type_playback, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
close(fd);
}
}
@@ -38354,7 +38321,7 @@ static ma_result ma_context_enumerate_devices__audio4(ma_context* pContext, ma_e
if (!isTerminating) {
fd = open(devpath, O_WRONLY, 0);
if (fd >= 0) {
isTerminating = !ma_context_enumerate_device_from_fd___audio4(fd, iDevice, &st, &stDefault, ma_device_type_capture, callback, pUserData);
isTerminating = (ma_context_enumerate_device_from_fd___audio4(fd, iDevice, &st, &stDefault, ma_device_type_capture, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
close(fd);
}
}
@@ -39191,7 +39158,7 @@ static ma_result ma_context_add_native_data_format_legacy__oss(ma_context* pCont
return MA_SUCCESS;
}
static ma_bool32 ma_context_enumerate_device_from_fd_legacy__oss(ma_context* pContext, int fd, const char* devnode, struct stat* stDefault, ma_device_type deviceType, ma_device_info* pDeviceInfo, ma_enum_devices_callback_proc callback, void* pUserData) /* Returns the result of the callback. */
static ma_device_enumeration_result ma_context_enumerate_device_from_fd_legacy__oss(ma_context* pContext, int fd, const char* devnode, struct stat* stDefault, ma_device_type deviceType, ma_device_info* pDeviceInfo, ma_enum_devices_callback_proc callback, void* pUserData) /* Returns the result of the callback. */
{
struct stat stDevice;
int formats;
@@ -39213,13 +39180,13 @@ static ma_bool32 ma_context_enumerate_device_from_fd_legacy__oss(ma_context* pCo
formats = 0;
if (ioctl(fd, SNDCTL_DSP_GETFMTS, &formats) < 0) {
ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "[OSS] Failed to retrieve formats for \"%s\" during device enumeration. Skipping", devnode);
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
/* We need to support at least u8 or s16. */
if ((formats & AFMT_U8) == 0 && (formats & (AFMT_S16_LE | AFMT_S16_BE)) == 0) {
ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, "[OSS] \"%s\" does not support u8 or s16 formats. Skipping", devnode);
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
if (((formats & AFMT_S16_LE) != 0 && ma_is_little_endian()) || ((formats & AFMT_S16_BE) != 0 && ma_is_big_endian())) {
@@ -39274,7 +39241,7 @@ static ma_result ma_context_enumerate_devices_legacy__oss(ma_context* pContext,
fdDevice = open(devnode, O_WRONLY);
if (fdDevice >= 0) {
if (ioctl(fdDevice, SNDCTL_DSP_GETOSPACE, &bufInfo) >= 0) {
isTerminating = !ma_context_enumerate_device_from_fd_legacy__oss(pContext, fdDevice, devnode, &stDefault, ma_device_type_playback, &deviceInfo, callback, pUserData);
isTerminating = (ma_context_enumerate_device_from_fd_legacy__oss(pContext, fdDevice, devnode, &stDefault, ma_device_type_playback, &deviceInfo, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
}
close(fdDevice);
@@ -39287,7 +39254,7 @@ static ma_result ma_context_enumerate_devices_legacy__oss(ma_context* pContext,
fdDevice = open(devnode, O_RDONLY);
if (fdDevice >= 0) {
if (ioctl(fdDevice, SNDCTL_DSP_GETISPACE, &bufInfo) >= 0) {
isTerminating = !ma_context_enumerate_device_from_fd_legacy__oss(pContext, fdDevice, devnode, &stDefault, ma_device_type_capture, &deviceInfo, callback, pUserData);
isTerminating = (ma_context_enumerate_device_from_fd_legacy__oss(pContext, fdDevice, devnode, &stDefault, ma_device_type_capture, &deviceInfo, callback, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
}
close(fdDevice);
@@ -39383,10 +39350,10 @@ static ma_result ma_context_enumerate_devices_modern__oss(ma_context* pContext,
/* The device can be both playback and capture. */
if (!isTerminating && (ai.caps & PCM_CAP_OUTPUT) != 0) {
isTerminating = !callback(ma_device_type_playback, &deviceInfo, pUserData);
isTerminating = (callback(ma_device_type_playback, &deviceInfo, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
}
if (!isTerminating && (ai.caps & PCM_CAP_INPUT) != 0) {
isTerminating = !callback(ma_device_type_capture, &deviceInfo, pUserData);
isTerminating = (callback(ma_device_type_capture, &deviceInfo, pUserData) == MA_DEVICE_ENUMERATION_ABORT);
}
if (isTerminating) {
@@ -40430,7 +40397,7 @@ static void ma_context_add_native_data_format_from_AAudioStream__aaudio(ma_conte
ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(pContext, pStream, ma_format_s16, flags, pDeviceInfo);
}
static ma_bool32 ma_context_enumerate_device_from_type__aaudio(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_type__aaudio(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_result result;
ma_AAudioStream* pStream;
@@ -40438,7 +40405,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__aaudio(ma_context* pCont
result = ma_open_stream_basic__aaudio(pContext, NULL, deviceType, ma_share_mode_shared, &pStream);
if (result != MA_SUCCESS) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
MA_ZERO_OBJECT(&deviceInfo);
@@ -40467,7 +40434,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__aaudio(ma_context* pCont
static ma_result ma_context_enumerate_devices__aaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
MA_ASSERT(pContext != NULL);
MA_ASSERT(callback != NULL);
@@ -40479,15 +40446,17 @@ static ma_result ma_context_enumerate_devices__aaudio(ma_context* pContext, ma_e
*/
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__aaudio(pContext, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__aaudio(pContext, ma_device_type_capture, callback, pUserData);
}
(void)cbResult;
return MA_SUCCESS;
}
@@ -41457,7 +41426,7 @@ static void ma_context_add_data_format__opensl(ma_context* pContext, ma_format f
}
}
static ma_bool32 ma_context_enumerate_device_from_type__opensl(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_type__opensl(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_device_info deviceInfo;
@@ -41498,7 +41467,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__opensl(ma_context* pCont
static ma_result ma_context_enumerate_devices__opensl(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_bool32 cbResult;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
MA_ASSERT(pContext != NULL);
MA_ASSERT(callback != NULL);
@@ -41508,18 +41477,18 @@ static ma_result ma_context_enumerate_devices__opensl(ma_context* pContext, ma_e
return MA_INVALID_OPERATION;
}
cbResult = MA_TRUE;
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__opensl(pContext, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__opensl(pContext, ma_device_type_capture, callback, pUserData);
}
(void)cbResult;
return MA_SUCCESS;
}
@@ -42456,7 +42425,7 @@ static void ma_context_uninit__webaudio(ma_context* pContext)
ma_free(pContextStateWebAudio, ma_context_get_allocation_callbacks(pContext));
}
static ma_bool32 ma_context_enumerate_device_from_type__webaudio(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
static ma_device_enumeration_result ma_context_enumerate_device_from_type__webaudio(ma_context* pContext, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_device_info deviceInfo;
@@ -42494,7 +42463,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__webaudio(ma_context* pCo
}, 0); /* Must pass in a dummy argument for C99 compatibility. */
if (deviceInfo.nativeDataFormats[0].sampleRate == 0) {
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
deviceInfo.nativeDataFormatCount = 1;
@@ -42504,7 +42473,7 @@ static ma_bool32 ma_context_enumerate_device_from_type__webaudio(ma_context* pCo
static ma_result ma_context_enumerate_devices__webaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)
{
ma_bool32 cbResult = MA_TRUE;
ma_device_enumeration_result cbResult = MA_DEVICE_ENUMERATION_CONTINUE;
MA_ASSERT(pContext != NULL);
MA_ASSERT(callback != NULL);
@@ -42512,17 +42481,19 @@ static ma_result ma_context_enumerate_devices__webaudio(ma_context* pContext, ma
/* Only supporting default devices for now. */
/* Playback. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
cbResult = ma_context_enumerate_device_from_type__webaudio(pContext, ma_device_type_playback, callback, pUserData);
}
/* Capture. */
if (cbResult) {
if (cbResult == MA_DEVICE_ENUMERATION_CONTINUE) {
if (ma_is_capture_supported__webaudio()) {
cbResult = ma_context_enumerate_device_from_type__webaudio(pContext, ma_device_type_capture, callback, pUserData);
}
}
(void)cbResult;
return MA_SUCCESS;
}
@@ -44200,7 +44171,7 @@ MA_API ma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devi
}
static ma_bool32 ma_context_get_devices__enum_callback(ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData)
static ma_device_enumeration_result ma_context_get_devices__enum_callback(ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData)
{
/*
We need to insert the device info into our main internal buffer. Where it goes depends on the device type. If it's a capture device
@@ -44219,7 +44190,7 @@ static ma_bool32 ma_context_get_devices__enum_callback(ma_device_type deviceType
ma_uint32 newCapacity = pContext->deviceInfoCapacity + bufferExpansionCount;
ma_device_info* pNewInfos = (ma_device_info*)ma_realloc(pContext->pDeviceInfos, sizeof(*pContext->pDeviceInfos)*newCapacity, &pContext->allocationCallbacks);
if (pNewInfos == NULL) {
return MA_FALSE; /* Out of memory. */
return MA_DEVICE_ENUMERATION_ABORT; /* Out of memory. */
}
pContext->pDeviceInfos = pNewInfos;
@@ -44246,7 +44217,7 @@ static ma_bool32 ma_context_get_devices__enum_callback(ma_device_type deviceType
}
(void)pUserData;
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
MA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount)
@@ -44313,7 +44284,7 @@ typedef struct ma_context_get_device_info_enum_callback_data
ma_bool32 foundDevice;
} ma_context_get_device_info_enum_callback_data;
static ma_bool32 ma_context_get_device_info_enum_callback(ma_device_type deviceType, const ma_device_info* pDeviceInfo, void* pUserData)
static ma_device_enumeration_result ma_context_get_device_info_enum_callback(ma_device_type deviceType, const ma_device_info* pDeviceInfo, void* pUserData)
{
ma_context_get_device_info_enum_callback_data* pData = (ma_context_get_device_info_enum_callback_data*)pUserData;
@@ -44341,10 +44312,10 @@ static ma_bool32 ma_context_get_device_info_enum_callback(ma_device_type deviceT
/* Abort enumeration once we've found our info. */
if (pData->foundDevice) {
return MA_FALSE;
return MA_DEVICE_ENUMERATION_ABORT;
}
return MA_TRUE;
return MA_DEVICE_ENUMERATION_CONTINUE;
}
MA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)