Come modificare automaticamente il livello del volume quando si scollegano / si collegano le cuffie?


36

Quello che voglio è il seguente:

  • Quando inserisco le cuffie, desidero che l'audio sia disattivato e impostato su un livello di volume specifico.
  • Quando scollego le cuffie, voglio che l'audio sia disattivato (o impostato su un livello di volume specifico).

L'impostazione dei livelli del volume non è il problema, ma in qualche modo ho bisogno di farlo quando si scollegano / scollegano le cuffie, quindi sto cercando un modo per essere avvisato di quegli eventi.

Ho trovato rapidamente /proc/asound/card0/codec#0per indicare se le cuffie sono collegate o meno, quindi ho provato a monitorarlo utilizzando inotifywaite modificare il livello del volume in base alle notifiche modificate . Sfortunatamente inotifywaitfallito perché proc non è un normale filesystem.

Ci sono altri modi per farlo (forse tramite PulseAudio)?

Dispositivo audio: Intel HDA , codec audio: Conexant CX20585 .


Per riassumere quello che ho provato finora:

  • Ear Candy: non funzionava affatto sul mio sistema. Sembra essere un progetto abbandonato?
  • Il codice pubblicato da Karl Bielefeldt potrebbe funzionare su alcuni hardware, non sul mio.
  • L'idea di StephenPaulger fallisce a causa della mancanza di un canale "Speaker".
  • Motivato da aking1012, l' ho fatto funzionare hackerando il codice del kernel (dopo aver trovato il codice di rilevamento jack del codec), ma questa è una soluzione piuttosto ingombrante.

Quindi, sto ancora cercando un modo semplice per farlo.


Ottima domanda, voglio fare anche questo!
Stephen Paulger,

bello ... ma penso che sarà necessaria una patch per alsa per la risposta "istantanea" desiderata su plug / unplug. altrimenti funzionerebbe o sembrerebbe funzionare, ma sotto carico o in altre condizioni, la risposta potrebbe essere in ritardo. pensa che devi entrare tra l'evento plug e l'output toggle. probabilmente possibile, ma non merita una base di patch individuale a meno che un alsa dev non dica che sarà impegnato in trunk.
RobotHumans,

un approccio sarebbe quello di caricare il modulo in gdb, attendere che gli eventi audio "normali" si fermassero, usare l'opzione di registrazione, collegare e scollegare le cuffie e vedere cosa è successo nella registrazione del debug.
RobotHumans,

con quale ritardo ti senti a tuo agio?
RobotHumans,

Risposte:


3

Per impostare il livello del volume dalla console, utilizzare il comando amixer. Per esempio:

Amixer sset Riproduzione master 0%

Imposta il tuo livello su 0%

Non so come cambiarlo quando colleghi le cuffie ... ma forse qualcuno può aiutarti


3

Durante l'UDS per Oneiric c'è stata una sessione sul rilevamento dei jack. Vedi il progetto per i dettagli. Sembra che questo farà esattamente quello che sto cercando: diversi livelli di volume per diversi dispositivi - non solo su ogni hardware:

<htorque> qualcosa di cui sono curioso: sarò in grado di avere livelli di volume diversi per dispositivi diversi (ad es. audio interno disattivato, cuffie al 75%) presto?

<coling> questo sarà supportato (su alcune h / w) sì. Le tempistiche sono "presto": p
<coling> (mi aspetto anche che l'OSD venga mostrato (con il volume corrente) quando i jack sono collegati / scollegati)

Aggiornamento per l'11.10

Ora dovrebbe funzionare su Oneiric - sfortunatamente il mio ThinkPad T510 sembra essere uno dei sistemi attualmente non supportati.

Un altro follow-up di David Henningsson:

Per farla breve, è una caratteristica desiderabile e ci stiamo muovendo in quella direzione, ma lentamente, poiché la caratteristica è più complessa di quanto sembri a prima vista.

La buona notizia: nel prossimo Ubuntu Oneiric (11.10), questo funziona davvero. Le cattive notizie: non funziona per tutti.

Più qui .

Aggiornamento per 12.04

Ora funziona con il mio ThinkPad T510 (e molti altri modelli) in Ubuntu 12.04 (versione di sviluppo).


Esiste qualcosa di tracciamento dell'hardware attualmente supportato o qualcosa in tal senso?
Mu Mind

2

Ear Candy ha alcune funzionalità per gestire l'inserimento / rimozione delle cuffie.


1
Sembra che questo sia solo per le cuffie USB ... è corretto?
Mu Mind

2

Non so quanta esperienza di codifica hai, ma hai menzionato, inotifywaitquindi suppongo che tu sia almeno a tuo agio con lo scripting della shell. Il seguente programma C, basato su questo articolo , dovrebbe essere in grado di rilevare se le cuffie sono collegate o scollegate, dopodiché è possibile eseguire qualsiasi azione desiderata.

#include <linux/input.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>

int main(int argc, char* argv[])
{
    int fd = -1;
    char name[256]= "Unknown";
    struct input_event event;

    if ((fd = open(argv[1], O_RDONLY)) < 0) {
        perror("evdev open");
        exit(1);
    }

    if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
        perror("evdev ioctl");
    }

    printf("The device on %s says its name is %s\n",
            argv[1], name);

    read(fd, &event, sizeof(struct input_event));
    printf("Event type is %d\n", event.type);
    printf("Event code is %d\n", event.code);
    printf("Event value is %d\n", event.value);

    close(fd);
    return 0;
}

Il programma utilizza un argomento, che dovrebbe essere un percorso verso il dispositivo degli eventi di input per le cuffie. Questo è /dev/input/event7per me, ma potresti dover provare alcuni per scoprire quale si trova sul tuo sistema. Avrai bisogno delle autorizzazioni di lettura su quel dispositivo. Il programma stamperà il nome del dispositivo, il tipo, il codice e il valore del primo evento prima di uscire.


Purtroppo nessuno degli eventi * si è rivelato essere collegato alla mia cuffia. Comunque, +1 - forse è di aiuto per altri utenti.
htorque,

+1, funziona per me, in event.valueeffetti è commutato ... ma l' readoperazione ritorna solo quando il valore cambia ... forse sai come fare per non bloccarlo? grazie comunque!
Kevin,

Si aggiunge O_NONBLOCKquando si apre il dispositivo e si controlla il valore restituito di read. Se è negativo, la lettura si sarebbe bloccata o si sarebbe verificato qualche altro errore. Ci sono altri modi più complicati per farlo senza polling se lo stai incorporando in un programma più ampio.
Karl Bielefeldt,

1

Controlla dmesg e altri file di registro. Probabilmente il collegamento in / out genera alcuni messaggi particolari.

Quindi, è possibile utilizzare un demone per analizzare quel file di registro e rilevare gli eventi. Penso che tu sappia cosa fare da questo punto :)


1

Se fate

amixer sset 'Speaker' playback 0%

il volume degli altoparlanti verrà disattivato ma le cuffie continueranno a funzionare. Scollegare le cuffie non significa alcun suono. Che è quasi quello che vuoi ...

Tuttavia ...

Se si modifica il controllo del volume, verrà ripristinata l'impostazione del volume "Altoparlante". Questo perché pulseaudio cerca di essere intelligente con l'impostazione dei volumi (vedi http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes per ulteriori informazioni). Tuttavia, possiamo impedirgli di rovinare i volumi.

Apri /etc/pulse/default.pa

e trova la linea

load-module module-udev-detect

e cambiarlo in

load-module module-udev-detect ignore_dB=1

Riavvia pulseaudio.

killall pulseaudio

Ora, se si silenzia il volume degli altoparlanti, la modifica del volume principale non influirà su di esso. Quindi le cuffie funzioneranno ma l'altoparlante rimarrà silenzioso.


Sarebbe un approccio diverso, ma sfortunatamente non ho un canale per il volume degli altoparlanti, solo Master e PCM.
htorque,

1

Controlla le modifiche al socket ACPID, può essere fatto con l'aiuto di script Python o C o shell, ( codice Python per controllare la riproduzione del plug in cuffia e mettere in pausa su rhythmbox). Verificare la presenza di variazioni nella tensione ACPID per rilevare il plug-in e il plug-in degli auricolari. Tuttavia, ci si può aspettare un secondo di ritardo.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.