From a0157f57cbe7e8274afdda9067b30e4b155bff70 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Mon, 25 Sep 2017 13:14:12 -0500 Subject: [PATCH] wineandroid: Create OpenSL outputmix object globally. This object will take multiple inputs, no need to re-create it for every IAudioClient. Signed-off-by: Andrew Eikum Signed-off-by: Alexandre Julliard --- dlls/wineandroid.drv/mmdevdrv.c | 40 ++++++++++++++------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/dlls/wineandroid.drv/mmdevdrv.c b/dlls/wineandroid.drv/mmdevdrv.c index 6b05c509f7a..d661fb5a632 100644 --- a/dlls/wineandroid.drv/mmdevdrv.c +++ b/dlls/wineandroid.drv/mmdevdrv.c @@ -128,7 +128,6 @@ struct ACImpl { HANDLE event; float *vols; - SLObjectItf outputmix; SLObjectItf player; SLObjectItf recorder; SLAndroidSimpleBufferQueueItf bufq; @@ -284,6 +283,7 @@ int WINAPI AUDDRV_GetPriority(void) static SLObjectItf sl; static SLEngineItf engine; +static SLObjectItf outputmix; HRESULT AUDDRV_Init(void) { @@ -310,6 +310,21 @@ HRESULT AUDDRV_Init(void) return E_FAIL; } + sr = SLCALL(engine, CreateOutputMix, &outputmix, 0, NULL, NULL); + if(sr != SL_RESULT_SUCCESS){ + SLCALL_N(sl, Destroy); + WARN("CreateOutputMix failed: 0x%x\n", sr); + return E_FAIL; + } + + sr = SLCALL(outputmix, Realize, SL_BOOLEAN_FALSE); + if(sr != SL_RESULT_SUCCESS){ + SLCALL_N(outputmix, Destroy); + SLCALL_N(sl, Destroy); + WARN("outputmix Realize failed: 0x%x\n", sr); + return E_FAIL; + } + return S_OK; } @@ -347,7 +362,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, ACImpl *This; HRESULT hr; EDataFlow flow; - SLresult sr; TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); @@ -372,24 +386,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, return hr; } - if(flow == eRender){ - sr = SLCALL(engine, CreateOutputMix, &This->outputmix, 0, NULL, NULL); - if(sr != SL_RESULT_SUCCESS){ - WARN("CreateOutputMix failed: 0x%x\n", sr); - HeapFree(GetProcessHeap(), 0, This); - return E_FAIL; - } - - sr = SLCALL(This->outputmix, Realize, SL_BOOLEAN_FALSE); - if(sr != SL_RESULT_SUCCESS){ - SLCALL_N(This->outputmix, Destroy); - This->outputmix = NULL; - HeapFree(GetProcessHeap(), 0, This); - WARN("outputmix Realize failed: 0x%x\n", sr); - return E_FAIL; - } - } - This->dataflow = flow; This->IAudioClient_iface.lpVtbl = &AudioClient_Vtbl; @@ -472,8 +468,6 @@ static ULONG WINAPI AudioClient_Release(IAudioClient *iface) SLCALL_N(This->recorder, Destroy); if(This->player) SLCALL_N(This->player, Destroy); - if(This->outputmix) - SLCALL_N(This->outputmix, Destroy); if(This->initted){ EnterCriticalSection(&g_sessions_lock); @@ -776,7 +770,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface, source.pFormat = &pcm; loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; - loc_outmix.outputMix = This->outputmix; + loc_outmix.outputMix = outputmix; sink.pLocator = &loc_outmix; sink.pFormat = NULL;