Portaudio на Raspberry Pi, не может найти устройство для входного потока

Я новичок в Portaudio и устанавливаю его на Raspberry Pi с помощью устройства под названием Matrix Creator. Matrix Creator подключает Pi, используя все контакты GPIO, и на нем есть 8 микрофонов.

Я хочу использовать Portaudio для реализации потоковой передачи звука в реальном времени (воспроизведение звука во время записи или одновременное воспроизведение всего, что собрано микрофонами).

Согласно веб-сайту Portaudio, в нем говорится, что мы должны знать идентификатор устройства как для inputStream, так и для outputStream. И я использовал функцию Pa_GetDeviceCount, чтобы проверить, что может обнаружить Pi, код показан ниже:

  int numDevices = Pa_GetDeviceCount();
  cout<<"Device num: "<<numDevices<<endl;
  const PaDeviceInfo * deviceInfo;
  for(int i = 0; i < numDevices; i++){ 
      deviceInfo = Pa_GetDeviceInfo(i);
      cout<<"Device info of "<<i<<"is :"<<deviceInfo;}

Результат, который я получил:

Device num: -10000

Вопрос 1

Есть ли способ получить информацию об устройствах для микрофонов Matrix?

Вопрос 2

Поскольку я не могу получить идентификатор устройства ввода, и я все еще хочу использовать буферы для передачи данных, полученных от микрофонов, в качестве моего inputStream (я могу поместить весь сигнал, полученный микрофонами, в 2D-буфер, код), что я могу сделать, чтобы реализовать сбор и воспроизведение звука в реальном времени?


person Arlene Fu    schedule 22.06.2018    source источник


Ответы (1)


Глядя на это конкретное оборудование, кажется, что оно не должно действовать как отдельный аудиоинтерфейс (в вашем обычном стиле, например, внешняя звуковая карта). Вот почему portaudio не распознает его.

Если вы посмотрите на код, который вы связали, и документацию MATRIX, все программное обеспечение работает поверх слоя абстракции (HAL). Это позволяет вызывать модули ядра с помощью C++ для чтения значений с устройства. Таким образом, предполагается, что вы получаете доступ к аудиовходам с аппаратного обеспечения через модули ядра HAL на C++ (или интерфейс более высокого уровня, если вы хотите использовать другой язык/возможно, более простую настройку с MATRIX Core).

Это именно тот код, который вы связали; доступ к микрофонным входам через модули ядра на C++!

So:

Вопрос 1. Можно ли как-то получить информацию об устройстве микрофонов Matrix?

Я был бы удивлен, если бы вы могли получить доступ к информации об устройстве каждого микрофона по отдельности, ЕСЛИ HAL не поддерживает это (хотя после просмотра я ничего не увидел в документации).

Вопрос 2. Поскольку я не могу получить идентификатор устройства ввода, и я все еще хочу использовать буферы для передачи данных, полученных от микрофонов, в качестве входного потока (я могу поместить весь сигнал, полученный микрофонами, в 2D-буфер, код) , что я могу сделать, чтобы реализовать сбор и воспроизведение звука в реальном времени?

Настройка аудиовыхода для portaudio — очень распространенная задача, поэтому я уверен, что вы найдете много примеров в Интернете о том, как это сделать. Для начала этот исходный код включен в загрузку portaudio для воспроизведения с плавающей запятой данные (синусоиду) через выбранный выход portaudio.

Однако в режиме реального времени общий метод заключается в написании функции обратного вызова, которая когда устройство вывода звука будет готово к большему количеству звука, оно запустит функцию обратного вызова, чтобы вернуть следующий буфер звука. Дополнительные примеры можно найти в папке примеров portaudio (например, paex_fuzz.c программа).

В этой функции обратного вызова вы можете выполнять любую обработку DSP и настраивать сигнал по своему усмотрению.

ОБРАТИТЕ ВНИМАНИЕ: функция обратного вызова portaudio может быть вызвана на уровне прерывания и будет очень быстро искать новые входные блоки, поэтому я не уверен, насколько жизнеспособна отправка аудио в portaudio, как это (без чрезмерной буферизации) . Но не видел другого пути, поддерживаемого HAL.

Я не уверен, что вы собираетесь делать с мгновенным воспроизведением (кроме звука в реальном времени через формирование луча, чтобы вы могли слышать то, что слышит Alexa/Google Home?), и я полагаю, что это устройство не предназначено для этой цели, но я надеюсь, что это может помочь!

person WoodyDev    schedule 22.06.2018
comment
micarray_recorder_direct.cpp — это файл, который я пытаюсь использовать для получения аудиосигнала. И я хочу использовать буфер, который загружается с помощью mics.read(). Поскольку я хочу иметь бесконечную потоковую передачу в реальном времени, где мне разместить буфер? (Внутри основной функции и передать буфер обратному вызову? Или прочитать микрофоны внутри функции обратного вызова?) В примере paex_sine.c под portaudio кажется, что они генерируют данные в основном и передают данные внутри обратного вызова, а функция обратного вызова работает только с тем, как передать левый и правый сигнал. - person Arlene Fu; 22.06.2018