How to adjust sound volume from a script?

Please post all general support questions for LXDE here.
Locked
holck
Posts: 2
Joined: Sat Apr 24, 2010 1:02 pm

How to adjust sound volume from a script?

Post by holck »

I am a quite happy user, running LXDE on my small eee 901 notebook.

I would like to be able to control the sound volume and to mute/un-mute sound from a small program or script, but it is a little more complicated and strange than I thought.

When I first enter the LXDE session, the volume control applet in the panel shows sound as muted, and volume = 0. I would guess that the commands below would change this:

Code: Select all

$ amixer cset iface=MIXER,name='Speaker Playback Switch' on
$ amixer cset iface=MIXER,name='Speaker Playback Volume' 50
But apparently nothing happens. If I now un-mute sound, using the applet, and issue this command

Code: Select all

$ amixer cset iface=MIXER,name='Speaker Playback Switch' off
the applet shows the sound as muted. Now I can turn on sound again with

Code: Select all

$ amixer cset iface=MIXER,name='Speaker Playback Switch' on
Volume is still 0, and the following command doesn't change this:

Code: Select all

$ amixer cset iface=MIXER,name='Speaker Playback Volume' 50
But I can turn up volume on the applet (to e.g. 100) and now control volume via the command line

Code: Select all

$ amixer cset iface=MIXER,name='Speaker Playback Volume' 50
sets volume = 58

Strange, isn't it? Any help appreciated
Jesper, Denmark
maces
Posts: 503
Joined: Sat Oct 25, 2008 6:04 pm
Contact:

Re: How to adjust sound volume from a script?

Post by maces »

Hi,

here is my script, works quite well for me:

Code: Select all

#!/bin/sh

usage="usage: $0 -c {up|down|mute} [-i increment] [-m mixer]"
command=
increment=1%
mixer=Master
mic=Mic

while getopts i:m:h o
do case "$o" in
    i) increment=$OPTARG;;
    m) mixer=$OPTARG;;
    h) echo "$usage"; exit 0;;
    ?) echo "$usage"; exit 0;;
esac
done

shift $(($OPTIND - 1))
command=$1

if [ "$command" = "" ]; then
    echo "usage: $0 {up|down|mute} [increment]"
    exit 0;
fi

display_volume=0

if [ "$command" = "up" ]; then
    display_volume=$(amixer set $mixer $increment+ unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
fi

if [ "$command" = "down" ]; then
    display_volume=$(amixer set $mixer $increment- unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
fi

if [ "$command" = "micup" ]; then
    display_volume=$(amixer set $mic $increment+ unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
    display_volume=$(amixer set "Front $mic" $increment+ unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
fi

if [ "$command" = "micdown" ]; then
    display_volume=$(amixer set $mic $increment- unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
    display_volume=$(amixer set "Front $mic" $increment- unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
fi

icon_name=""

if [ "$command" = "mute" ]; then
    if amixer get Master | grep "\[on\]"; then
        display_volume=0
        icon_name="notification-audio-volume-muted"
        amixer set $mixer mute
    else
        display_volume=$(amixer set $mixer unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1)
    fi
fi

if [ "$icon_name" = "" ]; then
    if [ "$display_volume" = "0" ]; then
        icon_name="notification-audio-volume-off"
    else
        if [ "$display_volume" -lt "33" ]; then
            icon_name="notification-audio-volume-low"
        else
            if [ "$display_volume" -lt "67" ]; then
                icon_name="notification-audio-volume-medium"
            else
                icon_name="notification-audio-volume-high"
            fi
        fi
    fi
fi
notify-send " " -i $icon_name -h int:value:$display_volume -h string:synchronous:volume
call it like that:

Code: Select all

vol.sh up -i 1% -m Master
vol.sh down -i 1% -m Master
vol.sh micdown -i 1% -m 
vol.sh micup -i 1% -m 
And for muting use this:

Code: Select all

amixer set Master toggle
Don't know if it works with eeepc901 immediately. Hope it helps.

maces
Marty Jack
Posts: 381
Joined: Mon Mar 23, 2009 5:14 am

Re: How to adjust sound volume from a script?

Post by Marty Jack »

An interesting fact to know is that the mixer that is controlled by the Volume applet is in the device "default", the first of "Master", "Front", "PCM", and "LineOut" that is found. I do not believe this is the one the original poster is setting with their script.

We expect to make this configurable in a future release. It is not going to be easy because of the great variety of ways that the sound system can be set up, particularly if you factor in PulseAudio, and because of the abstraction level of the ALSA API.
holck
Posts: 2
Joined: Sat Apr 24, 2010 1:02 pm

Re: How to adjust sound volume from a script?

Post by holck »

Thanks for the help and the script - but unfortunately, the script did not solve my problem.

I have done some experimentation, and the small script below seems to work for me, i.e. it unmutes sound:

Code: Select all

amixer sset 'Master' 50 unmute
amixer sset 'Speaker' 50 unmute
amixer sset 'Headphone' 50 unmute
One thing I found out is that isn't enough to unmute just one control, you have to unmute several, including "Headphone".

Jesper,
Denmark
rockdoctor
Posts: 116
Joined: Tue Nov 11, 2008 4:51 pm

Re: How to adjust sound volume from a script?

Post by rockdoctor »

Don't know if it's relevant, but on my Acer Aspire One, I find I need to up the setting on the 'Beep" device too
Geology - It's not rocket science, it's rock science!
Locked