[PATCH 2/3] xaudio2: Add stub IXAudio2MasteringVoice implementation

Andrew Eikum aeikum at codeweavers.com
Thu Aug 20 15:06:12 CDT 2015


---

This is the start of a sequence to implement xaudio2. It will depend
on OpenAL-soft for software mixing, and later on FFmpeg for audio
format conversion (WMA to PCM).

The full sequence:

xaudio2: Add stub IXAudio2MasteringVoice implementation
xaudio2: Stub IXAudio2SourceVoice
xaudio2: Stub IXAudio2SubmixVoice
xaudio2: Implement IXAudio2::GetDeviceDetails
xaudio2: Implement IXAudio2SourceVoice::SetOutputVoices
xaudio2: Implement device activation
xaudio2: Implement IXAudio2SourceVoice::Play
xaudio2: Partially implement GetPerformanceData
xaudio2: Implement IXAudio2::RegisterForCallbacks
xaudio2: Implement the audio mixing thread (introduces openal-soft dependency)
xaudio2: Implement IXAudio2SourceVoice::SubmitSourceBuffer
xaudio2: Implement IXAudio2SourceVoice::GetState
xaudio2: Implement IXAudio2SourceVoice::SetVolume
xaudio2: Implement IXAudio2SourceVoice::FlushSourceBuffers
xaudio2/tests: Add a simple audio streaming test
xaudio2/tests: Add callback tests
include/xapo.idl: Add descriptions for IXAPO and IXAPOProperties
xaudio2: Add stub implementation of AudioVolumeMeter
xaudio2: Add stub for AudioReverb class
xaudio2: Use ffmpeg to convert non-PCM formats (introduces ffmpeg dependency)
xaudio2: Support looping buffers
xaudio2: Implement IXAudio2SourceVoice::SetFrequencyRatio
xaudio2: Call OnStreamEnd callback

 dlls/xaudio2_7/xaudio_dll.c | 205 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 204 insertions(+), 1 deletion(-)

diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 03909bd..b7bf390 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -28,6 +28,7 @@
 #include "rpcproxy.h"
 
 #include "wine/debug.h"
+#include "wine/list.h"
 #include <propsys.h>
 #include "initguid.h"
 
@@ -73,6 +74,8 @@ HRESULT WINAPI DllUnregisterServer(void)
 typedef struct {
     IXAudio27 IXAudio27_iface;
     IXAudio2 IXAudio2_iface;
+    IXAudio2MasteringVoice IXAudio2MasteringVoice_iface;
+
     LONG ref;
 
     DWORD version;
@@ -88,6 +91,194 @@ static inline IXAudio2Impl *impl_from_IXAudio27(IXAudio27 *iface)
     return CONTAINING_RECORD(iface, IXAudio2Impl, IXAudio27_iface);
 }
 
