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»

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

Mikrotik: multicast в wireless-сетях

Mikrotik-RB951G-2HnDКратко: если у вас роутер mikrotik и вы хотите использовать udp-multicast в беспроводной сети, то надо включить опцию multicast helper в настройках интерфейса. Если этого не сделать, то пакеты будут теряться. А дальше мы посмотрим как можно диагностировать подобную ситуацию.

Обновил я свой роутер до mikrotik (оказалась очень удобная штука). В моей локальной сети для всяких разных iot был настроен zeroconfig по собственному мануалу. И тут что-то пошло не так.

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

Мы можем эту итуацию наблюдать на скриншоте wireshark ниже.wireshark.pngРассмотрим на примере хоста diskstation.local.

На нем я смотрел в tcpdump и видел, что ответ есть.

# tcpdump port mdns
...
18:04:29.405838 IP6 fe80::e3de:bf6f:105e:ad4d.mdns > ff02::fb.mdns: 0 [2q] A (QM)? diskstation.local. AAAA (QM)? diskstation.local. (41)
18:04:29.405885 IP 192.168.88.252.mdns > 224.0.0.251.mdns: 0 [2q] A (QM)? diskstation.local. AAAA (QM)? diskstation.local. (41)
18:04:29.406152 IP6 fe80::211:32ff:fe80:3eb5.mdns > ff02::fb.mdns: 0*- [0q] 1/0/0 (Cache flush) AAAA fe80::211:32ff:fe80:3eb5 (57)
18:04:29.406388 IP diskstation.lan.mdns > 224.0.0.251.mdns: 0*- [0q] 2/0/0 (Cache flush) AAAA fe80::211:32ff:fe80:3eb5, (Cache flush) A 192.168.88.250 (73)

Интернеты не смотгли дать вразумительного ответа почему так происходит. Была лишь одна зацепка — это разбор проблем с вещанием iptv. И именно там я встретил заметку о том, что гоже было бы включить multicast helper в настройках интерфейса wifi (предварительно нажать advanced settings).

wifi-config.png