gnomeradio & pulseaudio

Egy frissítés után újra gondom támadt a gnomeradioval.

Az eredeti probléma az volt, hogy a gnomeradio nem kezeli az audio inputot, ha az nem a hangkártyára van bekötve pl. átkötőkábellel. Eredetileg ezt soxal oldottam meg, de néhány héttel/nappal? ezelőtt egy frissítés után zabálni kezdte a processzort, ráadásul a hangerő szabályozásával is problémák adódtak. A gnomeradio elindítása után néhány másodperig csak a fehér zaj dőlt a hangszórókból.

Ezekre a problémákra próbáltam meg megoldást találni a következő scriptel.


#! /bin/bash
#
# fájlnév: /usr/local/bin/gnomeradio
#
############################################
#          pulseaudio & gnomeradio         #

# bezárja a pulseaudio/alsa recordert
on_exit() {
    if ps -A | egrep -q "$PID.*arecord|$PID.*pacat"
    then
	 kill $PID
    else
	 killall 'pacat'
	 killall 'arecord'
    fi
#    sleep 0.5
#    echo
}

# a forrás tényleges némítása vagy a némítás tiltása,
# és állapota
_mute() {
    # némítás aktuális értékét adja vissza 
    state() {
        LANG=C pactl list | \
            grep -A10 'Sink Input #'"$SINK_INPUT" | \
            grep 'Mute:' | \
            awk -F': ' '{print $2}'
    }

    SINK_INPUT=$(LANG=C pactl list | \
                 grep -A20 "Sink Input #" | \
                 grep -B20 "$CLIENTNAME" | \
                 grep "Sink Input #" | \
                 awk -F'#' '{print $2}')

    if [ $(state) = $1 ]
    then
	# némítás állapota az stdoutra
	state
	return 0
    fi

    # mute beállítás
    case $1 in
	'no')
	    pactl set-sink-input-mute $SINK_INPUT 0
	;;
	'yes')
	    pactl set-sink-input-mute $SINK_INPUT 1
	;;
    esac
    sleep 0.2
    # visszaadja némítás állapotát
    state
}


# a forrás némítása
i_mute() {
    # néha-néha nem elég egyszer rászólni
    if [ $(_mute 'yes') != 'yes' ]
    then
	_mute 'yes' > /dev/null
    fi
}

# a forrás némításának tiltása
i_umute() {
    # néha-néha nem elég egyszer rászólni
    if [ $(_mute 'no') != 'no' ]
    then
	_mute 'no' > /dev/null
    fi
}


# késleltető
delay() {
#    i_mute
    sleep $1
    # némítás tiltása
    i_umute
}


# ha már egy példány fut, akkor kilép
if ps -A a | grep -v "^[ ]*$$" | grep -q "bash.*[g]nomeradio"
then
    echo "a gnomeradio már fut"
    exit 0
fi

# a forrás száma a pulseaudioban
SOURCE=$(LANG=C pactl list | \
         grep -A3 'Source #' | \
         grep -B3 'Description:.*SAA71.*Video Broadcast Decoder' | \
         grep 'Source #' | awk -F'#' '{print $2}')

# ha nincs megfelelő forrás
if [ -z $SOURCE ]
then
    echo -e "-- HIBA! --\n\tA forrás (SAA7131/SAA7133/SAA7135 Video Broadcast Decoder)\n\tnem található"
    exit 1
fi

# a forrás neve
INPUT=$(LANG=C pactl list | \
        grep -A3 "Source #$SOURCE" | \
        grep 'Name:' | \
        awk -F': ' '{print $2}')

ALSADEV=$(arecord -l | \
          grep "card [0-9]*: SAA71" | \
          awk '{print $2}' | \
          awk -F':' '{print $1}')

CLIENTNAME='gnomeradio'

trap 'on_exit' INT TERM EXIT

# a forrást összeköti a kimenettel
# pacat programmal
# pacat --record --latency=1 --raw --channels=2 --client-name=gnomeradio --stream-name=Input --device=$INPUT | \
#    pacat --playback --latency=1 --raw --client-name=gnomeradio --stream-name=Output &

# inkább arecord programmal mert az gyorsabb
arecord -D hw:$ALSADEV,0 -r 32000 -c 2 -f S16_LE -q | \
    pacat --playback --rate 32000 --latency=1 --client-name=$CLIENTNAME --stream-name=Output &
# csak a recorder PID-je kell
PID=$(ps a | grep '[a]record -D hw:'"$ALSADEV"',0' | awk '{print $1}')
# némítás amíg elindul a gnomeradio
# különbem zúg mint a fene
i_mute

echo -e "forrás: #$SOURCE ($INPUT)\n   cél: alapértelmezett\n"

# késleltetés amíg rendesen elindul a gnomeradio
delay 10 &
# na most jön a lényeg
/usr/bin/gnomeradio $@
# END

A script működőképes. - az én rendszeremen -
Namost, ha valakinek van kedve, tehetne javaslatot az egyszerűsítésre, javításra, gyorsításra, vagy akármi másra:)