quartz: Immediately return failure from IFilterGraph::RemoveFilter() if IPin::Disconnect() fails.
Do not try to stop the filter. Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
be1ccdf73f
commit
bd1174e125
|
@ -704,14 +704,11 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface, IBaseFilte
|
||||||
|
|
||||||
TRACE("(%p/%p)->(%p)\n", This, iface, pFilter);
|
TRACE("(%p/%p)->(%p)\n", This, iface, pFilter);
|
||||||
|
|
||||||
/* FIXME: check graph is stopped */
|
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(entry, &This->filters, struct filter, entry)
|
LIST_FOR_EACH_ENTRY(entry, &This->filters, struct filter, entry)
|
||||||
{
|
{
|
||||||
if (entry->filter == pFilter)
|
if (entry->filter == pFilter)
|
||||||
{
|
{
|
||||||
IEnumPins *penumpins = NULL;
|
IEnumPins *penumpins = NULL;
|
||||||
FILTER_STATE state;
|
|
||||||
|
|
||||||
if (This->defaultclock && This->refClockProvider == pFilter)
|
if (This->defaultclock && This->refClockProvider == pFilter)
|
||||||
{
|
{
|
||||||
|
@ -726,31 +723,30 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface, IBaseFilte
|
||||||
IPin *ppin;
|
IPin *ppin;
|
||||||
while(IEnumPins_Next(penumpins, 1, &ppin, NULL) == S_OK)
|
while(IEnumPins_Next(penumpins, 1, &ppin, NULL) == S_OK)
|
||||||
{
|
{
|
||||||
IPin *victim = NULL;
|
IPin *peer = NULL;
|
||||||
HRESULT h;
|
HRESULT hr;
|
||||||
IPin_ConnectedTo(ppin, &victim);
|
|
||||||
if (victim)
|
IPin_ConnectedTo(ppin, &peer);
|
||||||
|
if (peer)
|
||||||
{
|
{
|
||||||
h = IPin_Disconnect(victim);
|
if (FAILED(hr = IPin_Disconnect(peer)))
|
||||||
TRACE("Disconnect other side: %08x\n", h);
|
|
||||||
if (h == VFW_E_NOT_STOPPED)
|
|
||||||
{
|
{
|
||||||
PIN_INFO pinfo;
|
WARN("Failed to disconnect peer %p, hr %#x.\n", peer, hr);
|
||||||
IPin_QueryPinInfo(victim, &pinfo);
|
IPin_Release(peer);
|
||||||
|
IPin_Release(ppin);
|
||||||
IBaseFilter_GetState(pinfo.pFilter, 0, &state);
|
IEnumPins_Release(penumpins);
|
||||||
if (state == State_Running)
|
return hr;
|
||||||
IBaseFilter_Pause(pinfo.pFilter);
|
|
||||||
IBaseFilter_Stop(pinfo.pFilter);
|
|
||||||
IBaseFilter_Release(pinfo.pFilter);
|
|
||||||
h = IPin_Disconnect(victim);
|
|
||||||
TRACE("Disconnect retry: %08x\n", h);
|
|
||||||
}
|
}
|
||||||
IPin_Release(victim);
|
IPin_Release(peer);
|
||||||
}
|
|
||||||
h = IPin_Disconnect(ppin);
|
|
||||||
TRACE("Disconnect 2: %08x\n", h);
|
|
||||||
|
|
||||||
|
if (FAILED(hr = IPin_Disconnect(ppin)))
|
||||||
|
{
|
||||||
|
WARN("Failed to disconnect pin %p, hr %#x.\n", ppin, hr);
|
||||||
|
IPin_Release(ppin);
|
||||||
|
IEnumPins_Release(penumpins);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
}
|
||||||
IPin_Release(ppin);
|
IPin_Release(ppin);
|
||||||
}
|
}
|
||||||
IEnumPins_Release(penumpins);
|
IEnumPins_Release(penumpins);
|
||||||
|
|
|
@ -3130,7 +3130,7 @@ todo_wine
|
||||||
|
|
||||||
source_pin.require_stopped_disconnect = TRUE;
|
source_pin.require_stopped_disconnect = TRUE;
|
||||||
hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface);
|
hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface);
|
||||||
todo_wine ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr);
|
ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr);
|
||||||
ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
|
ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
|
||||||
ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
|
ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
|
||||||
|
|
||||||
|
@ -3139,7 +3139,7 @@ todo_wine
|
||||||
source_pin.require_stopped_disconnect = FALSE;
|
source_pin.require_stopped_disconnect = FALSE;
|
||||||
sink_pin.require_stopped_disconnect = TRUE;
|
sink_pin.require_stopped_disconnect = TRUE;
|
||||||
hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface);
|
hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface);
|
||||||
todo_wine ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr);
|
ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr);
|
||||||
ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
|
ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
|
||||||
ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer);
|
ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue