pondělí 14. dubna 2014

Conky: Monitorování zvukového systému PulseAudio/ALSA

V článku PulseAudio a přehrávání hi-res zvuku na externím DAC FiiO E10 jsem slíbil, že se pochlubím i se svým skriptem pro monitorování zvukového systému v Conky, takže tady to je. Skript, který jsem nazval painfo, žere pár argumentů podle kterých vrací parametry tandemu PulseAudio/ALSA a to buď bez formátování, nebo s formátováním pro mé Conky. ...

To, co si nechávám v Conky zobrazovat, je vidět na úvodním obrázku. Na prvním řádku je vypsán právě aktivní výstup ALSA, včetně bitové hloubky převodníku a momentálně používané vzorkovací frekvence. To je info z kernelu. Pokud bude těch výstupů aktivních více (na mém systému jsou 3 zvukovky a PA je schopno posílat různé zdroje na různé výstupy), budou pod sebou všechny.
Pod čarou je výchozí zvuková karta PA, včetně aktuálních parametrů. Najdete tam v jakém se nachází stavu, hlasitost všech kanálů, aktuální latenci a aktuální (nebo poslední, pokud je neaktivní) parametry zvuku na mixeru. Na konci je výčet právě přehrávaných zdrojů na vstupu PA, včetně výstupních zařízení, na které jsou směrovány.

Tím jsem tedy pokryl mé konkrétní požadavky na informace o zvukovém systému, ze kterých vyčtu vše potřebné od vstupu po výstup.

painfo umí ještě vypsat všechny registrované zvukové karty v systému.

A samotný skript painfo vypadá následovně, obsahuje i nápovědu, takže pokud dostane neznámý, nebo žádný argument, napoví. Krom výše zmíněného umí ještě vypsat všechny registrované zvukové karty v systému.

painfo
#!/bin/bash

list_running_outputs() {
    egrep -r "rate:" /proc/asound/card*/pcm*p | sed 's/.*\(card[0-9]\/pcm[0-9]p\).* \([0-9]\+\) (.*/\1\n\2/'|\
        while read card; do
            id=$(cat /proc/asound/$card/info | sed -n '/^name:/s/name: \(.*\)/\1/p');
            format=$(awk '/^format/{print $2}' /proc/asound/$card/sub0/hw_params|sed 's/.*\([0-9]\{2\}\).*/\1/');
            read freq; freq=$(echo "$freq/1000"|bc);
            echo $id ${format}bit/${freq}kHz
        done
}

list_running_outputs_conky() {
    list_running_outputs | while read line; do [[ -z $l ]] && echo -n "Using: "; l=1; echo $line | sed 's/^/${alignr}/'; done
}

get_default_card_name() {
    pacmd list-sinks | sed -n '/*/,/alsa.name/s/.*alsa.name.*"\([^"]\+\).*/\1/p'
}

list_default_card_parameters() {
    pacmd list-sinks | sed -n '/*/,/sample spec:/p' |\
        sed -n '/state:\|[^ ]volume:\|current latency:\|sample spec:/p' |\
        sed 's/^\W*//; s/^./\u&/'
}

list_default_card_parameters_conky() {
    list_default_card_parameters | sed 's/: \| = /:${alignr}/'
}

list_cards() {
    cat /proc/asound/cards
}

list_cards_conky() {
    list_cards | sed -n '/[0-9]/s/\( [0-9]\).*: \(.*\)/Card \1:${alignr}\2/p'
}

list_input_streams() {
    pacmd list-sink-inputs |\
    sed -n 's/.*sink: \([0-9]\+\).*/\1/p; s/.*application.name = "\([^"]\+\)./\1/p'|\
    while read index; do
        name=$(pacmd list-sinks | sed -n "/index: $index/,/alsa.name/s/.*alsa.name = \"\([^\"]\+\).*/\1/p");
        read app; echo "$app - $name";
    done
}

list_input_streams_conky() {
        list_input_streams | sed -n 's/^/${alignr}/p' | grep '^' || echo '${alignr}none'
}

print_help() {
    exec 3>&1>&2
    echo "Usage: painfo [Option]"
    echo "Options:" 
    echo -e "\t list-cards (lc)"
    echo -e "\t list-input-streams (lis)"
    echo -e "\t list-running-outputs (lro)"
    echo -e "\t get-default-card (gdc)"
    echo -e "\t list-default-card-parameters (ldcp)"
    echo "For Conky formated output append '-conky' ('c') at the end of option string"
    exec >&3-
}

case $1 in
    list-running-outputs|lro)           list_running_outputs;;
    get-default-card|gdc)               get_default_card_name;;
    list-default-card-parameters|ldcp)  list_default_card_parameters;;
    list-cards|lc)                      list_cards;;
    list-input-streams|lis)             list_input_streams;;

    list-running-outputs-conky|lroc)    list_running_outputs_conky;;
    list-default-card-parameters-conky|ldcpc) list_default_card_parameters_conky;;
    list-cards-conky|lcc)               list_cards_conky;;
    list-input-streams-conky|lisc)      list_input_streams_conky;;
    *)                                  print_help;;
esac

Skript mám uložený v ~/bin, abych při jeho volání nemusel zadávat cestu, a volat ho lze s dlouhými, nebo zkrácenými parametry, jak je uvedeno v nápovědě. Pro vypsání výběru parametrů výchozí karty můžete použít

painfo list-default-card-parameters
nebo
painfo ldcp

Pro verzi formátovanou pro (mé) Conky, pak jen doplníte argument
painfo list-defult-card-parameters-conky
nebo
painfo ldcpc

atd.

V Conky to pak u mě vypadá následovně, používám dlouhé argumenty pro srozumitelnost i po delší době.

${color1}${font sans:size=10:bold}Sound$color$font${alignr}${execp painfo list-running-outputs-conky}
${voffset -6}$color3$hr$color$font
Default Card:$alignr${exec painfo get-default-card}
${execp painfo list-default-card-parameters-conky}
Inputs:${execp painfo list-input-streams-conky}

Tak to jen pro zajímavost a abych si to měl odkud zkopírovat, až si zas za týden omylem smažu /home při reinstalaci nové verze systému. Mimochodem, už se mi to Conky pomalu nevejde na obrazovku mého monitoru... Za což tedy mohou především početné filesystémy.



Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.