# [TIP] Gestire il mixer via tasti FN

## federico

Ero un po' frustrato dalle possibilita' che mi davano i miei tasti FN per quanto riguardava la gestione del volume.. Nulle o quasi, dipende dalle macchine.. Attraverso questo programma, con l'ausilio di xosd xbindkeys e setmixer otterrete una buona gestione del mixer, le features sono scritte nell'intestazione del programma.

A grandi linee potete alzare e abbassare il livello del volume e gestire in maniera precisa il mute e modificare il volume mentre il tutto e' muto, solitamente e' prerogativa di qualche mixer grafico e non di un uso tramite shortcut da tastiera.

Inoltre il livello e lo stato del volume vengono visualizzati a schermo quando vengono modificati.

Vi consiglio di mappare con xbindkeys o qualcosa del genere le combinazioni di tasti che servono per modificare lo stato del volume

Questo per me in .xbindkeysrc:

```

#Vol +

      "~/osdvol.py +"

        m:0x0 + c:176

#Vol -

      "~/osdvol.py -"

        m:0x0 + c:174

#Muto

      "~/osdvol.py mute"

      m:0x0 + c:160

```

Quindi il programma di gestione

http://www.sideralis.net/blackman/osdvol.py

```

#!/usr/bin/env python

"""

osdvol.py permette tramite l'ausilio di setmixer

http://packages.debian.org/testing/sound/setmixer.html

il controllo del volume sonoro.

osdvol.py e' ideato per lavorare preferibilmente coi tasti

funzione adeguati sulle tastiere multimediali e portatili.

osdvol.py supporta:

- creazione automatica del file di configurazione ~/.setmixer

- aumento,diminuzione e mute/unmute del volume

- mantenimento delle impostazioni del volume passando dallo stato di

  mute a quello di unmute e viceversa

- possibilita' di variare il volume nello stato di mute per riottenerlo

  modificato tornando unmute

- stampa a schermo dello stato sonoro tramite xosd http://www.ignavus.net

Questo programma e' liberamente modificabile.

Sideralis Programs

Federico e Riccardo Galli

http://www.sideralis.net

"""

import os,sys

PATH=os.sep.join((os.getenv('HOME'),'.setmixer'))

""" XOSDOPT sono le opzioni che vengono passata e osd_cat """

XOSDOPT='--font="-adobe-helvetica-bold-*-*-*-34-*-*-*-*-*-*-*" --shadow=2 --pos=top --align=right --colour=green --delay=1'

show_vol='|'.join((

r'''echo `setmixer -V vol +0''',

r'''awk '/vol/{split ($3,a,",");print a[1];}'` "% Volume"''',

r'''osd_cat ''' + XOSDOPT

))

if not os.path.exists(PATH):

    fp=file(PATH,'w')

    fp.write('0\n70\n')

    fp.close()

def ismute():

    fp=file(PATH,'r')

    val=int(fp.read(1))

    fp.close()

    return val

def vol_modify(flag):

    """

    modifica il volume in base a flag

    flag false: lo aumenta

    flag true:  lo diminuisce

    """

    vol=None

    op= flag and '-' or '+'

    if ismute():

        fp=file(PATH,'r+')

        fp.readline()

        value=int(fp.readline())

        value=eval("value %s 3" % op)

        if value>100: value=100

        elif value<0: value=0

        fp.seek(0)

        fp.write('1\n%d\n' % value)

        fp.close()

        vol=value

    else:

        os.system('setmixer vol %s3' % op)

    return vol

if len(sys.argv)!=2: print 'You must pass ONE argument'; sys.exit(1)

if sys.argv[1] not in ('+','-','mute'):

    print 'Argument "%s" not supported' % sys.argv[1]; sys.exit(1)

if sys.argv[1] in ('+','-'):

    vol=vol_modify(sys.argv[1]=='-' and True or False)

    if not vol: os.system(show_vol)

    else: os.system(r'echo "MUTE %d%% Volume" | osd_cat %s' % (vol,XOSDOPT))

elif sys.argv[1]=='mute':

    fp=file(PATH,"r+")

    flag=int(fp.readline())

    

    if flag:

        value=int(fp.readline())

        fp.seek(0)

        fp.write('0')

        os.system('setmixer vol %d' % value) 

        os.system('echo "Mute OFF"| osd_cat %s' % XOSDOPT)

    else: 

        out=os.popen('setmixer -V vol +0')

        value=int(out.readline().split(' - ')[1].split(',')[0])

        out.close()

        fp.seek(0)

        fp.write('1\n%d\n' % value)

        os.system("setmixer vol mute")

        os.system('echo "Mute ON"| osd_cat %s' % XOSDOPT)

    fp.close()

```

