[PATCH 1/2] xaudio2: Remove run-time version checks for XAudio2 object
Andrew Eikum
aeikum at codeweavers.com
Fri Jan 15 13:48:34 CST 2016
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
The DLLs are built independently now, so we can do these changes at
compile-time insteaed.
dlls/xaudio2_7/xaudio_dll.c | 186 ++++++++++++++++++++--------------------
dlls/xaudio2_7/xaudio_private.h | 2 -
2 files changed, 91 insertions(+), 97 deletions(-)
diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index cc75099..6517b40 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -38,8 +38,13 @@ static void (ALC_APIENTRY *palcRenderSamplesSOFT)(ALCdevice*, ALCvoid*, ALCsizei
static HINSTANCE instance;
-#define COMPAT_E_INVALID_CALL(v) (v == 20) ? E_INVALIDARG : XAUDIO2_E_INVALID_CALL
-#define COMPAT_E_DEVICE_INVALIDATED(v) (v == 20) ? XAUDIO20_E_DEVICE_INVALIDATED : XAUDIO2_E_DEVICE_INVALIDATED
+#if XAUDIO2_VER == 0
+#define COMPAT_E_INVALID_CALL E_INVALIDARG
+#define COMPAT_E_DEVICE_INVALIDATED XAUDIO20_E_DEVICE_INVALIDATED
+#else
+#define COMPAT_E_INVALID_CALL XAUDIO2_E_INVALID_CALL
+#define COMPAT_E_DEVICE_INVALIDATED XAUDIO2_E_DEVICE_INVALIDATED
+#endif
static void dump_fmt(const WAVEFORMATEX *fmt)
{
@@ -506,7 +511,7 @@ static HRESULT WINAPI XA2SRC_SubmitSourceBuffer(IXAudio2SourceVoice *iface,
if(This->nbufs >= XAUDIO2_MAX_QUEUED_BUFFERS){
TRACE("Too many buffers queued!\n");
LeaveCriticalSection(&This->lock);
- return COMPAT_E_INVALID_CALL(This->xa2->version);
+ return COMPAT_E_INVALID_CALL;
}
buf_idx = (This->first_buf + This->nbufs) % XAUDIO2_MAX_QUEUED_BUFFERS;
@@ -517,10 +522,10 @@ static HRESULT WINAPI XA2SRC_SubmitSourceBuffer(IXAudio2SourceVoice *iface,
* but pBuffer itself may be reused immediately */
memcpy(&buf->xa2buffer, pBuffer, sizeof(*pBuffer));
- if(This->xa2->version == 20){
- if(buf->xa2buffer.LoopCount == XAUDIO20_LOOP_INFINITE)
- buf->xa2buffer.LoopCount = XAUDIO2_LOOP_INFINITE;
- }
+#if XAUDIO2_VER == 0
+ if(buf->xa2buffer.LoopCount == XAUDIO20_LOOP_INFINITE)
+ buf->xa2buffer.LoopCount = XAUDIO2_LOOP_INFINITE;
+#endif
/* convert samples offsets to bytes */
if(This->fmt->wFormatTag == WAVE_FORMAT_ADPCM){
@@ -551,29 +556,29 @@ static HRESULT WINAPI XA2SRC_SubmitSourceBuffer(IXAudio2SourceVoice *iface,
if(buf->xa2buffer.LoopBegin >= buf->play_end_bytes){
/* this actually crashes on native xaudio 2.7 */
LeaveCriticalSection(&This->lock);
- return COMPAT_E_INVALID_CALL(This->xa2->version);
+ return COMPAT_E_INVALID_CALL;
}
buf->loop_end_bytes = buf->xa2buffer.LoopBegin + buf->xa2buffer.LoopLength;
/* xaudio 2.7 allows some invalid looping setups, but later versions
* return an error */
- if(This->xa2->version > 27){
- if(buf->loop_end_bytes > buf->play_end_bytes){
- LeaveCriticalSection(&This->lock);
- return COMPAT_E_INVALID_CALL(This->xa2->version);
- }
+#if XAUDIO2_VER > 7
+ if(buf->loop_end_bytes > buf->play_end_bytes){
+ LeaveCriticalSection(&This->lock);
+ return COMPAT_E_INVALID_CALL;
+ }
- if(buf->loop_end_bytes <= buf->xa2buffer.PlayBegin){
- LeaveCriticalSection(&This->lock);
- return COMPAT_E_INVALID_CALL(This->xa2->version);
- }
- }else{
- if(buf->loop_end_bytes <= buf->xa2buffer.PlayBegin){
- buf->xa2buffer.LoopCount = 0;
- buf->loop_end_bytes = buf->play_end_bytes;
- }
+ if(buf->loop_end_bytes <= buf->xa2buffer.PlayBegin){
+ LeaveCriticalSection(&This->lock);
+ return COMPAT_E_INVALID_CALL;
}
+#else
+ if(buf->loop_end_bytes <= buf->xa2buffer.PlayBegin){
+ buf->xa2buffer.LoopCount = 0;
+ buf->loop_end_bytes = buf->play_end_bytes;
+ }
+#endif
}else{
buf->xa2buffer.LoopLength = buf->xa2buffer.PlayLength;
buf->xa2buffer.LoopBegin = buf->xa2buffer.PlayBegin;
@@ -743,7 +748,7 @@ static HRESULT WINAPI XA2SRC_SetSourceSampleRate(
if(This->nbufs){
LeaveCriticalSection(&This->lock);
- return COMPAT_E_INVALID_CALL(This->xa2->version);
+ return COMPAT_E_INVALID_CALL;
}
This->fmt->nSamplesPerSec = NewSourceSampleRate;
@@ -1191,12 +1196,13 @@ static HRESULT WINAPI IXAudio2Impl_QueryInterface(IXAudio2 *iface, REFIID riid,
*ppvObject = &This->IXAudio2_iface;
else if(IsEqualGUID(riid, &IID_IXAudio27)){
/* all xaudio versions before 28 share an IID */
- if(This->version == 20)
- *ppvObject = &This->IXAudio20_iface;
- else if(This->version == 21 || This->version == 22)
- *ppvObject = &This->IXAudio22_iface;
- else
- *ppvObject = &This->IXAudio27_iface;
+#if XAUDIO2_VER == 0
+ *ppvObject = &This->IXAudio20_iface;
+#elif XAUDIO2_VER == 1 || XAUDIO2_VER == 2
+ *ppvObject = &This->IXAudio22_iface;
+#else
+ *ppvObject = &This->IXAudio27_iface;
+#endif
}else
*ppvObject = NULL;
@@ -1408,14 +1414,15 @@ static HRESULT WINAPI IXAudio2Impl_CreateSourceVoice(IXAudio2 *iface,
alSourcePlay(src->al_src);
- if(This->version == 20)
- *ppSourceVoice = (IXAudio2SourceVoice*)&src->IXAudio20SourceVoice_iface;
- else if(This->version <= 23)
- *ppSourceVoice = (IXAudio2SourceVoice*)&src->IXAudio23SourceVoice_iface;
- else if(This->version <= 27)
- *ppSourceVoice = (IXAudio2SourceVoice*)&src->IXAudio27SourceVoice_iface;
- else
- *ppSourceVoice = &src->IXAudio2SourceVoice_iface;
+#if XAUDIO2_VER == 0
+ *ppSourceVoice = (IXAudio2SourceVoice*)&src->IXAudio20SourceVoice_iface;
+#elif XAUDIO2_VER <= 3
+ *ppSourceVoice = (IXAudio2SourceVoice*)&src->IXAudio23SourceVoice_iface;
+#elif XAUDIO2_VER <= 7
+ *ppSourceVoice = (IXAudio2SourceVoice*)&src->IXAudio27SourceVoice_iface;
+#else
+ *ppSourceVoice = &src->IXAudio2SourceVoice_iface;
+#endif
TRACE("Created source voice: %p\n", src);
@@ -1463,12 +1470,13 @@ static HRESULT WINAPI IXAudio2Impl_CreateSubmixVoice(IXAudio2 *iface,
LeaveCriticalSection(&This->lock);
- if(This->version == 20)
- *ppSubmixVoice = (IXAudio2SubmixVoice*)&sub->IXAudio20SubmixVoice_iface;
- else if(This->version <= 23)
- *ppSubmixVoice = (IXAudio2SubmixVoice*)&sub->IXAudio23SubmixVoice_iface;
- else
- *ppSubmixVoice = &sub->IXAudio2SubmixVoice_iface;
+#if XAUDIO2_VER == 0
+ *ppSubmixVoice = (IXAudio2SubmixVoice*)&sub->IXAudio20SubmixVoice_iface;
+#elif XAUDIO2_VER <= 3
+ *ppSubmixVoice = (IXAudio2SubmixVoice*)&sub->IXAudio23SubmixVoice_iface;
+#else
+ *ppSubmixVoice = &sub->IXAudio2SubmixVoice_iface;
+#endif
TRACE("Created submix voice: %p\n", sub);
@@ -1525,7 +1533,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
/* there can only be one Mastering Voice, so just build it into XA2 */
if(This->aclient){
LeaveCriticalSection(&This->lock);
- return COMPAT_E_INVALID_CALL(This->version);
+ return COMPAT_E_INVALID_CALL;
}
if(!deviceId){
@@ -1539,7 +1547,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
hr = IMMDeviceEnumerator_GetDevice(This->devenum, deviceId, &dev);
if(FAILED(hr)){
WARN("GetDevice failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1548,7 +1556,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
if(FAILED(hr)){
WARN("Activate(IAudioClient) failed: %08x\n", hr);
IMMDevice_Release(dev);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1557,13 +1565,13 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
hr = IAudioClient_GetMixFormat(This->aclient, &fmt);
if(FAILED(hr)){
WARN("GetMixFormat failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
if(sizeof(WAVEFORMATEX) + fmt->cbSize > sizeof(WAVEFORMATEXTENSIBLE)){
FIXME("Mix format doesn't fit into WAVEFORMATEXTENSIBLE!\n");
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1587,7 +1595,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
if(hr == S_FALSE){
if(sizeof(WAVEFORMATEX) + fmt->cbSize > sizeof(WAVEFORMATEXTENSIBLE)){
FIXME("Mix format doesn't fit into WAVEFORMATEXTENSIBLE!\n");
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
memcpy(&This->fmt, fmt, sizeof(WAVEFORMATEX) + fmt->cbSize);
@@ -1598,7 +1606,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
hr = IAudioClient_GetDevicePeriod(This->aclient, &period, NULL);
if(FAILED(hr)){
WARN("GetDevicePeriod failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1610,7 +1618,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
0, &This->fmt.Format, NULL);
if(FAILED(hr)){
WARN("Initialize failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1619,7 +1627,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
hr = IAudioClient_SetEventHandle(This->aclient, This->mmevt);
if(FAILED(hr)){
WARN("Initialize failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1627,7 +1635,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
(void**)&This->render);
if(FAILED(hr)){
WARN("GetService(IAudioRenderClient) failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1665,27 +1673,27 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
if(!attrs[5]){
WARN("OpenAL can't output samples in this format\n");
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
This->al_device = palcLoopbackOpenDeviceSOFT(NULL);
if(!This->al_device){
WARN("alcLoopbackOpenDeviceSOFT failed\n");
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
This->al_ctx = alcCreateContext(This->al_device, attrs);
if(!This->al_ctx){
WARN("alcCreateContext failed\n");
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
if(alcMakeContextCurrent(This->al_ctx) == ALC_FALSE){
WARN("alcMakeContextCurrent failed\n");
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
@@ -1693,16 +1701,17 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
if (FAILED(hr))
{
WARN("Start(IAudioClient) failed: %08x\n", hr);
- hr = COMPAT_E_DEVICE_INVALIDATED(This->version);
+ hr = COMPAT_E_DEVICE_INVALIDATED;
goto exit;
}
- if(This->version <= 20)
- *ppMasteringVoice = (IXAudio2MasteringVoice*)&This->IXAudio20MasteringVoice_iface;
- else if(This->version <= 23)
- *ppMasteringVoice = (IXAudio2MasteringVoice*)&This->IXAudio23MasteringVoice_iface;
- else
- *ppMasteringVoice = &This->IXAudio2MasteringVoice_iface;
+#if XAUDIO2_VER == 0
+ *ppMasteringVoice = (IXAudio2MasteringVoice*)&This->IXAudio20MasteringVoice_iface;
+#elif XAUDIO2_VER <= 3
+ *ppMasteringVoice = (IXAudio2MasteringVoice*)&This->IXAudio23MasteringVoice_iface;
+#else
+ *ppMasteringVoice = &This->IXAudio2MasteringVoice_iface;
+#endif
exit:
if(FAILED(hr)){
@@ -1804,7 +1813,6 @@ static const IXAudio2Vtbl XAudio2_Vtbl =
struct xaudio2_cf {
IClassFactory IClassFactory_iface;
LONG ref;
- DWORD version;
};
static struct xaudio2_cf *impl_from_IClassFactory(IClassFactory *iface)
@@ -1944,11 +1952,6 @@ static HRESULT WINAPI XAudio2CF_CreateInstance(IClassFactory *iface, IUnknown *p
object->IXAudio23MasteringVoice_iface.lpVtbl = &XAudio23MasteringVoice_Vtbl;
object->IXAudio2MasteringVoice_iface.lpVtbl = &XAudio2MasteringVoice_Vtbl;
- if(IsEqualGUID(riid, &IID_IXAudio27))
- object->version = This->version;
- else /* only xaudio 2.8 has a different IID */
- object->version = 28;
-
list_init(&object->source_voices);
list_init(&object->submix_voices);
@@ -1973,7 +1976,7 @@ static HRESULT WINAPI XAudio2CF_CreateInstance(IClassFactory *iface, IUnknown *p
IXAudio2_StartEngine(&object->IXAudio2_iface);
- TRACE("Created XAudio version %u: %p\n", object->version, object);
+ TRACE("Created XAudio version %u: %p\n", 20 + XAUDIO2_VER, object);
return hr;
}
@@ -1993,11 +1996,10 @@ static const IClassFactoryVtbl XAudio2CF_Vtbl =
XAudio2CF_LockServer
};
-static IClassFactory *make_xaudio2_factory(DWORD version)
+static IClassFactory *make_xaudio2_factory(void)
{
struct xaudio2_cf *ret = HeapAlloc(GetProcessHeap(), 0, sizeof(struct xaudio2_cf));
ret->IClassFactory_iface.lpVtbl = &XAudio2CF_Vtbl;
- ret->version = version;
ret->ref = 0;
return &ret->IClassFactory_iface;
}
@@ -2008,22 +2010,15 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- if(IsEqualGUID(rclsid, &CLSID_XAudio20)){
- factory = make_xaudio2_factory(20);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio21)){
- factory = make_xaudio2_factory(21);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio22)){
- factory = make_xaudio2_factory(22);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio23)){
- factory = make_xaudio2_factory(23);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio24)){
- factory = make_xaudio2_factory(24);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio25)){
- factory = make_xaudio2_factory(25);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio26)){
- factory = make_xaudio2_factory(26);
- }else if(IsEqualGUID(rclsid, &CLSID_XAudio27)){
- factory = make_xaudio2_factory(27);
+ if(IsEqualGUID(rclsid, &CLSID_XAudio20) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio21) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio22) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio23) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio24) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio25) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio26) ||
+ IsEqualGUID(rclsid, &CLSID_XAudio27)){
+ factory = make_xaudio2_factory();
}else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter20)){
factory = make_xapo_factory(&CLSID_AudioVolumeMeter27, 20);
@@ -2080,7 +2075,7 @@ HRESULT WINAPI XAudio2Create(IXAudio2 **ppxa2, UINT32 flags, XAUDIO2_PROCESSOR p
IXAudio27 *xa27;
IClassFactory *cf;
- cf = make_xaudio2_factory(28);
+ cf = make_xaudio2_factory();
hr = IClassFactory_CreateInstance(cf, NULL, &IID_IXAudio2, (void**)&xa2);
IClassFactory_Release(cf);
@@ -2291,11 +2286,12 @@ static void do_engine_tick(IXAudio2Impl *This)
}
if(src->cb){
- if(This->version == 20)
- IXAudio20VoiceCallback_OnVoiceProcessingPassStart((IXAudio20VoiceCallback*)src->cb);
- else
- /* TODO: detect incoming underrun and inform callback */
- IXAudio2VoiceCallback_OnVoiceProcessingPassStart(src->cb, 0);
+#if XAUDIO2_VER == 0
+ IXAudio20VoiceCallback_OnVoiceProcessingPassStart((IXAudio20VoiceCallback*)src->cb);
+#else
+ /* TODO: detect incoming underrun and inform callback */
+ IXAudio2VoiceCallback_OnVoiceProcessingPassStart(src->cb, 0);
+#endif
}
update_source_state(src);
diff --git a/dlls/xaudio2_7/xaudio_private.h b/dlls/xaudio2_7/xaudio_private.h
index cba8306..81db339 100644
--- a/dlls/xaudio2_7/xaudio_private.h
+++ b/dlls/xaudio2_7/xaudio_private.h
@@ -109,8 +109,6 @@ struct _IXAudio2Impl {
HANDLE engine, mmevt;
BOOL stop_engine;
- DWORD version;
-
struct list source_voices;
struct list submix_voices;
--
2.7.0
More information about the wine-patches
mailing list