winealsa: Use NtAllocateVirtualMemory() to alloc the buffers returned to the user.
Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
9eb0ec9037
commit
7262da2afc
|
@ -597,12 +597,19 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
|
|||
}
|
||||
HeapFree(GetProcessHeap(), 0, This->vols);
|
||||
if (stream){
|
||||
SIZE_T size;
|
||||
snd_pcm_drop(stream->pcm_handle);
|
||||
snd_pcm_close(stream->pcm_handle);
|
||||
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
|
||||
if(stream->local_buffer){
|
||||
size = 0;
|
||||
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
|
||||
}
|
||||
if(stream->tmp_buffer){
|
||||
size = 0;
|
||||
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, stream->remapping_buf);
|
||||
HeapFree(GetProcessHeap(), 0, stream->silence_buf);
|
||||
HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
|
||||
HeapFree(GetProcessHeap(), 0, stream->hw_params);
|
||||
CoTaskMemFree(stream->fmt);
|
||||
HeapFree(GetProcessHeap(), 0, stream->vols);
|
||||
|
@ -928,6 +935,7 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
|
|||
unsigned int rate, alsa_period_us;
|
||||
int err, i;
|
||||
HRESULT hr = S_OK;
|
||||
SIZE_T size;
|
||||
|
||||
TRACE("(%p)->(%x, %x, %s, %s, %p, %s)\n", This, mode, flags,
|
||||
wine_dbgstr_longlong(duration), wine_dbgstr_longlong(period), fmt, debugstr_guid(sessionguid));
|
||||
|
@ -1158,9 +1166,9 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
stream->local_buffer = HeapAlloc(GetProcessHeap(), 0,
|
||||
stream->bufsize_frames * fmt->nBlockAlign);
|
||||
if(!stream->local_buffer){
|
||||
size = stream->bufsize_frames * fmt->nBlockAlign;
|
||||
if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, 0, &size,
|
||||
MEM_COMMIT, PAGE_READWRITE)){
|
||||
hr = E_OUTOFMEMORY;
|
||||
goto exit;
|
||||
}
|
||||
|
@ -1212,8 +1220,10 @@ exit:
|
|||
HeapFree(GetProcessHeap(), 0, sw_params);
|
||||
if(FAILED(hr)){
|
||||
snd_pcm_close(stream->pcm_handle);
|
||||
HeapFree(GetProcessHeap(), 0, stream->local_buffer);
|
||||
stream->local_buffer = NULL;
|
||||
if(stream->local_buffer){
|
||||
size = 0;
|
||||
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer, &size, MEM_RELEASE);
|
||||
}
|
||||
CoTaskMemFree(stream->fmt);
|
||||
stream->fmt = NULL;
|
||||
HeapFree(GetProcessHeap(), 0, stream->vols);
|
||||
|
@ -2297,6 +2307,7 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
|
|||
ACImpl *This = impl_from_IAudioRenderClient(iface);
|
||||
struct alsa_stream *stream = This->stream;
|
||||
UINT32 write_pos;
|
||||
SIZE_T size;
|
||||
|
||||
TRACE("(%p)->(%u, %p)\n", This, frames, data);
|
||||
|
||||
|
@ -2325,10 +2336,15 @@ static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
|
|||
write_pos = stream->wri_offs_frames;
|
||||
if(write_pos + frames > stream->bufsize_frames){
|
||||
if(stream->tmp_buffer_frames < frames){
|
||||
HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
|
||||
stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
|
||||
frames * stream->fmt->nBlockAlign);
|
||||
if(!stream->tmp_buffer){
|
||||
if(stream->tmp_buffer){
|
||||
size = 0;
|
||||
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
|
||||
stream->tmp_buffer = NULL;
|
||||
}
|
||||
size = frames * stream->fmt->nBlockAlign;
|
||||
if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0, &size,
|
||||
MEM_COMMIT, PAGE_READWRITE)){
|
||||
stream->tmp_buffer_frames = 0;
|
||||
alsa_unlock(stream);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
@ -2465,6 +2481,7 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
|
|||
{
|
||||
ACImpl *This = impl_from_IAudioCaptureClient(iface);
|
||||
struct alsa_stream *stream = This->stream;
|
||||
SIZE_T size;
|
||||
|
||||
TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
|
||||
devpos, qpcpos);
|
||||
|
@ -2495,10 +2512,15 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
|
|||
if(stream->lcl_offs_frames + *frames > stream->bufsize_frames){
|
||||
UINT32 chunk_bytes, offs_bytes, frames_bytes;
|
||||
if(stream->tmp_buffer_frames < *frames){
|
||||
HeapFree(GetProcessHeap(), 0, stream->tmp_buffer);
|
||||
stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0,
|
||||
*frames * stream->fmt->nBlockAlign);
|
||||
if(!stream->tmp_buffer){
|
||||
if(stream->tmp_buffer){
|
||||
size = 0;
|
||||
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, &size, MEM_RELEASE);
|
||||
stream->tmp_buffer = NULL;
|
||||
}
|
||||
size = *frames * stream->fmt->nBlockAlign;
|
||||
if(NtAllocateVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer, 0, &size,
|
||||
MEM_COMMIT, PAGE_READWRITE)){
|
||||
stream->tmp_buffer_frames = 0;
|
||||
alsa_unlock(stream);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue