Имитировать микрофон (виртуальный микрофон)

У меня проблема, когда мне нужно "имитировать" выход микрофона.

Данные будут поступать по сети, декодироваться в PCM и в основном должны быть записаны в микрофон, который затем другие программы могут читать/записывать/независимо.

Я читал на alsa, но информация довольно скудная. Файловый плагин кажется многообещающим - я думал о том, что именованный канал "infile", который я мог бы затем доставить данные из своего приложения. Я не могу заставить его работать (vlc/audacity просто segfault).

pcm.testing {
  type file
  slave {
    pcm {
      type hw
      card 0
      device 0
    }
  }
  infile "/dev/urandom"
  format "raw"
}

Есть ли лучшие способы сделать это? Любые предложения по плагинам alsa (в частности, файловый плагин)?

Ответ 1

Ваш звук будет передаваться по сети и что будет кэшировать его, пока что-то не захочет читать? Или данные будут отброшены? В общем, что-то вроде ниже (только тестировалось) должно работать как виртуальный микрофон, но я думаю, что он всегда будет читать файл с начала, когда устройство откроется, и вам нужно проверить, как он обрабатывает конец файла. Возможно, вы попытаетесь использовать его с помощью труб, но затем кэширование/отбрасывание входящих данных должно выполняться при чтении приложения из сети.

pcm.virtmic {
    type file
    format "raw"
    slave.pcm "default"
    file '/dev/null'
    infile '/dev/urandom'
}

Подробнее см. alsa docs.

Опять же, не уверен, что этот инструмент вам действительно нужен. Было бы очень удобно, если бы вы могли начать команду с опцией "infile", как вы можете с "файлом", но, к сожалению, вы не можете...

Надеюсь, что это поможет.

UPDATE: slave.pcm не должно быть "null", а некоторое реальное устройство. Кажется, что используется для синхронизации, или я не знаю, но использование null приводит к тому, что процесс рекордера блокируется навсегда. Это устройство может заставить вас с определенной частотой дискретизации, но будьте осторожны. Использование "по умолчанию" является нормальным значением по умолчанию. infile необходимо предоставить необработанные звуковые данные с правильным/совпадающим форматом и скоростью. Кстати, вы можете посмотреть сервер alsa и jackd и другие звуковые системы и библиотеки для альтернативных решений для своей задачи.