草庐IT

windows - 24 位 USB 采样率支持

coder 2024-06-13 原文

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

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

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

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

我的 USB 拓扑有 1 个音频控制接口(interface)和几个单元,以及 2 个音频流接口(interface),用于流式输入和输出。 Marc O 通过在他的输入终端中说一些东西来回答他的问题,我已经尝试更改 wChannelConfig 但我不起作用。 我已尝试卸载和安装设备驱动程序,但不起作用。

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

谢谢:)

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

当我将 channel 数更改为 2,并设置 wChannelConfig = 0x03 -> right + Left Front 时,我看到图片上的字段更改为:“2 channel ,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.

最佳答案

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

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

关于windows - 24 位 USB 采样率支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657626/

有关windows - 24 位 USB 采样率支持的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  6. ruby - 如何使用 readline 支持重新安装 ruby​​? - 2

    我已经按照https://github.com/wayneeseguin/rvm#installation上的说明通过RVM安装了Ruby.有关信息,我有所有文件(readline-5.2.tar.gz、readline-6.2.tar.gz、ruby-1.9.3-p327.tar.bz2、rubygems-1.8.24.tgz、wayneeseguin-rvm-stable.tgz和yaml-0.1.4.tar.gz)在~/.rvm/archives目录中,我不想在任何目录中重新下载它们方式。当我这样做时:sudo/usr/bin/apt-getinstallbuild-essent

  7. ruby-on-rails - "undefined method ` stub_request '"访问 RSpec 支持文件中的方法时 - 2

    我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re

  8. ruby - Ruby 是否支持逐字字符串? - 2

    Ruby是否支持(找不到更好的词)非转义(逐字)字符串?就像在C#中一样:@"c:\ProgramFiles\"...或者在Tcl中:{c:\ProgramFiles\} 最佳答案 是的,您需要在字符串前加上%前缀,然后是描述其类型的单个字符。你想要的是%q{c:\programfiles\}。镐书很好地涵盖了这一点here,部分是通用分隔输入。 关于ruby-Ruby是否支持逐字字符串?,我们在StackOverflow上找到一个类似的问题: https:/

  9. ruby - 在 Ruby 1.8 中支持 Ruby 1.9 的哈希语法 - 2

    我正在编写一个Rubygem,在我的代码中使用{key:'value'}哈希语法。我的测试都在1.9.x中通过,但我(可以理解)在1.8.7中得到syntaxerror,unexpected':',expecting')'。是否有支持1.8.x的最佳实践?我是否需要使用我们的老friend=>重写代码,还是有更好的策略? 最佳答案 我认为你运气不好,如果你想支持1.8,那么你必须使用=>。像往常一样,我会提到在1.9的某些情况下您必须使用=>:如果键不是一个符号。请记住,任何对象(符号、字符串、类、float……)都可以是Ruby哈

  10. ruby - 错误 : Failed to build gem native extension on Windows - 2

    我在安装“redcarpet”gem时遇到以下错误。它在我friend的机器上安装没有问题。(我想安装它来运行yard)ruby版本:1.9.3命令输出:D:\Learning\Common_POM_FW\SampleProjects>yard[error]:Missing'redcarpet'gemforMarkdownformatting.Installitwith`geminstallredcarpet`D:\Learning\Common_POM_FW\SampleProjects>geminstallredcarpetTemporarilyenhancingPATHtoinc

随机推荐