diff --git a/audio/xaudio-c/xaudio-c.c b/audio/xaudio-c/xaudio-c.c index af09648698..54c06f6222 100644 --- a/audio/xaudio-c/xaudio-c.c +++ b/audio/xaudio-c/xaudio-c.c @@ -7,6 +7,7 @@ #include "xaudio.h" #include "xaudio-c.h" #include +#include #include "../../msvc/msvc_compat.h" #define MAX_BUFFERS 16 @@ -55,8 +56,22 @@ const struct IXAudio2VoiceCallbackVtbl voice_vtable = { dummy_voidp, dummy_voidp_hresult, }; - -xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, size_t size) + +void xaudio2_enumerate_devices(xaudio2_t *xa) +{ + UINT32 dev_count; + IXAudio2_GetDeviceCount(xa->pXAudio2, &dev_count); + fprintf(stderr, "XAudio2 devices:\n"); + for (unsigned i = 0; i < dev_count; i++) + { + XAUDIO2_DEVICE_DETAILS dev_detail; + IXAudio2_GetDeviceDetails(xa->pXAudio2, i, &dev_detail); + fwprintf(stderr, L"\t%u: %s\n", i, dev_detail.DisplayName); + } +} + +xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, + size_t size, unsigned device) { xaudio2_t *handle = (xaudio2_t*)calloc(1, sizeof(*handle)); if (!handle) @@ -70,7 +85,7 @@ xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, size_t size) goto error; if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, - &handle->pMasterVoice, channels, samplerate, 0, 0, 0))) + &handle->pMasterVoice, channels, samplerate, 0, device, NULL))) goto error; wfx.wFormatTag = WAVE_FORMAT_IEEE_FLOAT; diff --git a/audio/xaudio-c/xaudio-c.h b/audio/xaudio-c/xaudio-c.h index dfae1da0eb..be8fa80079 100644 --- a/audio/xaudio-c/xaudio-c.h +++ b/audio/xaudio-c/xaudio-c.h @@ -15,10 +15,11 @@ extern "C" { typedef struct xaudio2 xaudio2_t; -xaudio2_t* xaudio2_new(unsigned samplerate, unsigned channels, size_t bufsize); +xaudio2_t* xaudio2_new(unsigned samplerate, unsigned channels, size_t bufsize, unsigned device); size_t xaudio2_write_avail(xaudio2_t *handle); size_t xaudio2_write(xaudio2_t *handle, const void *data, size_t bytes); void xaudio2_free(xaudio2_t *handle); +void xaudio2_enumerate_devices(xaudio2_t *handle); #ifdef __cplusplus } diff --git a/audio/xaudio-c/xaudio.h b/audio/xaudio-c/xaudio.h index 0dba35e2b6..3992d559a1 100644 --- a/audio/xaudio-c/xaudio.h +++ b/audio/xaudio-c/xaudio.h @@ -63,7 +63,14 @@ typedef enum XAUDIO2_FILTER_TYPE { HighPassFilter } XAUDIO2_FILTER_TYPE; -typedef struct XAUDIO2_DEVICE_DETAILS XAUDIO2_DEVICE_DETAILS; +typedef struct XAUDIO2_DEVICE_DETAILS +{ + WCHAR DeviceID[256]; + WCHAR DisplayName[256]; + XAUDIO2_DEVICE_ROLE Role; + WAVEFORMATEXTENSIBLE OutputFormat; +} XAUDIO2_DEVICE_DETAILS; + typedef struct XAUDIO2_VOICE_DETAILS XAUDIO2_VOICE_DETAILS; typedef struct XAUDIO2_VOICE_SENDS XAUDIO2_VOICE_SENDS; typedef struct XAUDIO2_EFFECT_DESCRIPTOR XAUDIO2_EFFECT_DESCRIPTOR; @@ -195,14 +202,16 @@ DECLARE_INTERFACE_(IXAudio2, IUnknown) }; // C hooks. -#define IXAudio2_Initialize(THIS, a, b) (THIS)->lpVtbl->Initialize(THIS, a, b) +#define IXAudio2_Initialize(THIS, ...) (THIS)->lpVtbl->Initialize(THIS, __VA_ARGS__) #define IXAudio2_Release(THIS) (THIS)->lpVtbl->Release(THIS) -#define IXAudio2_CreateSourceVoice(THIS, a, b, c, d, e, f, g) (THIS)->lpVtbl->CreateSourceVoice(THIS, a, b, c, d, e, f, g) -#define IXAudio2_CreateMasteringVoice(THIS, a, b, c, d, e, f) (THIS)->lpVtbl->CreateMasteringVoice(THIS, a, b, c, d, e, f) +#define IXAudio2_CreateSourceVoice(THIS, ...) (THIS)->lpVtbl->CreateSourceVoice(THIS, __VA_ARGS__) +#define IXAudio2_CreateMasteringVoice(THIS, ...) (THIS)->lpVtbl->CreateMasteringVoice(THIS, __VA_ARGS__) +#define IXAudio2_GetDeviceCount(THIS, ...) (THIS)->lpVtbl->GetDeviceCount(THIS, __VA_ARGS__) +#define IXAudio2_GetDeviceDetails(THIS, ...) (THIS)->lpVtbl->GetDeviceDetails(THIS, __VA_ARGS__) -#define IXAudio2SourceVoice_Start(THIS, a, b) (THIS)->lpVtbl->Start(THIS, a, b) -#define IXAudio2SourceVoice_Stop(THIS, a, b) (THIS)->lpVtbl->Stop(THIS, a, b) -#define IXAudio2SourceVoice_SubmitSourceBuffer(THIS, a, b) (THIS)->lpVtbl->SubmitSourceBuffer(THIS, a, b) +#define IXAudio2SourceVoice_Start(THIS, ...) (THIS)->lpVtbl->Start(THIS, __VA_ARGS__) +#define IXAudio2SourceVoice_Stop(THIS, ...) (THIS)->lpVtbl->Stop(THIS, __VA_ARGS__) +#define IXAudio2SourceVoice_SubmitSourceBuffer(THIS, ...) (THIS)->lpVtbl->SubmitSourceBuffer(THIS, __VA_ARGS__) #define IXAudio2SourceVoice_DestroyVoice(THIS) (THIS)->lpVtbl->DestroyVoice(THIS) #define IXAudio2MasteringVoice_DestroyVoice(THIS) (THIS)->lpVtbl->DestroyVoice(THIS) diff --git a/audio/xaudio.c b/audio/xaudio.c index eac513187e..146be4ce8c 100644 --- a/audio/xaudio.c +++ b/audio/xaudio.c @@ -42,7 +42,11 @@ static void *xa_init(const char *device, unsigned rate, unsigned latency) xa->bufsize = bufsize * 2 * sizeof(float); - xa->xa = xaudio2_new(rate, 2, xa->bufsize); + unsigned device_index = 0; + if (device) + device_index = strtoul(device, NULL, 0); + + xa->xa = xaudio2_new(rate, 2, xa->bufsize, device_index); if (!xa->xa) { SSNES_ERR("Failed to init XAudio2.\n"); @@ -50,6 +54,9 @@ static void *xa_init(const char *device, unsigned rate, unsigned latency) return NULL; } + if (g_extern.verbose) + xaudio2_enumerate_devices(xa->xa); + return xa; }