+IXAudio2Impl *impl_from_IXAudio2MasteringVoice(IXAudio2MasteringVoice *iface)
+{
+    return CONTAINING_RECORD(iface, IXAudio2Impl, IXAudio2MasteringVoice_iface);
+}
+
+static void WINAPI XA2M_GetVoiceDetails(IXAudio2MasteringVoice *iface,
+        XAUDIO2_VOICE_DETAILS *pVoiceDetails)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p\n", This, pVoiceDetails);
+}
+
+static HRESULT WINAPI XA2M_SetOutputVoices(IXAudio2MasteringVoice *iface,
+        const XAUDIO2_VOICE_SENDS *pSendList)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p\n", This, pSendList);
+    return S_OK;
+}
+
+static HRESULT WINAPI XA2M_SetEffectChain(IXAudio2MasteringVoice *iface,
+        const XAUDIO2_EFFECT_CHAIN *pEffectChain)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p\n", This, pEffectChain);
+    return S_OK;
+}
+
+static HRESULT WINAPI XA2M_EnableEffect(IXAudio2MasteringVoice *iface, UINT32 EffectIndex,
+        UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, 0x%x\n", This, EffectIndex, OperationSet);
+    return S_OK;
+}
+
+static HRESULT WINAPI XA2M_DisableEffect(IXAudio2MasteringVoice *iface, UINT32 EffectIndex,
+        UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, 0x%x\n", This, EffectIndex, OperationSet);
+    return S_OK;
+}
+
+static void WINAPI XA2M_GetEffectState(IXAudio2MasteringVoice *iface, UINT32 EffectIndex,
+        BOOL *pEnabled)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, %p\n", This, EffectIndex, pEnabled);
+}
+
+static HRESULT WINAPI XA2M_SetEffectParameters(IXAudio2MasteringVoice *iface,
+        UINT32 EffectIndex, const void *pParameters, UINT32 ParametersByteSize,
+        UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, %p, 0x%x, 0x%x\n", This, EffectIndex, pParameters,
+            ParametersByteSize, OperationSet);
+    return S_OK;
+}
+
+static HRESULT WINAPI XA2M_GetEffectParameters(IXAudio2MasteringVoice *iface,
+        UINT32 EffectIndex, void *pParameters, UINT32 ParametersByteSize)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, %p, 0x%x\n", This, EffectIndex, pParameters,
+            ParametersByteSize);
+    return S_OK;
+}
+
+static HRESULT WINAPI XA2M_SetFilterParameters(IXAudio2MasteringVoice *iface,
+        const XAUDIO2_FILTER_PARAMETERS *pParameters, UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p, 0x%x\n", This, pParameters, OperationSet);
+    return S_OK;
+}
+
+static void WINAPI XA2M_GetFilterParameters(IXAudio2MasteringVoice *iface,
+        XAUDIO2_FILTER_PARAMETERS *pParameters)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p\n", This, pParameters);
+}
+
+static HRESULT WINAPI XA2M_SetOutputFilterParameters(IXAudio2MasteringVoice *iface,
+        IXAudio2Voice *pDestinationVoice,
+        const XAUDIO2_FILTER_PARAMETERS *pParameters, UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p, %p, 0x%x\n", This, pDestinationVoice, pParameters, OperationSet);
+    return S_OK;
+}
+
+static void WINAPI XA2M_GetOutputFilterParameters(IXAudio2MasteringVoice *iface,
+        IXAudio2Voice *pDestinationVoice,
+        XAUDIO2_FILTER_PARAMETERS *pParameters)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p, %p\n", This, pDestinationVoice, pParameters);
+}
+
+static HRESULT WINAPI XA2M_SetVolume(IXAudio2MasteringVoice *iface, float Volume,
+        UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %f, 0x%x\n", This, Volume, OperationSet);
+    return S_OK;
+}
+
+static void WINAPI XA2M_GetVolume(IXAudio2MasteringVoice *iface, float *pVolume)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p\n", This, pVolume);
+}
+
+static HRESULT WINAPI XA2M_SetChannelVolumes(IXAudio2MasteringVoice *iface, UINT32 Channels,
+        const float *pVolumes, UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, %p, 0x%x\n", This, Channels, pVolumes, OperationSet);
+    return S_OK;
+}
+
+static void WINAPI XA2M_GetChannelVolumes(IXAudio2MasteringVoice *iface, UINT32 Channels,
+        float *pVolumes)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %u, %p\n", This, Channels, pVolumes);
+}
+
+static HRESULT WINAPI XA2M_SetOutputMatrix(IXAudio2MasteringVoice *iface,
+        IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels,
+        UINT32 DestinationChannels, const float *pLevelMatrix,
+        UINT32 OperationSet)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p, %u, %u, %p, 0x%x\n", This, pDestinationVoice,
+            SourceChannels, DestinationChannels, pLevelMatrix, OperationSet);
+    return S_OK;
+}
+
+static void WINAPI XA2M_GetOutputMatrix(IXAudio2MasteringVoice *iface,
+        IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels,
+        UINT32 DestinationChannels, float *pLevelMatrix)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p, %p, %u, %u, %p\n", This, pDestinationVoice,
+            SourceChannels, DestinationChannels, pLevelMatrix);
+}
+
+static void WINAPI XA2M_DestroyVoice(IXAudio2MasteringVoice *iface)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p\n", This);
+}
+
+/* not present in XAudio2 2.7 */
+static void WINAPI XA2M_GetChannelMask(IXAudio2MasteringVoice *iface,
+        DWORD *pChannelMask)
+{
+    IXAudio2Impl *This = impl_from_IXAudio2MasteringVoice(iface);
+    TRACE("%p %p\n", This, pChannelMask);
+}
+
+struct IXAudio2MasteringVoiceVtbl XAudio2MasteringVoice_Vtbl = {
+    XA2M_GetVoiceDetails,
+    XA2M_SetOutputVoices,
+    XA2M_SetEffectChain,
+    XA2M_EnableEffect,
+    XA2M_DisableEffect,
+    XA2M_GetEffectState,
+    XA2M_SetEffectParameters,
+    XA2M_GetEffectParameters,
+    XA2M_SetFilterParameters,
+    XA2M_GetFilterParameters,
+    XA2M_SetOutputFilterParameters,
+    XA2M_GetOutputFilterParameters,
+    XA2M_SetVolume,
+    XA2M_GetVolume,
+    XA2M_SetChannelVolumes,
+    XA2M_GetChannelVolumes,
+    XA2M_SetOutputMatrix,
+    XA2M_GetOutputMatrix,
+    XA2M_DestroyVoice,
+    XA2M_GetChannelMask
+};
+
 static HRESULT WINAPI IXAudio2Impl_QueryInterface(IXAudio2 *iface, REFIID riid,
         void **ppvObject)
 {
@@ -194,7 +385,18 @@ static HRESULT WINAPI IXAudio2Impl_CreateMasteringVoice(IXAudio2 *iface,
             ppMasteringVoice, inputChannels, inputSampleRate, flags,
             wine_dbgstr_w(deviceId), pEffectChain, streamCategory);
 
-    return E_NOTIMPL;
+    if(flags != 0)
+        WARN("Unknown flags set: 0x%x\n", flags);
+
+    if(pEffectChain)
+        WARN("Effect chain is unimplemented\n");
+
+    /* TODO: Initialize mmdevice */
+
+    /* there can only be one Mastering Voice, so just build it into XA2 */
+    *ppMasteringVoice = &This->IXAudio2MasteringVoice_iface;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI IXAudio2Impl_StartEngine(IXAudio2 *iface)
@@ -450,6 +652,7 @@ static HRESULT WINAPI XAudio2CF_CreateInstance(IClassFactory *iface, IUnknown *p
 
     object->IXAudio27_iface.lpVtbl = &XAudio27_Vtbl;
     object->IXAudio2_iface.lpVtbl = &XAudio2_Vtbl;
+    object->IXAudio2MasteringVoice_iface.lpVtbl = &XAudio2MasteringVoice_Vtbl;
 
     if(IsEqualGUID(riid, &IID_IXAudio27))
         object->version = 27;
-- 
2.5.0





More information about the wine-patches mailing list