在非默认音频设备上设置 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 音量调高/调低的主要内容,如果未能解决你的问题,请参考以下文章