(OpenAL) Implement device_list_new/device_list_free

This commit is contained in:
libretroadmin 2025-08-04 07:49:26 +02:00
parent d9d951b92e
commit e3435221d8
2 changed files with 84 additions and 49 deletions

View File

@ -32,6 +32,7 @@
#include <retro_miscellaneous.h>
#include <retro_timers.h>
#include <lists/string_list.h>
#include "../audio_driver.h"
#include "../../verbosity.h"
@ -252,6 +253,42 @@ static bool al_use_float(void *data)
return true;
}
static void *al_list_new(void *u)
{
union string_list_elem_attr attr;
const char *audio_out_device_list;
struct string_list *sl = string_list_new();
if (!sl)
return NULL;
attr.i = 0;
if (alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT"))
audio_out_device_list = alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);
else
audio_out_device_list = alcGetString(NULL, ALC_DEVICE_SPECIFIER);
if (audio_out_device_list)
{
while (*audio_out_device_list)
{
string_list_append(sl, audio_out_device_list, attr);
audio_out_device_list += strlen(audio_out_device_list) + 1;
}
}
return sl;
}
static void al_device_list_free(void *u, void *slp)
{
struct string_list *sl = (struct string_list*)slp;
if (sl)
string_list_free(sl);
}
audio_driver_t audio_openal = {
al_init,
al_write,
@ -262,8 +299,8 @@ audio_driver_t audio_openal = {
al_free,
al_use_float,
"openal",
NULL,
NULL,
al_list_new,
al_device_list_free,
al_write_avail,
al_buffer_size,
};

View File

@ -73,9 +73,6 @@ typedef struct
uint8_t flags;
} xa_t;
/* Forward declarations */
static void *xa_list_new(void *u);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct xaudio2 : public IXAudio2VoiceCallback
#else
@ -239,6 +236,51 @@ static size_t xa_device_get_samplerate(int id)
#endif
}
static void *xa_list_new(void *u)
{
#if defined(_XBOX) || !defined(HAVE_MMDEVICE)
unsigned i;
union string_list_elem_attr attr;
uint32_t dev_count = 0;
IXAudio2 *ixa2 = NULL;
struct string_list *sl = string_list_new();
if (!sl)
return NULL;
attr.i = 0;
if (FAILED(XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR)))
return NULL;
IXAudio2_GetDeviceCount(ixa2, &dev_count);
for (i = 0; i < dev_count; i++)
{
XAUDIO2_DEVICE_DETAILS dev_detail;
if (IXAudio2_GetDeviceDetails(ixa2, i, &dev_detail) == S_OK)
{
char *str = utf16_to_utf8_string_alloc(dev_detail.DisplayName);
if (str)
{
string_list_append(sl, str, attr);
free(str);
}
}
}
IXAudio2_Release(ixa2);
return sl;
#elif defined(__WINRT__)
return NULL;
#else
return mmdevice_list_new(u, 0 /* eRender */);
#endif
}
static xaudio2_t *xaudio2_new(unsigned *rate, unsigned channels,
unsigned latency, size_t len, const char *dev_id)
{
@ -546,50 +588,6 @@ static void xa_device_list_free(void *u, void *slp)
string_list_free(sl);
}
static void *xa_list_new(void *u)
{
#if defined(_XBOX) || !defined(HAVE_MMDEVICE)
unsigned i;
union string_list_elem_attr attr;
uint32_t dev_count = 0;
IXAudio2 *ixa2 = NULL;
struct string_list *sl = string_list_new();
if (!sl)
return NULL;
attr.i = 0;
if (FAILED(XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR)))
return NULL;
IXAudio2_GetDeviceCount(ixa2, &dev_count);
for (i = 0; i < dev_count; i++)
{
XAUDIO2_DEVICE_DETAILS dev_detail;
if (IXAudio2_GetDeviceDetails(ixa2, i, &dev_detail) == S_OK)
{
char *str = utf16_to_utf8_string_alloc(dev_detail.DisplayName);
if (str)
{
string_list_append(sl, str, attr);
free(str);
}
}
}
IXAudio2_Release(ixa2);
return sl;
#elif defined(__WINRT__)
return NULL;
#else
return mmdevice_list_new(u, 0 /* eRender */);
#endif
}
audio_driver_t audio_xa = {
xa_init,
xa_write,