HRESULT CStreamSwitcherFilter::CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin, IPin* pReceivePin) { if (dir == PINDIR_INPUT) { CAutoLock cAutoLock(&m_csPins); int nConnected = GetConnectedInputPinCount(); if (nConnected == 1) { m_pInput = static_cast<CStreamSwitcherInputPin*>(pPin); } if ((size_t)nConnected == m_pInputs.GetCount()) { CStringW name; name.Format(L"Channel %d", ++m_PinVersion); HRESULT hr = S_OK; CStreamSwitcherInputPin* pPin = DEBUG_NEW CStreamSwitcherInputPin(this, &hr, name); if (!pPin || FAILED(hr)) { delete pPin; return E_FAIL; } m_pInputs.AddTail(pPin); } } return S_OK; }
CStreamSwitcherFilter::CStreamSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid) : CBaseFilter(NAME("CStreamSwitcherFilter"), lpunk, &m_csState, clsid) { if(phr) *phr = S_OK; HRESULT hr = S_OK; do { CAutoPtr<CStreamSwitcherInputPin> pInput; CAutoPtr<CStreamSwitcherOutputPin> pOutput; hr = S_OK; pInput.Attach(DNew CStreamSwitcherInputPin(this, &hr, L"Channel 1")); if(!pInput || FAILED(hr)) break; hr = S_OK; pOutput.Attach(DNew CStreamSwitcherOutputPin(this, &hr)); if(!pOutput || FAILED(hr)) break; CAutoLock cAutoLock(&m_csPins); m_pInputs.AddHead(m_pInput = pInput.Detach()); m_pOutput = pOutput.Detach(); return; } while(false); if(phr) *phr = E_FAIL; }