在非默认音频设备上设置 HID 音量调高/调低

Posted

技术标签:

【中文标题】在非默认音频设备上设置 HID 音量调高/调低【英文标题】:Setting HID Volume Up/Down on non default audio devices 【发布时间】:2019-12-29 03:59:39 【问题描述】:

我正在尝试在 Arduino 上制作一些代码原型,以模拟 USB 复合设备 - 其中包括音频和 HID 功能。我想要实现的是能够通过按下 Arduino 上的物理按钮来控制音量 - 这将生成 HID 音量增大/减小事件来托管。我希望即使未将 Arduino 选为默认设备,更改音量也会设置音频。

在 Windows 上,即使 Arduino 不是默认音频设备,我也可以控制音量 - 这意味着我可以连接两个或多个 Arduino 设备并独立设置有效音量。在 Linux(使用 ALSA/PulseAudio)上,HID Volume Up/Down 似乎仅适用于默认设备 - 这意味着我不能使用两个 Arduino 设备并独立控制它们的音量。

我还可以观察到,如果默认音频设备与 Arduino 不同,则主机没有带有 SET_CUR 的 USB 消息。

我可以在 ALSA/PulseAudio 中配置什么来达到预期的效果吗?或者也许应该重新设计 HID 方法?

以下是我正在使用的 HID 消息的定义:

static const uint8_t JoystickHIDDescriptor[] = 

    0x05, 0x0c,                    // USAGE_PAGE (Consumer Devices)
    0x09, 0x01,                    // USAGE (Consumer Control)
    0xa1, 0x01,                    // COLLECTION (Application)
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
        0x09, 0xe9,                    //   USAGE (Volume Up)
        0x09, 0xea,                    //   USAGE (Volume Down)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x95, 0x02,                    //   REPORT_COUNT (2)
        0x81, 0x06,                    //   INPUT (Data,Var,Rel)
        0x09, 0xe2,                    //   USAGE (Mute)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x81, 0x06,                    //   INPUT (Data,Var,Rel)
        0x95, 0x05,                    //   REPORT_COUNT (5)
        0x81, 0x07,                    //   INPUT (Data,Var,Rel)
    0xc0                           // END_COLLECTION
;

【问题讨论】:

【参考方案1】:

如果您使用 HID,那么您可以检查这个

https://github.com/pzprovi/hid

在这里查看整个项目。有两个键盘无效功能。您可以测试 keyboard2() 示例只适合您。

https://github.com/pzprovi/hid/blob/master/MultiKey/MultiKey.c

只需替换它并尝试将 JoystickHIDDescriptor 中的所有数组元素都设置为大小写,就像底部的这个示例一样

    void Keyboard2(void)


  if(!HIDTxHandleBusy(lastINTransmission))
    
        switch(getInput())
        
            case INPUT_NONE:
                // if we don't send this, the vol +/- will continue to roll on and on...
                hid_report_in[0] = 0x00;
                hid_report_in[1] = 0x00;
                hid_report_in[2] = 0x00;
                lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);
                break;
            case INPUT_VOLUME_UP:
                hid_report_in[0] = 0x01;
                hid_report_in[1] = 0xE9;
                hid_report_in[2] = 0x00;
                lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);
                break;
            case INPUT_VOLUME_DOWN:
                hid_report_in[0] = 0x01;
                hid_report_in[1] = 0xEA;
                hid_report_in[2] = 0x00;
                lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);
                break;
            case INPUT_VOLUME_MUTE:
                hid_report_in[0] = 0x01;
                hid_report_in[1] = 0xE2;
                hid_report_in[2] = 0x00;
                lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);
                break;
            default:
                // no need to send anything.
                break;
        
    


0x09, 0xe9, // 使用(提高音量) 0x09, 0xea, // 用法(降低音量)

设置断点并检查设备上的所有硬件按钮。然后添加 vol up 这段代码:

  hid_report_in[0] = 0x01;
                hid_report_in[1] = 0xE9;
                hid_report_in[2] = 0x00;
                lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);

并降低这个:

hid_report_in[0] = 0x01;
                hid_report_in[1] = 0xEA;
                hid_report_in[2] = 0x00;
                lastINTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);

【讨论】:

感谢您的详细解答。我刚刚发现我的问题与 Gnome 版本

以上是关于在非默认音频设备上设置 HID 音量调高/调低的主要内容,如果未能解决你的问题,请参考以下文章

通过移动设备音量调高按钮调整 chromecast 电视音量

如何以编程方式控制我的电脑的音量?

手机连接两个蓝牙设备,选择耳机输出音量

将 MPVolumeView 滑块拇指位置设置为设备音量

设备的默认音量/声音

如何在 Android 中以编程方式增加和减少音量