void CStreamSwitcherFilter::SelectInput(CStreamSwitcherInputPin* pInput) { // make sure no input thinks it is active m_pInput = nullptr; // release blocked GetBuffer in our own allocator & block all Receive POSITION pos = m_pInputs.GetHeadPosition(); while (pos) { CStreamSwitcherInputPin* pPin = m_pInputs.GetNext(pos); pPin->Block(false); // a few Receive calls can arrive here, but since m_pInput == nullptr neighter of them gets delivered pPin->Block(true); } // this will let waiting GetBuffer() calls go on inside our Receive() if (m_pOutput) { m_pOutput->DeliverBeginFlush(); m_pOutput->DeliverEndFlush(); } if (!pInput) { return; } // set new input m_pInput = pInput; // let it go m_pInput->Block(false); }