Author: janderwald Date: Wed Oct 26 18:09:19 2016 New Revision: 73042 URL: http://svn.reactos.org/svn/reactos?rev=73042&view=rev Log: [USBAUDIO] - implement audio volume property handler
Modified: trunk/reactos/drivers/usb/usbaudio/filter.c trunk/reactos/drivers/usb/usbaudio/pin.c trunk/reactos/drivers/usb/usbaudio/usbaudio.h Modified: trunk/reactos/drivers/usb/usbaudio/filter.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/filter.c?rev=73042&r1=73041&r2=73042&view=diff ============================================================================== --- trunk/reactos/drivers/usb/usbaudio/filter.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbaudio/filter.c [iso-8859-1] Wed Oct 26 18:09:19 2016 @@ -157,7 +157,6 @@ /* submit urb */ Status = SubmitUrbSync(DeviceObject, Urb); - DPRINT1("UsbAudioGetSetProperty Status %x\n", Status); FreeFunction(Urb); return Status; } @@ -215,12 +214,12 @@ FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)NodeContext->Descriptor; if (Property->NodeProperty.Property.Flags & KSPROPERTY_TYPE_GET) { - Status = UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x81, 0x100, FeatureUnitDescriptor->bUnitID << 8, Data, 1, USBD_TRANSFER_DIRECTION_IN); + Status = UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x81, 0x1 << 8, FeatureUnitDescriptor->bUnitID << 8, Data, 1, USBD_TRANSFER_DIRECTION_IN); Irp->IoStatus.Information = sizeof(BOOL); } else { - Status = UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x01, 0x100, FeatureUnitDescriptor->bUnitID << 8, Data, 1, USBD_TRANSFER_DIRECTION_OUT); + Status = UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x01, 0x1 << 8, FeatureUnitDescriptor->bUnitID << 8, Data, 1, USBD_TRANSFER_DIRECTION_OUT); } } } @@ -234,8 +233,85 @@ IN PKSIDENTIFIER Request, IN OUT PVOID Data) { - UNIMPLEMENTED - return STATUS_SUCCESS; + PKSNODEPROPERTY_AUDIO_CHANNEL Property; + PKSFILTER Filter; + PFILTER_CONTEXT FilterContext; + PNODE_CONTEXT NodeContext; + PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR FeatureUnitDescriptor; + PSHORT TransferBuffer; + LONG Value; + NTSTATUS Status = STATUS_INVALID_PARAMETER; + + + /* get filter from irp */ + Filter = KsGetFilterFromIrp(Irp); + + if (Filter) + { + /* get property */ + Property = (PKSNODEPROPERTY_AUDIO_CHANNEL)Request; + + /* get filter context */ + FilterContext = (PFILTER_CONTEXT)Filter->Context; + + TransferBuffer = AllocFunction(sizeof(USHORT) * 3); + ASSERT(TransferBuffer); + + Value = *(PLONG)Data; + + /* search for node context */ + NodeContext = FindNodeContextWithNode(FilterContext->DeviceExtension->NodeContext, FilterContext->DeviceExtension->NodeContextCount, Property->NodeProperty.NodeId); + if (NodeContext) + { + FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)NodeContext->Descriptor; + if (Property->NodeProperty.Property.Flags & KSPROPERTY_TYPE_GET) + { + Status = UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x81, 0x2 << 8, FeatureUnitDescriptor->bUnitID << 8, &TransferBuffer[0], sizeof(USHORT), USBD_TRANSFER_DIRECTION_IN); + Value = (LONG)TransferBuffer[0] * 256; + + *(PLONG)Data = Value; + Irp->IoStatus.Information = sizeof(BOOL); + } + else + { + /* downscale value */ + Value /= 256; + + /* get minimum value */ + UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x82, 0x2 << 8, FeatureUnitDescriptor->bUnitID << 8, &TransferBuffer[0], sizeof(USHORT), USBD_TRANSFER_DIRECTION_IN); + + /* get maximum value */ + UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x83, 0x2 << 8, FeatureUnitDescriptor->bUnitID << 8, &TransferBuffer[1], sizeof(USHORT), USBD_TRANSFER_DIRECTION_IN); + + if (TransferBuffer[0] > Value) + { + /* use minimum value */ + Value = TransferBuffer[0]; + } + + if (TransferBuffer[1] < Value) + { + /* use maximum value */ + Value = TransferBuffer[1]; + } + + /* store value */ + TransferBuffer[2] = Value; + + /* set volume request */ + Status = UsbAudioGetSetProperty(FilterContext->DeviceExtension->LowerDevice, 0x01, 0x2 << 8, FeatureUnitDescriptor->bUnitID << 8, &TransferBuffer[2], sizeof(USHORT), USBD_TRANSFER_DIRECTION_OUT); + if (NT_SUCCESS(Status)) + { + /* store number of bytes transferred*/ + Irp->IoStatus.Information = sizeof(LONG); + } + } + } + + /* free transfer buffer */ + FreeFunction(TransferBuffer); + } + return Status; } Modified: trunk/reactos/drivers/usb/usbaudio/pin.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/pin.c?rev=73042&r1=73041&r2=73042&view=diff ============================================================================== --- trunk/reactos/drivers/usb/usbaudio/pin.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbaudio/pin.c [iso-8859-1] Wed Oct 26 18:09:19 2016 @@ -88,61 +88,6 @@ *OutUrb = Urb; return STATUS_SUCCESS; -} - -NTSTATUS -UsbAudioSetVolume( - IN PKSPIN Pin) -{ - PURB Urb; - PUCHAR SampleRateBuffer; - PPIN_CONTEXT PinContext; - NTSTATUS Status; - - /* allocate sample rate buffer */ - SampleRateBuffer = AllocFunction(sizeof(ULONG)); - if (!SampleRateBuffer) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* allocate urb */ - Urb = AllocFunction(sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST)); - if (!Urb) - { - /* no memory */ - FreeFunction(SampleRateBuffer); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* FIXME: determine controls and format urb */ - UsbBuildVendorRequest(Urb, - URB_FUNCTION_CLASS_INTERFACE, - sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), - USBD_TRANSFER_DIRECTION_OUT, - 0, - 0x01, - 0x200, - 0x300, - SampleRateBuffer, - NULL, - 2, - NULL); - - /* get pin context */ - PinContext = Pin->Context; - - SampleRateBuffer[0] = 0xC2; - SampleRateBuffer[1] = 0xFE; - - /* submit urb */ - Status = SubmitUrbSync(PinContext->LowerDevice, Urb); - - DPRINT1("UsbAudioSetVolume Pin %p Status %x\n", Pin, Status); - FreeFunction(Urb); - FreeFunction(SampleRateBuffer); - return Status; } NTSTATUS @@ -642,9 +587,6 @@ Status = _KsEdit(Pin->Bag, (PVOID*)&Pin->Descriptor->AllocatorFraming, sizeof(KSALLOCATOR_FRAMING_EX), sizeof(KSALLOCATOR_FRAMING_EX), USBAUDIO_TAG); ASSERT(Status == STATUS_SUCCESS); } - - /* FIXME move to build filter topology*/ - UsbAudioSetVolume(Pin); /* select streaming interface */ Status = USBAudioSelectAudioStreamingInterface(PinContext, PinContext->DeviceExtension, PinContext->DeviceExtension->ConfigurationDescriptor); Modified: trunk/reactos/drivers/usb/usbaudio/usbaudio.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/usbaudio.h?rev=73042&r1=73041&r2=73042&view=diff ============================================================================== --- trunk/reactos/drivers/usb/usbaudio/usbaudio.h [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbaudio/usbaudio.h [iso-8859-1] Wed Oct 26 18:09:19 2016 @@ -61,8 +61,6 @@ DEFINE_KSPROPERTY_TABLE(TopologySet) {\ DEFINE_KSPROPERTY_ITEM_AUDIO_MUTE(Handler)\ } - - #include <pshpack1.h>