//============================================================================= NTSTATUS CMiniportTopology::PropertyHandlerMute(IN PPCPROPERTY_REQUEST PropertyRequest) /*++ Routine Description: Property handler for KSPROPERTY_AUDIO_MUTE Arguments: PropertyRequest - property request structure Return Value: NT status code. --*/ { PAGED_CODE(); DPF_ENTER(("[%s]",__FUNCTION__)); NTSTATUS ntStatus; LONG lChannel; PBOOL pfMute; if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) { ntStatus = PropertyHandler_BasicSupport(PropertyRequest, KSPROPERTY_TYPE_ALL, VT_BOOL); } else { ntStatus = ValidatePropertyParams(PropertyRequest, sizeof(BOOL), sizeof(LONG)); if (NT_SUCCESS(ntStatus)) { lChannel = * PLONG (PropertyRequest->Instance); pfMute = PBOOL (PropertyRequest->Value); if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) { *pfMute = m_AdapterCommon->MixerMuteRead(PropertyRequest->Node); PropertyRequest->ValueSize = sizeof(BOOL); } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) { m_AdapterCommon->MixerMuteWrite(PropertyRequest->Node, *pfMute); } } else { DPF(D_TERSE, ("[%s - ntStatus=0x%08x]", __FUNCTION__, ntStatus)); } } return ntStatus; } // PropertyHandlerMute
//============================================================================= NTSTATUS CMiniportTopology::PropertyHandlerDevSpecific(IN PPCPROPERTY_REQUEST PropertyRequest) /*++ Routine Description: Property handler for KSPROPERTY_AUDIO_DEV_SPECIFIC Arguments: PropertyRequest - property request structure Return Value: NT status code. --*/ { PAGED_CODE(); DPF_ENTER(("[%s]",__FUNCTION__)); NTSTATUS ntStatus = STATUS_SUCCESS; if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) { if (DEV_SPECIFIC_VT_BOOL == PropertyRequest->Node ) { ntStatus = PropertyHandler_BasicSupport(PropertyRequest,KSPROPERTY_TYPE_ALL,VT_BOOL); } else { ULONG ExpectedSize = sizeof( KSPROPERTY_DESCRIPTION ) + sizeof( KSPROPERTY_MEMBERSHEADER ) + sizeof( KSPROPERTY_BOUNDS_LONG ); DWORD ulPropTypeSetId; if( DEV_SPECIFIC_VT_I4 == PropertyRequest->Node ) { ulPropTypeSetId = VT_I4; } else if ( DEV_SPECIFIC_VT_UI4 == PropertyRequest->Node ) { ulPropTypeSetId = VT_UI4; } else { ulPropTypeSetId = VT_ILLEGAL; ntStatus = STATUS_INVALID_PARAMETER; } if( NT_SUCCESS(ntStatus)) { if ( !PropertyRequest->ValueSize ) { PropertyRequest->ValueSize = ExpectedSize; ntStatus = STATUS_BUFFER_OVERFLOW; } else 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_ALL; PropDesc->DescriptionSize = ExpectedSize; PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General; PropDesc->PropTypeSet.Id = ulPropTypeSetId; PropDesc->PropTypeSet.Flags = 0; PropDesc->MembersListCount = 0; PropDesc->Reserved = 0; if ( PropertyRequest->ValueSize >= ExpectedSize ) { // Extra information to return PropDesc->MembersListCount = 1; PKSPROPERTY_MEMBERSHEADER MembersHeader = ( PKSPROPERTY_MEMBERSHEADER )( PropDesc + 1); MembersHeader->MembersFlags = KSPROPERTY_MEMBER_RANGES; MembersHeader->MembersCount = 1; MembersHeader->MembersSize = sizeof( KSPROPERTY_BOUNDS_LONG ); MembersHeader->Flags = 0; PKSPROPERTY_BOUNDS_LONG PeakMeterBounds = (PKSPROPERTY_BOUNDS_LONG)( MembersHeader + 1); if(VT_I4 == ulPropTypeSetId ) { PeakMeterBounds->SignedMinimum = 0; PeakMeterBounds->SignedMaximum = 0x7fffffff; } else { PeakMeterBounds->UnsignedMinimum = 0; PeakMeterBounds->UnsignedMaximum = 0xffffffff; } // set the return value size PropertyRequest->ValueSize = ExpectedSize; } else { // No extra information to return. 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(PropertyRequest->Value)) = KSPROPERTY_TYPE_ALL; PropertyRequest->ValueSize = sizeof(ULONG); ntStatus = STATUS_SUCCESS; } else { PropertyRequest->ValueSize = 0; ntStatus = STATUS_BUFFER_TOO_SMALL; } } } } else { // switch on node id switch( PropertyRequest->Node ) { case DEV_SPECIFIC_VT_BOOL: PBOOL pbDevSpecific; ntStatus = ValidatePropertyParams(PropertyRequest, sizeof(BOOL), 0); if (NT_SUCCESS(ntStatus)) { pbDevSpecific = PBOOL (PropertyRequest->Value); if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) { *pbDevSpecific = m_AdapterCommon->bDevSpecificRead(); PropertyRequest->ValueSize = sizeof(BOOL); } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) { m_AdapterCommon->bDevSpecificWrite(*pbDevSpecific); } else { ntStatus = STATUS_INVALID_PARAMETER; } } break; case DEV_SPECIFIC_VT_I4: INT* piDevSpecific; ntStatus = ValidatePropertyParams(PropertyRequest, sizeof(int), 0); if (NT_SUCCESS(ntStatus)) { piDevSpecific = PINT (PropertyRequest->Value); if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) { *piDevSpecific = m_AdapterCommon->iDevSpecificRead(); PropertyRequest->ValueSize = sizeof(int); } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) { m_AdapterCommon->iDevSpecificWrite(*piDevSpecific); } else { ntStatus = STATUS_INVALID_PARAMETER; } } break; case DEV_SPECIFIC_VT_UI4: UINT* puiDevSpecific; ntStatus = ValidatePropertyParams(PropertyRequest, sizeof(UINT), 0); if (NT_SUCCESS(ntStatus)) { puiDevSpecific = PUINT (PropertyRequest->Value); if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) { *puiDevSpecific = m_AdapterCommon->uiDevSpecificRead(); PropertyRequest->ValueSize = sizeof(UINT); } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) { m_AdapterCommon->uiDevSpecificWrite(*puiDevSpecific); } else { ntStatus = STATUS_INVALID_PARAMETER; } } break; default: ntStatus = STATUS_INVALID_PARAMETER; break; } if( !NT_SUCCESS(ntStatus)) { DPF(D_TERSE, ("[%s - ntStatus=0x%08x]",__FUNCTION__,ntStatus)); } } return ntStatus; } // PropertyHandlerDevSpecific
NTSTATUS PropertyHandler_Mute ( _In_ PADAPTERCOMMON AdapterCommon, _In_ PPCPROPERTY_REQUEST PropertyRequest, _In_ ULONG MaxChannels ) /*++ Routine Description: Property handler for KSPROPERTY_AUDIO_MUTE Arguments: AdapterCommon - interface to the common adapter object. PropertyRequest - property request structure. MaxChannels - # of supported channels. Return Value: NT status code. --*/ { PAGED_CODE(); DPF_ENTER(("[%s]",__FUNCTION__)); NTSTATUS ntStatus; ULONG ulChannel; PBOOL pfMute; if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) { ntStatus = PropertyHandler_BasicSupportMute( PropertyRequest, MaxChannels); } else { ntStatus = ValidatePropertyParams ( PropertyRequest, sizeof(BOOL), sizeof(ULONG) ); if (NT_SUCCESS(ntStatus)) { ulChannel = * (PULONG (PropertyRequest->Instance)); pfMute = PBOOL (PropertyRequest->Value); if (ulChannel >= MaxChannels && ulChannel != ALL_CHANNELS_ID) { ntStatus = STATUS_INVALID_PARAMETER; } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) { *pfMute = AdapterCommon->MixerMuteRead ( PropertyRequest->Node, ulChannel == ALL_CHANNELS_ID ? 0 : ulChannel ); PropertyRequest->ValueSize = sizeof(BOOL); } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) { if (ALL_CHANNELS_ID == ulChannel) { for (ULONG i=0; i<ulChannel; ++i) { AdapterCommon->MixerMuteWrite ( PropertyRequest->Node, i, (*pfMute) ? TRUE : FALSE ); } } else { AdapterCommon->MixerMuteWrite ( PropertyRequest->Node, ulChannel, (*pfMute) ? TRUE : FALSE ); } } } if (!NT_SUCCESS(ntStatus)) { DPF(D_TERSE, ("[%s - ntStatus=0x%08x]",__FUNCTION__,ntStatus)); } } return ntStatus; } // PropertyHandlerMute