24位USB采样率支持

我的问题和这个问题很相似: 链接 ,但是我不能发表评论。

我正在实现一个声卡的PIC32,现在我有一个工作的USBaudiostream,支持32位和48kHz采样率的16位。 我现在想改变位深度为24位,所以我改变我的USB描述符为:

bSubFrameSize = 0x03, // 3 bytes per sample bBitResolution = 0x18, // 24-bit resolution 

当我这样做的时候,他的位分辨率被改变了,但是在麦克风的属性中,我可以改变采样频率的下拉菜单是灰色的。 我没有改变terminal描述符中的任何地方,32kHz和48kHz仍然被支持。

不能改变采样频率

我的USB拓扑结构有一个audio控制接口,有两个单元,两个audiostream接口,用于stream入和输出。 Marc O在他的inputterminal中回答了他的问题,我试图改变wChannelConfig但是我不工作。 我曾尝试卸载和安装设备驱动程序,但不起作用。

我还需要在描述符中进行更改,以便能够select采样频率?

谢谢 :)

编辑:添加描述符代码和描述的进度

当我改变通道的数量为2,并做了wChannelConfig = 0x03 -> right + Left Front ,我看到他的画面上的字段更改为:“2通道,24位,48000赫兹(工作室质量)”,但它仍然没有使下拉菜单白色,我不能改变采样率。

