Wie ändere ich die Lautstärke automatisch, wenn ich einen Kopfhörer ab- / anstecke?

36

Was ich möchte ist folgendes:

  • Wenn ich meine Kopfhörer anschließe, soll der Ton stumm geschaltet und auf einen bestimmten Lautstärkepegel eingestellt werden.
  • Wenn ich meinen Kopfhörer aus der Steckdose ziehe, soll der Ton stumm geschaltet (oder auf einen bestimmten Lautstärkepegel eingestellt) werden.

Das Einstellen der Lautstärke ist nicht das Problem, aber ich muss dies irgendwie tun, wenn ich die Kopfhörer ab- / anstecke, also suche ich nach einer Möglichkeit, über diese Ereignisse benachrichtigt zu werden.

Ich fand schnell heraus /proc/asound/card0/codec#0, ob ein Kopfhörer angeschlossen ist oder nicht, und versuchte, ihn zu überwachen inotifywaitund den Lautstärkepegel anhand geänderter Benachrichtigungen zu ändern . Leider inotifywaitgescheitert, weil proc kein gewöhnliches Dateisystem ist.

Gibt es andere Möglichkeiten, dies zu tun (möglicherweise über PulseAudio)?

Audiogerät: Intel HDA , Audiocodec: Conexant CX20585 .


Um zusammenzufassen, was ich bisher versucht habe:

  • Ear Candy: lief überhaupt nicht auf meinem System. Scheint ein aufgegebenes Projekt zu sein?
  • Der Code von Karl Bielefeldt funktioniert möglicherweise auf einer Hardware, auf meiner jedoch nicht.
  • Die Idee von StephenPaulger scheitert am Fehlen eines "Speaker" -Kanals .
  • Motiviert durch aking1012 habe ich es geschafft, indem ich im Kernel-Code herumgehackt habe (nachdem ich den Jack-Sensing-Code des Codecs gefunden habe), aber das ist eine ziemlich umständliche Lösung.

Ich bin immer noch auf der Suche nach einem einfachen Weg, dies zu tun.

Drehmoment
quelle
Gute Frage, das möchte ich auch!
Stephen Paulger
nett ... aber ich denke, ein Patch für alsa wird für die gewünschte "sofortige" Reaktion auf Plug / Unplug notwendig sein. Andernfalls würde es funktionieren oder zu funktionieren scheinen, aber unter Last- oder anderen Bedingungen könnte die Reaktion verzögert sein. Ich denke, Sie müssen zwischen dem Plug-Event und dem Output-Toggle hin- und herschalten. wahrscheinlich möglich, aber sooooo keine einzelne Patch-Basis wert, es sei denn, ein Alsa-Entwickler sagt, dass es auf Trunk festgeschrieben wird.
RobotHumans
Ein Ansatz wäre, das Modul in GDB zu laden, zu warten, bis die "normalen" Soundereignisse beendet sind, die Aufnahmeoption zu verwenden, die Kopfhörer anzuschließen und abzuziehen und zu sehen, was bei der Debug-Aufnahme passiert ist.
RobotHumans
Mit wie viel Verspätung fühlen Sie sich wohl?
RobotHumans

Antworten:

3

Verwenden Sie den Befehl amixer, um die Lautstärke über die Konsole einzustellen. Beispielsweise:

amixer sset Master-Wiedergabe 0%

Setzt dein Level auf 0%

Ich weiß nicht, wie ich das ändern soll, wenn Sie Ihre Kopfhörer anschließen ... aber vielleicht kann Ihnen jemand dabei helfen

Luciano Facchinelli
quelle
3

Während des UDS for Oneiric gab es eine Sitzung zur Buchsenerkennung. Einzelheiten finden Sie in der Blaupause . Es hört sich so an, als würde dies genau das tun, wonach ich suche: Unterschiedliche Lautstärken für unterschiedliche Geräte - nur nicht auf jeder Hardware:

<htorque> etwas, worauf ich neugierig bin: Kann ich in Kürze verschiedene Lautstärken für verschiedene Geräte einstellen (z. B. interner Ton stummgeschaltet, Kopfhörer 75%)?

<coling> dies wird unterstützt (auf einigen h / w) yes. Die Zeitskalen sind "bald": p
<coling> (Ich würde auch erwarten, dass das OSD (mit der aktuellen Lautstärke) angezeigt wird, wenn die Buchsen gesteckt / abgezogen werden.)

Update für 11.10

Dies sollte nun in Oneiric funktionieren - leider scheint mein ThinkPad T510 eines der Systeme zu sein, die derzeit nicht unterstützt werden.

Ein weiteres Follow-up von David Henningsson:

Kurz gesagt, es ist eine wünschenswerte Funktion, und wir bewegen uns in diese Richtung, aber langsam, da die Funktion komplexer ist, als es auf den ersten Blick scheint.

