2025-04-27 07:49:33 -04:00

126 lines
3.3 KiB
C++

//==========================================================================;
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
//
//==========================================================================;
#ifndef __XBAR_H
#define __XBAR_H
#include "capmain.h"
#include "mediums.h"
struct _XBAR_PIN_DESCRIPTION {
ULONG PinType;
ULONG RelatedPinIndex;
ULONG IsRoutedTo; // Index of input pin in use
KSPIN_MEDIUM Medium;
_XBAR_PIN_DESCRIPTION(ULONG type, ULONG rel, const KSPIN_MEDIUM * PinMedium);
_XBAR_PIN_DESCRIPTION(){}
};
inline _XBAR_PIN_DESCRIPTION::_XBAR_PIN_DESCRIPTION(ULONG type, ULONG rel , const KSPIN_MEDIUM * PinMedium) :
PinType(type), RelatedPinIndex(rel), IsRoutedTo(0) // , Medium(PinMedium)
{
Medium = *PinMedium;
}
const NUMBER_OF_XBAR_OUTPUTS = 1;
const NUMBER_OF_XBAR_INPUTS = 3;
class CrossBar
{
friend class Device;
_XBAR_PIN_DESCRIPTION OutputPins [NUMBER_OF_XBAR_OUTPUTS];
_XBAR_PIN_DESCRIPTION InputPins [NUMBER_OF_XBAR_INPUTS];
public:
int GetNoInputs();
int GetNoOutputs();
void * operator new(size_t size, void * pAllocation) { return(pAllocation);}
void operator delete(void * pAllocation) {}
BOOL TestRoute(int InPin, int OutPin);
ULONG GetPinInfo(int dir, int idx, ULONG &related);
KSPIN_MEDIUM * GetPinMedium(int dir, int idx);
void Route(int OutPin, int InPin);
BOOL GoodPins(int InPin, int OutPin);
int GetRoute(int OutPin);
CrossBar();
};
inline CrossBar::CrossBar()
{
OutputPins [0] = _XBAR_PIN_DESCRIPTION(KS_PhysConn_Video_VideoDecoder, 1 , &CrossbarMediums[3]);
// InputPins are set in device.cpp
}
inline int CrossBar::GetNoInputs()
{
return NUMBER_OF_XBAR_INPUTS;
}
inline int CrossBar::GetNoOutputs()
{
return NUMBER_OF_XBAR_OUTPUTS;
}
inline BOOL CrossBar::GoodPins(int InPin, int OutPin)
{
return BOOL(InPin < NUMBER_OF_XBAR_INPUTS && OutPin < NUMBER_OF_XBAR_OUTPUTS);
}
inline void CrossBar::Route(int OutPin, int InPin)
{
OutputPins [OutPin].IsRoutedTo = InPin;
}
inline int CrossBar::GetRoute(int OutPin)
{
return OutputPins [OutPin].IsRoutedTo;
}
inline KSPIN_MEDIUM * CrossBar::GetPinMedium(int dir, int idx)
{
_XBAR_PIN_DESCRIPTION *pPinDesc;
if (dir == KSPIN_DATAFLOW_IN) {
pPinDesc = InputPins;
ASSERT(idx < NUMBER_OF_XBAR_INPUTS);
} else {
pPinDesc = OutputPins;
ASSERT(idx < NUMBER_OF_XBAR_OUTPUTS);
}
return &pPinDesc [idx].Medium;
}
inline ULONG CrossBar::GetPinInfo(int dir, int idx, ULONG &related)
{
_XBAR_PIN_DESCRIPTION *pPinDesc;
if (dir == KSPIN_DATAFLOW_IN) {
pPinDesc = InputPins;
ASSERT(idx < NUMBER_OF_XBAR_INPUTS);
} else {
pPinDesc = OutputPins;
ASSERT(idx < NUMBER_OF_XBAR_OUTPUTS);
}
related = pPinDesc [idx].RelatedPinIndex;
return pPinDesc [idx].PinType;
}
#endif