47 #include "../../SDL_internal.h"
49 #if SDL_AUDIO_DRIVER_XAUDIO2
51 #include "../../core/windows/SDL_windows.h"
53 #include "../SDL_audio_c.h"
54 #include "../SDL_sysaudio.h"
59 # define SDL_XAUDIO2_HAS_SDK 1
60 #elif defined(__WINRT__)
64 # define SDL_XAUDIO2_HAS_SDK
76 #if (!defined(_DXSDK_BUILD_MAJOR) || (_DXSDK_BUILD_MAJOR < 1284))
77 # pragma message("Your DirectX SDK is too old. Disabling XAudio2 support.")
79 # define SDL_XAUDIO2_HAS_SDK 1
84 #ifdef SDL_XAUDIO2_HAS_SDK
89 #define SDL_XAUDIO2_WIN8 1
93 #if !defined(SDL_XAUDIO2_H_)
99 #define _THIS SDL_AudioDevice *this
110 #define THIS INTERFACE *p
114 #define THIS_ INTERFACE *p,
130 XAUDIO2_DetectDevices(
void)
137 SDL_SetError(
"XAudio2: XAudio2Create() failed at detection.");
140 SDL_SetError(
"XAudio2: IXAudio2::GetDeviceCount() failed.");
145 for (i = 0; i < devcount; i++) {
159 static void STDMETHODCALLTYPE
160 VoiceCBOnBufferEnd(THIS_
void *
data)
167 static void STDMETHODCALLTYPE
168 VoiceCBOnVoiceError(THIS_
void *
data, HRESULT Error)
175 static void STDMETHODCALLTYPE VoiceCBOnStreamEnd(THIS) {}
176 static void STDMETHODCALLTYPE VoiceCBOnVoiceProcessPassStart(THIS_ UINT32
b) {}
177 static void STDMETHODCALLTYPE VoiceCBOnVoiceProcessPassEnd(THIS) {}
178 static void STDMETHODCALLTYPE VoiceCBOnBufferStart(THIS_
void *
data) {}
179 static void STDMETHODCALLTYPE VoiceCBOnLoopEnd(THIS_
void *
data) {}
183 XAUDIO2_GetDeviceBuf(
_THIS)
185 return this->hidden->nextbuf;
189 XAUDIO2_PlayDevice(
_THIS)
192 Uint8 *mixbuf = this->hidden->mixbuf;
193 Uint8 *nextbuf = this->hidden->nextbuf;
194 const int mixlen = this->hidden->mixlen;
208 if (nextbuf == mixbuf) {
213 this->hidden->nextbuf = nextbuf;
220 if (result !=
S_OK) {
227 XAUDIO2_WaitDevice(
_THIS)
235 XAUDIO2_PrepareToClose(
_THIS)
244 XAUDIO2_CloseDevice(
_THIS)
246 IXAudio2 *ixa2 = this->hidden->ixa2;
250 if (source !=
NULL) {
258 if (mastering !=
NULL) {
264 if (this->hidden->semaphore !=
NULL) {
273 XAUDIO2_OpenDevice(
_THIS,
void *
handle,
const char *devname,
int iscapture)
275 HRESULT result =
S_OK;
276 WAVEFORMATEX waveformat;
277 int valid_format = 0;
281 #if defined(SDL_XAUDIO2_WIN8)
282 LPCWSTR devId =
NULL;
288 VoiceCBOnVoiceProcessPassStart,
289 VoiceCBOnVoiceProcessPassEnd,
291 VoiceCBOnBufferStart,
299 #if defined(SDL_XAUDIO2_WIN8)
302 if (handle !=
NULL) {
304 const size_t val = ((
size_t) handle) - 1;
305 devId = (UINT32) val;
310 return SDL_SetError(
"XAudio2: XAudio2Create() failed at open.");
327 if (this->hidden ==
NULL) {
333 this->hidden->ixa2 = ixa2;
335 if (this->hidden->semaphore ==
NULL) {
336 return SDL_SetError(
"XAudio2: CreateSemaphore() failed!");
339 while ((!valid_format) && (test_format)) {
340 switch (test_format) {
353 return SDL_SetError(
"XAudio2: Unsupported audio format");
360 this->hidden->mixlen = this->
spec.
size;
362 if (this->hidden->mixbuf ==
NULL) {
365 this->hidden->nextbuf = this->hidden->mixbuf;
366 SDL_memset(this->hidden->mixbuf, this->spec.silence, 2 * this->hidden->mixlen);
381 this->spec.freq, 0, devId,
NULL);
383 if (result !=
S_OK) {
384 return SDL_SetError(
"XAudio2: Couldn't create mastering voice");
389 waveformat.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
391 waveformat.wFormatTag = WAVE_FORMAT_PCM;
395 waveformat.nSamplesPerSec = this->
spec.
freq;
396 waveformat.nBlockAlign =
397 waveformat.nChannels * (waveformat.wBitsPerSample / 8);
398 waveformat.nAvgBytesPerSec =
399 waveformat.nSamplesPerSec * waveformat.nBlockAlign;
412 XAUDIO2_VOICE_NOSRC |
413 XAUDIO2_VOICE_NOPITCH,
417 if (result !=
S_OK) {
418 return SDL_SetError(
"XAudio2: Couldn't create source voice");
420 this->hidden->source =
source;
424 if (result !=
S_OK) {
429 if (result !=
S_OK) {
430 return SDL_SetError(
"XAudio2: Couldn't start source voice");
437 XAUDIO2_Deinitialize(
void)
439 #if defined(__WIN32__)
450 #ifndef SDL_XAUDIO2_HAS_SDK
451 SDL_SetError(
"XAudio2: SDL was built without XAudio2 support (old DirectX SDK).");
456 HRESULT hr = S_FALSE;
457 #if defined(__WIN32__)
467 #if defined(__WIN32__)
470 SDL_SetError(
"XAudio2: XAudio2Create() failed at initialization: 0x%.8x", hr );
491 #if defined(SDL_XAUDIO2_WIN8) || defined(__WINRT__)
500 "xaudio2",
"XAudio2", XAUDIO2_Init, 0
void(* CloseDevice)(_THIS)
#define IXAudio2SourceVoice_DestroyVoice(A)
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
void(* WaitDevice)(_THIS)
#define IXAudio2SourceVoice_FlushSourceBuffers(A)
HRESULT __cdecl IXAudio2_GetDeviceCount(IXAudio2 *ixa2, UINT32 *devcount)
#define IXAudio2_StartEngine(A)
#define SDL_CreateSemaphore
Uint8 *(* GetDeviceBuf)(_THIS)
interface IXAudio2MasteringVoice IXAudio2MasteringVoice
void(* DetectDevices)(void)
void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Uint16 SDL_AudioFormat
Audio format flags.
#define IXAudio2SourceVoice_Stop(A, B, C)
void(* PrepareToClose)(_THIS)
SDL_AudioFormat SDL_NextAudioFormat(void)
WAVEFORMATEX * waveformat
#define IXAudio2SourceVoice_SubmitSourceBuffer(A, B, C)
#define IXAudio2SourceVoice_Start(A, B, C)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
interface IXAudio2 IXAudio2
#define SDL_AUDIO_ISFLOAT(x)
void(* PlayDevice)(_THIS)
#define IXAudio2_StopEngine(A)
int OnlyHasDefaultOutputDevice
#define XAUDIO2_DEFAULT_CHANNELS
EGLImageKHR EGLint EGLint * handle
HRESULT WIN_CoInitialize(void)
#define SDL_AUDIO_BITSIZE(x)
#define IXAudio2_CreateMasteringVoice(A, B, C, D, E, F, G, H)
#define WIN_StringToUTF8(S)
GLsizei GLsizei GLchar * source
void SDL_CalculateAudioSpec(SDL_AudioSpec *spec)
void(* Deinitialize)(void)
interface IXAudio2SourceVoice IXAudio2SourceVoice
GLenum GLenum GLsizei const GLuint GLboolean enabled
#define SDL_OutOfMemory()
void WIN_CoUninitialize(void)
#define IXAudio2_Release(A)
interface IXAudio2VoiceCallback IXAudio2VoiceCallback
#define IXAudio2_CreateSourceVoice(A, B, C, D, E, F, G, H)
#define SDL_DestroySemaphore
#define IXAudio2SourceVoice_Discontinuity(A)
HRESULT IXAudio2_GetDeviceDetails(IXAudio2 *unused, UINT32 index, XAUDIO2_DEVICE_DETAILS *details)
#define XAUDIO2_DEFAULT_PROCESSOR
HRESULT __stdcall XAudio2Create(_Out_ IXAudio2 **ppXAudio2, _In_ UINT32 Flags, _In_ XAUDIO2_PROCESSOR XAudio2Processor)
#define IXAudio2MasteringVoice_DestroyVoice(A)
#define XAUDIO2_E_DEVICE_INVALIDATED
AudioBootStrap XAUDIO2_bootstrap
#define XAUDIO2_COMMIT_NOW
GLboolean GLboolean GLboolean b
int(* OpenDevice)(_THIS, void *handle, const char *devname, int iscapture)
void SDL_AddAudioDevice(const int iscapture, const char *name, void *handle)