- Вопрос или проблема
- Использование :
- Предварительные условия :
- Играя со скриптом
- Ответ или решение
- Как управлять эквалайзером PulseAudio через командную строку
- 1. Настройка PulseAudio для работы с эквалайзером
- 2. Использование адаптированного Python-скрипта
- 3. Пример настройки эквалайзера через конфигурационные файлы
- Заключение
Вопрос или проблема
Таким образом, Pulseaudio имеет встроенный эквалайзер, загруженный с помощью
module-equalizer-sink
Согласно http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Equalizer, вы можете управлять им с помощью графического интерфейса qpaeq.
Существует ли способ настроить эквалайзер PA на системе без X (работающей в режиме сессии)?
Вот скрипт, адаптированный от qpaeq
, который идет в комплекте с Pulseaudio:
#!/usr/bin/env python
# pulse-set-eq
import os,math,sys
import dbus
# Исходный код адаптирован из utils/qpaeq Pulseaudio
def connect(): # скопировано из qpaeq
try:
if 'PULSE_DBUS_SERVER' in os.environ:
address = os.environ['PULSE_DBUS_SERVER']
else:
bus = dbus.SessionBus() # Должен быть UserBus, но D-Bus пока это не реализует.
server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface="org.freedesktop.DBus.Properties")
return dbus.connection.Connection(address)
except Exception as e:
sys.stderr.write('Произошла ошибка при подключении к pulseaudio, '
'пожалуйста, убедитесь, что модуль dbus '
'pulseaudio загружен, выход...\n')
sys.exit(-1)
def get_sink(str):
connection=connect()
path="/org/pulseaudio/core1/sink%s"%str
sink=connection.get_object(object_path=path)
return sink
args = sys.argv[1:]
if len(args)<5:
print("Использование: "+sys.argv[0]+" SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2...]")
sys.exit()
sinknum = args.pop(0);
sink = get_sink(sinknum);
prop_iface="org.freedesktop.DBus.Properties"
eq_iface="org.PulseAudio.Ext.Equalizing1.Equalizer"
sink_props=dbus.Interface(sink,dbus_interface=prop_iface)
def get_eq_attr(attr):
return sink_props.Get(eq_iface,attr)
sample_rate=get_eq_attr('SampleRate')
filter_rate=get_eq_attr('FilterSampleRate')
nchannels=get_eq_attr('NChannels')
sys.stderr.write('каналы %d, частота дискретизации: %f, частота дискретизации фильтра: %f\n'%
(nchannels, sample_rate, filter_rate))
channel = int(args.pop(0));
preamp = float(args.pop(0));
freqs = [];
coeffs = [];
while len(args) > 0:
if len(args)==1:
sys.stderr.write('Нечетное число аргументов частоты/усиления (%d)\n'%(len(freqs)*2+1))
sys.exit(-1)
sys.stderr.write('(%s, %s)\n'%(args[0],args[1]))
freqs.append(float(args.pop(0)))
coeffs.append(float(args.pop(0)))
#sys.stderr.write("freqs: "+str(freqs)+'\n');
freqs = list([int(round(x*filter_rate/sample_rate)) for x in freqs])
#sys.stderr.write("переведенные частоты: "+str(freqs)+'\n');
freqs = [0]+freqs+[filter_rate//2];
coeffs = [coeffs[0]]+coeffs+[coeffs[-1]];
#sys.stderr.write("корректные частоты: "+str(freqs)+'\n');
# по какой-то причине это исправляет типы аргументов для SeedFilter
sink=dbus.Interface(sink,dbus_interface=eq_iface)
# установить коэффициенты фильтра
sink.SeedFilter(channel,freqs,coeffs,preamp)
Использование :
Получите номер выхода с помощью pacmd list-sinks
, затем
./pulse-set-eq SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2 …]
Обратите внимание, что CHANNEL_NUM 0 будет соответствовать первому каналу, 1 – второму и т.д., и если вы используете фактическое количество каналов (например, 2, если у вас два канала), это установит эквализацию для всех каналов.
Вы можете проверить примененные настройки в любое время, используя qpaeq
.
Предварительные условия :
Обратите внимание, что сначала вам нужно загрузить модуль эквалайзера, а также модуль протокола DBus:
pactl load-module module-dbus-protocol
pactl load-module module-equalizer-sink sink_name=... sink_master=...
pactl set-default-sink ...
Играя со скриптом
Затем создайте немного шума или музыки или чего-то еще:
play -n synth pinknoise gain -10
Затем вызовите скрипт с номером выхода, индексом канала, к которому вы хотите применить эквалайзер, коэффициентом предварительного усиления (масштабирования) и списком пар (частота, коэффициент). Список частот не обязательно должен быть плотным, поскольку он интерполируется (см. seed_filter
в pulseaudio/src/modules/module-equalizer-sink.c
), чтобы получить коэффициенты фильтра. Если вы укажете общее количество каналов как индекс канала, то обновление будет применяться ко всем каналам. Используйте pacmd list-sinks
, чтобы получить номер выхода.
Например, если номер выхода это $SINKNUM и у него 2 канала, то это сбросит эквалайзер на все 1, как вы можете убедиться, открыв qpaeq
:
./pulse-set-eq $SINKNUM 2 1.0 100 1.0
Здесь 100 Гц произвольно; список не должен быть пустым и не может начинаться с нуля. Частоты должны быть между 0 и 32768 (максимум для меня, не уверен, можно ли его настроить, смотрите переменную filter_rate
выше – это половина от этого). Скрипт использует коэффициенты усиления наименьших и наибольших частот, указанных в командной строке, для частот ниже и выше этих соответственно, так что в этом случае весь спектр получит коэффициент усиления 1.0. При таких настройках эквалайзер не изменит сигнал (по крайней мере, в теории).
Будьте осторожны, чтобы не повредить свои колонки, но, например, вы можете поэкспериментировать, создавая розовый шум и устанавливая эквалайзер на пик (с 100-кратным усилением) на одной частоте (500 Гц):
./pulse-set-eq $SINKNUM 2 1.0 499 0 500 100 501 0
Когда я это делаю, я слышу дискретное последовательность тонов разной громкости, все на 500 Гц, которые, как я предполагаю, принадлежат последовательным окнам DFT в реализации фильтра. Это довольно приятно. Играет музыка через этот фильтр забавно. Такой резкий “полосовой фильтр” не был бы возможен с использованием нормального графического эквалайзера без версии командной строки.
Следующий пример создает фильтр, который поднимается и опускается по частоте, немного похоже на сирену. Очевидно, вы должны иметь какую-то музыку или шум или что-то еще, чтобы услышать эффект.
SINKNUM=12; NCHAN=2;
while true; do
for i in $(seq 500 10 1500) $(seq 1500 -10 500); do
./pulse-set-eq $SINKNUM $NCHAN 1 \
0 1 $(( $i - 300 )) 1 \
$i 5 $(( $i + 300 )) 1 \
32768 1;
done;
done
Эквалайзер pulseaudio считывает свои настройки из пользовательского файла ~/.config/pulse/equalizerrc
Чтобы отобразить его:
cat ~/.config/pulse/equalizerrc
Таким образом, например, чтобы задать значение 10DB на 5-й полосе эквалайзера и напрямую услышать изменение:
sed -i '19s/.*/10.0/' ~/.config/pulse/equalizerrc | pulseaudio-equalizer toggle
Чтобы разъяснить еще раз, sed заменит все строки с номером 19 на 10.0 в конфигурационном файле, затем эквалайзер перезапускается/переключается, чтобы получить результат.
Ответ в том, что вы не можете сделать это с простыми командными командами.
Вы можете сделать это с чем-то более сложным, например:
$ pactl load-module module-ladspa-sink sink_name=FonsParamEQ master=alsa_output.pci-0000_03_06.0.analog-stereo plugin=filters label=Parametric1 control=1,0,1,49,0.5,3,1,1000,0.5,2,1,10000,0.5,3,1,13500,0.5,-12
Я не знаю, как это работает; Я упоминаю это как ссылку для дальнейшего исследования.
Python-скрипт работает.
С помощью “qpaeq” вы найдете “~/.config/pulse/equalizer-presets.tdb”, который является “Samba Trivial DB”, который можно просмотреть с помощью tdb-tool, как комментировалось.
Файл, упоминаемый как “~/.config/pulse/equalizerrc”, принадлежит другой программе “pulseaudio-equalizer”; это другое приложение, которое для меня намного лучше.
Я полагаю, что команда это pacmd
.
EDIT:
Если вы перейдете по адресу:
/usr/share/pulseaudio/alsa-mixer/profile-sets
Вы найдете несколько конфигурационных файлов. Вы можете попробовать отредактировать default.conf
.
Ответ или решение
Как управлять эквалайзером PulseAudio через командную строку
Управление эквалайзером PulseAudio из командной строки может быть эффективным решением для систем без графического интерфейса. PulseAudio предоставляет встроенный эквалайзер через модуль module-equalizer-sink
. Расправа с эквалайзером в условиях работы на бездисплейных системах возможно с использованием командных инструментов и адаптированных скриптов.
В данной статье мы рассмотрим, как настроить эквалайзер и управлять его параметрами через командную строку.
1. Настройка PulseAudio для работы с эквалайзером
Перед началом работы убедитесь, что модули module-equalizer-sink
и module-dbus-protocol
загружены. Для этого выполните следующие команды в терминале:
pactl load-module module-dbus-protocol
pactl load-module module-equalizer-sink sink_name=MyEqSink sink_master=alsa_output.pci-0000_03_06.0.analog-stereo
pactl set-default-sink MyEqSink
Замените alsa_output.pci-0000_03_06.0.analog-stereo
на нужный вам выходной аудиосигнал, который можно узнать с помощью команды pacmd list-sinks
.
2. Использование адаптированного Python-скрипта
Для управления эквалайзером из командной строки можно использовать следующий Python-скрипт, который предоставляет интерфейс для настройки параметров эквалайзера:
#!/usr/bin/env python
import os
import sys
import dbus
def connect():
try:
if 'PULSE_DBUS_SERVER' in os.environ:
address = os.environ['PULSE_DBUS_SERVER']
else:
bus = dbus.SessionBus()
server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface="org.freedesktop.DBus.Properties")
return dbus.connection.Connection(address)
except Exception as e:
sys.stderr.write('Не удалось подключиться к PulseAudio: {}\n'.format(e))
sys.exit(-1)
def get_sink(sink_num):
connection = connect()
path = "/org/pulseaudio/core1/sink{}".format(sink_num)
sink = connection.get_object(object_path=path)
return sink
# Далее следует основной код для обработки параметров и установки значений эквалайзера...
2.1 Пример работы со скриптом
Для использования скрипта выполните следующие шаги:
-
Сначала получите номер выхода с помощью команды:
pacmd list-sinks
-
Запустите скрипт с параметрами. Синтаксис:
./pulse-set-eq SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2 ...]
Пример команды, устанавливающей эквалайзер:
./pulse-set-eq 0 2 1.0 100 1.0
3. Пример настройки эквалайзера через конфигурационные файлы
Эквалайзер тоже можно настраивать напрямую, изменяя его конфигурации в файлах. Для этого откройте файл ~/.config/pulse/equalizerrc
и измените нужные параметры. Например, чтобы установить значение 10 дБ на пятой полосе эквалайзера, выполните следующую команду:
sed -i '19s/.*/10.0/' ~/.config/pulse/equalizerrc
pulseaudio-equalizer toggle
Эта команда обновит соответствующую строку файла конфигурации и перезапустит эквалайзер, чтобы изменения вступили в силу.
Заключение
Все вышеописанные методы дают возможность управлять эквалайзером PulseAudio через терминал, что особенно полезно в средах без графического интерфейса. Выбор метода зависит от ваших потребностей и предпочтений. Изучите представленный функционал, чтобы добиться оптимального звучания вашей аудиосистемы.