2014-05-14 92 views
2

我的问题与这个问题很相似:Link,但我不允许发表评论。24bit USB采样率支持

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

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

当我做到这一点,他对位的分辨率,因为它是假设发生变化,但在的特性麦克风,我可以改变采样频率的下拉菜单是灰色的。 我没有改变端点描述符中的任何内容,其中仍支持32kHz和48kHz。

can't change sampling frequency

我的USB拓扑具有1一个夫妇单位和2个音频流接口,支持流IN和OUT音频控制接口。 Marc O通过在他的输入终端中回答他的问题,我试图改变wChannelConfig,但我不工作。 我试过卸载和安装设备驱动程序,但不起作用。

我还需要在描述符中更改什么,才能选择采样频率?

谢谢:)

编辑:添加描述代码和descriped进步

当我改变了没有渠道,2,搞得wChannelConfig = 0x03 -> right + Left Front,我看到他的图片变化的领域到:“2通道,24位,48000赫兹(工作室质量)”,但它仍然没有使下拉菜单变白,并且我无法改变采样率。

下面我已经添加了音频funcion描述:

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

回答

1

这个职位是很老,但我的回答也许帮助他人面临着同样的困难。

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

+0

[USBDeview](http://www.nirsoft.net/utils/usb_devices_view.html)适用于一次性卸载大量旧配置 – endolith