📄 mintopo.cpp
字号:
case MIC_LINEOUT_MUTE: // Microphone Lineout Mute Control (mono)
// check if MUTE property request on mono/left channel
if( ( PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_MUTE ) &&
( channel == CHAN_LEFT ) )
{
that->WriteBitsToMixer( DSP_MIX_OUTMIXIDX,
1,
MIXBIT_MIC_LINEOUT,
value );
ntStatus = STATUS_SUCCESS;
}
break;
}
}
}
} else if(PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT)
{
if ( ( (PropertyRequest->Node == MIC_AGC) && (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_AGC) ) ||
( (PropertyRequest->Node == MIC_LINEOUT_MUTE) && (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_MUTE) ) )
{
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_BOOL;
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 |
KSPROPERTY_TYPE_SET;
// set the return value size
PropertyRequest->ValueSize = sizeof(ULONG);
ntStatus = STATUS_SUCCESS;
}
}
}
}
return ntStatus;
}
/*****************************************************************************
* BasicSupportHandler()
*****************************************************************************
* Assists in BASICSUPPORT accesses on level properties
*/
static
NTSTATUS
BasicSupportHandler
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
{
PAGED_CODE();
ASSERT(PropertyRequest);
_DbgPrintF(DEBUGLVL_VERBOSE,("[BasicSupportHandler]"));
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
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) +
sizeof(KSPROPERTY_MEMBERSHEADER) +
sizeof(KSPROPERTY_STEPPING_LONG);
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = VT_I4;
PropDesc->PropTypeSet.Flags = 0;
PropDesc->MembersListCount = 1;
PropDesc->Reserved = 0;
// if return buffer cn also hold a range description, return it too
if(PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION) +
sizeof(KSPROPERTY_MEMBERSHEADER) +
sizeof(KSPROPERTY_STEPPING_LONG)))
{
// fill in the members header
PKSPROPERTY_MEMBERSHEADER Members = PKSPROPERTY_MEMBERSHEADER(PropDesc + 1);
Members->MembersFlags = KSPROPERTY_MEMBER_STEPPEDRANGES;
Members->MembersSize = sizeof(KSPROPERTY_STEPPING_LONG);
Members->MembersCount = 1;
Members->Flags = 0;
// fill in the stepped range
PKSPROPERTY_STEPPING_LONG Range = PKSPROPERTY_STEPPING_LONG(Members + 1);
switch(PropertyRequest->Node)
{
case WAVEOUT_VOLUME:
case SYNTH_VOLUME:
case CD_VOLUME:
case LINEIN_VOLUME:
case MIC_VOLUME:
case LINEOUT_VOL:
Range->Bounds.SignedMaximum = 0; // 0 (dB) * 0x10000
Range->Bounds.SignedMinimum = 0xFFC20000; // -62 (dB) * 0x10000
Range->SteppingDelta = 0x20000; // 2 (dB) * 0x10000
break;
case LINEOUT_GAIN:
case WAVEIN_GAIN:
Range->Bounds.SignedMaximum = 0x120000; // 18 (dB) * 0x10000
Range->Bounds.SignedMinimum = 0; // 0 (dB) * 0x10000
Range->SteppingDelta = 0x60000; // 6 (dB) * 0x10000
break;
case LINEOUT_BASS:
case LINEOUT_TREBLE:
Range->Bounds.SignedMaximum = 0xE0000; // 14 (dB) * 0x10000
Range->Bounds.SignedMinimum = 0xFFF20000; // -14 (dB) * 0x10000
Range->SteppingDelta = 0x20000; // 2 (dB) * 0x10000
break;
}
Range->Reserved = 0;
_DbgPrintF(DEBUGLVL_BLAB, ("---Node: %d Max: 0x%X Min: 0x%X Step: 0x%X",PropertyRequest->Node,
Range->Bounds.SignedMaximum,
Range->Bounds.SignedMinimum,
Range->SteppingDelta));
// set the return value size
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION) +
sizeof(KSPROPERTY_MEMBERSHEADER) +
sizeof(KSPROPERTY_STEPPING_LONG);
} else
{
// 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 |
KSPROPERTY_TYPE_SET;
// set the return value size
PropertyRequest->ValueSize = sizeof(ULONG);
ntStatus = STATUS_SUCCESS;
}
return ntStatus;
}
/*****************************************************************************
* PropertyHandler_Level()
*****************************************************************************
* Accesses a KSAUDIO_LEVEL property.
*/
static
NTSTATUS
PropertyHandler_Level
(
IN PPCPROPERTY_REQUEST PropertyRequest
)
{
PAGED_CODE();
ASSERT(PropertyRequest);
_DbgPrintF(DEBUGLVL_VERBOSE,("[PropertyHandler_Level]"));
CMiniportTopologySB16 *that =
(CMiniportTopologySB16 *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
ULONG count;
LONG channel;
// validate node
if(PropertyRequest->Node != ULONG(-1))
{
if(PropertyRequest->Verb & KSPROPERTY_TYPE_GET)
{
// get the instance channel parameter
if(PropertyRequest->InstanceSize >= sizeof(LONG))
{
channel = *(PLONG(PropertyRequest->Instance));
// only support get requests on either mono/left (0) or right (1) channels
if ( (channel == CHAN_LEFT) || (channel == CHAN_RIGHT) )
{
// validate and get the output parameter
if (PropertyRequest->ValueSize >= sizeof(LONG))
{
PLONG Level = (PLONG)PropertyRequest->Value;
// switch on node if
switch(PropertyRequest->Node)
{
case WAVEOUT_VOLUME:
case SYNTH_VOLUME:
case CD_VOLUME:
case LINEIN_VOLUME:
case MIC_VOLUME:
case LINEOUT_VOL:
// check if volume property request
if(PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_VOLUMELEVEL)
{
// bail out if a right channel request on the mono mic volume
if( (PropertyRequest->Node == MIC_VOLUME) && (channel != CHAN_LEFT) )
{
break;
}
*Level = ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + channel ];
#ifdef EVENT_SUPPORT
//
// see if there is a volume changed, update if neccessary.
//
BYTE data = that->ReadBitsFromMixer (
BYTE(AccessParams[PropertyRequest->Node].BaseRegister
+channel+DSP_MIX_BASEIDX),
5, 3);
//
// Convert the dB value into a register value. No boundary check.
// Register is 0 - 31 representing -62dB - 0dB.
//
if (data != ((*Level >> 17) + 31))
{
//
// Convert the register into dB value.
// Register is 0 - 31 representing -62dB - 0dB.
//
*Level = (data - 31) << 17;
ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + channel] = *Level;
}
#endif
PropertyRequest->ValueSize = sizeof(LONG);
ntStatus = STATUS_SUCCESS;
}
break;
case LINEOUT_GAIN:
case WAVEIN_GAIN:
// check if volume property request
if(PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_VOLUMELEVEL)
{
*Level = ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + channel ];
PropertyRequest->ValueSize = sizeof(LONG);
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) ) )
{
*Level = ControlValueCache[ AccessParams[PropertyRequest->Node].CacheOffset + channel ];
PropertyRequest->ValueSize = sizeof(LONG);
ntStatus = STATUS_SUCCESS;
}
break;
}
}
}
}
} else if(PropertyRequest->Verb & KSPROPERTY_TYPE_SET)
{
// get the instance channel parameter
if(PropertyRequest->InstanceSize >= sizeof(LONG))
{
channel = *(PLONG(PropertyRequest->Instance));
// only support set requests on either mono/left (0), right (1), or master (-1) channels
if ( (channel == CHAN_LEFT) || (channel == CHAN_RIGHT) || (channel == CHAN_MASTER))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -