Commit 068593b2 authored by Erich Hoover's avatar Erich Hoover Committed by Alexandre Julliard

quartz: Create and hold onto a preferred allocator for IAsyncReader::RequestAllocator.

parent 493a3a0f
...@@ -283,6 +283,7 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const ...@@ -283,6 +283,7 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const
This->pReader = NULL; This->pReader = NULL;
This->pAlloc = NULL; This->pAlloc = NULL;
This->prefAlloc = NULL;
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader); hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader);
...@@ -293,9 +294,19 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const ...@@ -293,9 +294,19 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const
hr = This->fnPreConnect(iface, pReceivePin, &props); hr = This->fnPreConnect(iface, pReceivePin, &props);
} }
/*
* Some custom filters (such as the one used by Fallout 3
* and Fallout: New Vegas) expect to be passed a non-NULL
* preferred allocator.
*/
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = IAsyncReader_RequestAllocator(This->pReader, NULL, &props, &This->pAlloc); hr = StdMemAllocator_create(NULL, (LPVOID *) &This->prefAlloc);
}
if (SUCCEEDED(hr))
{
hr = IAsyncReader_RequestAllocator(This->pReader, This->prefAlloc, &props, &This->pAlloc);
} }
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
...@@ -314,6 +325,9 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const ...@@ -314,6 +325,9 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const
if (This->pReader) if (This->pReader)
IAsyncReader_Release(This->pReader); IAsyncReader_Release(This->pReader);
This->pReader = NULL; This->pReader = NULL;
if (This->prefAlloc)
IMemAllocator_Release(This->prefAlloc);
This->prefAlloc = NULL;
if (This->pAlloc) if (This->pAlloc)
IMemAllocator_Release(This->pAlloc); IMemAllocator_Release(This->pAlloc);
This->pAlloc = NULL; This->pAlloc = NULL;
...@@ -366,6 +380,8 @@ ULONG WINAPI PullPin_Release(IPin *iface) ...@@ -366,6 +380,8 @@ ULONG WINAPI PullPin_Release(IPin *iface)
WaitForSingleObject(This->hEventStateChanged, INFINITE); WaitForSingleObject(This->hEventStateChanged, INFINITE);
assert(!This->hThread); assert(!This->hThread);
if(This->prefAlloc)
IMemAllocator_Release(This->prefAlloc);
if(This->pAlloc) if(This->pAlloc)
IMemAllocator_Release(This->pAlloc); IMemAllocator_Release(This->pAlloc);
if(This->pReader) if(This->pReader)
......
...@@ -73,6 +73,7 @@ typedef struct PullPin ...@@ -73,6 +73,7 @@ typedef struct PullPin
REFERENCE_TIME rtStart, rtCurrent, rtNext, rtStop; REFERENCE_TIME rtStart, rtCurrent, rtNext, rtStop;
IAsyncReader * pReader; IAsyncReader * pReader;
IMemAllocator * prefAlloc;
IMemAllocator * pAlloc; IMemAllocator * pAlloc;
QUERYACCEPTPROC fnQueryAccept; QUERYACCEPTPROC fnQueryAccept;
SAMPLEPROC_PULL fnSampleProc; SAMPLEPROC_PULL fnSampleProc;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment