USB 24bits audiostream描述符

时间:2013-12-12 10:57:58

标签: c audio embedded usb

我正在研究USB耳机的演示,我对USB的音频端点描述符有疑问。 我有一个8-48kHz的16位音频流,我可以在音频设备的windows属性中选择任何采样频率。我使用以下描述符:

代码:

// Interface 2: Speaker, alternate setting 1. Type 1 format descriptor. 
static const UsbAudioStreamingType1DescriptorType UsbIfd2Format = 
{ 
  sizeof(UsbAudioStreamingType1DescriptorType),                                       // uint8 bLength; 
  UDESC_CS_INTERFACE,                                                                 // uint8 bDescriptorType; 
  UA_FORMAT_TYPE,                                                                     // uint8 bDescriptorSubtype; 
  UA_FORMAT_TYPE_I,                                                                   // uint8 bFormatType; 
  AUDIO_LSR_NOC,                                                                      // uint8 bNrChannels; 
  AUDIO_LSR_SAMPLE_SIZE,                                                              // uint8 bSubFrameSize; 
  AUDIO_LSR_SAMPLE_SIZE << 3,                                                         // uint8 bBitResolution; 
  0x00,                                                                               // uint8 bSamFreqType; 
  (uint8)((AUDIO_LSR_MIN_SAMPLE_FREQUENCY) & 0xFF),                                   // uint8 first byte minumum sample frequency  
  (uint8)((AUDIO_LSR_MIN_SAMPLE_FREQUENCY >> 8) & 0xFF),                              // uint8 second byte minumum sample frequency                            
  (uint8)(((0x10000000 | AUDIO_LSR_MIN_SAMPLE_FREQUENCY) >> 16) & 0xFF),              // uint8 third byte minumum sample frequency  
  (uint8)((AUDIO_LSR_MAX_SAMPLE_FREQUENCY) & 0xFF),                                   // uint8 first byte maximum sample frequency  
  (uint8)((AUDIO_LSR_MAX_SAMPLE_FREQUENCY >> 8) & 0xFF),                              // uint8 second byte maximum sample frequency  
  (uint8)(((0x10000000 | AUDIO_LSR_MAX_SAMPLE_FREQUENCY) >> 16) & 0xFF),              // uint8 third byte maximum sample frequency  
}; 

// Interface 2: Speaker, alternate setting 1. Audio endpoint descriptor. 
static const UsbAudioEndpointDescriptorType UsbIfd2StdEndpoint = 
{ 
  sizeof(UsbAudioEndpointDescriptorType),                                             // uint8 bLength; 
  USB_DT_ENDPOINT,                                                                    // uint8 bDescriptorType; 
  USB_DIR_OUT | USB_EP_AUDIO_RX,                                                      // uint8 bEndpointAddress; 
  0x01,                                                                               // uint8 bmAttributes; 
  ((AUDIO_LSR_MAX_SAMPLE_FREQUENCY / 1000) * AUDIO_LSR_SAMPLE_SIZE) * AUDIO_LSR_NOC,  // uint16 wMaxPacketSize; 
  0x01,                                                                               // uint8 bInterval; 
  0x00,                                                                               // uint8 bRefresh; 
  0x00,                                                                               // uint8 bSynchAddress; 
};

使用以下设置:

// Sample frequencies 
#define AUDIO_LSR_MIN_SAMPLE_FREQUENCY 0x01F40  // 8kHz 
#define AUDIO_LSR_MAX_SAMPLE_FREQUENCY 0x0BB80  // 48kHz 

// Sample size 
#define AUDIO_LSR_SAMPLE_SIZE 0x02 // in bytes 

// Defines for mono/stereo. 
#define AUDIO_LSR_NOC 0x02 // Number Of Channels (stereo)

现在我想将其更改为8-48kHz 24位流。通过将AUDIO_LSR_SAMPLE_SIZE更改为0x03。当我这样做时,窗口属性窗口中的采样频率选择框在48kHz处显示为灰色,因此我无法选择任何其他频率。当我向设备播放内容时,流是24位。 我已经尝试卸载驱动程序,但这并没有改变任何东西。

有没有人遇到这个问题,或者有人知道可能导致这个问题的原因吗?

1 个答案:

答案 0 :(得分:1)

事实证明问题不在这些描述符中,而是在输入终端描述符中,其中通道配置错误。