Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/renderer.c | 16 ++++++++++++---- include/wine/strmbase.h | 1 + 2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index ea1be8b7127..7a69d98367c 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -194,6 +194,18 @@ static IPin *renderer_get_pin(BaseFilter *iface, unsigned int index) return &This->pInputPin->pin.IPin_iface; }
+static void renderer_destroy(BaseFilter *iface) +{ + BaseRenderer *filter = impl_from_BaseFilter(iface); + filter->pFuncsTable->renderer_destroy(filter); +} + +static const BaseFilterFuncTable RendererBaseFilterFuncTable = +{ + .filter_get_pin = renderer_get_pin, + .filter_destroy = renderer_destroy, +}; + static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE * pmt) { BaseRenderer *This = impl_from_IBaseFilter(pin->pinInfo.pFilter); @@ -206,10 +218,6 @@ static HRESULT WINAPI BaseRenderer_Receive(BaseInputPin *pin, IMediaSample * pSa return BaseRendererImpl_Receive(This, pSample); }
-static const BaseFilterFuncTable RendererBaseFilterFuncTable = { - .filter_get_pin = renderer_get_pin, -}; - static const BaseInputPinFuncTable input_BaseInputFuncTable = { { BaseRenderer_Input_CheckMediaType, diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 307204e0e07..ee3e2c2c04a 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -604,6 +604,7 @@ typedef struct BaseRendererFuncTable { BaseRenderer_EndOfStream pfnEndOfStream; BaseRenderer_BeginFlush pfnBeginFlush; BaseRenderer_EndFlush pfnEndFlush; + void (*renderer_destroy)(BaseRenderer *iface); } BaseRendererFuncTable;
HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/dsoundrender.c | 69 +++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 39 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index 844085a473b..2b50eaef9f9 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -586,6 +586,31 @@ static HRESULT WINAPI DSoundRender_EndFlush(BaseRenderer* iface) return S_OK; }
+static void dsound_render_destroy(BaseRenderer *iface) +{ + DSoundRenderImpl *filter = impl_from_BaseRenderer(iface); + + if (filter->threadid) + { + PostThreadMessageW(filter->threadid, WM_APP, 0, 0); + WaitForSingleObject(filter->advisethread, INFINITE); + CloseHandle(filter->advisethread); + } + + if (filter->dsbuffer) + IDirectSoundBuffer_Release(filter->dsbuffer); + filter->dsbuffer = NULL; + if (filter->dsound) + IDirectSound8_Release(filter->dsound); + filter->dsound = NULL; + + BasicAudio_Destroy(&filter->basicAudio); + CloseHandle(filter->blocked); + + strmbase_renderer_cleanup(&filter->renderer); + CoTaskMemFree(filter); +} + static const BaseRendererFuncTable BaseFuncTable = { DSoundRender_CheckMediaType, DSoundRender_DoRenderSample, @@ -606,6 +631,7 @@ static const BaseRendererFuncTable BaseFuncTable = { DSoundRender_EndOfStream, DSoundRender_BeginFlush, DSoundRender_EndFlush, + dsound_render_destroy, };
HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv) @@ -712,41 +738,6 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri return E_NOINTERFACE; }
-static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface) -{ - DSoundRenderImpl *This = impl_from_IBaseFilter(iface); - ULONG refCount = InterlockedDecrement(&This->renderer.filter.refCount); - - TRACE("(%p)->() Release from %d\n", This, refCount + 1); - - if (!refCount) - { - if (This->threadid) { - PostThreadMessageW(This->threadid, WM_APP, 0, 0); - WaitForSingleObject(This->advisethread, INFINITE); - CloseHandle(This->advisethread); - } - - if (This->dsbuffer) - IDirectSoundBuffer_Release(This->dsbuffer); - This->dsbuffer = NULL; - if (This->dsound) - IDirectSound8_Release(This->dsound); - This->dsound = NULL; - - BasicAudio_Destroy(&This->basicAudio); - CloseHandle(This->blocked); - - TRACE("Destroying Audio Renderer\n"); - strmbase_renderer_cleanup(&This->renderer); - CoTaskMemFree(This); - - return 0; - } - else - return refCount; -} - static HRESULT WINAPI DSoundRender_Pause(IBaseFilter * iface) { DSoundRenderImpl *This = impl_from_IBaseFilter(iface); @@ -781,7 +772,7 @@ static const IBaseFilterVtbl DSoundRender_Vtbl = { DSoundRender_QueryInterface, BaseFilterImpl_AddRef, - DSoundRender_Release, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, BaseRendererImpl_Stop, DSoundRender_Pause, @@ -820,7 +811,7 @@ static ULONG WINAPI Basicaudio_Release(IBasicAudio *iface) {
TRACE("(%p/%p)->()\n", This, iface);
- return DSoundRender_Release(&This->renderer.filter.IBaseFilter_iface); + return BaseFilterImpl_Release(&This->renderer.filter.IBaseFilter_iface); }
/*** IBasicAudio methods ***/ @@ -1016,7 +1007,7 @@ static ULONG WINAPI ReferenceClock_Release(IReferenceClock *iface)
TRACE("(%p/%p)->()\n", This, iface);
- return DSoundRender_Release(&This->renderer.filter.IBaseFilter_iface); + return BaseFilterImpl_Release(&This->renderer.filter.IBaseFilter_iface); }
/*** IReferenceClock methods ***/ @@ -1184,7 +1175,7 @@ static ULONG WINAPI AMDirectSound_Release(IAMDirectSound *iface)
TRACE("(%p/%p)->()\n", This, iface);
- return DSoundRender_Release(&This->renderer.filter.IBaseFilter_iface); + return BaseFilterImpl_Release(&This->renderer.filter.IBaseFilter_iface); }
/*** IAMDirectSound methods ***/
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/parser.h | 1 - 1 file changed, 1 deletion(-)
diff --git a/dlls/quartz/parser.h b/dlls/quartz/parser.h index 8660cf2cde5..3b89ed6ab81 100644 --- a/dlls/quartz/parser.h +++ b/dlls/quartz/parser.h @@ -30,7 +30,6 @@ struct ParserImpl { BaseFilter filter;
- PFN_CLEANUP fnCleanup; PFN_DISCONNECT fnDisconnect;
PullPin * pInputPin;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/avisplit.c | 7 ++++++- dlls/quartz/mpegsplit.c | 7 ++++++- dlls/quartz/parser.c | 12 ++++-------- dlls/quartz/parser.h | 6 ++++-- dlls/quartz/waveparser.c | 7 ++++++- 5 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index a422f45b8c8..e6f7c2ff43f 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -1429,6 +1429,11 @@ static const IBaseFilterVtbl AVISplitterImpl_Vtbl = Parser_QueryVendorInfo };
+static const BaseFilterFuncTable avi_splitter_func_table = +{ + .filter_get_pin = parser_get_pin, +}; + HRESULT AVISplitter_create(IUnknown * pUnkOuter, LPVOID * ppv) { static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0}; @@ -1449,7 +1454,7 @@ HRESULT AVISplitter_create(IUnknown * pUnkOuter, LPVOID * ppv) This->oldindex = NULL;
hr = Parser_Create(&This->Parser, &AVISplitterImpl_Vtbl, &CLSID_AviSplitter, - sink_name, AVISplitter_Sample, AVISplitter_QueryAccept, + &avi_splitter_func_table, sink_name, AVISplitter_Sample, AVISplitter_QueryAccept, AVISplitter_InputPin_PreConnect, AVISplitter_Flush, AVISplitter_Disconnect, AVISplitter_first_request, AVISplitter_done_process, NULL, AVISplitter_seek, NULL); diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c index c4cf93b13dd..24e61feb106 100644 --- a/dlls/quartz/mpegsplit.c +++ b/dlls/quartz/mpegsplit.c @@ -868,6 +868,11 @@ static const IAMStreamSelectVtbl AMStreamSelectVtbl = AMStreamSelect_Enable };
+static const BaseFilterFuncTable mpeg_splitter_func_table = +{ + .filter_get_pin = parser_get_pin, +}; + HRESULT MPEGSplitter_create(IUnknown * pUnkOuter, LPVOID * ppv) { static const WCHAR sink_name[] = {'I','n','p','u','t',0}; @@ -887,7 +892,7 @@ HRESULT MPEGSplitter_create(IUnknown * pUnkOuter, LPVOID * ppv)
ZeroMemory(This, sizeof(MPEGSplitterImpl)); hr = Parser_Create(&This->Parser, &MPEGSplitter_Vtbl, &CLSID_MPEG1Splitter, - sink_name, MPEGSplitter_process_sample, MPEGSplitter_query_accept, + &mpeg_splitter_func_table, sink_name, MPEGSplitter_process_sample, MPEGSplitter_query_accept, MPEGSplitter_pre_connect, MPEGSplitter_cleanup, MPEGSplitter_disconnect, MPEGSplitter_first_request, NULL, NULL, MPEGSplitter_seek, NULL); if (FAILED(hr)) diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index fdefa3d4b27..433502ced70 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -62,7 +62,7 @@ static inline ParserImpl *impl_from_BaseFilter( BaseFilter *iface ) return CONTAINING_RECORD(iface, ParserImpl, filter); }
-static IPin *parser_get_pin(BaseFilter *iface, unsigned int index) +IPin *parser_get_pin(BaseFilter *iface, unsigned int index) { ParserImpl *filter = impl_from_BaseFilter(iface);
@@ -73,13 +73,9 @@ static IPin *parser_get_pin(BaseFilter *iface, unsigned int index) return filter->ppPins[index]; }
-static const BaseFilterFuncTable BaseFuncTable = { - .filter_get_pin = parser_get_pin, -}; - HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *Parser_Vtbl, - const CLSID* pClsid, const WCHAR *sink_name, PFN_PROCESS_SAMPLE fnProcessSample, - PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, + const CLSID *pClsid, const BaseFilterFuncTable *func_table, const WCHAR *sink_name, + PFN_PROCESS_SAMPLE fnProcessSample, PFN_QUERY_ACCEPT fnQueryAccept, PFN_PRE_CONNECT fnPreConnect, PFN_CLEANUP fnCleanup, PFN_DISCONNECT fnDisconnect, REQUESTPROC fnRequest, STOPPROCESSPROC fnDone, SourceSeeking_ChangeStop stop, SourceSeeking_ChangeStart start, SourceSeeking_ChangeRate rate) @@ -88,7 +84,7 @@ HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *Parser_Vtbl, PIN_INFO piInput;
/* pTransformFilter is already allocated */ - BaseFilter_Init(&pParser->filter, Parser_Vtbl, pClsid, (DWORD_PTR)(__FILE__ ": ParserImpl.csFilter"), &BaseFuncTable); + BaseFilter_Init(&pParser->filter, Parser_Vtbl, pClsid, (DWORD_PTR)(__FILE__ ": ParserImpl.csFilter"), func_table);
pParser->fnDisconnect = fnDisconnect;
diff --git a/dlls/quartz/parser.h b/dlls/quartz/parser.h index 3b89ed6ab81..d221eec555f 100644 --- a/dlls/quartz/parser.h +++ b/dlls/quartz/parser.h @@ -53,8 +53,8 @@ typedef struct Parser_OutputPin extern HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PROPERTIES * props, const AM_MEDIA_TYPE * amt);
HRESULT Parser_Create(ParserImpl *parser, const IBaseFilterVtbl *vtbl, - const CLSID *clsid, const WCHAR *sink_name, PFN_PROCESS_SAMPLE, - PFN_QUERY_ACCEPT, PFN_PRE_CONNECT, PFN_CLEANUP, PFN_DISCONNECT, + const CLSID *clsid, const BaseFilterFuncTable *func_table, const WCHAR *sink_name, + PFN_PROCESS_SAMPLE, PFN_QUERY_ACCEPT, PFN_PRE_CONNECT, PFN_CLEANUP, PFN_DISCONNECT, REQUESTPROC, STOPPROCESSPROC, SourceSeeking_ChangeStop, SourceSeeking_ChangeStart, SourceSeeking_ChangeRate) DECLSPEC_HIDDEN;
@@ -76,6 +76,8 @@ extern HRESULT WINAPI Parser_QueryFilterInfo(IBaseFilter * iface, FILTER_INFO *p extern HRESULT WINAPI Parser_JoinFilterGraph(IBaseFilter * iface, IFilterGraph *pGraph, LPCWSTR pName); extern HRESULT WINAPI Parser_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVendorInfo);
+IPin *parser_get_pin(BaseFilter *iface, unsigned int index) DECLSPEC_HIDDEN; + /* COM helpers */ static inline Parser_OutputPin *unsafe_impl_Parser_OutputPin_from_IPin( IPin *iface ) { diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index b21b2e939ce..6240b7817f3 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -413,6 +413,11 @@ static const IBaseFilterVtbl WAVEParser_Vtbl = Parser_QueryVendorInfo };
+static const BaseFilterFuncTable wave_parser_func_table = +{ + .filter_get_pin = parser_get_pin, +}; + HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv) { static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0}; @@ -430,7 +435,7 @@ HRESULT WAVEParser_create(IUnknown * pUnkOuter, LPVOID * ppv) This = CoTaskMemAlloc(sizeof(WAVEParserImpl));
hr = Parser_Create(&This->Parser, &WAVEParser_Vtbl, &CLSID_WAVEParser, - sink_name, WAVEParser_Sample, WAVEParser_QueryAccept, + &wave_parser_func_table, sink_name, WAVEParser_Sample, WAVEParser_QueryAccept, WAVEParser_InputPin_PreConnect, WAVEParser_Cleanup, WAVEParser_disconnect, WAVEParser_first_request, NULL, NULL, WAVEParserImpl_seek, NULL);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52909
Your paranoid android.
=== debian9 (32 bit report) ===
quartz: systemclock: Timeout
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/avisplit.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-)
diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index e6f7c2ff43f..f77efa37c5a 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -1266,24 +1266,6 @@ static HRESULT AVISplitter_Disconnect(LPVOID iface) return S_OK; }
-static ULONG WINAPI AVISplitter_Release(IBaseFilter *iface) -{ - AVISplitterImpl *This = impl_from_IBaseFilter(iface); - ULONG ref; - - ref = InterlockedDecrement(&This->Parser.filter.refCount); - - TRACE("(%p)->() Release from %d\n", This, ref + 1); - - if (!ref) - { - AVISplitter_Flush(This); - Parser_Destroy(&This->Parser); - } - - return ref; -} - static HRESULT WINAPI AVISplitter_seek(IMediaSeeking *iface) { AVISplitterImpl *This = impl_from_IMediaSeeking(iface); @@ -1414,7 +1396,7 @@ static const IBaseFilterVtbl AVISplitterImpl_Vtbl = { Parser_QueryInterface, Parser_AddRef, - AVISplitter_Release, + BaseFilterImpl_Release, Parser_GetClassID, Parser_Stop, Parser_Pause, @@ -1429,9 +1411,17 @@ static const IBaseFilterVtbl AVISplitterImpl_Vtbl = Parser_QueryVendorInfo };
+static void avi_splitter_destroy(BaseFilter *iface) +{ + AVISplitterImpl *filter = impl_from_IBaseFilter(&iface->IBaseFilter_iface); + AVISplitter_Flush(filter); + Parser_Destroy(&filter->Parser); +} + static const BaseFilterFuncTable avi_splitter_func_table = { .filter_get_pin = parser_get_pin, + .filter_destroy = avi_splitter_destroy, };
HRESULT AVISplitter_create(IUnknown * pUnkOuter, LPVOID * ppv)