下面我添加了audiofunction描述符:

  //CD 0x09, // Size : 9 Bytes USB_DESCRIPTOR_CONFIGURATION, // Configuration Descriptor (0x02) 0x10, // Total length in bytes of data returned 0x01, // 2. Byte af Total Length 0x05, // Number of Interfaces: 5 3 Audio + 2 Comm 0x01, // Configuration Value, Value to use as an argument to select this configuration 0x00, // iConfiguration, Index of String Descriptor describing this configuration _DEFAULT | _SELF, // bmAttributes, selfpowered 0xFA, // Maximum Power : 250 mA // ######## Audio Control Interface Descriptor //ID - Interface Descriptor 0x09, // Size : 9 Bytes USB_DESCRIPTOR_INTERFACE, // Interface Descriptor (0x04) 0x00, // Number of Interface: Interface nr 0 0x00, // Value used to select alternative setting 0x00, // Number of Endpoints used for this interface, 0 AUDIO_DEVICE, // Class Code (Assigned by USB Org), AUDIO AUDIOCONTROL, // Subclass Code (Assigned by USB Org), AUDIOCONTROL 0x00, // Protocol Code (Assigned by USB Org) 0x00, // Index of String Descriptor Describing this interface // HEADER 0x0A, // Size : 10 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type HEADER, // HEADER descriptor subtype 0x00,0x01, // Audio Device compliant to the USB Audio specification version 1.00 0x46,0x00, // 64 bytes - Total number of bytes returned for the class-specific AudioControl interface descriptor. // Includes the combined length of this descriptor header and all Unit and Terminal descriptors. 0x02, // bInCollection -> Number of streaming interfaces = 2 0x01, // en form for index: "AudioStreaming interface 1 belongs to this AudioControl interface." 0x02, // beskriver nok streaming interface 2's index // INPUT_TERMINAL ID = 1 USB Stream 0x0B, // size : 12 bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type INPUT_TERMINAL, // INPUT_TERMINAL - Descriptor subtype = 2 INPUT_TER_USB, // ID of this Input Terminal. // Constant uniquely identifying the Terminal within the audio function. USB_STREAMING, // wTerminalType -> 0x0101 = USB streamming 0x00, // bAssocTerminal -> 0x00 = No association. 0x02, // bNrChannels -> 0x01 two channel. 0x03, // wChannelConfig -> 0x03 = right + Left Front 0x00, // iChannelNames -> 0x00 = Unused. 0x00, // iTerminal -> 0x00 = Unused. // INPUT_TERMINAL ID = 4 MICROPHONE 0x0B, // size : 12 bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type INPUT_TERMINAL, // INPUT_TERMINAL - Descriptor subtype INPUT_TER_MIC, // bTerminalID -> ID of this Input Terminal = 4 MICROPHONE, // wTerminalType -> 0x0201 = Microphone 0x00, // bAssocTerminal -> 0x00 = No association. 0x02, // bNrChannels -> 0x01 one channel. 0x03, // wChannelConfig -> 0x03 = right + Left Front 0x00, // iChannelNames -> 0x00 = Unused. 0x00, // iTerminal -> 0x00 = Unused. // OUTPUT_TERMINAL ID = 3 SPEAKER 0x09, // size : 9 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type OUTPUT_TERMINAL, // OUTPUT_TERMINAL - Descriptor subtype OUTPUT_TER_SPEAK, // bTerminalID -> ID of this Output Terminal = 3 SPEAKER, // wTerminalType -> 0x0301 = Speaker 0x00, // bAssocTerminal -> 0x00 = Unused FEATURE_OUT, // bSourceID -> 0x02 = From Input Terminal ID 2 = USB stream 0x00, // iTerminal -> 0x00 = Unused. // OUTPUT_TERMINAL ID = 6 USB Stream 0x09, // Size : 9 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type OUTPUT_TERMINAL, // OUTPUT_TERMINAL - Descriptor subtype OUTPUT_TER_USB, // bTerminalID -> ID of this Output Terminal = 6 USB_STREAMING, // wTerminalType -> 0x0101 = USB streaming 0x00, // bAssocTerminal -> 0x00 = Unused FEATURE_IN, // bSourceID -> 0x05 = Feature Unit that sets IN features SOURCE = 5 (Feature_IN) 0x00, // iTerminal -> 0x00 = Unused. // FEATURE_UNIT ID = 2 0x0A, // Size : 10 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type FEATURE_UNIT, // FEATURE_UNIT - Descriptor subtype FEATURE_OUT, // bUnitID -> ID 2 INPUT_TER_USB, // bSourceID -> 0x01 = connected to Input Terminal 1 SOURCE = 1 (Input USB) 0x01, // bControlSize -> 0x01 = 1 Byte 0x03, // bmaControls(n = channel nr) -> 0x03 = Mute + volume 0x03, // bmaControls(n = channel nr) -> 0x03 = Mute + volume 0x00, // bmaControls(n = channel nr) -> 0x00 = no master control 0x00, // iFeature -> string Descriptor Unused // FEATURE_UNIT ID = 5 0x0A, // Size : 9 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type FEATURE_UNIT, // FEATURE_UNIT - Descriptor subtype FEATURE_IN, // bUnitID -> ID 5 INPUT_TER_MIC, // bSourceID -> 0x04 = Connected to Unit ID 4 SOURCE = 4 (Input Mic.) 0x01, // bControlSize -> 0x01 = 1 Byte 0x03, // bmaControls(1) -> 0b0000011 = Mute + Volume no. of Channels +1 = no. of bmaControls 0x03, // bmaControls(2) -> 0b0000011 = Mute + Volume no. of Channels +1 = no. of bmaControls 0x00, // bmaControls(3) -> 0x00 = No controls supperted no. of Channels +1 = no. of bmaControls 0x00, // iFeature -> string Descriptor Unused // ######## AUDIO STREAM INTERFACE 1 OUT SPEAKER //ID // Alternate Setting 0 - 0 endpoint 0x09, // Size : 9 Bytes USB_DESCRIPTOR_INTERFACE, // Interface Descriptor (0x04) 0x01, // bInterfaceNumber -> 0x01 Interface ID = 1 0x00, // bAlternateSetting -> 0x00 = index of this interface's alternate setting 0x00, // bNumEndpoints -> 0x00 = 0 Endpoints to this interface AUDIO_DEVICE, // bInterfaceClass -> 0x01 = Audio Interface AUDIOSTREAMING, // bInterfaceSubclass -> 0x02 = AUDIO_STREAMING 0x00, // bInterfaceProtocol -> 0x00 = Unused 0x00, // iInterface -> 0x00 = Unused //ID // Alternate Setting 1 - 1 endpoint 0x09, // Size : 9 Bytes USB_DESCRIPTOR_INTERFACE, // Interface Descriptor (0x04) 0x01, // bInterfaceNumber -> 0x01 Interface ID = 1 0x01, // bAlternateSetting -> 0x01 = index of this interface's alternate setting 0x01, // bNumEndpoints -> 0x01 = 1 Endpoints to this interface 0x01, // bInterfaceClass -> 0x01 = Audio Interface 0x02, // bInterfaceSubclass -> 0x02 = AUDIO_STREAMING 0x00, // bInterfaceProtocol -> 0x00 = Unused 0x00, // iInterface -> 0x00 = Unused // ASID GENERAL 0x07, // Size : 7 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type AS_GENERAL, // bDescriptorSubtype -> 0x01 = GENERAL subtype 0x01, // bTerminalLink -> 0x01 = The Terminal ID of the Terminal to which the endpoint of this interface is connected. 0x01, // bDelay -> 0x01 = Delay (delta) introduced by the data path (see Section 3.4, ?Inter Channel Synchronization? - in Audio Devices). Expressed in number of frames. 0x01,0x00, // wFormatTag -> 0x0001 = PCM // ASID FORMAT_TYPE 0x0E, // Size : 14 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type FORMAT_TYPE, // bDescriptorSubtype -> 0x02 = FORMAT_TYPE 0x01, // bFormatType -> 0x01 = FORMAT_TYPE_I -> ref: A.1.1 Audio Data Format Type I Codes -> Audio Data Format Dok 0x02, // bNrChannels -> 0x02 = Two channels BYTES_PR_SAMPLE, // bSubFrameSize -> 0x03 = 3 bytes pr audio subframe BIT_RESOLUTION, // bBitResolution -> 0x18 = 24 bit pr sample 0x02, // bSamFreqType -> 0x02 = 2 sample frequencies supported 0x00,0x7D,0x00, // tSamFreq -> 0x7D00 = 32000 Hz 0x80,0xBB,0x00, // tSamFreq -> 0xBB80 = 48000 Hz //ED ENDPOINT OUT 0x09, // Size : 9 Bytes USB_DESCRIPTOR_ENDPOINT, // 0x05 -> ENDPOINT Descriptor Type 0x01, // bEndpointAddress -> 0x01 = adress 1, OUT, -> ref 9.6.6 Endpoint -> usb_20 Dok 0x09, // bmAttributes -> 0b00001001 -> Bits 0-1 = 01 = Isochronous , Bits 2-3 = 10 = Adaptive AUDIO_MAX_SAMPLES * sizeof ( AUDIO_PLAY_SAMPLE ), AUDIO_MAX_SAMPLES * sizeof ( AUDIO_PLAY_SAMPLE )>>8, 0x01, // bInterval -> 0x01 = 1 millisecond 0x00, // Unused 0x00, // Unused //AS ENDPOINT 0x07, // Size : 7 Bytes CS_ENDPOINT, // CS_ENDPOINT EP_GENERAL, // bDescriptorSubtype -> 0x01 = GENERAL SAMPLING_FREQ_CONTROL, // bmAttributes -> 0b00000001 = Bit 1 = 1 => Sample Freq Control is supported by this endpoint 0x00, // bLockDelayUnits -> 0x00 = Indicates the units used for the wLockDelay field: 0 = Undefined 0x00,0x00, // the time it takes this endpoint to reliably lock its internal clock recovery circuitry. // ######## AUDIO STREAM INTERFACE 2 IN MICROPHONE //ID // Alternate Setting 0 - 0 endpoint 0x09, // Size : 9 Bytes USB_DESCRIPTOR_INTERFACE, // Interface Descriptor (0x04) 0x02, // bInterfaceNumber -> 0x02 Interface ID = 2 0x00, // bAlternateSetting -> 0x00 = Value used to select this alternate setting for the interface identified in the prior field 0x00, // bNumEndpoints -> 0x00 = 0 -> Number of endpoints used by this interface AUDIO_DEVICE, // bInterfaceClass -> 0x01 = 1 = AUDIO AUDIOSTREAMING, // bInterfaceSubClass -> 0x02 = AUDIO_STREAMING 0x00, // bInterfaceProtocol -> 0x00 = Unused 0x00, // iInterface -> 0x00 = Unused -> Index of string descriptor. //ID // Alternate Setting 1 - 1 endpoint 0x09, // Size : 9 Bytes USB_DESCRIPTOR_INTERFACE, // Interface Descriptor (0x04) 0x02, // bInterfaceNumber -> 0x02 Interface ID = 2 0x01, // bAlternateSetting -> 0x01 = Value used to select this alternate setting for the interface identified in the prior field 0x01, // bNumEndpoints -> 0x01 = 1 -> Number of endpoints used by this interface 0x01, // bInterfaceClass -> 0x01 = 1 = AUDIO 0x02, // bInterfaceSubClass -> 0x02 = AUDIO_STREAMING 0x00, // bInterfaceProtocol -> 0x00 = Unused 0x00, // iInterface -> 0x00 = Unused -> Index of string descriptor. // ASID GENERAL 0x07, // Size : 7 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type AS_GENERAL, // GENERAL Descriptor 0x06, // bTerminalLink -> 0x06 = The Terminal ID of the Terminal to which the endpoint of this interface is connected. = 6 0x01, // bDelay -> 0x01 = Delay (delta) introduced by the data path (see Section 3.4, ?Inter Channel Synchronization? - in Audio Devices). Expressed in number of frames. 0x01,0x00, // wFormatTag -> 0x0001 = PCM // ASID FORMAT_TYPE 0x0E, // Size : 14 Bytes CS_INTERFACE, // CS_INTERFACE Descriptor Type FORMAT_TYPE, // bDescriptorSubtype -> 0x02 = FORMAT_TYPE 0x01, // bFormatType -> 0x01 = FORMAT_TYPE_I -> ref: A.1.1 Audio Data Format Type I Codes -> Audio Data Format Dok 0x02, // bNrChannels -> 0x02 = Two channels BYTES_PR_SAMPLE, // bSubFrameSize -> 0x03 = 3 bytes pr audio subframe BIT_RESOLUTION, // bBitResolution -> 0x18 = 24 bit pr sample 0x02, // bSamFreqType -> 0x02 = 2 sample frequencies supported 0x00,0x7D,0x00, // tSamFreq -> 0x7D00 = 32000 Hz 0x80,0xBB,0x00, // tSamFreq -> 0xBB80 = 48000 Hz //ED ENDPOINT IN 0x09, // Size : 9 Bytes USB_DESCRIPTOR_ENDPOINT, // 0x05 -> ENDPOINT Descriptor Type 0x82, // bEndpointAddress -> 0x82 = adress 2, IN, -> ref 9.6.6 Endpoint -> usb_20 Dok 0x05, // bmAttributes -> 0b00000101 -> Bits 0-1 = 01 = Isochronous , Bits 2-3 = 01 = Asynchronous AUDIO_MAX_SAMPLES * sizeof ( AUDIO_PLAY_SAMPLE ), AUDIO_MAX_SAMPLES * sizeof ( AUDIO_PLAY_SAMPLE )>>8, 0x01, // bInterval -> 0x01 = 1 millisecond 0x00, // unused 0x00, // unused //AS ENDPOINT 0x07, // Size : 7 Bytes CS_ENDPOINT, // bDescriptorType -> 0x25 = CS_ENDPOINT EP_GENERAL, // bDescriptorSubtype -> 0x01 = GENERAL SAMPLING_FREQ_CONTROL, // bmAttributes -> 0b00000001 = Bit 1 = 1 => Sample Freq Control is supported by this endpoint 0x00, // bLockDelayUnits -> 0x00 = Indicates the units used for the wLockDelay field: 0 = Undefined 0x00,0x00, // the time it takes this endpoint to reliably lock its internal clock recovery circuitry. 

这篇文章相当老,但我的回复可能对面临同样困难的人有帮助。

我注意到,当界面改变时,windows并没有改变已安装的驱动程序。 您必须手动卸载设备的Windows驱动程序,让Windows重新安装USB重新连接或重置设备。