本文整理汇总了C++中IPin_Release函数的典型用法代码示例。如果您正苦于以下问题:C++ IPin_Release函数的具体用法?C++ IPin_Release怎么用?C++ IPin_Release使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IPin_Release函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: QT_RemoveOutputPins
/*
* Input Pin
*/
static HRESULT QT_RemoveOutputPins(QTSplitter *This)
{
HRESULT hr;
TRACE("(%p)\n", This);
if (This->pVideo_Pin)
{
OutputQueue_Destroy(This->pVideo_Pin->queue);
hr = BaseOutputPinImpl_BreakConnect(&This->pVideo_Pin->pin);
TRACE("Disconnect: %08x\n", hr);
IPin_Release(&This->pVideo_Pin->pin.pin.IPin_iface);
This->pVideo_Pin = NULL;
}
if (This->pAudio_Pin)
{
OutputQueue_Destroy(This->pAudio_Pin->queue);
hr = BaseOutputPinImpl_BreakConnect(&This->pAudio_Pin->pin);
TRACE("Disconnect: %08x\n", hr);
IPin_Release(&This->pAudio_Pin->pin.pin.IPin_iface);
This->pAudio_Pin = NULL;
}
BaseFilterImpl_IncrementPinVersion(&This->filter);
return S_OK;
}
示例2: NullRendererInner_Release
static ULONG WINAPI NullRendererInner_Release(IUnknown * iface)
{
ICOM_THIS_MULTI(NullRendererImpl, IInner_vtbl, iface);
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
if (!refCount)
{
IPin *pConnectedTo;
if (This->pClock)
IReferenceClock_Release(This->pClock);
if (SUCCEEDED(IPin_ConnectedTo((IPin *)This->pInputPin, &pConnectedTo)))
{
IPin_Disconnect(pConnectedTo);
IPin_Release(pConnectedTo);
}
IPin_Disconnect((IPin *)This->pInputPin);
IPin_Release((IPin *)This->pInputPin);
This->lpVtbl = NULL;
This->csFilter.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->csFilter);
TRACE("Destroying Null Renderer\n");
CoTaskMemFree(This);
return 0;
}
else
return refCount;
}
示例3: Parser_Destroy
void Parser_Destroy(ParserImpl *This)
{
IPin *connected = NULL;
ULONG pinref;
assert(!This->filter.refCount);
PullPin_WaitForStateChange(This->pInputPin, INFINITE);
/* Don't need to clean up output pins, freeing input pin will do that */
IPin_ConnectedTo(&This->pInputPin->pin.IPin_iface, &connected);
if (connected)
{
assert(IPin_Disconnect(connected) == S_OK);
IPin_Release(connected);
assert(IPin_Disconnect(&This->pInputPin->pin.IPin_iface) == S_OK);
}
pinref = IPin_Release(&This->pInputPin->pin.IPin_iface);
if (pinref)
{
/* Valgrind could find this, if I kill it here */
ERR("pinref should be null, is %u, destroying anyway\n", pinref);
assert((LONG)pinref > 0);
while (pinref)
pinref = IPin_Release(&This->pInputPin->pin.IPin_iface);
}
CoTaskMemFree(This->ppPins);
TRACE("Destroying parser\n");
CoTaskMemFree(This);
}
示例4: unknown_inner_Release
static ULONG WINAPI unknown_inner_Release(IUnknown *iface)
{
VfwCapture *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedDecrement(&This->filter.refCount);
TRACE("(%p) ref=%d\n", This, ref);
if (!ref)
{
IPin *conn = NULL;
TRACE("destroying everything\n");
if (This->init)
{
if (This->filter.state != State_Stopped)
qcap_driver_stop(This->driver_info, &This->filter.state);
qcap_driver_destroy(This->driver_info);
}
IPin_ConnectedTo(This->pOutputPin, &conn);
if (conn)
{
IPin_Disconnect(conn);
IPin_Disconnect(This->pOutputPin);
IPin_Release(conn);
}
IPin_Release(This->pOutputPin);
BaseFilter_Destroy(&This->filter);
CoTaskMemFree(This);
ObjectRefCount(FALSE);
}
return ref;
}
示例5: test_AviCo
static void test_AviCo(void)
{
IPersistPropertyBag *persist_bag;
IPin *pin, *in_pin, *out_pin;
IEnumPins *enum_pins;
IBaseFilter *avico;
PIN_INFO pin_info;
HRESULT hres;
static const WCHAR inputW[] = {'I','n','p','u','t',0};
static const WCHAR outputW[] = {'O','u','t','p','u','t',0};
hres = CoCreateInstance(&CLSID_AVICo, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void**)&avico);
if(hres == REGDB_E_CLASSNOTREG) {
win_skip("CLSID_AVICo not restered\n");
return;
}
ok(hres == S_OK, "Could not create CLSID_AVICo class: %08x\n", hres);
hres = IBaseFilter_QueryInterface(avico, &IID_IPin, (void**)&pin);
ok(hres == E_NOINTERFACE, "QueryInterface(IID_IPin) returned: %08x\n", hres);
hres = IBaseFilter_QueryInterface(avico, &IID_IPersistPropertyBag, (void**)&persist_bag);
ok(hres == S_OK, "QueryInterface(IID_IPersistPropertyBag) returned: %08x\n", hres);
SET_EXPECT(Read_FccHandler);
hres = IPersistPropertyBag_Load(persist_bag, &PropertyBag, NULL);
ok(hres == S_OK, "Load failed: %08x\n", hres);
CHECK_CALLED(Read_FccHandler);
IPersistPropertyBag_Release(persist_bag);
hres = IBaseFilter_EnumPins(avico, &enum_pins);
ok(hres == S_OK, "EnumPins failed: %08x\n", hres);
hres = IEnumPins_Next(enum_pins, 1, &in_pin, NULL);
ok(hres == S_OK, "Next failed: %08x\n", hres);
hres = IPin_QueryPinInfo(in_pin, &pin_info);
ok(hres == S_OK, "QueryPinInfo failed: %08x\n", hres);
ok(pin_info.pFilter == avico, "pin_info.pFilter != avico\n");
ok(pin_info.dir == PINDIR_INPUT, "pin_info.dir = %d\n", pin_info.dir);
ok(!lstrcmpW(pin_info.achName, inputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName));
hres = IEnumPins_Next(enum_pins, 1, &out_pin, NULL);
ok(hres == S_OK, "Next failed: %08x\n", hres);
hres = IPin_QueryPinInfo(out_pin, &pin_info);
ok(hres == S_OK, "QueryPinInfo failed: %08x\n", hres);
ok(pin_info.pFilter == avico, "pin_info.pFilter != avico\n");
ok(pin_info.dir == PINDIR_OUTPUT, "pin_info.dir = %d\n", pin_info.dir);
ok(!lstrcmpW(pin_info.achName, outputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName));
IEnumPins_Release(enum_pins);
IPin_Release(in_pin);
IPin_Release(out_pin);
IBaseFilter_Release(avico);
}
示例6: QT_Destroy
static void QT_Destroy(QTSplitter *This)
{
IPin *connected = NULL;
ULONG pinref;
TRACE("Destroying\n");
EnterCriticalSection(&This->csReceive);
/* Don't need to clean up output pins, disconnecting input pin will do that */
IPin_ConnectedTo(&This->pInputPin.pin.IPin_iface, &connected);
if (connected)
{
IPin_Disconnect(connected);
IPin_Release(connected);
}
pinref = IPin_Release(&This->pInputPin.pin.IPin_iface);
if (pinref)
{
ERR("pinref should be null, is %u, destroying anyway\n", pinref);
assert((LONG)pinref > 0);
while (pinref)
pinref = IPin_Release(&This->pInputPin.pin.IPin_iface);
}
if (This->pQTMovie)
{
DisposeMovie(This->pQTMovie);
This->pQTMovie = NULL;
}
if (This->vContext)
QTVisualContextRelease(This->vContext);
if (This->aSession)
MovieAudioExtractionEnd(This->aSession);
ExitMoviesOnThread();
LeaveCriticalSection(&This->csReceive);
if (This->loaderThread)
{
WaitForSingleObject(This->loaderThread, INFINITE);
CloseHandle(This->loaderThread);
}
if (This->splitterThread)
{
SetEvent(This->runEvent);
WaitForSingleObject(This->splitterThread, INFINITE);
CloseHandle(This->splitterThread);
}
CloseHandle(This->runEvent);
This->csReceive.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->csReceive);
BaseFilter_Destroy(&This->filter);
CoTaskMemFree(This);
}
示例7: QualityControlImpl_Notify
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm)
{
QualityControlImpl *This = impl_from_IQualityControl(iface);
HRESULT hr = S_FALSE;
TRACE("%p %p { 0x%x %u " XTIME_FMT " " XTIME_FMT " }\n",
This, sender, qm.Type, qm.Proportion,
XTIME(qm.Late), XTIME(qm.TimeStamp));
if (This->tonotify)
return IQualityControl_Notify(This->tonotify, This->self, qm);
if (This->input) {
IPin *to = NULL;
IPin_ConnectedTo(This->input, &to);
if (to) {
IQualityControl *qc = NULL;
IPin_QueryInterface(to, &IID_IQualityControl, (void**)&qc);
if (qc) {
hr = IQualityControl_Notify(qc, This->self, qm);
IQualityControl_Release(qc);
}
IPin_Release(to);
}
}
return hr;
}
示例8: IAMMultiMediaStreamImpl_Release
static ULONG WINAPI IAMMultiMediaStreamImpl_Release(IAMMultiMediaStream* iface)
{
IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
ULONG ref = InterlockedDecrement(&This->ref);
ULONG i;
TRACE("(%p/%p)\n", iface, This);
if (!ref)
{
for(i = 0; i < This->nbStreams; i++)
IMediaStream_Release(This->pStreams[i]);
if (This->ipin)
IPin_Release(This->ipin);
if (This->media_stream_filter)
IBaseFilter_Release(This->media_stream_filter);
if (This->media_seeking)
IMediaSeeking_Release(This->media_seeking);
if (This->media_control)
IMediaControl_Release(This->media_control);
if (This->pFilterGraph)
IGraphBuilder_Release(This->pFilterGraph);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
}
示例9: pin_matches
static BOOL pin_matches(IPin *pin, PIN_DIRECTION direction, const GUID *cat, const GUID *type, BOOL unconnected)
{
IPin *partner;
PIN_DIRECTION pindir;
IPin_QueryDirection(pin, &pindir);
if (pindir != direction)
{
TRACE("No match, wrong direction\n");
return FALSE;
}
if (unconnected && IPin_ConnectedTo(pin, &partner) == S_OK)
{
IPin_Release(partner);
TRACE("No match, %p already connected to %p\n", pin, partner);
return FALSE;
}
if (cat || type)
FIXME("Ignoring category/type\n");
TRACE("Match made in heaven\n");
return TRUE;
}
示例10: Parser_RemoveOutputPins
static HRESULT Parser_RemoveOutputPins(ParserImpl * This)
{
/* NOTE: should be in critical section when calling this function */
HRESULT hr;
ULONG i;
IPin ** ppOldPins = This->ppPins;
TRACE("(%p)\n", This);
/* reduce the pin array down to 1 (just our input pin) */
This->ppPins = CoTaskMemAlloc(sizeof(IPin *) * 1);
memcpy(This->ppPins, ppOldPins, sizeof(IPin *) * 1);
for (i = 0; i < This->cStreams; i++)
{
hr = ((BaseOutputPin *)ppOldPins[i + 1])->pFuncsTable->pfnBreakConnect((BaseOutputPin *)ppOldPins[i + 1]);
TRACE("Disconnect: %08x\n", hr);
IPin_Release(ppOldPins[i + 1]);
}
BaseFilterImpl_IncrementPinVersion(&This->filter);
This->cStreams = 0;
CoTaskMemFree(ppOldPins);
return S_OK;
}
示例11: TransformFilter_InputPin_EndOfStream
static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface)
{
BaseInputPin* This = impl_BaseInputPin_from_IPin(iface);
TransformFilter* pTransform;
IPin* ppin;
HRESULT hr;
TRACE("(%p)->()\n", iface);
/* Since we process samples synchronously, just forward notification downstream */
pTransform = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
if (!pTransform)
hr = E_FAIL;
else
hr = IPin_ConnectedTo(pTransform->ppPins[1], &ppin);
if (SUCCEEDED(hr))
{
hr = IPin_EndOfStream(ppin);
IPin_Release(ppin);
}
if (FAILED(hr))
ERR("%x\n", hr);
return hr;
}
示例12: TransformFilter_Release
static ULONG WINAPI TransformFilter_Release(IBaseFilter * iface)
{
TransformFilterImpl *This = (TransformFilterImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
if (!refCount)
{
ULONG i;
if (This->pClock)
IReferenceClock_Release(This->pClock);
for (i = 0; i < This->npins; i++)
{
IPin *pConnectedTo;
if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo)))
{
IPin_Disconnect(pConnectedTo);
IPin_Release(pConnectedTo);
}
IPin_Disconnect(This->ppPins[i]);
IPin_Release(This->ppPins[i]);
}
CoTaskMemFree(This->ppPins);
This->lpVtbl = NULL;
This->csFilter.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->csFilter);
TRACE("Destroying transform filter\n");
FreeMediaType(&This->pmt);
CoTaskMemFree(This);
return 0;
}
else
return refCount;
}
示例13: DSoundRender_Release
static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface)
{
DSoundRenderImpl *This = (DSoundRenderImpl *)iface;
ULONG refCount = BaseFilterImpl_Release(iface);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
if (!refCount)
{
IPin *pConnectedTo;
if (This->dsbuffer)
IDirectSoundBuffer_Release(This->dsbuffer);
This->dsbuffer = NULL;
if (This->dsound)
IDirectSound_Release(This->dsound);
This->dsound = NULL;
if (SUCCEEDED(IPin_ConnectedTo((IPin *)This->pInputPin, &pConnectedTo)))
{
IPin_Disconnect(pConnectedTo);
IPin_Release(pConnectedTo);
}
IPin_Disconnect((IPin *)This->pInputPin);
IPin_Release((IPin *)This->pInputPin);
This->IBasicAudio_vtbl = NULL;
if (This->seekthru_unk)
IUnknown_Release(This->seekthru_unk);
CloseHandle(This->state_change);
CloseHandle(This->blocked);
TRACE("Destroying Audio Renderer\n");
CoTaskMemFree(This);
return 0;
}
else
return refCount;
}
示例14: fnCaptureGraphBuilder2_RenderStream
static HRESULT WINAPI
fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
const GUID *pCategory,
const GUID *pType,
IUnknown *pSource,
IBaseFilter *pfCompressor,
IBaseFilter *pfRenderer)
{
CaptureGraphImpl *This = impl_from_ICaptureGraphBuilder2(iface);
IPin *pin_in = NULL;
IPin *pin_out = NULL;
HRESULT hr;
FIXME("(%p/%p)->(%s, %s, %p, %p, %p) Stub!\n", This, iface,
debugstr_guid(pCategory), debugstr_guid(pType),
pSource, pfCompressor, pfRenderer);
if (pfCompressor)
FIXME("Intermediate streams not supported yet\n");
if (!This->mygraph)
{
FIXME("Need a capture graph\n");
return E_UNEXPECTED;
}
ICaptureGraphBuilder2_FindPin(iface, pSource, PINDIR_OUTPUT, pCategory, pType, TRUE, 0, &pin_in);
if (!pin_in)
return E_FAIL;
ICaptureGraphBuilder2_FindPin(iface, (IUnknown*)pfRenderer, PINDIR_INPUT, pCategory, pType, TRUE, 0, &pin_out);
if (!pin_out)
{
IPin_Release(pin_in);
return E_FAIL;
}
/* Uses 'Intelligent Connect', so Connect, not ConnectDirect here */
hr = IGraphBuilder_Connect(This->mygraph, pin_in, pin_out);
IPin_Release(pin_in);
IPin_Release(pin_out);
return hr;
}
示例15: qcap_driver_stop
HRESULT qcap_driver_stop(Capture *capBox, FILTER_STATE *state)
{
TRACE("%p -> (%p)\n", capBox, state);
if (*state == State_Stopped)
return S_OK;
EnterCriticalSection(&capBox->CritSect);
if (capBox->thread)
{
if (*state == State_Paused)
ResumeThread(capBox->thread);
capBox->stopped = 1;
capBox->thread = 0;
if (capBox->iscommitted)
{
IMemInputPin *pMem = NULL;
IMemAllocator * pAlloc = NULL;
IPin *pConnect = NULL;
HRESULT hr;
capBox->iscommitted = 0;
hr = IPin_ConnectedTo(capBox->pOut, &pConnect);
if (SUCCEEDED(hr))
hr = IPin_QueryInterface(pConnect, &IID_IMemInputPin, (void **) &pMem);
if (SUCCEEDED(hr))
hr = IMemInputPin_GetAllocator(pMem, &pAlloc);
if (SUCCEEDED(hr))
hr = IMemAllocator_Decommit(pAlloc);
if (pAlloc)
IMemAllocator_Release(pAlloc);
if (pMem)
IMemInputPin_Release(pMem);
if (pConnect)
IPin_Release(pConnect);
if (hr != S_OK && hr != VFW_E_NOT_COMMITTED)
WARN("Decommitting allocator: %x\n", hr);
}
V4l_Unprepare(capBox);
}
*state = State_Stopped;
LeaveCriticalSection(&capBox->CritSect);
return S_OK;
}