PulseAudio на Debian 9: Как настроить уровень громкости звука по умолчанию?

Символ, заканчивающийся на .part - это настоящий символ функции, а не какое-то украшение функции. Более точно, функция, заканчивающаяся на .part - это функция, сгенерированная GCC из большей функции.

Иногда GCC считает, что некоторая часть потока управления большой функции может быть легко инлайнирована, но что инлайнинг всей большой функции не подходит. Поэтому он разделяет функцию, чтобы поместить большую часть в свою собственную функцию, которая получает в качестве имени оригинальное имя функции плюс .part + .<какое-то число>, а остальное инлайнит в другие функции.

Это часть оптимизации, описанной в исходном коде GCC, в gcc/ipa-split.c. По крайней мере, в gcc-4.8.3 (и, возможно, в более поздних версиях, я не могу проверить сейчас), там говорится:

/* Целью этого прохода является разделение тел функций, чтобы улучшить
 инлайнинга. Т.е. для функции вида:

 func (...)
 {
 if (cheap_test)
 что-то_маленькое
 иначе
 что-то_большое
 }

 Производить:

 func.part (...)
 {
 что-то_большое
 }

 func (...)
 {
 if (cheap_test)
 что-то_маленькое
 else
 func.part (...);
 }

 Когда func становится инлайнируемым и когда cheap_test часто истинен, инлайнинг func,
 но не fund.part приводит к улучшению производительности, аналогичному инлайнингу
 оригинальной func, а рост объема кода меньше.

 Проход состоит из трех этапов:
 1) Сбор локальной информации о базовом блоке в структуру BB_INFO и
 вычисление размера и времени тела функции.
 2) С помощью DFS-шага находим все возможные базовые блоки, которые мы можем разбить на части
 и выбираем лучший.
 3) Если точка разделения найдена, разделить на указанном BB путем создания клона
 и обновить функцию для его вызова. 

 Решения о том, какие функции разделить, принимаются в функциях execute_split_functions
 и consider_split. 

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

 1) Разделение для разбиения больших функций
 2) Разделение для уменьшения использования фрейма стека
 3) Разрешить разделенной части функции использовать значения, вычисленные в заголовочной части.
 Значения должны быть переданы в разделенную функцию, возможно, через тот же
 интерфейс, как для вложенных функций, или как аргумент.
 4) Поддержка простой рематериализации. Т.е. когда разделенная часть использует
 значение, вычисленное в заголовке из параметра функции очень дешевым способом, мы можем
 можем просто пересчитать его.
 5) Поддержка расщепления вложенных функций.
 6) Поддерживать аргументы не-SSA. 
 7) Ничто не мешает нам производить несколько частей одной функции
 когда это необходимо, или расщеплять также части. */

Как вы уже догадались, этот процесс полностью контролируется компилятором. Новое имя символа производится функцией clone_function_name в gcc/cgraphclones.c. Число, добавленное после .part, не имеет особого значения, оно используется только для предотвращения столкновений имен. Это простой счетчик, который увеличивается каждый раз, когда GCC создает новую функцию из некоторой существующей (то, что разработчики GCC называют "клоном").

Вы можете использовать опцию -fdisable-ipa-fnsplit, чтобы запретить компилятору применять эту оптимизацию, или -fenable-ipa-fnsplit, чтобы включить ее. По умолчанию она применяется на уровнях оптимизации -O2 и -O3 и отключена в противном случае.

0
21.08.2018, 23:55
2 ответа

Выполнить

pactl set-sink-volume @DEFAULT_SINK@ 30%
Команда

как автозапуск.

В другую сторону:

echo 'set-sink-volume @DEFAULT_SINK@ 20000' >> ~/.config/pulse/default.pa
3
28.01.2020, 02:23

скопировать файл конфигурации Pulseaudio в домашнюю папку

cp /etc/pulse/daemon.conf ~/.config/pulse/daemon.conf

добавьте эту строку, чтобы отключить Pulseaudio, сбросить уровень звука до 100%

echo 'flat-volumes = no' >> ~/.config/pulse/daemon.conf

перезапустить Pulseaudio/выйти из системы/перезагрузить компьютер для загрузки новых настроек

0
28.01.2020, 02:23

Теги

Похожие вопросы