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)
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_WaitDone(
_THIS)
258 XAUDIO2_CloseDevice(
_THIS)
260 if (this->hidden !=
NULL) {
261 IXAudio2 *ixa2 = this->hidden->ixa2;
265 if (source !=
NULL) {
273 if (mastering !=
NULL) {
280 if (this->hidden->semaphore !=
NULL) {
290 XAUDIO2_OpenDevice(
_THIS,
void *handle,
const char *devname,
int iscapture)
292 HRESULT result =
S_OK;
293 WAVEFORMATEX waveformat;
294 int valid_format = 0;
298 #if defined(SDL_XAUDIO2_WIN8) 299 LPCWSTR devId =
NULL;
305 VoiceCBOnVoiceProcessPassStart,
306 VoiceCBOnVoiceProcessPassEnd,
308 VoiceCBOnBufferStart,
316 #if defined(SDL_XAUDIO2_WIN8) 319 if (handle !=
NULL) {
321 const size_t val = ((
size_t) handle) - 1;
322 devId = (UINT32) val;
327 return SDL_SetError(
"XAudio2: XAudio2Create() failed at open.");
344 if (this->hidden ==
NULL) {
348 SDL_memset(this->hidden, 0, (
sizeof *this->hidden));
350 this->hidden->ixa2 = ixa2;
352 if (this->hidden->semaphore ==
NULL) {
353 XAUDIO2_CloseDevice(
this);
354 return SDL_SetError(
"XAudio2: CreateSemaphore() failed!");
357 while ((!valid_format) && (test_format)) {
358 switch (test_format) {
371 XAUDIO2_CloseDevice(
this);
372 return SDL_SetError(
"XAudio2: Unsupported audio format");
379 this->hidden->mixlen = this->
spec.
size;
381 if (this->hidden->mixbuf ==
NULL) {
382 XAUDIO2_CloseDevice(
this);
385 this->hidden->nextbuf = this->hidden->mixbuf;
386 SDL_memset(this->hidden->mixbuf, 0, 2 * this->hidden->mixlen);
401 this->spec.freq, 0, devId,
NULL);
403 if (result !=
S_OK) {
404 XAUDIO2_CloseDevice(
this);
405 return SDL_SetError(
"XAudio2: Couldn't create mastering voice");
410 waveformat.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
412 waveformat.wFormatTag = WAVE_FORMAT_PCM;
416 waveformat.nSamplesPerSec = this->
spec.
freq;
417 waveformat.nBlockAlign =
418 waveformat.nChannels * (waveformat.wBitsPerSample / 8);
419 waveformat.nAvgBytesPerSec =
420 waveformat.nSamplesPerSec * waveformat.nBlockAlign;
421 waveformat.cbSize =
sizeof(waveformat);
433 XAUDIO2_VOICE_NOSRC |
434 XAUDIO2_VOICE_NOPITCH,
438 if (result !=
S_OK) {
439 XAUDIO2_CloseDevice(
this);
440 return SDL_SetError(
"XAudio2: Couldn't create source voice");
442 this->hidden->source =
source;
446 if (result !=
S_OK) {
447 XAUDIO2_CloseDevice(
this);
452 if (result !=
S_OK) {
453 XAUDIO2_CloseDevice(
this);
454 return SDL_SetError(
"XAudio2: Couldn't start source voice");
461 XAUDIO2_Deinitialize(
void)
463 #if defined(__WIN32__) 474 #ifndef SDL_XAUDIO2_HAS_SDK 475 SDL_SetError(
"XAudio2: SDL was built without XAudio2 support (old DirectX SDK).");
480 #if defined(__WIN32__) 489 #if defined(__WIN32__) 492 SDL_SetError(
"XAudio2: XAudio2Create() failed at initialization");
513 #if defined(SDL_XAUDIO2_WIN8) || defined(__WINRT__) 522 "xaudio2",
"XAudio2", XAUDIO2_Init, 0
#define IXAudio2SourceVoice_DestroyVoice(A)
SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format)
void(* DetectDevices)(void)
#define IXAudio2SourceVoice_FlushSourceBuffers(A)
HRESULT __cdecl IXAudio2_GetDeviceCount(IXAudio2 *ixa2, UINT32 *devcount)
#define IXAudio2_StartEngine(A)
#define SDL_CreateSemaphore
interface IXAudio2MasteringVoice IXAudio2MasteringVoice
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
void(* PlayDevice)(_THIS)
void(* WaitDevice)(_THIS)
void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)
Uint16 SDL_AudioFormat
Audio format flags.
#define IXAudio2SourceVoice_Stop(A, B, C)
SDL_AudioFormat SDL_NextAudioFormat(void)
#define IXAudio2SourceVoice_SubmitSourceBuffer(A, B, C)
#define IXAudio2SourceVoice_Start(A, B, C)
interface IXAudio2 IXAudio2
#define SDL_AUDIO_ISFLOAT(x)
#define IXAudio2_StopEngine(A)
int OnlyHasDefaultOutputDevice
#define XAUDIO2_DEFAULT_CHANNELS
HRESULT WIN_CoInitialize(void)
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_AUDIO_BITSIZE(x)
void(* Deinitialize)(void)
#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)
interface IXAudio2SourceVoice IXAudio2SourceVoice
GLenum GLenum GLsizei const GLuint GLboolean enabled
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)
#define SDL_assert(condition)
int(* OpenDevice)(_THIS, void *handle, const char *devname, int iscapture)
#define SDL_OutOfMemory()
void WIN_CoUninitialize(void)
#define IXAudio2_Release(A)
void(* CloseDevice)(_THIS)
interface IXAudio2VoiceCallback IXAudio2VoiceCallback
#define IXAudio2_CreateSourceVoice(A, B, C, D, E, F, G, H)
AudioBootStrap XAUDIO2_bootstrap
#define SDL_DestroySemaphore
#define IXAudio2SourceVoice_Discontinuity(A)
Uint8 *(* GetDeviceBuf)(_THIS)
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 XAUDIO2_VOICE_NOSAMPLESPLAYED
#define IXAudio2MasteringVoice_DestroyVoice(A)
#define XAUDIO2_E_DEVICE_INVALIDATED
#define XAUDIO2_COMMIT_NOW
#define IXAudio2SourceVoice_GetState(A, B, C)
GLboolean GLboolean GLboolean b
void SDL_AddAudioDevice(const int iscapture, const char *name, void *handle)