[PATCH 3/5] quartz/filesource: Store the source pin inline in the AsyncReader structure.
Zebediah Figura
z.figura12 at gmail.com
Wed Jun 19 20:16:12 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/quartz/filesource.c | 339 ++++++++++++++++-----------------------
1 file changed, 138 insertions(+), 201 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c
index afac6f7d319..2a6188a5fc7 100644
--- a/dlls/quartz/filesource.c
+++ b/dlls/quartz/filesource.c
@@ -57,40 +57,31 @@ typedef struct DATAREQUEST
OVERLAPPED ovl;
} DATAREQUEST;
-typedef struct FileAsyncReader
+typedef struct AsyncReader
{
- BaseOutputPin pin;
+ BaseFilter filter;
+ IFileSourceFilter IFileSourceFilter_iface;
+
+ BaseOutputPin source;
IAsyncReader IAsyncReader_iface;
+ LPOLESTR pszFileName;
+ AM_MEDIA_TYPE *pmt;
ALLOCATOR_PROPERTIES allocProps;
- HANDLE hFile;
- BOOL bFlushing;
- /* Why would you need more? Every sample has its own handle */
- LONG queued_number;
- LONG samples;
- LONG oldest_sample;
- CRITICAL_SECTION csList;
+ HANDLE file;
+ BOOL flushing;
+ unsigned int queued_number;
+ unsigned int samples;
+ unsigned int oldest_sample;
+ CRITICAL_SECTION sample_cs;
DATAREQUEST *sample_list;
-
/* Have a handle for every sample, and then one more as flushing handle */
HANDLE *handle_list;
-} FileAsyncReader;
-
-static inline FileAsyncReader *impl_from_IPin(IPin *iface)
-{
- return CONTAINING_RECORD(iface, FileAsyncReader, pin.pin.IPin_iface);
-}
-
-typedef struct AsyncReader
-{
- BaseFilter filter;
- IFileSourceFilter IFileSourceFilter_iface;
-
- IPin * pOutputPin;
- LPOLESTR pszFileName;
- AM_MEDIA_TYPE * pmt;
} AsyncReader;
+static const IPinVtbl FileAsyncReaderPin_Vtbl;
+static const BaseOutputPinFuncTable output_BaseOutputFuncTable;
+
static inline AsyncReader *impl_from_BaseFilter(BaseFilter *iface)
{
return CONTAINING_RECORD(iface, AsyncReader, filter);
@@ -110,8 +101,6 @@ static const IBaseFilterVtbl AsyncReader_Vtbl;
static const IFileSourceFilterVtbl FileSource_Vtbl;
static const IAsyncReaderVtbl FileAsyncReader_Vtbl;
-static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
-
static const WCHAR mediatype_name[] = {
'M', 'e', 'd', 'i', 'a', ' ', 'T', 'y', 'p', 'e', 0 };
static const WCHAR subtype_name[] = {
@@ -427,8 +416,8 @@ static IPin *async_reader_get_pin(BaseFilter *iface, unsigned int index)
{
AsyncReader *filter = impl_from_BaseFilter(iface);
- if (!index && filter->pOutputPin)
- return filter->pOutputPin;
+ if (!index && filter->pszFileName)
+ return &filter->source.pin.IPin_iface;
return NULL;
}
@@ -436,30 +425,26 @@ static void async_reader_destroy(BaseFilter *iface)
{
AsyncReader *filter = impl_from_BaseFilter(iface);
- if (filter->pOutputPin)
+ if (filter->pszFileName)
{
- FileAsyncReader *pin = impl_from_IPin(filter->pOutputPin);
unsigned int i;
- IPin *peer;
- if (SUCCEEDED(IPin_ConnectedTo(filter->pOutputPin, &peer)))
- {
- IPin_Disconnect(peer);
- IPin_Release(peer);
- }
- IPin_Disconnect(filter->pOutputPin);
+ if (filter->source.pin.pConnectedTo)
+ IPin_Disconnect(filter->source.pin.pConnectedTo);
+
+ IPin_Disconnect(&filter->source.pin.IPin_iface);
- CoTaskMemFree(pin->sample_list);
- if (pin->handle_list)
+ CoTaskMemFree(filter->sample_list);
+ if (filter->handle_list)
{
- for (i = 0; i <= pin->samples; ++i)
- CloseHandle(pin->handle_list[i]);
- CoTaskMemFree(pin->handle_list);
+ for (i = 0; i <= filter->samples; ++i)
+ CloseHandle(filter->handle_list[i]);
+ CoTaskMemFree(filter->handle_list);
}
- CloseHandle(pin->hFile);
- pin->csList.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&pin->csList);
- BaseOutputPin_Destroy(&pin->pin);
+ CloseHandle(filter->file);
+ filter->sample_cs.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&filter->sample_cs);
+ strmbase_source_cleanup(&filter->source);
}
CoTaskMemFree(filter->pszFileName);
if (filter->pmt)
@@ -502,7 +487,8 @@ HRESULT AsyncReader_create(IUnknown *outer, void **out)
(DWORD_PTR)(__FILE__ ": AsyncReader.csFilter"), &BaseFuncTable);
pAsyncRead->IFileSourceFilter_iface.lpVtbl = &FileSource_Vtbl;
- pAsyncRead->pOutputPin = NULL;
+
+ pAsyncRead->IAsyncReader_iface.lpVtbl = &FileAsyncReader_Vtbl;
pAsyncRead->pszFileName = NULL;
pAsyncRead->pmt = NULL;
@@ -591,10 +577,9 @@ static ULONG WINAPI FileSource_Release(IFileSourceFilter * iface)
static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFileName, const AM_MEDIA_TYPE * pmt)
{
- HRESULT hr;
HANDLE hFile;
- IAsyncReader * pReader = NULL;
AsyncReader *This = impl_from_IFileSourceFilter(iface);
+ PIN_INFO pin_info;
TRACE("%p->(%s, %p)\n", This, debugstr_w(pszFileName), pmt);
@@ -611,58 +596,42 @@ static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFi
}
/* create pin */
- hr = FileAsyncReader_Construct(hFile, &This->filter.IBaseFilter_iface, &This->filter.csFilter, &This->pOutputPin);
+ pin_info.dir = PINDIR_OUTPUT;
+ pin_info.pFilter = &This->filter.IBaseFilter_iface;
+ strcpyW(pin_info.achName, wszOutputPinName);
+ strmbase_source_init(&This->source, &FileAsyncReaderPin_Vtbl, &pin_info,
+ &output_BaseOutputFuncTable, &This->filter.csFilter);
BaseFilterImpl_IncrementPinVersion(&This->filter);
- if (SUCCEEDED(hr))
- hr = IPin_QueryInterface(This->pOutputPin, &IID_IAsyncReader, (LPVOID *)&pReader);
-
- /* store file name & media type */
- if (SUCCEEDED(hr))
- {
- CoTaskMemFree(This->pszFileName);
- if (This->pmt)
- DeleteMediaType(This->pmt);
-
- This->pszFileName = CoTaskMemAlloc((strlenW(pszFileName) + 1) * sizeof(WCHAR));
- strcpyW(This->pszFileName, pszFileName);
+ This->file = hFile;
+ This->flushing = FALSE;
+ This->sample_list = NULL;
+ This->handle_list = NULL;
+ This->queued_number = 0;
+ InitializeCriticalSection(&This->sample_cs);
+ This->sample_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FileAsyncReader.sample_cs");
- This->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
- if (!pmt)
- {
- CopyMediaType(This->pmt, &default_mt);
- if (FAILED(GetClassMediaFile(pReader, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL)))
- {
- This->pmt->majortype = MEDIATYPE_Stream;
- This->pmt->subtype = MEDIASUBTYPE_NULL;
- }
- }
- else
- CopyMediaType(This->pmt, pmt);
- }
+ CoTaskMemFree(This->pszFileName);
+ if (This->pmt)
+ DeleteMediaType(This->pmt);
- if (pReader)
- IAsyncReader_Release(pReader);
+ This->pszFileName = CoTaskMemAlloc((strlenW(pszFileName) + 1) * sizeof(WCHAR));
+ strcpyW(This->pszFileName, pszFileName);
- if (FAILED(hr))
+ This->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ if (!pmt)
{
- if (This->pOutputPin)
+ CopyMediaType(This->pmt, &default_mt);
+ if (FAILED(GetClassMediaFile(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL)))
{
- IPin_Release(This->pOutputPin);
- This->pOutputPin = NULL;
+ This->pmt->majortype = MEDIATYPE_Stream;
+ This->pmt->subtype = MEDIASUBTYPE_NULL;
}
-
- CoTaskMemFree(This->pszFileName);
- if (This->pmt)
- DeleteMediaType(This->pmt);
- This->pszFileName = NULL;
- This->pmt = NULL;
-
- CloseHandle(hFile);
}
+ else
+ CopyMediaType(This->pmt, pmt);
- /* FIXME: check return codes */
- return hr;
+ return S_OK;
}
static HRESULT WINAPI FileSource_GetCurFile(IFileSourceFilter * iface, LPOLESTR * ppszFileName, AM_MEDIA_TYPE * pmt)
@@ -703,14 +672,19 @@ static const IFileSourceFilterVtbl FileSource_Vtbl =
FileSource_GetCurFile
};
-static inline FileAsyncReader *impl_from_BasePin(BasePin *iface)
+static inline AsyncReader *impl_from_IPin(IPin *iface)
+{
+ return CONTAINING_RECORD(iface, AsyncReader, source.pin.IPin_iface);
+}
+
+static inline AsyncReader *impl_from_BasePin(BasePin *iface)
{
- return CONTAINING_RECORD(iface, FileAsyncReader, pin.pin);
+ return CONTAINING_RECORD(iface, AsyncReader, source.pin);
}
-static inline FileAsyncReader *impl_from_BaseOutputPin(BaseOutputPin *iface)
+static inline AsyncReader *impl_from_BaseOutputPin(BaseOutputPin *iface)
{
- return CONTAINING_RECORD(iface, FileAsyncReader, pin);
+ return CONTAINING_RECORD(iface, AsyncReader, source);
}
static inline BaseOutputPin *impl_BaseOutputPin_from_BasePin(BasePin *iface)
@@ -718,9 +692,9 @@ static inline BaseOutputPin *impl_BaseOutputPin_from_BasePin(BasePin *iface)
return CONTAINING_RECORD(iface, BaseOutputPin, pin);
}
-static inline FileAsyncReader *impl_from_IAsyncReader(IAsyncReader *iface)
+static inline AsyncReader *impl_from_IAsyncReader(IAsyncReader *iface)
{
- return CONTAINING_RECORD(iface, FileAsyncReader, IAsyncReader_iface);
+ return CONTAINING_RECORD(iface, AsyncReader, IAsyncReader_iface);
}
static HRESULT WINAPI FileAsyncReaderPin_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *pmt)
@@ -736,8 +710,7 @@ static HRESULT WINAPI FileAsyncReaderPin_CheckMediaType(BasePin *pin, const AM_M
static HRESULT WINAPI FileAsyncReaderPin_GetMediaType(BasePin *iface, int index, AM_MEDIA_TYPE *mt)
{
- FileAsyncReader *This = impl_from_BasePin(iface);
- AsyncReader *filter = impl_from_IBaseFilter(This->pin.pin.pinInfo.pFilter);
+ AsyncReader *filter = impl_from_BasePin(iface);
if (index < 0)
return E_INVALIDARG;
@@ -753,28 +726,25 @@ static HRESULT WINAPI FileAsyncReaderPin_GetMediaType(BasePin *iface, int index,
/* overridden pin functions */
-static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
+static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin *iface, REFIID iid, void **out)
{
- FileAsyncReader *This = impl_from_IPin(iface);
- TRACE("(%s, %p)\n", qzdebugstr_guid(riid), ppv);
+ AsyncReader *filter = impl_from_IPin(iface);
- *ppv = NULL;
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
- if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPin))
- *ppv = &This->pin.pin.IPin_iface;
- else if (IsEqualIID(riid, &IID_IAsyncReader))
- *ppv = &This->IAsyncReader_iface;
-
- if (*ppv)
+ if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IPin))
+ *out = &filter->source.pin.IPin_iface;
+ else if (IsEqualIID(iid, &IID_IAsyncReader))
+ *out = &filter->IAsyncReader_iface;
+ else
{
- IUnknown_AddRef((IUnknown *)*ppv);
- return S_OK;
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+ *out = NULL;
+ return E_NOINTERFACE;
}
- if (!IsEqualIID(riid, &IID_IMediaSeeking))
- FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
-
- return E_NOINTERFACE;
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
static const IPinVtbl FileAsyncReaderPin_Vtbl =
@@ -832,7 +802,7 @@ static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(BaseOutputPin *This,
static HRESULT WINAPI FileAsyncReaderPin_DecideBufferSize(BaseOutputPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
{
- FileAsyncReader *This = impl_from_BaseOutputPin(iface);
+ AsyncReader *This = impl_from_BaseOutputPin(iface);
ALLOCATOR_PROPERTIES actual;
if (ppropInputRequest->cbAlign && ppropInputRequest->cbAlign != This->allocProps.cbAlign)
@@ -857,61 +827,29 @@ static const BaseOutputPinFuncTable output_BaseOutputFuncTable = {
BaseOutputPinImpl_DecideAllocator,
};
-static HRESULT FileAsyncReader_Construct(HANDLE hFile, IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
-{
- PIN_INFO piOutput;
- HRESULT hr;
-
- *ppPin = NULL;
- piOutput.dir = PINDIR_OUTPUT;
- piOutput.pFilter = pBaseFilter;
- strcpyW(piOutput.achName, wszOutputPinName);
- hr = BaseOutputPin_Construct(&FileAsyncReaderPin_Vtbl, sizeof(FileAsyncReader), &piOutput, &output_BaseOutputFuncTable, pCritSec, ppPin);
-
- if (SUCCEEDED(hr))
- {
- FileAsyncReader *pPinImpl = (FileAsyncReader *)*ppPin;
- pPinImpl->IAsyncReader_iface.lpVtbl = &FileAsyncReader_Vtbl;
- pPinImpl->hFile = hFile;
- pPinImpl->bFlushing = FALSE;
- pPinImpl->sample_list = NULL;
- pPinImpl->handle_list = NULL;
- pPinImpl->queued_number = 0;
- InitializeCriticalSection(&pPinImpl->csList);
- pPinImpl->csList.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FileAsyncReader.csList");
- }
- return hr;
-}
-
-/* IAsyncReader */
-
-static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader * iface, REFIID riid, LPVOID * ppv)
+static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader *iface, REFIID iid, void **out)
{
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
-
- return IPin_QueryInterface(&This->pin.pin.IPin_iface, riid, ppv);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
+ return IPin_QueryInterface(&filter->source.pin.IPin_iface, iid, out);
}
static ULONG WINAPI FileAsyncReader_AddRef(IAsyncReader * iface)
{
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
-
- return IPin_AddRef(&This->pin.pin.IPin_iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
+ return IPin_AddRef(&filter->source.pin.IPin_iface);
}
static ULONG WINAPI FileAsyncReader_Release(IAsyncReader * iface)
{
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
-
- return IPin_Release(&This->pin.pin.IPin_iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
+ return IPin_Release(&filter->source.pin.IPin_iface);
}
#define DEF_ALIGNMENT 1
static HRESULT WINAPI FileAsyncReader_RequestAllocator(IAsyncReader * iface, IMemAllocator * pPreferred, ALLOCATOR_PROPERTIES * pProps, IMemAllocator ** ppActual)
{
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
-
+ AsyncReader *This = impl_from_IAsyncReader(iface);
HRESULT hr = S_OK;
TRACE("%p->(%p, %p, %p)\n", This, pPreferred, pProps, ppActual);
@@ -1004,10 +942,10 @@ done:
* however, this would be quite complicated to do and may be a bit error prone */
static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample * pSample, DWORD_PTR dwUser)
{
+ AsyncReader *This = impl_from_IAsyncReader(iface);
HRESULT hr = S_OK;
REFERENCE_TIME Start;
REFERENCE_TIME Stop;
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
LPBYTE pBuffer = NULL;
TRACE("%p->(%p, %lx)\n", This, pSample, dwUser);
@@ -1022,10 +960,10 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample
if (SUCCEEDED(hr))
hr = IMediaSample_GetPointer(pSample, &pBuffer);
- EnterCriticalSection(&This->csList);
- if (This->bFlushing)
+ EnterCriticalSection(&This->sample_cs);
+ if (This->flushing)
{
- LeaveCriticalSection(&This->csList);
+ LeaveCriticalSection(&This->sample_cs);
return VFW_E_WRONG_STATE;
}
@@ -1068,7 +1006,7 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample
* as they do not support async reads on files, but it is
* sooo much easier to use this than messing around with threads!
*/
- if (!ReadFile(This->hFile, pBuffer, dwLength, NULL, &pDataRq->ovl))
+ if (!ReadFile(This->file, pBuffer, dwLength, NULL, &pDataRq->ovl))
hr = HRESULT_FROM_WIN32(GetLastError());
/* ERROR_IO_PENDING is not actually an error since this is what we want! */
@@ -1076,7 +1014,7 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample
hr = S_OK;
}
- LeaveCriticalSection(&This->csList);
+ LeaveCriticalSection(&This->sample_cs);
TRACE("-- %x\n", hr);
return hr;
@@ -1084,8 +1022,8 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample
static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dwTimeout, IMediaSample ** ppSample, DWORD_PTR * pdwUser)
{
+ AsyncReader *This = impl_from_IAsyncReader(iface);
HRESULT hr = S_OK;
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
DWORD buffer = ~0;
TRACE("%p->(%u, %p, %p)\n", This, dwTimeout, ppSample, pdwUser);
@@ -1093,8 +1031,8 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw
*ppSample = NULL;
*pdwUser = 0;
- EnterCriticalSection(&This->csList);
- if (!This->bFlushing)
+ EnterCriticalSection(&This->sample_cs);
+ if (!This->flushing)
{
LONG oldest = This->oldest_sample;
@@ -1103,12 +1041,12 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw
/* It could be that nothing is queued right now, but that can be fixed */
WARN("Called without samples in queue and not flushing!!\n");
}
- LeaveCriticalSection(&This->csList);
+ LeaveCriticalSection(&This->sample_cs);
/* wait for an object to read, or time out */
buffer = WaitForMultipleObjectsEx(This->samples+1, This->handle_list + oldest, FALSE, dwTimeout, TRUE);
- EnterCriticalSection(&This->csList);
+ EnterCriticalSection(&This->sample_cs);
if (buffer <= This->samples)
{
/* Re-scale the buffer back to normal */
@@ -1135,7 +1073,7 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw
--This->queued_number;
}
- if (This->bFlushing && buffer == ~0)
+ if (This->flushing && buffer == ~0)
{
for (buffer = 0; buffer < This->samples; ++buffer)
{
@@ -1164,14 +1102,14 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw
DWORD dwBytes = 0;
/* get any errors */
- if (!This->bFlushing && !GetOverlappedResult(This->hFile, &pDataRq->ovl, &dwBytes, FALSE))
+ if (!This->flushing && !GetOverlappedResult(This->file, &pDataRq->ovl, &dwBytes, FALSE))
hr = HRESULT_FROM_WIN32(GetLastError());
/* Return the sample no matter what so it can be destroyed */
*ppSample = pDataRq->pSample;
*pdwUser = pDataRq->dwUserData;
- if (This->bFlushing)
+ if (This->flushing)
hr = VFW_E_WRONG_STATE;
if (FAILED(hr))
@@ -1205,7 +1143,7 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader * iface, DWORD dw
This->oldest_sample = x;
}
}
- LeaveCriticalSection(&This->csList);
+ LeaveCriticalSection(&This->sample_cs);
TRACE("-- %x\n", hr);
return hr;
@@ -1234,7 +1172,7 @@ static BOOL sync_read(HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, D
static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMediaSample *sample)
{
- FileAsyncReader *filter = impl_from_IAsyncReader(iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
REFERENCE_TIME start_time, end_time;
DWORD read_len;
BYTE *buffer;
@@ -1252,7 +1190,7 @@ static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMedi
if (SUCCEEDED(hr))
{
length = BYTES_FROM_MEDIATIME(end_time - start_time);
- ret = sync_read(filter->hFile, BYTES_FROM_MEDIATIME(start_time), length, buffer, &read_len);
+ ret = sync_read(filter->file, BYTES_FROM_MEDIATIME(start_time), length, buffer, &read_len);
if (ret)
hr = (read_len == length) ? S_OK : S_FALSE;
else if (GetLastError() == ERROR_HANDLE_EOF)
@@ -1270,7 +1208,7 @@ static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMedi
static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface,
LONGLONG offset, LONG length, BYTE *buffer)
{
- FileAsyncReader *filter = impl_from_IAsyncReader(iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
DWORD read_len;
HRESULT hr;
BOOL ret;
@@ -1278,7 +1216,7 @@ static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface,
TRACE("filter %p, offset %s, length %d, buffer %p.\n",
filter, wine_dbgstr_longlong(offset), length, buffer);
- ret = sync_read(filter->hFile, offset, length, buffer, &read_len);
+ ret = sync_read(filter->file, offset, length, buffer, &read_len);
if (ret)
hr = (read_len == length) ? S_OK : S_FALSE;
else if (GetLastError() == ERROR_HANDLE_EOF)
@@ -1289,54 +1227,53 @@ static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface,
return hr;
}
-static HRESULT WINAPI FileAsyncReader_Length(IAsyncReader * iface, LONGLONG * pTotal, LONGLONG * pAvailable)
+static HRESULT WINAPI FileAsyncReader_Length(IAsyncReader *iface, LONGLONG *total, LONGLONG *available)
{
- DWORD dwSizeLow;
- DWORD dwSizeHigh;
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
+ DWORD low, high;
- TRACE("%p->(%p, %p)\n", This, pTotal, pAvailable);
+ TRACE("iface %p, total %p, available %p.\n", iface, total, available);
- if (((dwSizeLow = GetFileSize(This->hFile, &dwSizeHigh)) == -1) &&
- (GetLastError() != NO_ERROR))
+ if ((low = GetFileSize(filter->file, &high)) == -1 && GetLastError() != NO_ERROR)
return HRESULT_FROM_WIN32(GetLastError());
- *pTotal = (LONGLONG)dwSizeLow | (LONGLONG)dwSizeHigh << (sizeof(DWORD) * 8);
-
- *pAvailable = *pTotal;
+ *available = *total = (LONGLONG)low | (LONGLONG)high << (sizeof(DWORD) * 8);
return S_OK;
}
static HRESULT WINAPI FileAsyncReader_BeginFlush(IAsyncReader * iface)
{
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
- TRACE("%p->()\n", This);
+ TRACE("iface %p.\n", iface);
- EnterCriticalSection(&This->csList);
- This->bFlushing = TRUE;
- CancelIo(This->hFile);
- SetEvent(This->handle_list[This->samples]);
- LeaveCriticalSection(&This->csList);
+ EnterCriticalSection(&filter->sample_cs);
+
+ filter->flushing = TRUE;
+ CancelIo(filter->file);
+ SetEvent(filter->handle_list[filter->samples]);
+
+ LeaveCriticalSection(&filter->sample_cs);
return S_OK;
}
static HRESULT WINAPI FileAsyncReader_EndFlush(IAsyncReader * iface)
{
- FileAsyncReader *This = impl_from_IAsyncReader(iface);
+ AsyncReader *filter = impl_from_IAsyncReader(iface);
int x;
- TRACE("%p->()\n", This);
+ TRACE("iface %p.\n", iface);
+
+ EnterCriticalSection(&filter->sample_cs);
- EnterCriticalSection(&This->csList);
- ResetEvent(This->handle_list[This->samples]);
- This->bFlushing = FALSE;
- for (x = 0; x < This->samples; ++x)
- assert(!This->sample_list[x].pSample);
+ ResetEvent(filter->handle_list[filter->samples]);
+ filter->flushing = FALSE;
+ for (x = 0; x < filter->samples; ++x)
+ assert(!filter->sample_list[x].pSample);
- LeaveCriticalSection(&This->csList);
+ LeaveCriticalSection(&filter->sample_cs);
return S_OK;
}
--
2.21.0
More information about the wine-devel
mailing list