2

我的问题与这个问题非常相似:Link,但我不允许发表评论。

我将 PIC32 实现为声卡,现在我有一个工作的 USB 音频流,支持 16 位 32kHz 和 48kHz 采样率。我现在想将位深度更改为 24 位,因此我将 USB 描述符更改为:

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

当我这样做时,他的位分辨率会按预期更改,但是在麦克风的属性中,我可以更改采样频率的下拉菜单是灰色的。我没有更改端点描述符中的任何内容,仍然支持 32kHz 和 48kHz。

不能改变采样频率

我的 USB 拓扑有 1 个带有几个单元的音频控制接口和 2 个音频流接口,用于流式输入和输出。Marc O 回答他的问题时说他的输入终端中的某些内容,我尝试过更改wChannelConfig但我不工作。我已经尝试卸载和安装设备驱动程序,但不起作用。

为了能够选择采样频率,我还需要在描述符中进行哪些更改?

谢谢 :)

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

当我将频道数更改为 2 并制作时wChannelConfig = 0x03 -> right + Left Front,我看到他图片上的字段更改为:“2 频道,24 位,48000 Hz(工作室质量)”,但它仍然没有制作下拉菜单白色,我无法更改采样率。

下面我添加了音频功能描述符:

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

1 回答 1

1

这篇文章很老了,但我的回复可能对面临同样困难的其他人有所帮助。

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

于 2015-11-01T23:45:51.950 回答