Simplify enumeration more;

This commit is contained in:
bjorn 2021-02-05 22:26:38 -07:00 committed by Bjorn
parent d1801cfcde
commit 1995aae7e9
3 changed files with 15 additions and 31 deletions

View File

@ -19,15 +19,15 @@ StringEntry lovrTimeUnit[] = {
{ 0 }
};
static void onDevice(AudioDevice* device, void* userdata) {
static void onDevice(const void* id, size_t size, const char* name, bool isDefault, void* userdata) {
lua_State* L = userdata;
lua_createtable(L, 0, 3);
void* id = lua_newuserdata(L, device->idSize);
memcpy(id, device->id, device->idSize);
void* p = lua_newuserdata(L, size);
memcpy(p, id, size);
lua_setfield(L, -2, "id");
lua_pushstring(L, device->name);
lua_pushstring(L, name);
lua_setfield(L, -2, "name");
lua_pushboolean(L, device->isDefault);
lua_pushboolean(L, isDefault);
lua_setfield(L, -2, "default");
lua_rawseti(L, -2, luax_len(L, -2) + 1);
}

View File

@ -228,30 +228,21 @@ const char* lovrAudioGetSpatializer() {
return state.spatializer->name;
}
static LOVR_THREAD_LOCAL struct {
AudioType type;
AudioDeviceCallback* callback;
} enumerateContext;
static AudioDeviceCallback* enumerateCallback;
static ma_bool32 enumerateCallback(ma_context* context, ma_device_type type, const ma_device_info* info, void* userdata) {
if (type == (enumerateContext.type == AUDIO_PLAYBACK ? ma_device_type_playback : ma_device_type_capture)) {
AudioDevice device = {
.id = &info->id,
.idSize = sizeof(info->id),
.name = info->name,
.isDefault = info->isDefault
};
enumerateContext.callback(&device, userdata);
}
static ma_bool32 enumPlayback(ma_context* context, ma_device_type type, const ma_device_info* info, void* userdata) {
if (type == ma_device_type_playback) enumerateCallback(&info->id, sizeof(info->id), info->name, info->isDefault, userdata);
return MA_TRUE;
}
static ma_bool32 enumCapture(ma_context* context, ma_device_type type, const ma_device_info* info, void* userdata) {
if (type == ma_device_type_capture) enumerateCallback(&info->id, sizeof(info->id), info->name, info->isDefault, userdata);
return MA_TRUE;
}
void lovrAudioEnumerateDevices(AudioType type, AudioDeviceCallback* callback, void* userdata) {
enumerateContext.type = type;
enumerateContext.callback = callback;
ma_context_enumerate_devices(&state.context, enumerateCallback, userdata);
enumerateCallback = callback;
ma_context_enumerate_devices(&state.context, type == AUDIO_PLAYBACK ? enumPlayback : enumCapture, userdata);
}
bool lovrAudioSetDevice(AudioType type, void* id, size_t size, uint32_t sampleRate, SampleFormat format, bool exclusive) {

View File

@ -20,14 +20,7 @@ typedef enum {
UNIT_FRAMES
} TimeUnit;
typedef struct {
size_t idSize;
const void* id;
const char* name;
bool isDefault;
} AudioDevice;
typedef void AudioDeviceCallback(AudioDevice* device, void* userdata);
typedef void AudioDeviceCallback(const void* id, size_t size, const char* name, bool isDefault, void* userdata);
bool lovrAudioInit(const char* spatializer);
void lovrAudioDestroy(void);