xaudio2: IXAudio23 needs its own interface, for XAUDIO23_VOICE_SENDS parameters.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46727 Signed-off-by: Ethan Lee <elee@codeweavers.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ac8be6a1a2
commit
b49b78db49
|
@ -2488,6 +2488,222 @@ const IXAudio22Vtbl XAudio22_Vtbl = {
|
||||||
XA22_SetDebugConfiguration
|
XA22_SetDebugConfiguration
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#elif XAUDIO2_VER <= 3
|
||||||
|
|
||||||
|
static inline IXAudio2Impl *impl_from_IXAudio23(IXAudio23 *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, IXAudio2Impl, IXAudio23_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_QueryInterface(IXAudio23 *iface, REFIID riid,
|
||||||
|
void **ppvObject)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_QueryInterface(&This->IXAudio2_iface, riid, ppvObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI XA23_AddRef(IXAudio23 *iface)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_AddRef(&This->IXAudio2_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI XA23_Release(IXAudio23 *iface)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_Release(&This->IXAudio2_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_GetDeviceCount(IXAudio23 *iface, UINT32 *pCount)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
TRACE("%p, %p\n", This, pCount);
|
||||||
|
return FAudio_GetDeviceCount(This->faudio, pCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_GetDeviceDetails(IXAudio23 *iface, UINT32 index,
|
||||||
|
XAUDIO2_DEVICE_DETAILS *pDeviceDetails)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
TRACE("%p, %u, %p\n", This, index, pDeviceDetails);
|
||||||
|
return FAudio_GetDeviceDetails(This->faudio, index, (FAudioDeviceDetails *)pDeviceDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_Initialize(IXAudio23 *iface, UINT32 flags,
|
||||||
|
XAUDIO2_PROCESSOR processor)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
TRACE("(%p)->(0x%x, 0x%x)\n", This, flags, processor);
|
||||||
|
return xaudio2_initialize(This, flags, processor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_RegisterForCallbacks(IXAudio23 *iface,
|
||||||
|
IXAudio2EngineCallback *pCallback)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_RegisterForCallbacks(&This->IXAudio2_iface, pCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI XA23_UnregisterForCallbacks(IXAudio23 *iface,
|
||||||
|
IXAudio2EngineCallback *pCallback)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
IXAudio2_UnregisterForCallbacks(&This->IXAudio2_iface, pCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_CreateSourceVoice(IXAudio23 *iface,
|
||||||
|
IXAudio2SourceVoice **ppSourceVoice, const WAVEFORMATEX *pSourceFormat,
|
||||||
|
UINT32 flags, float maxFrequencyRatio,
|
||||||
|
IXAudio2VoiceCallback *pCallback, const XAUDIO23_VOICE_SENDS *pSendList,
|
||||||
|
const XAUDIO2_EFFECT_CHAIN *pEffectChain)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
XAUDIO2_VOICE_SENDS sends, *psends = NULL;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if(pSendList){
|
||||||
|
sends.SendCount = pSendList->OutputCount;
|
||||||
|
sends.pSends = convert_send_descriptors23(pSendList);
|
||||||
|
psends = &sends;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IXAudio2_CreateSourceVoice(&This->IXAudio2_iface, ppSourceVoice,
|
||||||
|
pSourceFormat, flags, maxFrequencyRatio, pCallback, psends,
|
||||||
|
pEffectChain);
|
||||||
|
|
||||||
|
if(pSendList)
|
||||||
|
HeapFree(GetProcessHeap(), 0, sends.pSends);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_CreateSubmixVoice(IXAudio23 *iface,
|
||||||
|
IXAudio2SubmixVoice **ppSubmixVoice, UINT32 inputChannels,
|
||||||
|
UINT32 inputSampleRate, UINT32 flags, UINT32 processingStage,
|
||||||
|
const XAUDIO23_VOICE_SENDS *pSendList,
|
||||||
|
const XAUDIO2_EFFECT_CHAIN *pEffectChain)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
XAUDIO2_VOICE_SENDS sends, *psends = NULL;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if(pSendList){
|
||||||
|
sends.SendCount = pSendList->OutputCount;
|
||||||
|
sends.pSends = convert_send_descriptors23(pSendList);
|
||||||
|
psends = &sends;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IXAudio2_CreateSubmixVoice(&This->IXAudio2_iface, ppSubmixVoice,
|
||||||
|
inputChannels, inputSampleRate, flags, processingStage, psends,
|
||||||
|
pEffectChain);
|
||||||
|
|
||||||
|
if(pSendList)
|
||||||
|
HeapFree(GetProcessHeap(), 0, sends.pSends);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_CreateMasteringVoice(IXAudio23 *iface,
|
||||||
|
IXAudio2MasteringVoice **ppMasteringVoice, UINT32 inputChannels,
|
||||||
|
UINT32 inputSampleRate, UINT32 flags, UINT32 deviceIndex,
|
||||||
|
const XAUDIO2_EFFECT_CHAIN *pEffectChain)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
|
||||||
|
TRACE("(%p)->(%p, %u, %u, 0x%x, %u, %p)\n", This, ppMasteringVoice,
|
||||||
|
inputChannels, inputSampleRate, flags, deviceIndex,
|
||||||
|
pEffectChain);
|
||||||
|
|
||||||
|
EnterCriticalSection(&This->lock);
|
||||||
|
|
||||||
|
/* XAUDIO2_VER == 3 */
|
||||||
|
*ppMasteringVoice = (IXAudio2MasteringVoice*)&This->mst.IXAudio23MasteringVoice_iface;
|
||||||
|
|
||||||
|
EnterCriticalSection(&This->mst.lock);
|
||||||
|
|
||||||
|
if(This->mst.in_use){
|
||||||
|
LeaveCriticalSection(&This->mst.lock);
|
||||||
|
LeaveCriticalSection(&This->lock);
|
||||||
|
return COMPAT_E_INVALID_CALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LeaveCriticalSection(&This->lock);
|
||||||
|
|
||||||
|
This->mst.effect_chain = wrap_effect_chain(pEffectChain);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&This->mst.engine_lock);
|
||||||
|
|
||||||
|
This->mst.engine_thread = CreateThread(NULL, 0, &engine_thread, &This->mst, 0, NULL);
|
||||||
|
|
||||||
|
pthread_cond_wait(&This->mst.engine_done, &This->mst.engine_lock);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&This->mst.engine_lock);
|
||||||
|
|
||||||
|
FAudio_SetEngineProcedureEXT(This->faudio, &engine_cb, &This->mst);
|
||||||
|
|
||||||
|
FAudio_CreateMasteringVoice(This->faudio, &This->mst.faudio_voice, inputChannels,
|
||||||
|
inputSampleRate, flags, deviceIndex, This->mst.effect_chain);
|
||||||
|
|
||||||
|
This->mst.in_use = TRUE;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&This->mst.lock);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_StartEngine(IXAudio23 *iface)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_StartEngine(&This->IXAudio2_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI XA23_StopEngine(IXAudio23 *iface)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_StopEngine(&This->IXAudio2_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI XA23_CommitChanges(IXAudio23 *iface, UINT32 operationSet)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_CommitChanges(&This->IXAudio2_iface, operationSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI XA23_GetPerformanceData(IXAudio23 *iface,
|
||||||
|
XAUDIO2_PERFORMANCE_DATA *pPerfData)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_GetPerformanceData(&This->IXAudio2_iface, pPerfData);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI XA23_SetDebugConfiguration(IXAudio23 *iface,
|
||||||
|
const XAUDIO2_DEBUG_CONFIGURATION *pDebugConfiguration,
|
||||||
|
void *pReserved)
|
||||||
|
{
|
||||||
|
IXAudio2Impl *This = impl_from_IXAudio23(iface);
|
||||||
|
return IXAudio2_SetDebugConfiguration(&This->IXAudio2_iface,
|
||||||
|
pDebugConfiguration, pReserved);
|
||||||
|
}
|
||||||
|
|
||||||
|
const IXAudio23Vtbl XAudio23_Vtbl = {
|
||||||
|
XA23_QueryInterface,
|
||||||
|
XA23_AddRef,
|
||||||
|
XA23_Release,
|
||||||
|
XA23_GetDeviceCount,
|
||||||
|
XA23_GetDeviceDetails,
|
||||||
|
XA23_Initialize,
|
||||||
|
XA23_RegisterForCallbacks,
|
||||||
|
XA23_UnregisterForCallbacks,
|
||||||
|
XA23_CreateSourceVoice,
|
||||||
|
XA23_CreateSubmixVoice,
|
||||||
|
XA23_CreateMasteringVoice,
|
||||||
|
XA23_StartEngine,
|
||||||
|
XA23_StopEngine,
|
||||||
|
XA23_CommitChanges,
|
||||||
|
XA23_GetPerformanceData,
|
||||||
|
XA23_SetDebugConfiguration
|
||||||
|
};
|
||||||
|
|
||||||
#elif XAUDIO2_VER <= 7
|
#elif XAUDIO2_VER <= 7
|
||||||
|
|
||||||
static inline IXAudio2Impl *impl_from_IXAudio27(IXAudio27 *iface)
|
static inline IXAudio2Impl *impl_from_IXAudio27(IXAudio27 *iface)
|
||||||
|
@ -2588,12 +2804,8 @@ static HRESULT WINAPI XA27_CreateMasteringVoice(IXAudio27 *iface,
|
||||||
|
|
||||||
EnterCriticalSection(&This->lock);
|
EnterCriticalSection(&This->lock);
|
||||||
|
|
||||||
/* 3 <= XAUDIO2_VER <= 7 */
|
/* 4 <= XAUDIO2_VER <= 7 */
|
||||||
#if XAUDIO2_VER == 3
|
|
||||||
*ppMasteringVoice = (IXAudio2MasteringVoice*)&This->mst.IXAudio23MasteringVoice_iface;
|
|
||||||
#else
|
|
||||||
*ppMasteringVoice = (IXAudio2MasteringVoice*)&This->mst.IXAudio27MasteringVoice_iface;
|
*ppMasteringVoice = (IXAudio2MasteringVoice*)&This->mst.IXAudio27MasteringVoice_iface;
|
||||||
#endif
|
|
||||||
|
|
||||||
EnterCriticalSection(&This->mst.lock);
|
EnterCriticalSection(&This->mst.lock);
|
||||||
|
|
||||||
|
|
|
@ -1400,6 +1400,8 @@ static HRESULT WINAPI IXAudio2Impl_QueryInterface(IXAudio2 *iface, REFIID riid,
|
||||||
*ppvObject = &This->IXAudio20_iface;
|
*ppvObject = &This->IXAudio20_iface;
|
||||||
#elif XAUDIO2_VER <= 2
|
#elif XAUDIO2_VER <= 2
|
||||||
*ppvObject = &This->IXAudio22_iface;
|
*ppvObject = &This->IXAudio22_iface;
|
||||||
|
#elif XAUDIO2_VER <= 3
|
||||||
|
*ppvObject = &This->IXAudio23_iface;
|
||||||
#elif XAUDIO2_VER <= 7
|
#elif XAUDIO2_VER <= 7
|
||||||
*ppvObject = &This->IXAudio27_iface;
|
*ppvObject = &This->IXAudio27_iface;
|
||||||
#else
|
#else
|
||||||
|
@ -1902,6 +1904,8 @@ static HRESULT WINAPI XAudio2CF_CreateInstance(IClassFactory *iface, IUnknown *p
|
||||||
object->IXAudio20_iface.lpVtbl = &XAudio20_Vtbl;
|
object->IXAudio20_iface.lpVtbl = &XAudio20_Vtbl;
|
||||||
#elif XAUDIO2_VER <= 2
|
#elif XAUDIO2_VER <= 2
|
||||||
object->IXAudio22_iface.lpVtbl = &XAudio22_Vtbl;
|
object->IXAudio22_iface.lpVtbl = &XAudio22_Vtbl;
|
||||||
|
#elif XAUDIO2_VER <= 3
|
||||||
|
object->IXAudio23_iface.lpVtbl = &XAudio23_Vtbl;
|
||||||
#elif XAUDIO2_VER <= 7
|
#elif XAUDIO2_VER <= 7
|
||||||
object->IXAudio27_iface.lpVtbl = &XAudio27_Vtbl;
|
object->IXAudio27_iface.lpVtbl = &XAudio27_Vtbl;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -111,6 +111,8 @@ typedef struct _IXAudio2Impl {
|
||||||
IXAudio20 IXAudio20_iface;
|
IXAudio20 IXAudio20_iface;
|
||||||
#elif XAUDIO2_VER <= 2
|
#elif XAUDIO2_VER <= 2
|
||||||
IXAudio22 IXAudio22_iface;
|
IXAudio22 IXAudio22_iface;
|
||||||
|
#elif XAUDIO2_VER <= 3
|
||||||
|
IXAudio23 IXAudio23_iface;
|
||||||
#elif XAUDIO2_VER <= 7
|
#elif XAUDIO2_VER <= 7
|
||||||
IXAudio27 IXAudio27_iface;
|
IXAudio27 IXAudio27_iface;
|
||||||
#endif
|
#endif
|
||||||
|
@ -158,6 +160,8 @@ extern XA2VoiceImpl *impl_from_IXAudio27MasteringVoice(IXAudio27MasteringVoice *
|
||||||
extern const IXAudio20Vtbl XAudio20_Vtbl DECLSPEC_HIDDEN;
|
extern const IXAudio20Vtbl XAudio20_Vtbl DECLSPEC_HIDDEN;
|
||||||
#elif XAUDIO2_VER <= 2
|
#elif XAUDIO2_VER <= 2
|
||||||
extern const IXAudio22Vtbl XAudio22_Vtbl DECLSPEC_HIDDEN;
|
extern const IXAudio22Vtbl XAudio22_Vtbl DECLSPEC_HIDDEN;
|
||||||
|
#elif XAUDIO2_VER <= 3
|
||||||
|
extern const IXAudio23Vtbl XAudio23_Vtbl DECLSPEC_HIDDEN;
|
||||||
#elif XAUDIO2_VER <= 7
|
#elif XAUDIO2_VER <= 7
|
||||||
extern const IXAudio27Vtbl XAudio27_Vtbl DECLSPEC_HIDDEN;
|
extern const IXAudio27Vtbl XAudio27_Vtbl DECLSPEC_HIDDEN;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1050,6 +1050,67 @@ interface IXAudio22 : IUnknown
|
||||||
[in, defaultvalue(NULL)] void* pReserved);
|
[in, defaultvalue(NULL)] void* pReserved);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb), /* all versions before 28 share IID_IXAudio */
|
||||||
|
]
|
||||||
|
/* XAudio2 2.3's IXAudio2 interface. Actually called IXAudio2 in the Nov 2008
|
||||||
|
* DX SDK */
|
||||||
|
interface IXAudio23 : IUnknown
|
||||||
|
{
|
||||||
|
HRESULT GetDeviceCount([out] UINT32* pCount);
|
||||||
|
|
||||||
|
HRESULT GetDeviceDetails(
|
||||||
|
[in] UINT32 Index,
|
||||||
|
[out] XAUDIO2_DEVICE_DETAILS* pDeviceDetails);
|
||||||
|
|
||||||
|
HRESULT Initialize(
|
||||||
|
[in, defaultvalue(0)] UINT32 Flags,
|
||||||
|
[in, defaultvalue(XAUDIO2_DEFAULT_PROCESSOR)] XAUDIO2_PROCESSOR XAudio2Processor);
|
||||||
|
|
||||||
|
HRESULT RegisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
|
||||||
|
|
||||||
|
void UnregisterForCallbacks([in] IXAudio2EngineCallback* pCallback);
|
||||||
|
|
||||||
|
HRESULT CreateSourceVoice(
|
||||||
|
[out] IXAudio2SourceVoice** ppSourceVoice,
|
||||||
|
[in] const WAVEFORMATEX* pSourceFormat,
|
||||||
|
[in, defaultvalue(0)] UINT32 Flags,
|
||||||
|
[in, defaultvalue(XAUDIO2_DEFAULT_FREQ_RATIO)] float MaxFrequencyRatio,
|
||||||
|
[in, defaultvalue(NULL)] IXAudio2VoiceCallback* pCallback,
|
||||||
|
[in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
|
||||||
|
[in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
|
||||||
|
|
||||||
|
HRESULT CreateSubmixVoice(
|
||||||
|
[out] IXAudio2SubmixVoice** ppSubmixVoice,
|
||||||
|
[in] UINT32 InputChannels,
|
||||||
|
[in] UINT32 InputSampleRate,
|
||||||
|
[in, defaultvalue(0)] UINT32 Flags,
|
||||||
|
[in, defaultvalue(0)] UINT32 ProcessingStage,
|
||||||
|
[in, defaultvalue(NULL)] const XAUDIO23_VOICE_SENDS* pSendList,
|
||||||
|
[in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
|
||||||
|
|
||||||
|
HRESULT CreateMasteringVoice(
|
||||||
|
[out] IXAudio2MasteringVoice** ppMasteringVoice,
|
||||||
|
[in, defaultvalue(XAUDIO2_DEFAULT_CHANNELS)] UINT32 InputChannels,
|
||||||
|
[in, defaultvalue(XAUDIO2_DEFAULT_SAMPLERATE)] UINT32 InputSampleRate,
|
||||||
|
[in, defaultvalue(0)] UINT32 Flags,
|
||||||
|
[in, defaultvalue(0)] UINT32 DeviceIndex,
|
||||||
|
[in, defaultvalue(NULL)] const XAUDIO2_EFFECT_CHAIN* pEffectChain);
|
||||||
|
|
||||||
|
HRESULT StartEngine();
|
||||||
|
|
||||||
|
void StopEngine();
|
||||||
|
|
||||||
|
HRESULT CommitChanges([in] UINT32 OperationSet);
|
||||||
|
|
||||||
|
void GetPerformanceData([out] XAUDIO2_PERFORMANCE_DATA* pPerfData);
|
||||||
|
|
||||||
|
[local] void SetDebugConfiguration(
|
||||||
|
[in] const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
|
||||||
|
[in, defaultvalue(NULL)] void* pReserved);
|
||||||
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
object,
|
object,
|
||||||
uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb),
|
uuid(8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb),
|
||||||
|
|
Loading…
Reference in New Issue