simplify
fix accessing pins > 0
This commit is contained in:
@@ -25,10 +25,11 @@ struct WinWdmFilter;
|
|||||||
|
|
||||||
struct WinWdmPin
|
struct WinWdmPin
|
||||||
{
|
{
|
||||||
WinWdmPin()
|
WinWdmPin( WinWdmFilter *pParentFilter, int iPinId )
|
||||||
{
|
{
|
||||||
m_hHandle = NULL;
|
m_hHandle = NULL;
|
||||||
m_pParentFilter = NULL;
|
m_pParentFilter = pParentFilter;
|
||||||
|
m_iPinId = iPinId;
|
||||||
|
|
||||||
/* Set up the default m_pPinConnect. */
|
/* Set up the default m_pPinConnect. */
|
||||||
m_pPinConnect = NULL;
|
m_pPinConnect = NULL;
|
||||||
@@ -52,6 +53,7 @@ struct WinWdmPin
|
|||||||
|
|
||||||
HANDLE m_hHandle;
|
HANDLE m_hHandle;
|
||||||
WinWdmFilter *m_pParentFilter;
|
WinWdmFilter *m_pParentFilter;
|
||||||
|
int m_iPinId;
|
||||||
KSPIN_CONNECT *m_pPinConnect;
|
KSPIN_CONNECT *m_pPinConnect;
|
||||||
vector<KSDATARANGE_AUDIO> m_dataRangesItem;
|
vector<KSDATARANGE_AUDIO> m_dataRangesItem;
|
||||||
};
|
};
|
||||||
@@ -272,23 +274,20 @@ static bool WdmGetPinPropertyMulti(
|
|||||||
*/
|
*/
|
||||||
WinWdmPin *WinWdmFilter::CreatePin( unsigned long iPinId, RString &sError )
|
WinWdmPin *WinWdmFilter::CreatePin( unsigned long iPinId, RString &sError )
|
||||||
{
|
{
|
||||||
/* Allocate the new PIN object */
|
|
||||||
WinWdmPin *pPin = new WinWdmPin;
|
|
||||||
|
|
||||||
pPin->m_pParentFilter = this;
|
|
||||||
pPin->m_pPinConnect->PinId = iPinId;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Get the COMMUNICATION property */
|
/* Get the COMMUNICATION property */
|
||||||
KSPIN_COMMUNICATION communication;
|
KSPIN_COMMUNICATION communication;
|
||||||
if( !WdmGetPinPropertySimple(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_COMMUNICATION,
|
if( !WdmGetPinPropertySimple(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_COMMUNICATION,
|
||||||
&communication, sizeof(KSPIN_COMMUNICATION), sError) )
|
&communication, sizeof(KSPIN_COMMUNICATION), sError) )
|
||||||
goto error;
|
{
|
||||||
|
sError = "KSPROPERTY_PIN_COMMUNICATION: " + sError;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if( communication != KSPIN_COMMUNICATION_SINK && communication != KSPIN_COMMUNICATION_BOTH )
|
if( communication != KSPIN_COMMUNICATION_SINK && communication != KSPIN_COMMUNICATION_BOTH )
|
||||||
{
|
{
|
||||||
sError = "Not an audio output device";
|
sError = "Not an audio output device";
|
||||||
goto error;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,12 +296,15 @@ WinWdmPin *WinWdmFilter::CreatePin( unsigned long iPinId, RString &sError )
|
|||||||
KSPIN_DATAFLOW dataFlow;
|
KSPIN_DATAFLOW dataFlow;
|
||||||
if( !WdmGetPinPropertySimple(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_DATAFLOW,
|
if( !WdmGetPinPropertySimple(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_DATAFLOW,
|
||||||
&dataFlow, sizeof(KSPIN_DATAFLOW), sError) )
|
&dataFlow, sizeof(KSPIN_DATAFLOW), sError) )
|
||||||
goto error;
|
{
|
||||||
|
sError = "KSPROPERTY_PIN_DATAFLOW: " + sError;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if( dataFlow != KSPIN_DATAFLOW_IN )
|
if( dataFlow != KSPIN_DATAFLOW_IN )
|
||||||
{
|
{
|
||||||
sError = "Not KSPIN_DATAFLOW_IN";
|
sError = "Not KSPIN_DATAFLOW_IN";
|
||||||
goto error;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,7 +312,10 @@ WinWdmPin *WinWdmFilter::CreatePin( unsigned long iPinId, RString &sError )
|
|||||||
{
|
{
|
||||||
KSMULTIPLE_ITEM *pItem = NULL;
|
KSMULTIPLE_ITEM *pItem = NULL;
|
||||||
if( !WdmGetPinPropertyMulti(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_INTERFACES, &pItem, sError) )
|
if( !WdmGetPinPropertyMulti(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_INTERFACES, &pItem, sError) )
|
||||||
goto error;
|
{
|
||||||
|
sError = "KSPROPERTY_PIN_INTERFACES: " + sError;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
KSIDENTIFIER *identifier = (KSIDENTIFIER *) &pItem[1];
|
KSIDENTIFIER *identifier = (KSIDENTIFIER *) &pItem[1];
|
||||||
|
|
||||||
@@ -329,14 +334,17 @@ WinWdmPin *WinWdmFilter::CreatePin( unsigned long iPinId, RString &sError )
|
|||||||
free( pItem );
|
free( pItem );
|
||||||
|
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
goto error;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the MEDIUM properties list */
|
/* Get the MEDIUM properties list */
|
||||||
{
|
{
|
||||||
KSMULTIPLE_ITEM *pItem = NULL;
|
KSMULTIPLE_ITEM *pItem = NULL;
|
||||||
if( !WdmGetPinPropertyMulti( m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_MEDIUMS, &pItem, sError) )
|
if( !WdmGetPinPropertyMulti( m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_MEDIUMS, &pItem, sError) )
|
||||||
goto error;
|
{
|
||||||
|
sError = "KSPROPERTY_PIN_MEDIUMS: " + sError;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
const KSIDENTIFIER *identifier = (KSIDENTIFIER *) &pItem[1];
|
const KSIDENTIFIER *identifier = (KSIDENTIFIER *) &pItem[1];
|
||||||
|
|
||||||
@@ -355,13 +363,19 @@ WinWdmPin *WinWdmFilter::CreatePin( unsigned long iPinId, RString &sError )
|
|||||||
free( pItem );
|
free( pItem );
|
||||||
|
|
||||||
if( sError != "" )
|
if( sError != "" )
|
||||||
goto error;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate the new PIN object */
|
||||||
|
WinWdmPin *pPin = new WinWdmPin( this, iPinId );
|
||||||
|
|
||||||
/* Get DATARANGEs */
|
/* Get DATARANGEs */
|
||||||
KSMULTIPLE_ITEM *pDataRangesItem;
|
KSMULTIPLE_ITEM *pDataRangesItem;
|
||||||
if( !WdmGetPinPropertyMulti(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_DATARANGES, &pDataRangesItem, sError) )
|
if( !WdmGetPinPropertyMulti(m_hHandle, iPinId, &KSPROPSETID_Pin, KSPROPERTY_PIN_DATARANGES, &pDataRangesItem, sError) )
|
||||||
|
{
|
||||||
|
sError = "KSPROPERTY_PIN_DATARANGES: " + sError;
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
KSDATARANGE *pDataRanges = (KSDATARANGE*) (pDataRangesItem + 1);
|
KSDATARANGE *pDataRanges = (KSDATARANGE*) (pDataRangesItem + 1);
|
||||||
|
|
||||||
@@ -455,6 +469,7 @@ void WinWdmPin::SetFormat( const WAVEFORMATEX *pFormat )
|
|||||||
ASSERT( m_pPinConnect != NULL );
|
ASSERT( m_pPinConnect != NULL );
|
||||||
|
|
||||||
memset( m_pPinConnect, 0, iSize );
|
memset( m_pPinConnect, 0, iSize );
|
||||||
|
m_pPinConnect->PinId = m_iPinId;
|
||||||
m_pPinConnect->Interface.Set = KSINTERFACESETID_Standard;
|
m_pPinConnect->Interface.Set = KSINTERFACESETID_Standard;
|
||||||
m_pPinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING;
|
m_pPinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING;
|
||||||
m_pPinConnect->Interface.Flags = 0;
|
m_pPinConnect->Interface.Flags = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user