Поддержка 24-битной частоты дискретизации USB

Мой вопрос очень похож на этот вопрос: Ссылка, но мне не разрешено комментировать.

Я использую PIC32 в качестве звуковой карты, и теперь у меня есть работающий аудиопоток USB, поддерживающий 16-битную частоту дискретизации 32 кГц и 48 кГц. Теперь я хочу изменить разрядность на 24-битную, поэтому я изменяю свои дескрипторы USB на:

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

Когда я это делаю, битовое разрешение изменяется, как и предполагалось, но в свойствах микрофона выпадающее меню, где я могу изменить частоту дискретизации, отображается серым цветом. Я ничего не менял в дескрипторах конечной точки, где по-прежнему поддерживаются как 32 кГц, так и 48 кГц.

невозможно изменить частоту дискретизации

Моя топология USB имеет 1 интерфейс управления аудио с парой модулей и 2 интерфейса потоковой передачи аудио для потоковой передачи IN и OUT. Марк О ответил на его вопрос, сказав, что что-то в его входном терминале, я пытался изменить wChannelConfig, но это не работает. Я пробовал удалить и установить драйверы устройств, но не работает.

Что еще мне нужно изменить в дескрипторах, чтобы иметь возможность выбирать частоту дискретизации?

Спасибо :)

Изменить: добавлен код дескриптора и описание хода выполнения

Когда я изменил количество каналов на 2 и сделал wChannelConfig = 0x03 -> right + Left Front, я увидел, что поле на картинке изменилось на: «2 канала, 24 бита, 48000 Гц (студийное качество)», но это все еще не сделало раскрывающийся список меню белое, и я не мог изменить частоту дискретизации.

Ниже я добавил дескрипторы аудиофункции:

    //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.

person Wiingaard    schedule 14.05.2014    source источник
comment
Вы когда-нибудь решали это?   -  person endolith    schedule 13.03.2018


Ответы (1)


Этот пост довольно старый, но мой ответ может быть полезен другим, столкнувшимся с той же трудностью.

Заметил, что винда не вносит изменения в установленные драйвера при смене интерфейса. Вы должны вручную удалить драйвер Windows для вашего устройства и позволить Windows переустановить его либо при повторном подключении USB, либо при перезагрузке устройства.

person user5513908    schedule 01.11.2015
comment
USBDeview хорошо подходит для одновременного удаления множества старых конфигураций. - person endolith; 18.08.2016