Программная проверка устройства определенного типа в Linux - PullRequest
1 голос
/ 08 ноября 2019

Я пишу сегмент в моей программе на Python (в Linux), который позволяет пользователю записать короткий аудиофайл. Конечно, первым шагом в коде является проверка наличия микрофона. К сожалению, я изо всех сил пытаюсь сделать это надежно.

Я хочу, чтобы он работал независимо от:

  1. Модель USB-микрофона
  2. Порядок, в котором онаи любые другие аудиоустройства были подключены / перечислены
  3. Было ли устройство горячим или холодным

Возможно ли это? Я рассмотрел:

  • правила udev и команду 'udevadm info' (конфликтует с пунктами 1 и 3 выше)
  • aplay / arecord (указание устройства с помощью --deviceопция конфликтует с пунктом 2)
  • команда lsusb (конфликтует с 1)
  • Проверка определенного узла устройства или файла в каталогах / dev и / sys (конфликтует с 1 & 2)

Это расширяет мои познания в Linux, так что есть неплохой шанс, что я сделал несколько неверных предположений о потенциальных конфликтах выше.

1 Ответ

0 голосов
/ 08 ноября 2019

Конечно, первым шагом в коде является проверка наличия микрофона.

Это сложнее, чем вы думаете. Используя пакет pyaudio , относительно легко обнаружить доступные устройства ввода ...

import pyaudio

p = pyaudio.PyAudio()

for i in range(p.get_device_count()):
  dev = p.get_device_info_by_index(i)
  if dev.get('maxInputChannels', 0) > 0:
    print('Input device: ', dev.get('name'))

... но в моей системе есть как минимум четыре различных устройства ввода ... одноэто микрофон для конференций, один - это микрофонный вход от моей гарнитуры, один - микрофон на моей камере, а другой - микрофон на звуковом устройстве USB, которое я использую только для управления набором динамиков. Нет никакого способа программно решить, какой из них я действительно хочу использовать.


Если вы предполагаете простую настройку (например, только один микрофон), вы можете просто попросить PyAudio записать, и он будет использоватьустройство ввода по умолчанию. См. Пример в документации PyAudio для получения более подробной информации:

stream = p.open(input=True, ...)

Кажется, это соответствует вашим требованиям. Если устройства ввода недоступны, произойдет сбой:

>>> s = p.open(input=True, rate=44100, channels=2, format=pyaudio.paInt16)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.7/site-packages/pyaudio.py", line 750, in open
    stream = Stream(self, *args, **kwargs)
  File "/usr/lib64/python3.7/site-packages/pyaudio.py", line 441, in __init__
    self._stream = pa.open(**arguments)
OSError: [Errno -9996] Invalid input device (no default output device)
...