Vi consiglio tuttavia di wgettare il link proposto prima.

Spero che a qualcuno faciliti la vita...

Fede

----------

## fedeliallalinea

Grazie a federico sono riuscito a provare questo script e devo dire che e' molto carino e funzionale  :Very Happy:  .

----------

## codadilupo

 *fedeliallalinea wrote:*   

> Grazie a federico sono riuscito a provare questo script e devo dire che e' molto carino e funzionale  .

 

a me i tasti funzione... funzionano senza aver dovuto fare nulla. L'unica stranezza é che F12, riporta la freccetta "Volume Su" abbassa il volume, e F11, che dovrebbe abbassarlo, lo alza. Il Mute funziona a dovere  :Wink: 

... Certo: provero' giusto per avere anche la sezione grafica   :Very Happy:  !

Grazie a federico,

Coda

----------

## MyZelF

 *codadilupo wrote:*   

> a me i tasti funzione... funzionano senza aver dovuto fare nulla.

 

Credo questo dipenda dal fatto che su hardware non recentissimi di queste funzioni se ne occupa direttamente il BIOS, senza passare per il sistema operativo.

----------

## fedeliallalinea

 *MyZelF wrote:*   

> Credo questo dipenda dal fatto che su hardware non recentissimi di queste funzioni se ne occupa direttamente il BIOS, senza passare per il sistema operativo.

 

Si anche a me funzionano ma non si capisce mai se il volume e' al massimo o no. Con lo script di federico tutto e' piu' chiaro   :Very Happy:  .

----------

## codadilupo

 *MyZelF wrote:*   

>  *codadilupo wrote:*   a me i tasti funzione... funzionano senza aver dovuto fare nulla. 
> 
> Credo questo dipenda dal fatto che su hardware non recentissimi di queste funzioni se ne occupa direttamente il BIOS, senza passare per il sistema operativo.

 

oddio, non recentissimi: é il solito asus L3400H celeron 2.0Ghz, 256Mb DDR 20Gb HD.... quando l'ho comprato, un anno fa, non era cosi' obsoleto  :Wink: )

Coda

----------

## koma

nn ho ben capito come usarlo  :Smile:  perchè nn fai un piccolo howto?

----------

## fedeliallalinea

Per prima cosa si devono installare dei programmi.

```
# emerge xosd 
```

Librerie per la visualizzazione a schermo di testo.

```
# emerege xbindkeys 
```

Programma che premette di lanciare comandi con i tasti.

```
# emerge setmixer
```

Mixer da linea di comando.

Ora che si hanno tutti i programmi necessari possiamo lanciare xbindkeys per vedere come sono mappati i tasti per il controllo del volume.

```
$ xbindkeys -mk
```

Una volta che sappiamo come sono mappati i tasti che vogliamo usare si crea il file, dentro la nostra home, .xbindkeysrc che nel mio caso e'

```
#Vol +

      "~/osdvol.py +"

        m:0x0 + c:176

#Vol -

      "~/osdvol.py -"

        m:0x0 + c:174

#Muto

      "~/osdvol.py mute"

      m:0x0 + c:160 
```

A questo punto scarichiamo il programma osdvol.py che gestisce il mixer con setmixer e stampa a schermo il volume grazie alla librerie xosd.

```
#!/usr/bin/env python

"""

osdvol.py permette tramite l'ausilio di setmixer

http://packages.debian.org/testing/sound/setmixer.html

il controllo del volume sonoro.

osdvol.py e' ideato per lavorare preferibilmente coi tasti

funzione adeguati sulle tastiere multimediali e portatili.

osdvol.py supporta:

- creazione automatica del file di configurazione ~/.setmixer

- aumento,diminuzione e mute/unmute del volume

- mantenimento delle impostazioni del volume passando dallo stato di

  mute a quello di unmute e viceversa

- possibilita' di variare il volume nello stato di mute per riottenerlo

  modificato tornando unmute

- stampa a schermo dello stato sonoro tramite xosd http://www.ignavus.net

Questo programma e' liberamente modificabile.

Sideralis Programs

Federico e Riccardo Galli

http://www.sideralis.net

"""

import os,sys

PATH=os.sep.join((os.getenv('HOME'),'.setmixer'))

""" XOSDOPT sono le opzioni che vengono passata e osd_cat """

XOSDOPT='--font="-adobe-helvetica-bold-*-*-*-34-*-*-*-*-*-*-*" --shadow=2 --pos=top --align=right --colour=green --delay=1'

show_vol='|'.join((

r'''echo `setmixer -V vol +0''',

r'''awk '/vol/{split ($3,a,",");print a[1];}'` "% Volume"''',

r'''osd_cat ''' + XOSDOPT

))

if not os.path.exists(PATH):

    fp=file(PATH,'w')

    fp.write('0\n70\n')

    fp.close()

def ismute():

    fp=file(PATH,'r')

    val=int(fp.read(1))

    fp.close()

    return val

def vol_modify(flag):

    """

    modifica il volume in base a flag

    flag false: lo aumenta

    flag true:  lo diminuisce

    """

    vol=None

    op= flag and '-' or '+'

    if ismute():

        fp=file(PATH,'r+')

        fp.readline()

        value=int(fp.readline())

        value=eval("value %s 3" % op)

        if value>100: value=100

        elif value<0: value=0

        fp.seek(0)

        fp.write('1\n%d\n' % value)

        fp.close()

        vol=value

    else:

        os.system('setmixer vol %s3' % op)

    return vol

if len(sys.argv)!=2: print 'You must pass ONE argument'; sys.exit(1)

if sys.argv[1] not in ('+','-','mute'):

    print 'Argument "%s" not supported' % sys.argv[1]; sys.exit(1)

if sys.argv[1] in ('+','-'):

    vol=vol_modify(sys.argv[1]=='-' and True or False)

    if not vol: os.system(show_vol)

    else: os.system(r'echo "MUTE %d%% Volume" | osd_cat %s' % (vol,XOSDOPT))

elif sys.argv[1]=='mute':

    fp=file(PATH,"r+")

    flag=int(fp.readline())

   

    if flag:

        value=int(fp.readline())

        fp.seek(0)

        fp.write('0')

        os.system('setmixer vol %d' % value)

        os.system('echo "Mute OFF"| osd_cat %s' % XOSDOPT)

    else:

        out=os.popen('setmixer -V vol +0')

        value=int(out.readline().split(' - ')[1].split(',')[0])

        out.close()

        fp.seek(0)

        fp.write('1\n%d\n' % value)

        os.system("setmixer vol mute")

        os.system('echo "Mute ON"| osd_cat %s' % XOSDOPT)

    fp.close() 
```

A questo punto ci manca solo di fare partire xbindkeys

```
$ xbindkeys
```

Bisogna lanciare questo comando ogni volta quindi aggiungetelo nel file di autostart del vostro wm.

PS: Grazie mille federico  :Very Happy: 

----------

## federico

Cavoli grazie mille a te che hai fatto il piccolo howto al posto mio   :Cool:   :Cool: 

Se trovate bachi o migliorie sono qui disponibile  :Smile: 

Chiaramente con lo stesso principio è possibile visualizzare o settare molte combinazioni di tasti.

----------

## codadilupo

 *federico wrote:*   

> Chiaramente con lo stesso principio è possibile visualizzare o settare molte combinazioni di tasti.

 

Infatti pensavo, appena ho sistemato anche il desktop, di sfruttare questo input per visualizzare i tasti speciali della tastiera wirless logitech  :Wink: )

tienti pronto, che ti tampinero' non poco   :Very Happy: 

Coda

----------

## federico

Ho anche io su un pc quella tastiera, se una sera di queste ho tempo mi porto avanti col lavoro  :Smile: )

Dunque abbiamo, un tasto per lo sleep (e a me nn va lo spleep percui sara' dura), muto, volume su e giu, e quelli sono a posto, poi tasti multimediali

play/pause avanti e indietro e stop (su quale programma li facciamo agire?)

Infine posta, home, cerca e.. cos'e' l'ultimo?

Fede

----------

## codadilupo

 *federico wrote:*   

> Infine posta, home, cerca e.. cos'e' l'ultimo?

 

il bloc maiusc e il numlock te li sei dimenticati: e' vero che non sono peculiari della tastiera, ma, visto che non ha led che indichino lo stato dei tasti, é cmq comodo vedere la scrittina verde, quando li premi, che ti dice: attivato/disattivato  :Wink: )

P.S.: mi pare ci sia anche la navigazione browser, la cartella stampanti, e la rotellina per lo scroll da tastiera  :Wink: 

P.S.: esiste già un programma, mi pare, per la gestione degli hotkeys... magari si puo' prendere spunto da li'.

Coda

----------

## shev

 *codadilupo wrote:*   

> P.S.: esiste già un programma, mi pare, per la gestione degli hotkeys... magari si puo' prendere spunto da li'

 

Esatto, io per gestire i tasti multimediali della mia logitech wireless uso con soddisfazione hotkeys, molto semplice da configurare, personalizzare ed usare. Ha anche "le scrittine verdi"  :Wink:  (con colore personalizzabile a scelta).

In alternativa esiste anche lineakd, ma l'ho provato quando ancora era alle prime versioni e non m'aveva impressionato molto.

----------

## federico

 *codadilupo wrote:*   

> 
> 
> P.S.: mi pare ci sia anche la navigazione browser, la cartella stampanti, e la rotellina per lo scroll da tastiera 
> 
> 

 

Mi sa che la tua e' molto + multimediale della mia..

Proviamo questo programma di gestione degli hotkeys e vediamo un po' cosa fa e cosa non ..

Fede

----------

## codadilupo

 *federico wrote:*   

> Mi sa che la tua e' molto + multimediale della mia..
> 
> Proviamo questo programma di gestione degli hotkeys e vediamo un po' cosa fa e cosa non ..

 

le nostre (mia e di shev) sono questa

Coda

----------

## federico

La mia e' NETTAMENTE meno multimediale  :Smile: 

E' probabilmente un modello + vecchio ma presumo che la teoria di funzionamento sia la medesima

----------

## maschievano

 *shev wrote:*   

>  *codadilupo wrote:*   P.S.: esiste già un programma, mi pare, per la gestione degli hotkeys... magari si puo' prendere spunto da li' 
> 
> Esatto, io per gestire i tasti multimediali della mia logitech wireless uso con soddisfazione hotkeys, molto semplice da configurare, personalizzare ed usare. Ha anche "le scrittine verdi"  (con colore personalizzabile a scelta).
> 
> In alternativa esiste anche lineakd, ma l'ho provato quando ancora era alle prime versioni e non m'aveva impressionato molto.

 

Come si fa a far partire hotkeys a DM già avviato?

Se faccio 

```
rc-update add hotkeys default
```

lo script viene lanciato durante l'avvio testuale e va in errore non trovando X in run mode.

----------

## fedeliallalinea

Con

```
# /etc/init.d/hotkeys restart
```

----------

## maschievano

CosÃ¬ ogni volta che apro X devo da terminal dare il comando.

Invece dovrebbe esserci qualcosa tipo Autostart

----------

## shev

Io lo avvio tramite apposita linea di configurazione in .xinitrc, così viene lanciato ad ogni startx. Per maggiori info, cerca ".xinitrc" su questo forum, dovresti trovare diversa roba a riguardo.

----------

## nick_spacca

Io non riesco a scaricare + il file di Federico....forse il link non e' + quello giusto!!!

(poco male comunque visto che si puo' fare copia/incolla dal testo...)

----------

## koma

a me i tasti FN non funzionano e xbindkeys non li traccia.

----------

## gutter

 *koma wrote:*   

> a me i tasti FN non funzionano e xbindkeys non li traccia.

 

Che portatile hai? Hai provato ad usare acpi?

----------

## koma

latitude d600, no, come provo?

----------

## fedeliallalinea

 *koma wrote:*   

> a me i tasti FN non funzionano e xbindkeys non li traccia.

 

Anche a me ma usavo altri file. acpi non posso metterlo

----------

## mouser

 *codadilupo wrote:*   

> 
> 
> le nostre (mia e di shev) sono questa
> 
> Coda

 

hmmm, la mia tastierina da casa e' come la vostra, pero' non ho il mouse ed e' ancora una "troglodita" tastiera usb...... i tasti multimediali pero' sono uguali! Nel caso si faccia il programmino, visto che non sono molto buono con il python, se posso dare una mano nel testing (e magari posso fare una bella interfaccina in gtk  :Wink:  )

mouser  :Wink: 

----------

## bandreabis

dove salvo osdvol.py? Devo renderlo eseguibile?

----------

## mouser

 *bandreabis wrote:*   

> dove salvo osdvol.py? Devo renderlo eseguibile?

 

Ovunque vuoi, l'importante è che poi ~/.xbindkeysrc abbia il path corretto.

Si, devi renderlo eseguibile se vuoi lanciarlo semplicemente richiamando il nome, altrimenti invece di

```
$ ./osdvol.py
```

lo dovrai lanciare con

```
$ python osdvol.py
```

Ciriciao

mouser  :Wink: 

----------

## mouser

Mi sono permesso di stravolgere il lavoro dei Sideralis Bros.   :Laughing: 

Ne e' venuto fuori bosdvol.... la *b* iniziale sta a significare che, non conoscendo il python, ho riscritto tutto in bash, mantenendo le funzionalita' e modificando una piccolissima cosa grafica.

Ora, utilizzando bosdvol, oltre a tutto quello che potevate fare con osdvol, nel momento in cui aumentate/diminuite il volume vedrete una simpaticissima barra progressiva in basso al centro dello schermo. Inoltre ho modificato il font in modo da utilizzarne uno standard (per esempio quello che usa Fede mi dava problemi perchè non trovava il font ^.^)

Spero che possa essere di aiuto a qualcuno e magari di spunto a qualcun'altro.

(ah, anche il file di appoggio che utilizza il programma è lo stesso con la stessa sintassi, quindi potete decidere volta per volta quale dei due tool usare mantendeno entrambi aggiornati al sistema  :Cool:  )

Per ottenere lo script:

```
$ wget http://mouser.altervista.org/software/gentoo/bosdvol
```

La spiegazione di come usarlo, configurarlo ecc, non la posto (usate pure quella di fedeliallalinea, è perfetta)

e qui il codice  :Wink: 

```
#!/bin/bash

#

# Conversione in bash e modifica per visualizzare una barra di scorrimento

# di osdvol.py di Sideralis

#

# Matteo <mouser> Cappadonna, 2006

# matteo.cappadonna(at)gmail.com

#---

# osdvol.py permette tramite l'ausilio di setmixer

# http://packages.debian.org/testing/sound/setmixer.html

# il controllo del volume sonoro.

# osdvol.py e' ideato per lavorare preferibilmente coi tasti

# funzione adeguati sulle tastiere multimediali e portatili.

# osdvol.py supporta:

# - creazione automatica del file di configurazione ~/.setmixer

# - aumento,diminuzione e mute/unmute del volume

# - mantenimento delle impostazioni del volume passando dallo stato di

#   mute a quello di unmute e viceversa

# - possibilita' di variare il volume nello stato di mute per riottenerlo

#   modificato tornando unmute

# - stampa a schermo dello stato sonoro tramite xosd http://www.ignavus.net

#

#  Questo programma e' liberamente modificabile.

#  Sideralis Programs

#  Federico e Riccardo Galli

#  http://www.sideralis.net

function help () {

        echo

        echo "usage: bosdvol (+|-|mute)"

        echo "  +     Aumenta il volume"

        echo "  -     Diminuisce il volume"

        echo "  mute  Attiva/Disattiva il muto"

        echo

}

if [ ${#1} -eq 0 ]; then

        help

        exit

fi

MUTE=`cat $HOME/.setmixer | head -1`

VOLUME=`cat $HOME/.setmixer | tail -1`

XOSDOPT="--font=8x13 --shadow=1 --pos=bottom --align=center --color=lightgreen --delay=1 --offset="

case $1 in

  '+'|'-')

        # Incremento o decremento il volume

        if [ $1 = '+' ]; then

                VOLUME=`expr $VOLUME + 3`

        else

                VOLUME=`expr $VOLUME - 3`

        fi

        # Salva i valori nel file ~/.setmixer

        echo $MUTE > $HOME/.setmixer

        echo $VOLUME >> $HOME/.setmixer

        # Imposta il volume con setmixer

        if [ $MUTE -eq 0 ]; then

                setmixer vol $VOLUME

        fi

        # Visualizza la scritta e la barra

        if [ $MUTE -eq 1 ]; then

                TEXT="Mute ON - Volume $VOLUME%"

        else

                TEXT="Volume $VOLUME%"

        fi

        echo $TEXT | osd_cat $XOSDOPT"50" &

        echo $TEXT | osd_cat $XOSDOPT"40" --barmode=percentage --percentage=$VOLUME &

        ;;

  'mute')

        # Modifico il valore del mute ed il suono

        if [ $MUTE -eq 0 ]; then

                MUTE=1

                setmixer vol 0

        else

                MUTE=0

                setmixer vol $VOLUME

        fi

        # Salva i valori nel file ~/.setmixer

        echo $MUTE > $HOME/.setmixer

        echo $VOLUME >> $HOME/.setmixer

        if [ $MUTE -eq 0 ]; then

                TEXT="Mute OFF"

        else

                TEXT="Mute ON"

        fi

        echo $TEXT | osd_cat $XOSDOPT"40" &

        ;;

  *)

        help

        ;;

esac
```

Ciriciao

mouser  :Wink: 

----------

## bandreabis

Niente, non riesco nè con uno nè con l'altro.

Sono tornato a hotkeys ma ho i soliti problemi di unmute dopo riavvio, della lucina Mute che non si accende.

Andrea

----------

## bandreabis

Beh, ho usato hotkeys per associare i tasti a osdvol.py e funziona anche lui, ma non risolve il problema del riavvio con il muto attivo.

Andrea

----------

## lucapost

un altro problema è il tempo di permanenza dell'output di osd_cat sullo schermo, infatti avrete notato che premendo i tasti a distanza troppo brevi le scritte si sovrappongono.

una possibile soluzione potrebbe essere uccidere il demone osd_cat ad ogni premuta del tasto...così si potrebbe anche allungare i tempi di output sullo schermo, devo solo trovare il posto giusto dove metterlo nello script....

----------

## lucapost

alla fine, prendendo un pezzo di qua ed un pezzo di la, ho creato il mio script per gestire il volume con i tasti Fn e l'acpid (acpi4asus), la guida dalla quale ho preso spunto è questa.

Ho creato i file degli eventi:

```
lucapost@jarod ~ $ cat ~/.asus_acpi/events/mute 

event=hotkey.*32[[:space:]].*

action=~/.asus_acpi/volume state
```

```
lucapost@jarod ~ $ cat ~/.asus_acpi/events/volup 

event=hotkey.*30[[:space:]].*

action=~/.asus_acpi/volume +
```

```
lucapost@jarod ~ $ cat ~/.asus_acpi/events/voldowm 

event=hotkey.*31[[:space:]].*

action=~/.asus_acpi/volume -
```

 e lo script ~/.asus_acpi/volume :

```
#!/bin/sh

PERC=`amixer get PCM | tail -1 | cut -d'[' -f2 | cut -d']' -f1 |sed s/'%'//`

XOSDOPT="--font=-misc-*-bold-*-*-*-26-*-*-*-*-*-*-* --pos=bottom --align=center --color=green --delay=1"

killall osd_cat &> /dev/null

if [ "$1" = "state" ] ; then

   amixer -q set Headphone toggle

else

   amixer set PCM 1%$1 

   osd_cat $XOSDOPT -b percentage -T "VOLUME ${PERC}%" -P ${PERC} &

fi
```

Lampeggia un pò troppo veloce, ma risolve quello che secondo me è il problema dei tempi morti.

Come posso evitare questo lampeggiamento dovuto al kill di osd_cat? mi piacerebbe ottenere un effetto della gestione del volume come quello dell'osd di mplayer senza lampeggi....qualcumo sa aiutarmi?

/edit: l'ho semplificato un po!   :Cool: 

----------

