Windows10 x64使用USB虚拟HID设备控制系统音频音量的播放/暂停
搞了一个虚拟的自定义HID通讯,这一般对程序员来说,比较好用,特别是功能开发的。内容详见:http://www.usbzh.com/article/detail-884.html
不过在HID的大类中,有一些特定的类如“符合 HID 标准的用户控制设备”,这些由系统负责打开(我们在应用层是无法打开的,如打开会报没有权限的),实现一些特定的功能,如显示器的屏幕亮度等,一键打开浏览器等多功能HID设备,不过最常用的还是我们的音频控制,如耳机上带的音量控制,播放、暂停、上一曲,下一曲等功能。
说到底,这些都是HID设备,只是符合一些通用的默认功能,由系统对其输入报告和输出报告进行维护,这有点类似如键盘的输出报告用于维护接入系统中所有的键盘的指示灯功能。
我们基于原来的自定义HID进行信息修改,实现一个音量增减和当前播放停止开始的HID设备,当然由于我们是虚拟的HID设备,故这些按钮的信息是通过应用层的按钮实现,故这里是一个虚拟的按键,不同于我们如耳机上的真实按钮,不过功能都是一样的。
下来我们实现通过虚拟HID设备来控制系统音频播放器的控制,如我们的实例为华为耳机播放音乐。
基于本站的HID报告描述符( http://www.usbzh.com/article/detail-803.html )修改驱动后,进行自定义HID设备驱动的相关参数修改,编译后,安装驱动,在设备管理器中虚拟出的HID设备如下图:
在应用层定义其输入报告描的结构体:
typedef struct AUDIO_HID
{
UCHAR VolumeIncrement : 1;
UCHAR VolumeDecrement : 1;
UCHAR Mute : 1;
UCHAR PlayPause : 1;
UCHAR NextTrak : 1;
UCHAR PreTrack : 1;
UCHAR FastForWard : 1;
UCHAR Stop : 1;
UCHAR TrackIngIncrement : 1;;
UCHAR TrackingDecrement : 1;;
UCHAR StopEject : 1;;
UCHAR Volume : 1;;
UCHAR BalanceRight : 1;;
UCHAR BalacneLeft : 1;;
UCHAR Play : 1;;
UCHAR Pause : 1;;
}AUDIO_HID;
按钮与播放、暂停的控制:
void CHidTestDlg::OnBnClickedButtonSendData()
{
TCHAR DeviceName[512] = { 0 };
if (!CUsb::USBEnumDevice(DeviceName, 0))
{
printf("USBEnumDevice err\n");
return;
}
CUsb usb;
if (!usb.UsbOpenDevice(DeviceName))
{
printf("open usb device err\n");
return;
}
CButton* pPlayPause = (CButton*)GetDlgItem(IDC_CHECK_PLAY_PAUSE);
AUDIO_HID ah;
memset(&ah, 0, sizeof(ah));
ah.PlayPause = pPlayPause->GetCheck();
for (int i = 0; i < 1; i++)
{
ULONG rtn = 0;
if (!usb.SetHidInputReport(&ah, sizeof(ah), &rtn))
{
printf("SetHidInputReport err=0x%x\n", GetLastError());
}
else
{
printf("SetHidInputReport ok\n");
}
}
usb.UsbClose();
}
点击按钮实现对歌曲的播放与暂停的功能。
暂停状态
播放状态
通过BUSHOUND抓取虚拟的HID设备的数据
Device Length Phase Data
------ -------- ----- --------------------
30 3 IN 00 08 00
30 3 IN 00 08 00
30 3 IN 00 00 00
30 3 IN 00 00 00
30 3 IN 00 00 00
30 3 IN 00 00 00
30 3 IN 00 08 00
30 3 IN 00 08 00
23.3 RESET
30 3 IN 00 08 00
30 3 IN 00 08 00
30 3 IN 00 08 00
30 3 IN 00 08 00
30 3 IN 00 08 00
30 3 IN 00 08 00
23.3 RESET
30是我们虚拟HID设备,23.3是们的耳机。
说明,1607的WIN10系统不支持播放暂停的功能,但支持音量的控制。