Сохранение/восстановление настроек alsa между перезагрузками


Anonymous - Posted on 16 Февраль 2016

Данный скрипт считывает настройки звуковых карт доступных через звуковую систему alsa и сохраняет эти настройки в файлах. Причина почему пришлось городить такое решение проста, linux не всегда запоминает настройки звуковых устройств, после перезагрузки часто происходит сброс не понятно по какому принципу. А потому было решено написать скрипт, который решает проблему восстановления нужных настроек звуковых систем и решает эту проблему достаточно быстро.

Данный скрипт считывает настройки звуковых карт доступных через звуковую систему alsa и сохраняет эти настройки в файлах. Имя файла формируется из шаблона префикса, например "alsa_" и номера карты в системе alsa "hw".

Надо отметить, что есть звуковых карт много (4, 5) и они одинаковы (одинаков например чип), может случится так, что номера hw будут иногда меняться местами. Если звуковые карты и в принципе звуковое оборудование все разное и специфичное - номера поменяются только если менять оборудование, например добавлять или убирать звуковые карты или звуковое оборудование.

Рекомендуется добавить скрипт в $HOME/bin с именем amixer_swap и дать скрипту права на запуск

$ chmod +x ~/bin/amixer_swap

. При запуске без аргументов скрипт сообщит, что нужно вводить параметры read или set. Соответственно - read это читать настройки, set это применить настройки из сохраненных файлов. При выполнении скрипта с аргументом read старые файлы настроек будут переписаны новыми.

Принцип работы со скриптом может быть и такой - сделать настройки звуковых систем как нравится, после применить скрипт с аргументом read, после чего применить запускать скрипт с аргументом set после запуска системы, запускать вручную или автоматически.

#!/bin/bash -
 
FILE_SAVE_TEMPLATE="alsa_"
 
read_params() {
    local number_card=$1
    local numidlist=$(amixer -D hw:"$number_card" controls | awk --re-interval 'BEGIN{FS=","}{print $1}')
    local numarray=($numidlist)
    local params=()
 
    for key in "${numarray[@]}"
    do
        value=$(amixer -D hw:"$number_card" cget $key | awk --re-interval 'BEGIN {FS=": values="}/: values/ {print $2}')
        if [[ $value =~ ^[0-9]{1,3},[0-9]{1,3}|^[0-9]{1,3}|on,on|off,off|on|off ]]
        then
            params[$key]="$value"
        fi
    done
 
    if [[ -f "$FILE_SAVE_TEMPLATE""$number_card" ]]
    then
        rm "$FILE_SAVE_TEMPLATE""$number_card"
    fi
 
    for i in ${!params[@]}
    do
        printf "$i:${params[$i]}\n" >> "$FILE_SAVE_TEMPLATE""$number_card"
    done
}
 
set_params () {
    local number_card=$1
    local params=($(cat "$FILE_SAVE_TEMPLATE""$number_card"))
    for i in "${params[@]}"
    do
        key=$(printf "$i" | awk --re-interval 'BEGIN { FS=":" } { print $1 }')
        value=$(printf "$i" | awk --re-interval 'BEGIN { FS=":" } { print $2 }')
        if [[ $value =~ ^[0-9]{1,3},[0-9]{1,3}|^[0-9]{1,3}|on,on|off,off|on|off ]]
        then
            amixer -D hw:"$number_card" cset numid=$key $value 1>/dev/null 2>/dev/null
        fi
    done
}
 
case "$1" in
    read)
        for i in $(awk --re-interval "/^.[0-9]{1,2}/"'{print $1}' /proc/asound/cards | xargs)
        do
            read_params $i
        done
        ;;
    set)
        for i in $(awk --re-interval "/^.[0-9]{1,2}/"'{print $1}' /proc/asound/cards | xargs)
        do
            set_params $i
        done
        ;;
    *)
        echo "read set"
        ;;
esac

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

0
Ваша оценка: Ничего

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.