mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 05:32:55 +00:00
[USBAUDIO]
- partly implement BuildUSBAudioFilterTopology svn path=/trunk/; revision=72971
This commit is contained in:
parent
1c43c34853
commit
5c2a0471bd
3 changed files with 299 additions and 7 deletions
|
@ -90,13 +90,270 @@ static KSPIN_DISPATCH UsbAudioPinDispatch =
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
CountTopologyComponents(
|
||||||
|
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
|
||||||
|
{
|
||||||
|
PUSB_INTERFACE_DESCRIPTOR Descriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor;
|
||||||
|
PUSB_COMMON_DESCRIPTOR CommonDescriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR FeatureUnitDescriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR MixerUnitDescriptor;
|
||||||
|
ULONG NodeCount = 0;
|
||||||
|
UCHAR Value;
|
||||||
|
|
||||||
|
for (Descriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, ConfigurationDescriptor, -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1);
|
||||||
|
Descriptor != NULL;
|
||||||
|
Descriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, (PVOID)((ULONG_PTR)Descriptor + Descriptor->bLength), -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1))
|
||||||
|
{
|
||||||
|
if (Descriptor->bInterfaceSubClass == 0x01) /* AUDIO_CONTROL */
|
||||||
|
{
|
||||||
|
InterfaceHeaderDescriptor = (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR)USBD_ParseDescriptors(ConfigurationDescriptor, ConfigurationDescriptor->wTotalLength, Descriptor, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE);
|
||||||
|
if (InterfaceHeaderDescriptor != NULL)
|
||||||
|
{
|
||||||
|
CommonDescriptor = USBD_ParseDescriptors(InterfaceHeaderDescriptor, InterfaceHeaderDescriptor->wTotalLength, (PVOID)((ULONG_PTR)InterfaceHeaderDescriptor + InterfaceHeaderDescriptor->bLength), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE);
|
||||||
|
while (CommonDescriptor)
|
||||||
|
{
|
||||||
|
InputTerminalDescriptor = (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR)CommonDescriptor;
|
||||||
|
if (InputTerminalDescriptor->bDescriptorSubtype == 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor->bDescriptorSubtype == 0x03 /* OUTPUT_TERMINAL*/)
|
||||||
|
{
|
||||||
|
NodeCount++;
|
||||||
|
}
|
||||||
|
else if (InputTerminalDescriptor->bDescriptorSubtype == 0x06 /* FEATURE_UNIT*/)
|
||||||
|
{
|
||||||
|
FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)InputTerminalDescriptor;
|
||||||
|
Value = FeatureUnitDescriptor->bmaControls[0];
|
||||||
|
if (Value & 0x01) /* MUTE*/
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x02) /* VOLUME */
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x04) /* BASS */
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x08) /* MID */
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x10) /* TREBLE */
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x20) /* GRAPHIC EQUALIZER */
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x40) /* AUTOMATIC GAIN */
|
||||||
|
NodeCount++;
|
||||||
|
if (Value & 0x80) /* DELAY */
|
||||||
|
NodeCount++;
|
||||||
|
|
||||||
|
/* FIXME handle logical channels too */
|
||||||
|
}
|
||||||
|
else if (InputTerminalDescriptor->bDescriptorSubtype == 0x04 /* MIXER_UNIT */)
|
||||||
|
{
|
||||||
|
MixerUnitDescriptor = (PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR)InputTerminalDescriptor;
|
||||||
|
NodeCount += MixerUnitDescriptor->bNrInPins + 1; /* KSNODETYPE_SUPERMIX for each source pin and KSNODETYPE_SUM for target */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED
|
||||||
|
}
|
||||||
|
CommonDescriptor = (PUSB_COMMON_DESCRIPTOR)((ULONG_PTR)CommonDescriptor + CommonDescriptor->bLength);
|
||||||
|
if ((ULONG_PTR)CommonDescriptor >= ((ULONG_PTR)InterfaceHeaderDescriptor + InterfaceHeaderDescriptor->wTotalLength))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NodeCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
BuildUSBAudioFilterTopology(
|
BuildUSBAudioFilterTopology(
|
||||||
PKSDEVICE Device)
|
PKSDEVICE Device,
|
||||||
|
PKSFILTER_DESCRIPTOR FilterDescriptor)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
PDEVICE_EXTENSION DeviceExtension;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
ULONG NodeCount, Index;
|
||||||
|
UCHAR Value;
|
||||||
|
PUSB_INTERFACE_DESCRIPTOR Descriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor;
|
||||||
|
PUSB_COMMON_DESCRIPTOR CommonDescriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR FeatureUnitDescriptor;
|
||||||
|
PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR MixerUnitDescriptor;
|
||||||
|
PKSNODE_DESCRIPTOR NodeDescriptors;
|
||||||
|
|
||||||
|
/* get device extension */
|
||||||
|
DeviceExtension = Device->Context;
|
||||||
|
|
||||||
|
/* count topology nodes */
|
||||||
|
NodeCount = CountTopologyComponents(DeviceExtension->ConfigurationDescriptor);
|
||||||
|
|
||||||
|
/* init node descriptors*/
|
||||||
|
FilterDescriptor->NodeDescriptors = NodeDescriptors = AllocFunction(NodeCount * sizeof(KSNODE_DESCRIPTOR));
|
||||||
|
if (FilterDescriptor->NodeDescriptors == NULL)
|
||||||
|
{
|
||||||
|
/* no memory */
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
FilterDescriptor->NodeDescriptorSize = sizeof(KSNODE_DESCRIPTOR);
|
||||||
|
|
||||||
|
for (Descriptor = USBD_ParseConfigurationDescriptorEx(DeviceExtension->ConfigurationDescriptor, DeviceExtension->ConfigurationDescriptor, -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1);
|
||||||
|
Descriptor != NULL;
|
||||||
|
Descriptor = USBD_ParseConfigurationDescriptorEx(DeviceExtension->ConfigurationDescriptor, (PVOID)((ULONG_PTR)Descriptor + Descriptor->bLength), -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1))
|
||||||
|
{
|
||||||
|
if (Descriptor->bInterfaceSubClass == 0x01) /* AUDIO_CONTROL */
|
||||||
|
{
|
||||||
|
InterfaceHeaderDescriptor = (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR)USBD_ParseDescriptors(DeviceExtension->ConfigurationDescriptor, DeviceExtension->ConfigurationDescriptor->wTotalLength, Descriptor, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE);
|
||||||
|
if (InterfaceHeaderDescriptor != NULL)
|
||||||
|
{
|
||||||
|
CommonDescriptor = USBD_ParseDescriptors(InterfaceHeaderDescriptor, InterfaceHeaderDescriptor->wTotalLength, (PVOID)((ULONG_PTR)InterfaceHeaderDescriptor + InterfaceHeaderDescriptor->bLength), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE);
|
||||||
|
while (CommonDescriptor)
|
||||||
|
{
|
||||||
|
InputTerminalDescriptor = (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR)CommonDescriptor;
|
||||||
|
if (InputTerminalDescriptor->bDescriptorSubtype == 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor->bDescriptorSubtype == 0x03 /* OUTPUT_TERMINAL*/)
|
||||||
|
{
|
||||||
|
if (InputTerminalDescriptor->wTerminalType == USB_AUDIO_STREAMING_TERMINAL_TYPE)
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SRC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SRC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
else if ((InputTerminalDescriptor->wTerminalType & 0xFF00) == 0x200)
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_ADC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_ADC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
else if ((InputTerminalDescriptor->wTerminalType & 0xFF00) == 0x300)
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_DAC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_DAC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Unexpected input terminal type %x\n", InputTerminalDescriptor->wTerminalType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (InputTerminalDescriptor->bDescriptorSubtype == 0x03 /* OUTPUT_TERMINAL*/)
|
||||||
|
{
|
||||||
|
if (InputTerminalDescriptor->wTerminalType == USB_AUDIO_STREAMING_TERMINAL_TYPE)
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SRC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SRC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
else if ((InputTerminalDescriptor->wTerminalType & 0xFF00) == 0x300)
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_DAC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_DAC;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Unexpected output terminal type %x\n", InputTerminalDescriptor->wTerminalType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (InputTerminalDescriptor->bDescriptorSubtype == 0x06 /* FEATURE_UNIT*/)
|
||||||
|
{
|
||||||
|
FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)InputTerminalDescriptor;
|
||||||
|
Value = FeatureUnitDescriptor->bmaControls[0];
|
||||||
|
if (Value & 0x01) /* MUTE*/
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_MUTE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_MUTE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
if (Value & 0x02) /* VOLUME */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_VOLUME;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_VOLUME;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Value & 0x04) /* BASS */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Value & 0x08) /* MID */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Value & 0x10) /* TREBLE */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Value & 0x20) /* GRAPHIC EQUALIZER */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Value & 0x40) /* AUTOMATIC GAIN */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Value & 0x80) /* DELAY */
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (InputTerminalDescriptor->bDescriptorSubtype == 0x04 /* MIXER_UNIT */)
|
||||||
|
{
|
||||||
|
MixerUnitDescriptor = (PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR)InputTerminalDescriptor;
|
||||||
|
for (Index = 0; Index < MixerUnitDescriptor->bNrInPins; Index++)
|
||||||
|
{
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SUPERMIX;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SUPERMIX;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SUM;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SUM;
|
||||||
|
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE));
|
||||||
|
FilterDescriptor->NodeDescriptorsCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED
|
||||||
|
}
|
||||||
|
CommonDescriptor = (PUSB_COMMON_DESCRIPTOR)((ULONG_PTR)CommonDescriptor + CommonDescriptor->bLength);
|
||||||
|
if ((ULONG_PTR)CommonDescriptor >= ((ULONG_PTR)InterfaceHeaderDescriptor + InterfaceHeaderDescriptor->wTotalLength))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -411,7 +668,7 @@ USBAudioPinBuildDescriptors(
|
||||||
DeviceExtension = Device->Context;
|
DeviceExtension = Device->Context;
|
||||||
|
|
||||||
CountTerminalUnits(DeviceExtension->ConfigurationDescriptor, &NonStreamingTerminalDescriptorCount, &TotalTerminalDescriptorCount);
|
CountTerminalUnits(DeviceExtension->ConfigurationDescriptor, &NonStreamingTerminalDescriptorCount, &TotalTerminalDescriptorCount);
|
||||||
DPRINT1("TotalTerminalDescriptorCount %lu NonStreamingTerminalDescriptorCount %lu", TotalTerminalDescriptorCount, NonStreamingTerminalDescriptorCount);
|
DPRINT("TotalTerminalDescriptorCount %lu NonStreamingTerminalDescriptorCount %lu\n", TotalTerminalDescriptorCount, NonStreamingTerminalDescriptorCount);
|
||||||
|
|
||||||
/* allocate pins */
|
/* allocate pins */
|
||||||
Pins = AllocFunction(sizeof(KSPIN_DESCRIPTOR_EX) * TotalTerminalDescriptorCount);
|
Pins = AllocFunction(sizeof(KSPIN_DESCRIPTOR_EX) * TotalTerminalDescriptorCount);
|
||||||
|
@ -560,7 +817,7 @@ USBAudioCreateFilterContext(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build topology */
|
/* build topology */
|
||||||
Status = BuildUSBAudioFilterTopology(Device);
|
Status = BuildUSBAudioFilterTopology(Device, FilterDescriptor);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* failed*/
|
/* failed*/
|
||||||
|
@ -570,7 +827,7 @@ USBAudioCreateFilterContext(
|
||||||
|
|
||||||
/* lets create the filter */
|
/* lets create the filter */
|
||||||
Status = KsCreateFilterFactory(Device->FunctionalDeviceObject, FilterDescriptor, ReferenceString, NULL, KSCREATE_ITEM_FREEONSTOP, NULL, NULL, NULL);
|
Status = KsCreateFilterFactory(Device->FunctionalDeviceObject, FilterDescriptor, ReferenceString, NULL, KSCREATE_ITEM_FREEONSTOP, NULL, NULL, NULL);
|
||||||
DPRINT1("KsCreateFilterFactory: %x\n", Status);
|
DPRINT("KsCreateFilterFactory: %x\n", Status);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,5 +7,12 @@ DEFINE_GUID(KSNAME_Filter, 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20,
|
||||||
DEFINE_GUID(KSDATAFORMAT_TYPE_AUDIO, 0x73647561L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
|
DEFINE_GUID(KSDATAFORMAT_TYPE_AUDIO, 0x73647561L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
|
||||||
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
|
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
|
||||||
DEFINE_GUID(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, 0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);
|
DEFINE_GUID(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, 0x05589f81L, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);
|
||||||
|
DEFINE_GUID(KSNODETYPE_SRC, 0x9DB7B9E0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_ADC, 0x4D837FE0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_DAC, 0x507AE360L, 0xC554, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_MUTE, 0x02B223C0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_TONE, 0x7607E580L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_SUM, 0xDA441A60L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_SUPERMIX, 0xE573ADC0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
|
DEFINE_GUID(KSNODETYPE_VOLUME, 0x3A5ACC00L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1);
|
||||||
/* NO CODE HERE, THIS IS JUST REQUIRED FOR THE GUID DEFINITIONS */
|
/* NO CODE HERE, THIS IS JUST REQUIRED FOR THE GUID DEFINITIONS */
|
||||||
|
|
|
@ -75,6 +75,34 @@ typedef struct
|
||||||
UCHAR iTerminal;
|
UCHAR iTerminal;
|
||||||
}USB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR;
|
}USB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR, *PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
UCHAR bLength;
|
||||||
|
UCHAR bDescriptorType;
|
||||||
|
UCHAR bDescriptorSubtype;
|
||||||
|
UCHAR bUnitID;
|
||||||
|
UCHAR bSourceID;
|
||||||
|
UCHAR bControlSize;
|
||||||
|
UCHAR bmaControls[1];
|
||||||
|
UCHAR iFeature;
|
||||||
|
}USB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
UCHAR bLength;
|
||||||
|
UCHAR bDescriptorType;
|
||||||
|
UCHAR bDescriptorSubtype;
|
||||||
|
UCHAR bUnitID;
|
||||||
|
UCHAR bNrInPins;
|
||||||
|
UCHAR baSourceID[1];
|
||||||
|
UCHAR bNrChannels;
|
||||||
|
USHORT wChannelConfig;
|
||||||
|
UCHAR iChannelNames;
|
||||||
|
UCHAR bmControls;
|
||||||
|
UCHAR iMixer;
|
||||||
|
}USB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR, *PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UCHAR bLength;
|
UCHAR bLength;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue