PulseAudio: Перенаправление потоков аля jackd

Что мы хотим? Мы хотим подмешать к микрофонному сигналу еще что-то. Например дополнительный сигнал с другой звуковой карты для того, чтобы по скайпу с кем-то поджемить на гитаре\ударке.

В jackd это сделать довольно просто — там куча графических роутеров. Но что делать если надо подмешать сигнал в pulse?

Возьмем самый простой пример: нужно подмешать к звуку микрофона аудио из браузера.

mic -> skype <- ff

Просто так это работать не будет. Потребуется виртуальное loopback-устройство, которое будет смешивать сигналы, а после остальное по будет использовать его как микрофон.

       skype
^
|
mic -> loopback <- ff

1 — Создаем устройство

Создаем само устройство и задаем ему описание чтобы в панели управления бло что-то вразумительное, а не «Пустой выход».

$ pacmd load-module module-null-sink sink_name=fx-sink
42
$ pacmd update-sink-proplist fx-sink device.description=Виртуальный_микрофон_вход
$ pacmd update-source-proplist fx-sink.monitor device.description=Виртуальный_микрофон_выход

Цифру, которая выдает первая команда можно запомнить. Это идентификатор, по которому можно sink удалить.

2 — Перенаправляем микрофонный выход на это устройство

$ pactl load-module module-loopback source=alsa_input sink=fx-sink
43

Номер так же можно запомнить чтобы потом удалить ассоциацию.

Теперь в качестве устройства для ввода в панели управления (ставим как дефолтный девайс) или в программе выбираем fx-sink.monitor. Он будет называться «Виртуальный_микрофон_выход» (выше мы прописали в описании).

Чтобы посмотреть что писать в аргументе source просматриваем вывод команды

$ pactl list-sinks

Тут нам нужно найти содержимое поля name системного микрофона.

Источники:

Jackd: Измеряем задержку аудио сигнала в цепочке обработки

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

Но что на самом деле означает эта задержка? Это лишь время, которое будет затрачено на обработку сигнала после поступления его в роутер (в моем случае в роли роутера выступает jackd).

А как измерить полную задержку вместе со временем на обработку и перевод сигнала в аналог?

jack_iodelay — утилита генерирует тестовый сигнал, который можно направить в роутере куда угодно, потом вернуть на вход этой же утилиты и посмотреть в консоли что получится.

Для измерения нам потребуется небольшой патч чтобы соединить один из входов интерфейса с выходом.

После этого запускаем утилиту, коммутируем нужный вход и выход в роутере и смотрим на результат в консоли.

Общая задержка составляет в среднем 820 фреймов. Чтобы узнать задержку в миллисекундах делим это число на частоту семплирования. (96кГц). Это 8,5мс.

Поле extra loopback latency содержит лаг, который был вызван ЦАП’ом и АЦП.

Задержка зависит и от настроек джека. От количества семплов и периодов на буфер

Для текущего теста 2 периода на буфер и 128 сэмплов. Итого 384. И ~430 фреймов — это задержка на железе. В сумме и получается ~820.

Можно пользоваться опциям -I и -O. Они отдельно позволяют посмотреть задержку по входу и выходу сигнала.

Linux: Настраиваем МФУ pantum

Есть такие новые китайские принтеры (относительноо новые) Pantum. В них и wifi, и поддержка linux из коробки. Достал я и себе такое чудо платы лутом делать и шаблоны для фоторезиста печатать.

Настроить wifi в принтере (если он есть) без смартфона не получится — лезем туда и делаем все по инструкции (она с картинками).

Теперь надо поставить драйвера и настроить сканирование и печать по wifi. Если у вас убунту или дебиан, то драйвера скачиваются и устанавливаются в виде пакета. Если федора, то придется немного покомпилировать.

Продолжить чтение «Linux: Настраиваем МФУ pantum»

Ошибка юнита systemd-modules-load.service

2020-04-28-22:47:01_select

Ошибка юнита systemd-modules-load.service

Видели такое при старте системы и не можете понять в чем причина?

А приина в secureboot. Один из модулей ядра у вас не имеет цифровой подписи.

