Module: wine Branch: master Commit: 41c6ffea440f0814b16b3499f4d7dbdfdd7699e7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=41c6ffea440f0814b16b3499f4...
Author: Jörg Höhle hoehle@users.sourceforge.net Date: Sun Aug 21 06:53:56 2011 +0200
winecoreaudio: Release buffer memory.
---
dlls/winecoreaudio.drv/mmdevdrv.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index c45a8c6..79cf5e3 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -509,16 +509,27 @@ static ULONG WINAPI AudioClient_Release(IAudioClient *iface) ref = InterlockedDecrement(&This->ref); TRACE("(%p) Refcount now %u\n", This, ref); if(!ref){ - IAudioClient_Stop(iface); - if(This->aqueue) + if(This->aqueue){ + AQBuffer *buf, *next; + if(This->public_buffer){ + buf = This->public_buffer->mUserData; + list_add_tail(&This->avail_buffers, &buf->entry); + } + IAudioClient_Stop(iface); + AudioQueueStop(This->aqueue, 1); + /* Stopped synchronously, all buffers returned. */ + LIST_FOR_EACH_ENTRY_SAFE(buf, next, &This->avail_buffers, AQBuffer, entry){ + AudioQueueFreeBuffer(This->aqueue, buf->buf); + HeapFree(GetProcessHeap(), 0, buf); + } AudioQueueDispose(This->aqueue, 1); + } if(This->session){ EnterCriticalSection(&g_sessions_lock); list_remove(&This->entry); LeaveCriticalSection(&g_sessions_lock); } HeapFree(GetProcessHeap(), 0, This->vols); - HeapFree(GetProcessHeap(), 0, This->public_buffer); CoTaskMemFree(This->fmt); IMMDevice_Release(This->parent); HeapFree(GetProcessHeap(), 0, This);