Невозможно воспроизвести аудио и получить пакеты от HID - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь использовать 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 на этом устройстве и воспроизводить аудио?

...