我正在try 编写一个小C程序来读取和调整USB ADC(Apple USB-C到3.5mm加密狗)的音量.我一直在使用this document作为参考,但遇到了一个我似乎无法解决的问题.我正在收到针对我的请求的LIBUSB_BER_PIPE响应.

libusb_control_transfer(handle, 0b10100001, 0x81, 0x0200, 0x0200, mesg, 2, 500);是我正在使用的行,bmReportType,bRecord来自第68页的文档,wValue是0x 02(VOLUME_UTE),具有较低的0字节,wIndex来自卷更改期间嗅探wireshark(我有一种感觉,这是我失败的地方,但我不明白终端ID是如何来源的),mesg是2 0x 00字节,wSize是2.完整的程序如下.

#include <assert.h>
#include <libusb-1.0/libusb.h>

int main(int argc, char **argv) {
    libusb_context *context;
    libusb_device_handle *handle;
    libusb_device *device;
    
    libusb_device **devs;
    ssize_t num_devs;
    
    int i;
    
    struct libusb_device_descriptor desc;
    unsigned char buffer[256];
    
    assert(!libusb_init(&context));
    
    num_devs = libusb_get_device_list(context, &devs);
    if (num_devs < 0) {
        fprintf(stderr, "Error getting device list\n");
        libusb_exit(context);
        return 1;
    }
    
    for (i = 0; i < num_devs; ++i) {
        libusb_device *dev = devs[i];
        struct libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(dev, &desc);
        if (r < 0) {
            fprintf(stderr, "Failed to get device descriptor\n");
            continue;
        }
        if(desc.idVendor == 0x05ac && desc.idProduct == 0x110a){
            device = dev;
        }
    }
    
    assert(!libusb_get_device_descriptor(device, &desc));
    printf("Vendor ID: %04x\n", desc.idVendor);
    printf("Product ID: %04x\n", desc.idProduct);

    assert(libusb_open(device, &handle) == 0);
    device = libusb_get_device(handle);
    
    assert(libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, buffer, 256) >= 0);
    printf("Manufacturer: %s\n", buffer);
    assert(libusb_get_string_descriptor_ascii(handle, desc.iProduct, buffer, 256) >= 0);
    printf("Product: %s\n", buffer);
    if (libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 256) >= 0)
        printf("Serial No: %s\n", buffer);
    libusb_detach_kernel_driver(handle, 0);
    libusb_claim_interface(handle, 0);
    
    int result = libusb_control_transfer(handle, 0b10100001, 0x81, 0x0200, 0x0200, mesg, 2, 500);
    printf(libusb_error_name(result));
    printf("%d", result);
    printf("\n");
    
    libusb_release_interface(handle, 0);
    libusb_attach_kernel_driver(handle, 0);
    libusb_exit(context);
}

推荐答案

我认为你的bRequest应该是0x1而不是0x81:

int result = libusb_control_transfer(handle, 0b10100001 /* bmRequest */, 0x1 /* bRequest */, 0x0200 /* wValue */, 0x0200 /* wIndex */, mesg, 2 /* wLength */, 500);

我现在无法向您引用UAC 1.0,但这就是我在wireshark中看到的内容,并且您的代码成功了,从而产生了与我在Audio MIDI Setup.app中看到的内容相匹配的量.

C++相关问答推荐

为什么macOS上的FIFA管道比匿名管道慢8倍?

FFmpeg不检测比特流过滤器参数

根据工具链文件中的定义替换单个函数定义

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

函数指针始终为零,但在解除引用和调用时有效

ISO_C_BINDING,从Fortran调用C

C/C++中的状态库

球体—立方体重叠:无、部分或全部?

当main函数调用被重构时,C函数给出错误的结果

DPDK-DumpCap不捕获端口上的传入数据包

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

将常量转换为指针会增加.数据大小增加1000字节

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

GTK函数调用将完全不相关的char* 值搞乱

隐藏测试用例无法在c程序中计算位数.

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

将char*数组深度复制到 struct 中?

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

如何在 C 中的 Postgres 函数的表中 for 循环