// $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