Используйте микрорамки с WinUsb - PullRequest
0 голосов
/ 08 января 2020

Я занимаюсь разработкой приложения для аудиопотока, критичного к задержке, для устройства с изохронными конечными точками, используя libusb с драйвером WinUsb. Конечные точки настраиваются с помощью wMaxPacketSize 32 и bInterval 1. Я пытаюсь добиться задержки в 250 раз c в обе стороны, которая в настоящее время работает на платформе Linux. В моем приложении реализован сигнал передачи, который отправляет и обрабатывает ожидающие передачи.

При Windows я могу общаться с устройством, но только с интервалом 1 кГц. Libusb требует, чтобы буфер был MaximumBytesPerInterval * 8) / interval, и прямо заявляет, что

windows_winusb.c line 2728:
// WinUSB only supports isochronous transfers spanning a full USB frames

Обеспечение буфера, если это требование работает, но с интервалами передачи 1 кГц. Библиотека libusb вызывает windows WinUsb_WriteIsochPipeAsap/WinUsb_ReadIsochPipeAsap и пытается использовать ContinueStream, что кажется правильным.

Документация Windows (https://docs.microsoft.com/en-us/windows/win32/api/winusb/nf-winusb-winusb_writeisochpipeasap) гласит, что

WinUsb_WriteIsochPipeAsap упаковывает буфер передачи так, чтобы в каждом интервале хост мог отправлять максимально разрешенные байты за интервал. Максимальное количество байт соответствует дескриптору конечной точки для полных и высокоскоростных конечных точек и сопутствующему дескриптору конечной точки для конечных точек SuperSpeed. Если вызывающий абонент отправляет несколько запросов записи для потоковой передачи данных на устройство, размер передачи должен быть кратным максимальному количеству байтов за интервал (как возвращается WinUsb_QueryPipeEx) * 8 / интервал.

Это приводит к мой главный вопрос: Разве WinUsb вообще не поддерживает транзакции с низкой задержкой (в микрокадрах)?! (и логически, если это действительно так, как я могу этого достичь?)

Если нет, то что мои варианты?

  • Я также пробовал libusbK, но получил тот же результат, 1 кГц. Использует ли libusbK WinUsb или почему
  • https://github.com/daynix/UsbDk?
...