HRESULT NullRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv) { HRESULT hr; PIN_INFO piInput; NullRendererImpl * pNullRenderer; TRACE("(%p, %p)\n", pUnkOuter, ppv); *ppv = NULL; pNullRenderer = CoTaskMemAlloc(sizeof(NullRendererImpl)); pNullRenderer->pUnkOuter = pUnkOuter; pNullRenderer->bUnkOuterValid = FALSE; pNullRenderer->bAggregatable = FALSE; pNullRenderer->IInner_vtbl = &IInner_VTable; pNullRenderer->lpVtbl = &NullRenderer_Vtbl; pNullRenderer->refCount = 1; InitializeCriticalSection(&pNullRenderer->csFilter); pNullRenderer->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": NullRendererImpl.csFilter"); pNullRenderer->state = State_Stopped; pNullRenderer->pClock = NULL; ZeroMemory(&pNullRenderer->filterInfo, sizeof(FILTER_INFO)); /* construct input pin */ piInput.dir = PINDIR_INPUT; piInput.pFilter = (IBaseFilter *)pNullRenderer; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); hr = InputPin_Construct(&NullRenderer_InputPin_Vtbl, &piInput, NullRenderer_Sample, (LPVOID)pNullRenderer, NullRenderer_QueryAccept, NULL, &pNullRenderer->csFilter, NULL, (IPin **)&pNullRenderer->pInputPin); if (SUCCEEDED(hr)) { MediaSeekingImpl_Init((IBaseFilter*)pNullRenderer, NullRendererImpl_Change, NullRendererImpl_Change, NullRendererImpl_Change, &pNullRenderer->mediaSeeking, &pNullRenderer->csFilter); pNullRenderer->mediaSeeking.lpVtbl = &TransformFilter_Seeking_Vtbl; *ppv = pNullRenderer; } else { pNullRenderer->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&pNullRenderer->csFilter); CoTaskMemFree(pNullRenderer); } return hr; }
HRESULT TransformFilter_Create(TransformFilterImpl* pTransformFilter, const CLSID* pClsid, const TransformFuncsTable* pFuncsTable, CHANGEPROC stop, CHANGEPROC current, CHANGEPROC rate) { HRESULT hr; PIN_INFO piInput; PIN_INFO piOutput; /* pTransformFilter is already allocated */ pTransformFilter->clsid = *pClsid; pTransformFilter->pFuncsTable = pFuncsTable; pTransformFilter->lpVtbl = &TransformFilter_Vtbl; pTransformFilter->refCount = 1; InitializeCriticalSection(&pTransformFilter->csFilter); pTransformFilter->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": TransformFilterImpl.csFilter"); pTransformFilter->state = State_Stopped; pTransformFilter->pClock = NULL; ZeroMemory(&pTransformFilter->filterInfo, sizeof(FILTER_INFO)); ZeroMemory(&pTransformFilter->pmt, sizeof(pTransformFilter->pmt)); pTransformFilter->npins = 2; pTransformFilter->ppPins = CoTaskMemAlloc(2 * sizeof(IPin *)); /* construct input pin */ piInput.dir = PINDIR_INPUT; piInput.pFilter = (IBaseFilter *)pTransformFilter; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); piOutput.dir = PINDIR_OUTPUT; piOutput.pFilter = (IBaseFilter *)pTransformFilter; lstrcpynW(piOutput.achName, wcsOutputPinName, sizeof(piOutput.achName) / sizeof(piOutput.achName[0])); hr = InputPin_Construct(&TransformFilter_InputPin_Vtbl, &piInput, (SAMPLEPROC_PUSH)pFuncsTable->pfnProcessSampleData, NULL, TransformFilter_Input_QueryAccept, NULL, &pTransformFilter->csFilter, NULL, &pTransformFilter->ppPins[0]); if (SUCCEEDED(hr)) { ALLOCATOR_PROPERTIES props; props.cbAlign = 1; props.cbPrefix = 0; props.cbBuffer = 0; /* Will be updated at connection time */ props.cBuffers = 1; ((InputPin *)pTransformFilter->ppPins[0])->pin.pUserData = pTransformFilter->ppPins[0]; hr = OutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(OutputPin), &piOutput, &props, pTransformFilter, TransformFilter_Output_QueryAccept, &pTransformFilter->csFilter, &pTransformFilter->ppPins[1]); if (FAILED(hr)) ERR("Cannot create output pin (%x)\n", hr); else { if (!stop) stop = TransformFilter_ChangeStop; if (!current) current = TransformFilter_ChangeCurrent; if (!rate) rate = TransformFilter_ChangeRate; MediaSeekingImpl_Init((IBaseFilter*)pTransformFilter, stop, current, rate, &pTransformFilter->mediaSeeking, &pTransformFilter->csFilter); pTransformFilter->mediaSeeking.lpVtbl = &TransformFilter_Seeking_Vtbl; } } else { CoTaskMemFree(pTransformFilter->ppPins); pTransformFilter->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&pTransformFilter->csFilter); CoTaskMemFree(pTransformFilter); } return hr; }
HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv) { HRESULT hr; PIN_INFO piInput; DSoundRenderImpl * pDSoundRender; TRACE("(%p, %p)\n", pUnkOuter, ppv); *ppv = NULL; if (pUnkOuter) return CLASS_E_NOAGGREGATION; pDSoundRender = CoTaskMemAlloc(sizeof(DSoundRenderImpl)); if (!pDSoundRender) return E_OUTOFMEMORY; ZeroMemory(pDSoundRender, sizeof(DSoundRenderImpl)); pDSoundRender->lpVtbl = &DSoundRender_Vtbl; pDSoundRender->IBasicAudio_vtbl = &IBasicAudio_Vtbl; pDSoundRender->IReferenceClock_vtbl = &IReferenceClock_Vtbl; pDSoundRender->refCount = 1; InitializeCriticalSection(&pDSoundRender->csFilter); pDSoundRender->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DSoundRenderImpl.csFilter"); pDSoundRender->state = State_Stopped; /* construct input pin */ piInput.dir = PINDIR_INPUT; piInput.pFilter = (IBaseFilter *)pDSoundRender; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); hr = InputPin_Construct(&DSoundRender_InputPin_Vtbl, &piInput, DSoundRender_Sample, pDSoundRender, DSoundRender_QueryAccept, NULL, &pDSoundRender->csFilter, NULL, (IPin **)&pDSoundRender->pInputPin); if (SUCCEEDED(hr)) { hr = DirectSoundCreate8(NULL, &pDSoundRender->dsound, NULL); if (FAILED(hr)) ERR("Cannot create Direct Sound object (%x)\n", hr); else IDirectSound_SetCooperativeLevel(pDSoundRender->dsound, GetDesktopWindow(), DSSCL_PRIORITY); } if (SUCCEEDED(hr)) { MediaSeekingImpl_Init((IBaseFilter*)pDSoundRender, sound_mod_stop, sound_mod_start, sound_mod_rate, &pDSoundRender->mediaSeeking, &pDSoundRender->csFilter); pDSoundRender->mediaSeeking.lpVtbl = &IMediaSeeking_Vtbl; pDSoundRender->state_change = CreateEventW(NULL, TRUE, TRUE, NULL); pDSoundRender->blocked = CreateEventW(NULL, FALSE, FALSE, NULL); if (!pDSoundRender->state_change || !pDSoundRender->blocked) { IUnknown_Release((IUnknown *)pDSoundRender); return HRESULT_FROM_WIN32(GetLastError()); } *ppv = (LPVOID)pDSoundRender; } else { if (pDSoundRender->pInputPin) IPin_Release((IPin*)pDSoundRender->pInputPin); pDSoundRender->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&pDSoundRender->csFilter); CoTaskMemFree(pDSoundRender); } return hr; }