Die gute Nachricht: Im kommenden Ubuntu Oneiric (11.10) funktioniert dies tatsächlich. Die schlechte Nachricht: Es funktioniert nicht für alle.

Mehr hier .

Update für den 12.04

Es funktioniert jetzt mit meinem ThinkPad T510 (und vielen anderen Modellen) in Ubuntu 12.04 (Entwicklungsversion).

Drehmoment
quelle
Gibt es eine Nachverfolgung, welche Hardware derzeit unterstützt wird, oder etwas in diesem Sinne?
Mu Mind
2

Ear Candy bietet einige Funktionen zum Einsetzen / Entfernen von Kopfhörern.

Zacharyliu
quelle
1
Sieht so aus, als wäre es nur für USB-Kopfhörer ... ist das richtig?
Mu Mind
2

Ich weiß nicht, wie viel Programmiererfahrung Sie haben, aber Sie haben es erwähnt, inotifywaitalso gehe ich davon aus, dass Sie zumindest mit Shell-Skripten vertraut sind. Das folgende C-Programm, das auf diesem Artikel basiert , sollte in der Lage sein, das Einstecken oder Herausziehen Ihres Kopfhörers zu erkennen. Anschließend können Sie die gewünschten Aktionen ausführen.

#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;
}

Das Programm verwendet ein Argument, das ein Pfad zum Eingangsereignisgerät für Ihre Kopfhörer sein sollte. Dies ist /dev/input/event7für mich, aber Sie müssen möglicherweise ein paar ausprobieren, um herauszufinden, welches auf Ihrem System vorhanden ist. Sie benötigen Leserechte für dieses Gerät. Das Programm gibt vor dem Beenden den Namen des Geräts sowie den Typ, den Code und den Wert des ersten Ereignisses aus.

Karl Bielefeldt
quelle
Leider stellte sich heraus, dass keine der Veranstaltungen * mit meinem Kopfhörer verbunden war. Wie auch immer, +1 - vielleicht hilft es anderen Benutzern.
htorque
+1, funktioniert bei mir, event.valueist zwar geschaltet ... aber die readOperation kehrt erst zurück, wenn sich der Wert ändert ... vielleicht weißt du, wie man es nicht blockiert? Danke trotzdem!
Kevin
Sie fügen hinzu, O_NONBLOCKwenn Sie das Gerät öffnen, und überprüfen den Rückgabewert des read. Wenn dies negativ ist, hätte der Lesevorgang entweder blockiert, oder es ist ein anderer Fehler aufgetreten. Es gibt andere kompliziertere Möglichkeiten, dies ohne Abfragen zu tun, wenn Sie dies in ein größeres Programm integrieren.
Karl Bielefeldt
1

Überprüfen Sie dmesg und andere Protokolldateien. Wahrscheinlich werden beim Ein- und Ausstecken bestimmte Meldungen ausgelöst.

Dann könnten Sie einen Daemon verwenden, um diese Protokolldatei zu analysieren und die Ereignisse zu erkennen. Ich denke du weißt was zu tun ist :)

Pedro Loureiro
quelle
1

Wenn Sie tun

amixer sset 'Speaker' playback 0%

Die Lautsprecherlautstärke wird stummgeschaltet, die Kopfhörer funktionieren jedoch weiterhin. Wenn Sie den Kopfhörer ausstecken, ist kein Ton zu hören. Welches ist fast das, was Sie wollen ...

Wie auch immer ...

Wenn Sie den Lautstärkeregler ändern, wird die Lautstärkeeinstellung für den Lautsprecher erneut vorgenommen. Dies liegt daran, dass pulseaudio versucht, die Lautstärke geschickt einzustellen ( weitere Informationen finden Sie unter http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes ). Wir können jedoch verhindern, dass es mit den Volumes zu schaffen macht.

Öffnen Sie /etc/pulse/default.pa

und finde die Linie

load-module module-udev-detect

und ändere es auf

load-module module-udev-detect ignore_dB=1

Starten Sie pulseaudio neu.

killall pulseaudio

Wenn Sie nun die Lautsprecherlautstärke stumm schalten, hat dies keine Auswirkungen auf die Gesamtlautstärke. Kopfhörer funktionieren also, aber der Lautsprecher bleibt stumm.

StephenPaulger
quelle
Wäre ein anderer Ansatz, aber ich habe leider keinen Lautsprecher-Lautstärkekanal, nur Master und PCM.
htorque
1

Überprüfen Sie die ACPID-Buchse auf Änderungen, die mithilfe von Python oder C- oder Shell-Skript vorgenommen werden können ( Python-Code zur Steuerung der Wiedergabe und Pause des Kopfhörer-Plugins in der Rhythmbox). Überprüfen Sie, ob sich die ACPID-Spannung geändert hat, um zu erkennen, ob ein Kopfhörer angeschlossen oder angeschlossen ist. Es ist jedoch mit einer Verzögerung von Sekunden zu rechnen.

t3pleni9
quelle