Я пытаюсь использовать USB-трубку с микрофоном, динамиком в трубке, динамиком в базе и кнопкой, которая используется для чего угодно. Я намерен использовать if для pu sh to talk (PTT).
Я попытался использовать libusb, hidapi, открыть устройство / dev / hiddraw0 и отправить ему данные. Когда у меня открыто устройство hiddraw0, в динамик трубки не воспроизводится звук. Аудио также не записывается с микрофона.
Вывод lsbusb -t дает:
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
|__ Port 1: Dev 30, If 2, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 1: Dev 30, If 0, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 1: Dev 30, If 3, Class=h Interface Device, Driver=usbhid, 12M
|__ Port 1: Dev 30, If 1, Class=Audio, Driver=snd-usb-audio, 12M
Я изменил пример hidraw в источнике примеров ядра для записи на устройство по запросу нажмите кнопку. Вот этот код:
/*
* Hidraw Userspace Example
*
* Copyright (c) 2010 Alan Ott <alan@signal11.us>
* Copyright (c) 2010 Signal 11 Software
*
* The code may be used by anyone for any purpose,
* and can serve as a starting point for developing
* applications using hidraw.
*/
#include <linux/types.h>
#include <linux/input.h>
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char **argv)
{
int fd;
int i, res, desc_size = 0;
char buf[256];
struct hidraw_devinfo info;
char *device = "/dev/hidraw0";
if (argc > 1)
device = argv[1];
/* Open the Device with non-blocking reads. In real life,
don't use a hard coded path; use libudev instead. */
fd = open(device, O_RDWR);
if (fd < 0) {
perror("Unable to open device");
return 1;
}
memset(&info, 0x0, sizeof(info));
memset(buf, 0x0, sizeof(buf));
/* Get Raw Info */
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("HIDIOCGRAWINFO");
} else {
printf("Raw Info:\n");
printf("\tbustype: %d \n", info.bustype);
printf("\tvendor: 0x%04hx\n", info.vendor);
printf("\tproduct: 0x%04hx\n", info.product);
}
/* Send a Report to the Device */
buf[0] = 0x80; /* Report Number */
buf[1] = 0x00;
res = write(fd, buf, 2);
if (res < 0) {
printf("Error: %d\n", errno);
perror("write");
} else {
printf("write() wrote %d bytes\n", res);
}
/* Get a report from the device */
res = read(fd, buf, 16);
if (res < 0) {
perror("read");
} else {
printf("read() read %d bytes:\n\t", res);
for (i = 0; i < res; i++)
printf("%hhx ", buf[i]);
puts("\n");
}
close(fd);
return 0;
}
Это считывает различные нажатия кнопок на устройстве, но после подключения устройства я могу воспроизводить звук и записывать звук. Если я запустил вышеупомянутую программу, какая-либо звуковая функция больше не работает.
Есть идеи, как читать HID на этом устройстве и воспроизводить аудио?