📄 mintopo.cpp
字号:
// validate and get the input parameter
if (PropertyRequest->ValueSize == sizeof(LONG))
{
PLONG Level = (PLONG)PropertyRequest->Value;
// switch on the node id
switch(PropertyRequest->Node)
{
case WAVEOUT_VOLUME:
case SYNTH_VOLUME:
case CD_VOLUME:
case LINEIN_VOLUME:
case MIC_VOLUME:
case LINEOUT_VOL:
if(PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_VOLUMELEVEL)
{
// convert the level to register bits
if(*Level <= (-62 << 16))
{
count = 0;
} else if(*Level >= 0)
{
count = 0x1F;
} else
{
count = ((*Level >> 17) + 31) & 0x1F;
}
// set right channel if channel requested is right or master
// and node is not mic volume (mono)
if ( ( (channel == CHAN_RIGHT) || (channel == CHAN_MASTER) ) &&
( PropertyRequest->Node != MIC_VOLUME ) )
{
// cache the commanded control value
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + CHAN_RIGHT ] = *Level;
that->WriteBitsToMixer( AccessParams[PropertyRequest->Node].BaseRegister+1,
5,
3,
BYTE(count) );
ntStatus = STATUS_SUCCESS;
}
// set the left channel if channel requested is left or master
if ( (channel == CHAN_LEFT) || (channel == CHAN_MASTER) )
{
// cache the commanded control value
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + CHAN_LEFT ] = *Level;
that->WriteBitsToMixer( AccessParams[PropertyRequest->Node].BaseRegister,
5,
3,
BYTE(count) );
ntStatus = STATUS_SUCCESS;
}
}
break;
case LINEOUT_GAIN:
case WAVEIN_GAIN:
if(PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_VOLUMELEVEL)
{
// determine register bits
if(*Level >= (18 << 16))
{
count = 0x3;
} else if(*Level <= 0)
{
count = 0;
} else
{
count = (*Level >> 17) / 3;
}
// set right channel if channel requested is right or master
if ( (channel == CHAN_RIGHT) || (channel == CHAN_MASTER) )
{
// cache the commanded control value
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + CHAN_RIGHT ] = *Level;
that->WriteBitsToMixer( AccessParams[PropertyRequest->Node].BaseRegister+1,
2,
6,
BYTE(count) );
ntStatus = STATUS_SUCCESS;
}
// set the left channel if channel requested is left or master
if ( (channel == CHAN_LEFT) || (channel == CHAN_MASTER) )
{
// cache the commanded control value
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + CHAN_LEFT ] = *Level;
that->WriteBitsToMixer( AccessParams[PropertyRequest->Node].BaseRegister,
2,
6,
BYTE(count) );
ntStatus = STATUS_SUCCESS;
}
}
break;
case LINEOUT_BASS:
case LINEOUT_TREBLE:
if( ( (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_BASS) &&
(PropertyRequest->Node == LINEOUT_BASS) ) ||
( (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_TREBLE) &&
(PropertyRequest->Node == LINEOUT_TREBLE) ) )
{
// determine register bits
if(*Level <= (-14 << 16))
{
count = 0;
} else if(*Level >= (14 << 16))
{
count = 0xF;
} else
{
count = ((*Level >> 16) + 14) >> 1;
}
// set right channel if channel requested is right or master
if ( (channel == CHAN_RIGHT) || (channel == CHAN_MASTER) )
{
// cache the commanded control value
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + CHAN_RIGHT ] = *Level;
that->WriteBitsToMixer( AccessParams[PropertyRequest->Node].BaseRegister + 1,
4,
4,
BYTE(count) );
ntStatus = STATUS_SUCCESS;
}
// set the left channel if channel requested is left or master
if ( (channel == CHAN_LEFT) || (channel == CHAN_MASTER) )
{
// cache the commanded control value
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + CHAN_LEFT ] = *Level;
that->WriteBitsToMixer( AccessParams[PropertyRequest->Node].BaseRegister,
4,
4,
BYTE(count) );
ntStatus = STATUS_SUCCESS;
}
}
break;
}
}
}
}
} else if(PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
{
// service basic support request
switch(PropertyRequest->Node)
{
case WAVEOUT_VOLUME:
case SYNTH_VOLUME:
case CD_VOLUME:
case LINEIN_VOLUME:
case MIC_VOLUME:
case LINEOUT_VOL:
case LINEOUT_GAIN:
case WAVEIN_GAIN:
if(PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_VOLUMELEVEL)
{
ntStatus = BasicSupportHandler(PropertyRequest);
}
break;
case LINEOUT_BASS:
case LINEOUT_TREBLE:
if( ( (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_BASS) &&
(PropertyRequest->Node == LINEOUT_BASS) ) ||
( (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_TREBLE) &&
(PropertyRequest->Node == LINEOUT_TREBLE) ) )
{
ntStatus = BasicSupportHandler(PropertyRequest);
}
break;
}
}
}
return ntStatus;
}
/*****************************************************************************
* PropertyHandler_SuperMixCaps()
*****************************************************************************
* Handles supermixer caps accesses
*/
static
NTSTATUS
PropertyHandler_SuperMixCaps
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
{
PAGED_CODE();
ASSERT(PropertyRequest);
_DbgPrintF(DEBUGLVL_VERBOSE,("[PropertyHandler_SuperMixCaps]"));
CMiniportTopologySB16 *that =
(CMiniportTopologySB16 *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
ULONG count;
// 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 = 2 * sizeof(ULONG) + 4 * sizeof(KSAUDIO_MIX_CAPS);
ntStatus = STATUS_BUFFER_OVERFLOW;
} else if(PropertyRequest->ValueSize == 2 * sizeof(ULONG))
{
PKSAUDIO_MIXCAP_TABLE MixCaps = (PKSAUDIO_MIXCAP_TABLE)PropertyRequest->Value;
MixCaps->InputChannels = 2;
MixCaps->OutputChannels = 2;
ntStatus = STATUS_SUCCESS;
} else if(PropertyRequest->ValueSize >= 2 * sizeof(ULONG) + 4 * sizeof(KSAUDIO_MIX_CAPS))
{
PropertyRequest->ValueSize = 2 * sizeof(ULONG) + 4 * sizeof(KSAUDIO_MIX_CAPS);
PKSAUDIO_MIXCAP_TABLE MixCaps = (PKSAUDIO_MIXCAP_TABLE)PropertyRequest->Value;
MixCaps->InputChannels = 2;
MixCaps->OutputChannels = 2;
for(count = 0; count < 4; 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;
// Limited 2x2 Switches
case CD_LINEOUT_SUPERMIX:
case LINEIN_LINEOUT_SUPERMIX:
if(!PropertyRequest->ValueSize)
{
PropertyRequest->ValueSize = 2 * sizeof(ULONG) + 4 * sizeof(KSAUDIO_MIX_CAPS);
ntStatus = STATUS_BUFFER_OVERFLOW;
} else if(PropertyRequest->ValueSize == 2 * sizeof(ULONG))
{
PKSAUDIO_MIXCAP_TABLE MixCaps = (PKSAUDIO_MIXCAP_TABLE)PropertyRequest->Value;
MixCaps->InputChannels = 2;
MixCaps->OutputChannels = 2;
ntStatus = STATUS_SUCCESS;
} else if(PropertyRequest->ValueSize >= 2 * sizeof(ULONG) + 4 * sizeof(KSAUDIO_MIX_CAPS))
{
PropertyRequest->ValueSize = 2 * sizeof(ULONG) + 4 * sizeof(KSAUDIO_MIX_CAPS);
PKSAUDIO_MIXCAP_TABLE MixCaps = (PKSAUDIO_MIXCAP_TABLE)PropertyRequest->Value;
MixCaps->InputChannels = 2;
MixCaps->OutputChannels = 2;
for(count = 0; count < 4; count++)
{
if((count == 0) || (count == 3))
{
MixCaps->Capabilities[count].Mute = TRUE;
MixCaps->Capabilities[count].Minimum = 0;
MixCaps->Capabilities[count].Maximum = 0;
MixCaps->Capabilities[count].Reset = 0;
} else
{
MixCaps->Capabilities[count].Mute = FALSE;
MixCaps->Capabilities[count].Minimum = LONG_MIN;
MixCaps->Capabilities[count].Maximum = LONG_MIN;
MixCaps->Capabilities[count].Reset = LONG_MIN;
}
}
ntStatus = STATUS_SUCCESS;
}
break;
// 1x2 Switch
case MIC_WAVEIN_SUPERMIX:
if(!PropertyRequest->ValueSize)
{
PropertyRequest->ValueSize = 2 * sizeof(ULONG) + 2 * sizeof(KSAUDIO_MIX_CAPS);
ntStatus = STATUS_BUFFER_OVERFLOW;
} else if(PropertyRequest->ValueSize == 2 * sizeof(ULONG))
{
PKSAUDIO_MIXCAP_TABLE MixCaps = (PKSAUDIO_MIXCAP_TABLE)PropertyRequest->Value;
MixCaps->InputChannels = 1;
MixCaps->OutputChannels = 2;
ntStatus = STATUS_SUCCESS;
} else if(PropertyRequest->ValueSize >= 2 * sizeof(ULONG) + 2 * sizeof(KSAUDIO_MIX_CAPS))
{
PropertyRequest->ValueSize = 2 * sizeof(ULONG) + 2 * sizeof(KSAUDIO_MIX_CAPS);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -