293 lines
8.6 KiB
C++
293 lines
8.6 KiB
C++
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Xbar.h 1.8 1998/04/29 22:43:42 tomz Exp $
|
|
|
|
#ifndef __XBAR_H
|
|
#define __XBAR_H
|
|
|
|
//
|
|
// This file defines interconnections between components via Mediums
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifdef BT848_MEDIUMS
|
|
#define MEDIUM_DECL
|
|
#else
|
|
#define MEDIUM_DECL extern
|
|
#endif
|
|
|
|
/* -----------------------------------------------------------
|
|
|
|
Topology of all devices:
|
|
|
|
PinDir FilterPin# M_GUID#
|
|
TVTuner
|
|
TVTunerVideo out 0 0
|
|
TVTunerAudio out 1 1
|
|
TVAudio
|
|
TVTunerAudio in 0 1
|
|
TVAudio out 1 3
|
|
Crossbar
|
|
TVTunerVideo in 0 0
|
|
TVAudio in 3 3
|
|
AnalogVideoOut out 4 4
|
|
AnalogAudioOut out 5 NULL
|
|
Capture
|
|
AnalogVideoIn in 0 4
|
|
|
|
|
|
All other pins are marked as promiscuous connections via GUID_NULL
|
|
------------------------------------------------------------------ */
|
|
|
|
// Define the GUIDs which will be used to create the Mediums
|
|
#define M_GUID0 0xa19dc0e0, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID1 0xa19dc0e1, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID2 0xa19dc0e2, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID3 0xa19dc0e3, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID4 0xa19dc0e4, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID5 0xa19dc0e5, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID6 0xa19dc0e6, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID7 0xa19dc0e7, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID8 0xa19dc0e8, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
#define M_GUID9 0xa19dc0e9, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
|
|
|
|
// Note: To allow multiple instances of the same piece of hardware,
|
|
// set the first ULONG after the GUID in the Medium to a unique value.
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
MEDIUM_DECL KSPIN_MEDIUM TVTunerMediums[2]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
{M_GUID0, 0, 0}, // Pin 0
|
|
{M_GUID1, 0, 0}, // Pin 1
|
|
}
|
|
#endif
|
|
;
|
|
|
|
MEDIUM_DECL BOOL TVTunerPinDirection [2]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
TRUE, // Output Pin 0
|
|
TRUE, // Output Pin 1
|
|
}
|
|
#endif
|
|
;
|
|
|
|
// -----------------------------------------------
|
|
|
|
MEDIUM_DECL KSPIN_MEDIUM TVAudioMediums[2]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
{M_GUID1, 0, 0}, // Pin 0
|
|
{M_GUID3, 0, 0}, // Pin 1
|
|
}
|
|
#endif
|
|
;
|
|
|
|
MEDIUM_DECL BOOL TVAudioPinDirection [2]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
FALSE, // Input Pin 0
|
|
TRUE, // Output Pin 1
|
|
}
|
|
#endif
|
|
;
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
MEDIUM_DECL KSPIN_MEDIUM CrossbarMediums[6]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
{STATIC_GUID_NULL, 0, 0}, // Input Pin 0 - SVideoIn
|
|
{M_GUID0, 0, 0}, // Input Pin 2, KS_PhysConn_Video_Tuner,
|
|
{STATIC_GUID_NULL, 0, 0}, // Input Pin 1 - VideoCompositeIn
|
|
{M_GUID3, 0, 0}, // Input Pin 3 KS_PhysConn_Audio_Tuner,
|
|
{M_GUID4, 0, 0}, // Output Pin 4 - VideoDecoderOut
|
|
{STATIC_GUID_NULL, 0, 0}, // Output Pin 5 KS_PhysConn_Audio_AudioDecoder,
|
|
}
|
|
#endif
|
|
;
|
|
|
|
MEDIUM_DECL BOOL CrossbarPinDirection [6]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
FALSE, // Input Pin 0
|
|
FALSE, // Input Pin 1
|
|
FALSE, // Input Pin 2
|
|
FALSE, // Input Pin 3
|
|
TRUE, // Output Pin 4
|
|
TRUE, // Output Pin 5
|
|
}
|
|
#endif
|
|
;
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
MEDIUM_DECL KSPIN_MEDIUM CaptureMediums[4]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
// should change STATIC_KSMEDIUMSETID_Standard to
|
|
// STATIC_GUID_NULL when it works
|
|
{STATIC_KSMEDIUMSETID_Standard, 0, 0}, // Pin 0 Capture
|
|
{STATIC_KSMEDIUMSETID_Standard, 0, 0}, // Pin 1 Preview
|
|
{STATIC_KSMEDIUMSETID_Standard, 0, 0}, // Pin 2 VBI
|
|
{M_GUID4, 0, 0}, // Pin 3 Analog Video In
|
|
}
|
|
#endif
|
|
;
|
|
|
|
MEDIUM_DECL BOOL CapturePinDirection [4]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
TRUE, // Output Pin 0
|
|
TRUE, // Output Pin 1
|
|
TRUE, // Output Pin 2
|
|
FALSE, // Input Pin 3
|
|
}
|
|
#endif
|
|
;
|
|
|
|
MEDIUM_DECL GUID CaptureCategories [4]
|
|
#ifdef BT848_MEDIUMS
|
|
= {
|
|
STATIC_PINNAME_VIDEO_CAPTURE, // Pin 0
|
|
STATIC_PINNAME_VIDEO_PREVIEW, // Pin 1
|
|
STATIC_PINNAME_VIDEO_VBI, // Pin 2
|
|
STATIC_PINNAME_VIDEO_ANALOGVIDEOIN, // Pin 3
|
|
}
|
|
#endif
|
|
;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
|
|
struct _XBAR_PIN_DESCRIPTION {
|
|
ULONG PinType;
|
|
ULONG RelatedPinIndex;
|
|
ULONG IsRoutedTo; // Index of input pin in use
|
|
ULONG PinNo; // pin number as hard-wired; i.e. mux input 1; to be used in calls
|
|
// into the decoder to select a mux input
|
|
|
|
const KSPIN_MEDIUM *Medium;
|
|
|
|
_XBAR_PIN_DESCRIPTION( ULONG type, ULONG no, ULONG rel, const KSPIN_MEDIUM *);
|
|
_XBAR_PIN_DESCRIPTION(){}
|
|
};
|
|
|
|
inline _XBAR_PIN_DESCRIPTION::_XBAR_PIN_DESCRIPTION( ULONG type, ULONG no,
|
|
ULONG rel, const KSPIN_MEDIUM *Medium ) : PinType( type ),
|
|
RelatedPinIndex( rel ), IsRoutedTo( 0 ), PinNo( no ), Medium (Medium)
|
|
{
|
|
}
|
|
|
|
const int MaxOutPins = 2;
|
|
const int MaxInpPins = 4;
|
|
|
|
class CrossBar
|
|
{
|
|
// it is possible to make these into the pointers and allocate dynamically
|
|
// based on info from registry; but this seems like a lot of work - just allocate
|
|
// the maximum possible number and construct each based on the registry settings
|
|
_XBAR_PIN_DESCRIPTION OutputPins [MaxOutPins];
|
|
_XBAR_PIN_DESCRIPTION InputPins [MaxInpPins];
|
|
|
|
int InPinsNo_;
|
|
public:
|
|
int GetNoInputs();
|
|
int GetNoOutputs();
|
|
bool TestRoute( int InPin, int OutPin );
|
|
ULONG GetPinInfo( int dir, int idx, ULONG &related,
|
|
KSPIN_MEDIUM * Medium);
|
|
ULONG GetPinNo( int no );
|
|
|
|
void Route( int OutPin, int InPin );
|
|
bool GoodPins( int InPin, int OutPin );
|
|
|
|
int GetRoute( int OutPin );
|
|
|
|
CrossBar() : InPinsNo_( 0 ) {};
|
|
CrossBar( LONG *types );
|
|
};
|
|
|
|
inline CrossBar::CrossBar( LONG *types ) : InPinsNo_( 0 )
|
|
{
|
|
OutputPins [0] = _XBAR_PIN_DESCRIPTION( KS_PhysConn_Video_VideoDecoder,
|
|
0, 1, &CrossbarMediums[4]);
|
|
|
|
// [!!!] The following should be moved into the _XBAR_PIN_DESCRIPTION
|
|
// constructor as another parameter
|
|
Route( 0 /*Video OutPin*/, 1 /*Video InPin*/ );
|
|
|
|
OutputPins [1] = _XBAR_PIN_DESCRIPTION( KS_PhysConn_Audio_AudioDecoder,
|
|
0, 1, &CrossbarMediums[5]);
|
|
|
|
// [!!!] The following should be moved into the _XBAR_PIN_DESCRIPTION
|
|
// constructor as another parameter
|
|
Route( 1 /*Audio OutPin*/, 3 /*Audio InPin*/ );
|
|
|
|
for ( int i = 0; i < MaxInpPins; i++ ) {
|
|
if ( types [i] != -1 ) {
|
|
InputPins [InPinsNo_] = _XBAR_PIN_DESCRIPTION( types [i], i, (DWORD) -1, &CrossbarMediums[i] );
|
|
InPinsNo_++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
inline int CrossBar::GetNoInputs()
|
|
{
|
|
return InPinsNo_;
|
|
}
|
|
|
|
inline int CrossBar::GetNoOutputs()
|
|
{
|
|
return MaxOutPins;
|
|
}
|
|
|
|
inline bool CrossBar::GoodPins( int InPin, int OutPin )
|
|
{
|
|
return InPinsNo_ &&
|
|
bool( InPin >= -1 && InPin < InPinsNo_ && OutPin >= 0 && OutPin < MaxOutPins ); // JBC 4/1/98 Don't allow negative pin numbers
|
|
}
|
|
|
|
inline void CrossBar::Route( int OutPin, int InPin )
|
|
{
|
|
OutputPins [OutPin].IsRoutedTo = InPin;
|
|
}
|
|
|
|
inline int CrossBar::GetRoute( int OutPin )
|
|
{
|
|
return OutputPins [OutPin].IsRoutedTo;
|
|
}
|
|
|
|
// should be called for input pins only !
|
|
inline ULONG CrossBar::GetPinNo( int no )
|
|
{
|
|
return InputPins [no].PinNo;
|
|
}
|
|
|
|
inline ULONG CrossBar::GetPinInfo( int dir, int idx, ULONG &related,
|
|
KSPIN_MEDIUM * Medium )
|
|
{
|
|
_XBAR_PIN_DESCRIPTION *pPinDesc;
|
|
|
|
if ( dir == KSPIN_DATAFLOW_IN ) {
|
|
pPinDesc = InputPins;
|
|
ASSERT( idx < InPinsNo_ );
|
|
} else {
|
|
pPinDesc = OutputPins;
|
|
ASSERT( idx < MaxOutPins );
|
|
}
|
|
related = pPinDesc [idx].RelatedPinIndex;
|
|
*Medium = *pPinDesc[idx].Medium;
|
|
return pPinDesc [idx].PinType;
|
|
}
|
|
|
|
#endif
|