yes i am handling the set and get in the support handler and getting the KdPrint value which is correct in the device side also but my slider goes up and the get value is not the maximum value but the value which i selected.
i have posted my support handler and get and set handleralso
DEFINE_KSPROPERTY_ITEM
(
KSPROPERTY_AUDIO_VOLUMELEVEL, // property item defined in ksmedia.h
PropertyAudioVolume, // our “get” property handler
sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), // minimum buffer length for property
sizeof(ULONG), // minimum buffer length for returned data
PropertyAudioVolume, // our “set” property handler
NULL, // default values
0, // related properties
NULL,
SupportVolumeLevel, // no raw serialization handler
0 // don’t serialize
)
in my SupportVolumeLevel function i am getting the maximum and minimum values from the device.
and i am getting the correct value whice i send from the device.
this is my SupportVolumeLevel function.
{
NTSTATUS Status;
PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp );
ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
VOLUMELEVELSUPPORT volumeSupport;
KSPROPERTY_DESCRIPTION propDesc;
KSPROPERTY_MEMBERSHEADER members;
KSPROPERTY_STEPPING_LONG range;
ULONG fullPropertySize = sizeof(KSPROPERTY_DESCRIPTION) +
sizeof(KSPROPERTY_MEMBERSHEADER) +
sizeof(KSPROPERTY_STEPPING_LONG);
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;
members.MembersFlags = KSPROPERTY_MEMBER_STEPPEDRANGES;
members.MembersSize = sizeof(KSPROPERTY_STEPPING_LONG);
members.MembersCount = 1;
members.Flags = 0;
CCaptureFilter::ptr_CAVRequest->GetVolMinMax(&CCaptureFilter::ptr_CAVRequest->vol_min,
&CCaptureFilter::ptr_CAVRequest->vol_max,
&CCaptureFilter::ptr_CAVRequest->vol_res,
CCaptureFilter::ptr_Device);
range.SteppingDelta = CaptureFilter::ptr_CAVRequest->vol_res;
range.Bounds.SignedMinimum =CCaptureFilter::ptr_CAVRequest->vol_min;
range.Bounds.SignedMaximum = CCaptureFilter::ptr_CAVRequest->vol_max;
volumeSupport.propDesc = propDesc;
volumeSupport.members = members;
volumeSupport.range = range;
if ( sizeof(ULONG) > ulOutputBufferLength )
{ // No useful buffer. Return info about the requested size and an error.
pIrp->IoStatus.Information = fullPropertySize;
Status = STATUS_BUFFER_TOO_SMALL;
}
else
{
Status = STATUS_SUCCESS;
if ( sizeof(ULONG) <= ulOutputBufferLength )
{
// Should only be Access flags
pIrp->IoStatus.Information = sizeof(ULONG);
if ( sizeof( KSPROPERTY_DESCRIPTION ) <= ulOutputBufferLength )
{
// Just the PropDesc at this level.
*((PKSPROPERTY_DESCRIPTION)Data) = propDesc;
pIrp->IoStatus.Information = sizeof(KSPROPERTY_DESCRIPTION );
if ( fullPropertySize <= ulOutputBufferLength )
{ // All of it.
*((PVOLUMELEVELSUPPORT)Data) = volumeSupport;
pIrp->IoStatus.Information = fullPropertySize ;
}
}
}
}
return Status;
}
and in my get and set handler function is
NTSTATUS
PropertyAudioVolume
(
IN PIRP pIrp,
IN PKSPROPERTY property,
IN OUT PVOID audvol
)
{
PAGED_CODE ();
NTSTATUS Status;
PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp );
ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
PKSFILTER KsFilter = KsGetFilterFromIrp(pIrp);
CCaptureFilter::ptr_CAVRequest->req_params_obj.pdatabuffer=audvol;
CCaptureFilter::ptr_CAVRequest->req_params_obj.length=2;
CCaptureFilter::ptr_CAVRequest->req_params_obj.icontrol=VOLUME;
CCaptureFilter::ptr_CAVRequest->req_params_obj.unitID = CCaptureFilter::ptr_CAVRequest->usb_des.pconfig_desc_comp->aud_ctrl_feature_unit.bUnitID;
Status = ValidatePropertyParams(ulOutputBufferLength,
sizeof(ULONG),
sizeof(LONG));
if (NT_SUCCESS(Status)){
if(property->Flags & KSPROPERTY_TYPE_SET){
// set property
CCaptureFilter::ptr_CAVRequest->req_params_obj.irequest=SET_CUR;
CCaptureFilter::ptr_CAVRequest->req_params_obj.direction= USB_TRANSFER_DIRECTION_OUT;
}
else if(property->Flags & KSPROPERTY_TYPE_GET){
//get property
CCaptureFilter::ptr_CAVRequest->req_params_obj.irequest=GET_CUR;
CCaptureFilter::ptr_CAVRequest->req_params_obj.unitID = CCaptureFilter::ptr_CAVRequest->usb_des.pconfig_desc_comp->aud_ctrl_feature_unit.bUnitID;
CCaptureFilter::ptr_CAVRequest->req_params_obj.direction= USB_TRANSFER_DIRECTION_IN;
}
Status = CCaptureFilter::ptr_CAVRequest->InitiateAudioControlRequest(&CCaptureFilter::ptr_CAVRequest->req_params_obj,
CCaptureFilter::ptr_Device);
KdPrint((“audvol =0x%x\n”,*(PLONG)audvol));
pIrp->IoStatus.Information = ulOutputBufferLength;
}
return Status;
}
do i need to implement the EVENT KSEVENTSETID_AudioControlChange for audio volume.