/*****************************************************************************
* crossbar.c : DirectShow access module for vlc
*****************************************************************************
- * Copyright (C) 2002 VideoLAN
+ * Copyright (C) 2002 the VideoLAN team
* $Id$
*
* Author: Damien Fouilleul <damien dot fouilleul at laposte dot net>
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
#include <vlc/vlc.h>
-#include <vlc/input.h>
-#include <vlc/vout.h>
+#include <vlc_vout.h>
#ifndef _MSC_VER
/* Work-around a bug in w32api-2.5 */
if( pXbar->QueryInterface(IID_IBaseFilter, (void **)&pFilter) == S_OK )
{
- if( SUCCEEDED(pFilter->EnumPins(&pins)) )
+ if( SUCCEEDED(pFilter->EnumPins(&pins)) )
{
LONG i = 0;
- while( pins->Next(1, &pP, &n) == S_OK )
+ while( pins->Next(1, &pP, &n) == S_OK )
{
pP->Release();
- if( i == TrueIndex )
+ if( i == TrueIndex )
{
*ppPin = pP;
break;
pFilter->Release();
}
- return *ppPin ? S_OK : E_FAIL;
+ return *ppPin ? S_OK : E_FAIL;
}
/*****************************************************************************
pFilter->Release();
}
- return fOK ? S_OK : E_FAIL;
+ return fOK ? S_OK : E_FAIL;
}
/*****************************************************************************
}
LONG inputPinIndexRelated, outputPinIndexRelated;
- LONG inputPinPhysicalType, outputPinPhysicalType;
- LONG inputPinIndex, outputPinIndex;
+ LONG inputPinPhysicalType = 0, outputPinPhysicalType;
+ LONG inputPinIndex = 0, outputPinIndex;
if( FAILED(GetCrossbarIndexFromIPin( pXbar, &outputPinIndex,
FALSE, p_output_pin )) ||
FAILED(pXbar->get_CrossbarPinInfo( FALSE, outputPinIndex,
return S_FALSE;
}
+ /*
+ ** if physical type is 0, then use default/existing route to physical connector
+ */
+ if( physicalType == 0 )
+ {
+ /* use following as default connector type if we fail to find an existing route */
+ physicalType = PhysConn_Video_Tuner;
+ if( SUCCEEDED(pXbar->get_IsRoutedTo(outputPinIndex, &inputPinIndex)) )
+ {
+
+ if( SUCCEEDED( pXbar->get_CrossbarPinInfo( TRUE, inputPinIndex,
+ &inputPinIndexRelated, &inputPinPhysicalType )) )
+ {
+ // remember connector type
+ physicalType = inputPinPhysicalType;
+
+ msg_Dbg( p_this, "found existing route for output %ld (type %ld) to input %ld (type %ld)",
+ outputPinIndex, outputPinPhysicalType, inputPinIndex,
+ inputPinPhysicalType );
+
+ // fall through to for loop, note 'inputPinIndex' is set to the pin we are looking for
+ // hence, loop iteration should not wind back
+
+ }
+ }
+ else {
+ // reset to first pin for complete loop iteration
+ inputPinIndex = 0;
+ }
+ }
+
//
// for all input pins
//
- for( inputPinIndex = 0; S_OK != result && inputPinIndex < inputPinCount;
- inputPinIndex++ )
+ for( /* inputPinIndex has been set */ ; (S_OK != result) && (inputPinIndex < inputPinCount); ++inputPinIndex )
{
if( FAILED(pXbar->get_CrossbarPinInfo( TRUE, inputPinIndex,
- &inputPinIndexRelated, &inputPinPhysicalType )) ) continue;
-
- // Is the pin a video pin?
+ &inputPinIndexRelated, &inputPinPhysicalType )) ) continue;
+
+ // Is this pin matching required connector physical type?
if( inputPinPhysicalType != physicalType ) continue;
// Can we route it?
if( FAILED(pXbar->CanRoute(outputPinIndex, inputPinIndex)) ) continue;
-
+
+
IPin *pPin;
if( FAILED(GetCrossbarIPinAtIndex( pXbar, inputPinIndex,
TRUE, &pPin)) ) continue;
physicalType == inputPinPhysicalType &&
(p_sys->i_crossbar_route_depth = depth+1) < MAX_CROSSBAR_DEPTH) )
{
- // hold on crossbar
+ // hold on crossbar, will be released when graph is destroyed
pXbar->AddRef();
// remember crossbar route
p_sys->crossbar_routes[depth].AudioInputIndex = inputPinIndexRelated;
p_sys->crossbar_routes[depth].AudioOutputIndex = outputPinIndexRelated;
- msg_Dbg( p_this, "Crossbar at depth %d, Found Route For "
- "ouput %ld (type %ld) to input %ld (type %ld)", depth,
+ msg_Dbg( p_this, "crossbar at depth %d, found route for "
+ "output %ld (type %ld) to input %ld (type %ld)", depth,
outputPinIndex, outputPinPhysicalType, inputPinIndex,
inputPinPhysicalType );