Чаще всего это происходит с модулями, которые собираются через akmod. Среди них virtualbox и nvidia (вроде amd тоже, но у меня нет возможности проверить). В последних релизах федоры что-то сломали и модули больше не подписываются при сборке.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT.

И что делать? Можно отключить secureboot?

Можно, но не нужно. Будете страдать от сообщения о несекурной загрузке.

  1. Создаем собственный ключ для подписи модулей и каталог, в котором это будет жить.
# mkdir /root/module-signing
# cd /root/module-signing
# openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=YOUR_NAME/"
# chmod 600 MOK.priv
  1. Регистрируем ключ в системе при помощи mokutils. Нам потребуется задать простой одноразовый пароль, который у нас спросят при перезагрузке.
# mokutil --import /root/module-signing/MOK.der
input password:
input password again:
  1. Перезагружаемся. Выбираем Enroll MOK. После выбираем единственный ключ и вводим пароль из шага выше.
  2. Пишем скрипт для подписания модулей. Помимо виртуалбокса туда можно добавить нужные вам записи.
#!/bin/bash

for modfile in $(dirname $(modinfo -n vboxdrv))/*.ko; do
  echo "Signing $modfile"
  /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 \
                                /root/module-signing/MOK.priv \
                                /root/module-signing/MOK.der "$modfile"
done
  1. После обновления ядра\модуля\компонента запускаем скрипт выше, а потом перезагружаем модули.
# ./root/module-signing/sign-vbox-modules
Signing /lib/modules/5.6.6-200.fc31.x86_64/extra/VirtualBox/vboxdrv.ko
Signing /lib/modules/5.6.6-200.fc31.x86_64/extra/VirtualBox/vboxnetadp.ko
Signing /lib/modules/5.6.6-200.fc31.x86_64/extra/VirtualBox/vboxnetflt.ko
# systemctl restart systemd-modules-load.service

Источник

Python: Чем плох datetime.replace?

часыПоговорим сегодня про даты и часовые пояса. А именно о том, почему не стоит использовать datetime.replace совместно с таймзонами из pytz если вы не уверены (вообще не стоит).

Конечно все с оговорками. Иногда так надо. Но все равно не стоит так делать.

Продолжить чтение «Python: Чем плох datetime.replace?»

Linux: Обрабатываем RAW-изображения

resize_resultМы не будем говорить о том, как правильно\неправильно обрабатывать raw’ки. Мы поговорим об инструментах (конечно же консольных), которые можно применять для конвертирования, склейки и других операций.

Фото на превью — это то, что удалось вытащить из raw (конечно же оно пожатое в джипег и отресайзено для публикации).

Продолжить чтение «Linux: Обрабатываем RAW-изображения»

Linux: Избавляемся от файловых ассоциаций WINE

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

$ rm -f ~/.local/share/applications/mimeinfo.cache
$ rm -f ~/.local/share/mime/packages/x-wine*
$ rm -f ~/.local/share/mime/application/x-wine-extension-*
$ update-desktop-database ~/.local/share/applications

OpenWRT: Настройка после установки

openwrt Небольшой скетч про послеустановочную настройку OpenWRT.

Настройка флешки как overlayfs

Большинство роутеров имеют у себя usb-порт куда можно воткнуть флешку и использовать ее для swap-файла (вдруг что) и для overlayfs. https://wiki.openwrt.org/ru/doc/howto/extroot

Настройка dropbear

/etc/config/dropbear

config dropbear
     option PasswordAuth 'on'
     option RootPasswordAuth 'on'
     option Port         '22'
     # option BannerFile   '/etc/banner'
     option Interface 'lan'

Выставляем ssh только в lan-интерфейс

https://wiki.openwrt.org/doc/howto/secure.access

Добавление пользователя

# opkg update
# opkg install shadow-usermod shadow-useradd shadow-groupadd
# mkdir /home
# useradd -m -s /bin/ash penguin
# passwd penguin
# opkg update
# opkg install sudo
# groupadd --system sudo
# usermod -a -G sudo penguin
# visudo

Добавляем строки, которые позволяют группе sudo использовать sudo

%sudo ALL=(ALL) ALL

Настройка dropbear для запрета доступа root

На локальной машине

$ ssh-copy-id 

На сервере в конфиге dropbear

     option PasswordAuth 'off'
     option RootPasswordAuth 'off'

Предварительно убеждаемся что ключи работают. Иначе останетесь без доступа.

Изменение размера vmdk-диска

Диски vmdk не поддерживают простое изменение размера. Нужно сначала конверировать в vdi, изменять размер и конвертировать обратно.

Опция размера передается в мегабайтах

$ VBoxManage clonehd "source.vmdk" "cloned.vdi" --format vdi
$ VBoxManage modifyhd "cloned.vdi" --resize 51200
$ VBoxManage clonehd "cloned.vdi" "resized.vmdk" --format vmdk

Linux: XScreenSaver не гасит подсветку монитора

xscreensaver-settings-1Начиная с какого-то обновления системы у меня перестал выключаться монитор. Xscreensaver настроен в режим «только пустой экран» и на вкладке энергосбережения выставлен флажок «быстрое отключение питания в режиме пустого экрана».

Никакими комбинациями опций нельзя было заставить его гаснуть нормально.

xscreensaver-settings-2.png

Вдобавок к этому я использую xss-lock чтобы при открытии крышки не было момента когда выдно содержимое экрана. Подробнее можно почитать в похожем багрепорте для gnome-screensaver (проблема имеет одни и те же корни у всех вариаций скринсейверов).

Проблема выглядит так:

  • если активировать блокировку через консоль
    xscreensaver-command -lock

    то все работает как надо и экран гаснет;

  • если активировать блокировку через хоткеи lxde, то после активации на долю секунды виден рабочий стол и после этого черный экран с активной подсветкой.

Конечно же надо читать логи.

Прибиваем активного хранителя и стартуем verbose-mode.

$ killall xscreensaver
$ xscreensaver -no-splash -v

После этого можно пытаться заблокировать экран из консоли и с клавиатуры. Смотрим.

Блокировка с консоли

xscreensaver: 20:03:18: LOCK ClientMessage received; activating and locking.
xscreensaver: 20:03:19: 0: locked mode switching.
xscreensaver: 20:03:19: user is idle (ClientMessage)
xscreensaver: 20:03:19: blanking screen at Fri May  3 20:03:19 2019.
xscreensaver: 20:03:19: mouse is on screen 1 of 2
xscreensaver: 20:03:19: 1: grabbing keyboard on 0x16a... GrabSuccess.
xscreensaver: 20:03:19: 1: grabbing mouse on 0x16a... GrabSuccess.
xscreensaver: 20:03:19: LOCK ClientMessage received while already locked.
xscreensaver: 20:03:33: user is active (keyboard activity)
xscreensaver: 20:03:33: pam_start ("xscreensaver", "penguin", ...) ==> 0 (Succes
s)
...

Блокировка с хоткея

xscreensaver: 20:01:46: LOCK ClientMessage received; activating and locking.
xscreensaver: 20:01:46: 0: locked mode switching.
xscreensaver: 20:01:46: user is idle (ClientMessage)
xscreensaver: 20:01:46: blanking screen at Fri May  3 20:01:46 2019.
xscreensaver: 20:01:46: mouse is on screen 1 of 2
xscreensaver: 20:01:46: 1: grabbing keyboard on 0x16a... GrabSuccess.
xscreensaver: 20:01:46: 1: grabbing mouse on 0x16a... GrabSuccess.
xscreensaver: 20:01:48: DPMSForceLevel(dpy, DPMSModeOff) did not change monitor power state.
xscreensaver: 20:01:48: LOCK ClientMessage received while already locked.
xscreensaver: 20:02:05: user is active (keyboard activity)
xscreensaver: 20:02:05: pam_start ("xscreensaver", "penguin", ...) ==> 0 (Success)
...

Ага. Во втором случае у нас почему-то не смог выключиться монитор.

В интернетах ответа я не нашел, но предполагается, что хоткей передается дальше в активированный скринсейвер.

Поэтому я просто модифицировал команду, которую вызываю с клавиатуры добавив sleep 0.1. Это помогло. Вероятно значение слипа вам придется выбрать самостоятельно. На одной из машин этот фикс у меня сработал только при задержке в 0.5.

lxde-hotkey.png