📄 mintopo.cpp
字号:
PKSAUDIO_MIXCAP_TABLE MixCaps = (PKSAUDIO_MIXCAP_TABLE)PropertyRequest->Value;
MixCaps->InputChannels = 1;
MixCaps->OutputChannels = 2;
for(count = 0; count < 2; count++)
{
MixCaps->Capabilities[count].Mute = TRUE;
MixCaps->Capabilities[count].Minimum = 0;
MixCaps->Capabilities[count].Maximum = 0;
MixCaps->Capabilities[count].Reset = 0;
}
ntStatus = STATUS_SUCCESS;
}
break;
}
} else if(PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
{
// service basic support request
switch(PropertyRequest->Node)
{
case SYNTH_WAVEIN_SUPERMIX:
case CD_WAVEIN_SUPERMIX:
case LINEIN_WAVEIN_SUPERMIX:
case CD_LINEOUT_SUPERMIX:
case LINEIN_LINEOUT_SUPERMIX:
case MIC_WAVEIN_SUPERMIX:
if(PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION)))
{
// if return buffer can hold a KSPROPERTY_DESCRIPTION, return it
PKSPROPERTY_DESCRIPTION PropDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
PropDesc->AccessFlags = KSPROPERTY_TYPE_BASICSUPPORT |
KSPROPERTY_TYPE_GET;
PropDesc->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = VT_ARRAY;
PropDesc->PropTypeSet.Flags = 0;
PropDesc->MembersListCount = 0;
PropDesc->Reserved = 0;
// set the return value size
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION);
ntStatus = STATUS_SUCCESS;
} else if(PropertyRequest->ValueSize >= sizeof(ULONG))
{
// if return buffer can hold a ULONG, return the access flags
PULONG AccessFlags = PULONG(PropertyRequest->Value);
*AccessFlags = KSPROPERTY_TYPE_BASICSUPPORT |
KSPROPERTY_TYPE_GET;
// set the return value size
PropertyRequest->ValueSize = sizeof(ULONG);
ntStatus = STATUS_SUCCESS;
}
ntStatus = STATUS_SUCCESS;
break;
}
}
}
return ntStatus;
}
/*****************************************************************************
* PropertyHandler_SuperMixTable()
*****************************************************************************
* Handles supermixer level accesses
*/
static
NTSTATUS
PropertyHandler_SuperMixTable
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
{
PAGED_CODE();
ASSERT(PropertyRequest);
_DbgPrintF(DEBUGLVL_VERBOSE,("[PropertyHandler_SuperMixTable]"));
CMiniportTopologySB16 *that =
(CMiniportTopologySB16 *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
BYTE dataL,dataR;
// validate node
if(PropertyRequest->Node != ULONG(-1))
{
if(PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
{
switch(PropertyRequest->Node)
{
// Full 2x2 Switches
case SYNTH_WAVEIN_SUPERMIX:
case CD_WAVEIN_SUPERMIX:
case LINEIN_WAVEIN_SUPERMIX:
if(!PropertyRequest->ValueSize)
{
PropertyRequest->ValueSize = 4 * sizeof(KSAUDIO_MIXLEVEL);
ntStatus = STATUS_BUFFER_OVERFLOW;
} else if(PropertyRequest->ValueSize >= 4 * sizeof(KSAUDIO_MIXLEVEL))
{
PropertyRequest->ValueSize = 4 * sizeof(KSAUDIO_MIXLEVEL);
PKSAUDIO_MIXLEVEL MixLevel = (PKSAUDIO_MIXLEVEL)PropertyRequest->Value;
dataL = that->ReadBitsFromMixer( DSP_MIX_ADCMIXIDX_L,
2,
AccessParams[PropertyRequest->Node].BaseRegister );
dataR = that->ReadBitsFromMixer( DSP_MIX_ADCMIXIDX_R,
2,
AccessParams[PropertyRequest->Node].BaseRegister );
MixLevel[0].Mute = dataL & 0x2 ? FALSE : TRUE; // left to left mute
MixLevel[0].Level = 0;
MixLevel[1].Mute = dataR & 0x2 ? FALSE : TRUE; // left to right mute
MixLevel[1].Level = 0;
MixLevel[2].Mute = dataL & 0x1 ? FALSE : TRUE; // right to left mute
MixLevel[2].Level = 0;
MixLevel[3].Mute = dataR & 0x1 ? FALSE : TRUE; // right to right mute
MixLevel[3].Level = 0;
ntStatus = STATUS_SUCCESS;
}
break;
// Limited 2x2 Switches
case CD_LINEOUT_SUPERMIX:
case LINEIN_LINEOUT_SUPERMIX:
if(!PropertyRequest->ValueSize)
{
PropertyRequest->ValueSize = 4 * sizeof(KSAUDIO_MIXLEVEL);
ntStatus = STATUS_BUFFER_OVERFLOW;
} else if(PropertyRequest->ValueSize >= 4 * sizeof(KSAUDIO_MIXLEVEL))
{
PropertyRequest->ValueSize = 4 * sizeof(KSAUDIO_MIXLEVEL);
PKSAUDIO_MIXLEVEL MixLevel = (PKSAUDIO_MIXLEVEL)PropertyRequest->Value;
dataL = that->ReadBitsFromMixer( DSP_MIX_OUTMIXIDX,
2,
AccessParams[PropertyRequest->Node].BaseRegister );
MixLevel[0].Mute = dataL & 0x2 ? FALSE : TRUE; // left to left mute
MixLevel[0].Level = 0;
MixLevel[1].Mute = FALSE;
MixLevel[1].Level = LONG_MIN;
MixLevel[2].Mute = FALSE;
MixLevel[2].Level = LONG_MIN;
MixLevel[3].Mute = dataL & 0x1 ? FALSE : TRUE; // right to right mute
MixLevel[3].Level = 0;
ntStatus = STATUS_SUCCESS;
}
break;
// 1x2 Switch
case MIC_WAVEIN_SUPERMIX:
if(!PropertyRequest->ValueSize)
{
PropertyRequest->ValueSize = 2 * sizeof(KSAUDIO_MIXLEVEL);
ntStatus = STATUS_BUFFER_OVERFLOW;
} else if(PropertyRequest->ValueSize >= 2 * sizeof(KSAUDIO_MIXLEVEL))
{
PropertyRequest->ValueSize = 2 * sizeof(KSAUDIO_MIXLEVEL);
PKSAUDIO_MIXLEVEL MixLevel = (PKSAUDIO_MIXLEVEL)PropertyRequest->Value;
dataL = that->ReadBitsFromMixer( DSP_MIX_ADCMIXIDX_L,
1,
MIXBIT_MIC_WAVEIN );
dataR = that->ReadBitsFromMixer( DSP_MIX_ADCMIXIDX_R,
1,
MIXBIT_MIC_WAVEIN );
MixLevel[0].Mute = dataL & 0x1 ? FALSE : TRUE; // mono to left mute
MixLevel[0].Level = 0;
MixLevel[1].Mute = dataR & 0x1 ? FALSE : TRUE; // mono to right mute
MixLevel[1].Level = 0;
ntStatus = STATUS_SUCCESS;
}
break;
}
} else if(PropertyRequest->Verb & KSPROPERTY_TYPE_SET)
{
switch(PropertyRequest->Node)
{
// Full 2x2 Switches
case SYNTH_WAVEIN_SUPERMIX:
case CD_WAVEIN_SUPERMIX:
case LINEIN_WAVEIN_SUPERMIX:
if(PropertyRequest->ValueSize == 4 * sizeof(KSAUDIO_MIXLEVEL))
{
PKSAUDIO_MIXLEVEL MixLevel = (PKSAUDIO_MIXLEVEL)PropertyRequest->Value;
dataL = MixLevel[0].Mute ? 0x0 : 0x2;
dataL |= MixLevel[2].Mute ? 0x0 : 0x1;
dataR = MixLevel[1].Mute ? 0x0 : 0x2;
dataR |= MixLevel[3].Mute ? 0x0 : 0x1;
that->WriteBitsToMixer( DSP_MIX_ADCMIXIDX_L,
2,
AccessParams[PropertyRequest->Node].BaseRegister,
dataL );
that->WriteBitsToMixer( DSP_MIX_ADCMIXIDX_R,
2,
AccessParams[PropertyRequest->Node].BaseRegister,
dataR );
ntStatus = STATUS_SUCCESS;
}
break;
// Limited 2x2 Switches
case CD_LINEOUT_SUPERMIX:
case LINEIN_LINEOUT_SUPERMIX:
if(PropertyRequest->ValueSize == 4 * sizeof(KSAUDIO_MIXLEVEL))
{
PKSAUDIO_MIXLEVEL MixLevel = (PKSAUDIO_MIXLEVEL)PropertyRequest->Value;
dataL = MixLevel[0].Mute ? 0x0 : 0x2;
dataL |= MixLevel[3].Mute ? 0x0 : 0x1;
that->WriteBitsToMixer( DSP_MIX_OUTMIXIDX,
2,
AccessParams[PropertyRequest->Node].BaseRegister,
dataL );
ntStatus = STATUS_SUCCESS;
}
break;
// 1x2 Switch
case MIC_WAVEIN_SUPERMIX:
if(PropertyRequest->ValueSize == 2 * sizeof(KSAUDIO_MIXLEVEL))
{
PKSAUDIO_MIXLEVEL MixLevel = (PKSAUDIO_MIXLEVEL)PropertyRequest->Value;
dataL = MixLevel[0].Mute ? 0x0 : 0x1;
dataR = MixLevel[1].Mute ? 0x0 : 0x1;
that->WriteBitsToMixer( DSP_MIX_ADCMIXIDX_L,
1,
MIXBIT_MIC_WAVEIN,
dataL );
that->WriteBitsToMixer( DSP_MIX_ADCMIXIDX_R,
1,
MIXBIT_MIC_WAVEIN,
dataR );
ntStatus = STATUS_SUCCESS;
}
break;
}
} else if(PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
{
// service basic support request
switch(PropertyRequest->Node)
{
case SYNTH_WAVEIN_SUPERMIX:
case CD_WAVEIN_SUPERMIX:
case LINEIN_WAVEIN_SUPERMIX:
case CD_LINEOUT_SUPERMIX:
case LINEIN_LINEOUT_SUPERMIX:
case MIC_WAVEIN_SUPERMIX:
if(PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION)))
{
// if return buffer can hold a KSPROPERTY_DESCRIPTION, return it
PKSPROPERTY_DESCRIPTION PropDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
PropDesc->AccessFlags = KSPROPERTY_TYPE_BASICSUPPORT |
KSPROPERTY_TYPE_GET |
KSPROPERTY_TYPE_SET;
PropDesc->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = VT_ARRAY;
PropDesc->PropTypeSet.Flags = 0;
PropDesc->MembersListCount = 0;
PropDesc->Reserved = 0;
// set the return value size
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION);
ntStatus = STATUS_SUCCESS;
} else if(PropertyRequest->ValueSize >= sizeof(ULONG))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -