[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