Jak automatycznie zmienić poziom głośności podczas odłączania / podłączania słuchawek?


36

Chcę to:

  • Po podłączeniu słuchawek chcę, aby dźwięk był wyciszony i ustawiony na określony poziom głośności.
  • Kiedy odłączam słuchawki, chcę, aby dźwięk był wyciszony (lub ustawiony na określony poziom głośności).

Ustawienie poziomów głośności nie jest problemem, ale jakoś muszę to zrobić po odłączeniu / podłączeniu słuchawek, więc szukam sposobu na powiadomienie o tych zdarzeniach.

Szybko stwierdziłem /proc/asound/card0/codec#0, czy słuchawki są podłączone, czy nie, więc próbowałem to monitorować inotifywaiti zmieniać poziom głośności na podstawie zmodyfikowanych powiadomień. Niestety inotifywaitnie powiodło się, ponieważ proc nie jest zwykłym systemem plików.

Czy są na to inne sposoby (może za pośrednictwem PulseAudio)?

Urządzenie audio: Intel HDA , kodek audio: Conexant CX20585 .


Podsumowując to, co do tej pory próbowałem:

  • Ear Candy: w ogóle nie działał w moim systemie. Wygląda na opuszczony projekt?
  • Kod opublikowany przez Karla Bielefeldta może działać na niektórych urządzeniach, a nie na moich.
  • Pomysł StephenPaulger zawodzi z powodu braku kanału „Głośnik”.
  • Motywowany przez aking1012 Zmusiłem go do włamania się do kodu jądra (po znalezieniu kodu wykrywającego gniazda w kodeku), ale jest to dość kłopotliwe rozwiązanie.

Wciąż szukam łatwego sposobu na zrobienie tego.


Doskonałe pytanie, ja też chcę to zrobić!
Stephen Paulger

fajnie ... ale myślę, że łatka do alsa będzie potrzebna do pożądanej „natychmiastowej” odpowiedzi po podłączeniu / odłączeniu. w przeciwnym razie zadziałałoby lub wydaje się działać, ale pod obciążeniem lub w innych warunkach odpowiedź może się opóźnić. myślę, że musisz wejść pomiędzy zdarzenie plug a przełączanie wyjścia. Prawdopodobnie możliwe, ale nie jest to warte indywidualnej poprawki, chyba że programista alsa twierdzi, że będzie zaangażowany w trunk.
RobotHumans

jednym z podejść byłoby załadowanie modułu do gdb, poczekanie na zatrzymanie „normalnych” zdarzeń dźwiękowych, użycie opcji nagrywania, podłączenie i odłączenie słuchawek oraz sprawdzenie, co się stało w nagraniu debugowania.
RobotHumans

z jakim opóźnieniem czujesz się komfortowo?
RobotHumans

Odpowiedzi:


3

Aby ustawić poziom głośności z konsoli, użyj polecenia amixer. Na przykład:

amixer sset Odtwarzanie główne 0%

Ustawi twój poziom na 0%

Nie wiem, jak to zmienić po podłączeniu słuchawek ... ale może ktoś może ci w tym pomóc


3

Podczas UDS dla Oneiric miała miejsce sesja dotycząca wykrywania gniazd. Szczegółowe informacje zawiera plan . Wygląda na to, że to zrobi dokładnie to, czego szukam: różne poziomy głośności dla różnych urządzeń - ale nie na każdym sprzęcie:

<htorque> coś, co mnie ciekawi: czy w najbliższym czasie będę mógł mieć różne poziomy głośności dla różnych urządzeń (np. wewnętrzny dźwięk wyciszony, słuchawki 75%)?

<coling> to będzie obsługiwane (na niektórych urządzeniach) tak. Skale są „wkrótce”: p
<kolekcja> (oczekiwałbym również, że OSD będzie wyświetlane (z bieżącą głośnością), gdy gniazda są podłączone / odłączone)

Aktualizacja do 11.10

To powinno teraz działać w Oneiric - niestety mój ThinkPad T510 wydaje się być jednym z systemów, które obecnie nie są obsługiwane.

Kolejna kontynuacja Davida Henningssona:

Krótko mówiąc, jest to pożądana funkcja i idziemy w tym kierunku, ale powoli, ponieważ jest ona bardziej złożona, niż się wydaje na pierwszy rzut oka.

Dobra wiadomość: w nadchodzącym Ubuntu Oneiric (11.10) to faktycznie działa. Zła wiadomość: nie działa dla wszystkich.

Więcej tutaj .

Aktualizacja do 12.04

Działa teraz z moim ThinkPadem T510 (i wieloma innymi modelami) w Ubuntu 12.04 (wersja rozwojowa).


Czy jest coś, co śledzi, który sprzęt jest obecnie obsługiwany, czy coś w tym celu?
Mu Mind

2

Ear Candy ma pewną funkcjonalność związaną z wkładaniem / wyjmowaniem słuchawek.


1
Wygląda na to, że dotyczy to tylko słuchawek USB ... czy to prawda?
Mu Mind

2

Nie wiem, ile masz doświadczenia w inotifywaitprogramowaniu , ale wspomniałeś o tym, więc zakładam, że przynajmniej dobrze sobie radzisz ze skryptami powłoki. Poniższy program C, oparty na tym artykule , powinien być w stanie wykryć, że słuchawki są podłączone lub odłączone, po czym możesz wykonać dowolne czynności.

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

Program pobiera jeden argument, który powinien być ścieżką do wejściowego urządzenia zdarzeń dla słuchawek. To jest /dev/input/event7dla mnie, ale być może będziesz musiał spróbować kilku, aby znaleźć, który jest w twoim systemie. Będziesz potrzebował uprawnień do odczytu na tym urządzeniu. Program wydrukuje nazwę urządzenia oraz typ, kod i wartość pierwszego zdarzenia przed wyjściem.


Niestety żadne z wydarzeń * nie okazało się być podłączone do moich słuchawek. W każdym razie +1 - może to pomóc innym użytkownikom.
htorque

+1, działa dla mnie, event.valuejest rzeczywiście przełączony ... ale readoperacja powraca tylko wtedy, gdy wartość się zmienia ... może wiesz, jak to zrobić, aby nie blokować? w każdym razie dzięki!
Kevin

Dodajesz O_NONBLOCKpo otwarciu urządzenia i sprawdzasz wartość zwracaną read. Jeśli jest ujemny, odczyt zostałby zablokowany lub wystąpił inny błąd. Istnieją inne, bardziej skomplikowane sposoby, aby to zrobić bez odpytywania, jeśli włączasz to do większego programu.
Karl Bielefeldt

1

Sprawdź dmesg i inne pliki dziennika. Prawdopodobnie podłączenie / wyłączenie uruchamia niektóre określone wiadomości.

Następnie można użyć demona do przeanalizowania tego pliku dziennika i wykrycia zdarzeń. Myślę, że wiesz co robić od tego momentu :)


1

Jeśli zrobisz

amixer sset 'Speaker' playback 0%

głośność głośnika zostanie wyciszona, ale słuchawki będą działać. Odłączenie słuchawek oznacza brak dźwięku. Co jest prawie tym, czego chcesz ...

Jednak ...

W przypadku zmiany regulacji głośności ustawienie głośności „Głośnik” zostanie ponownie skonfigurowane. Wynika to z tego, że pulseaudio stara się być sprytnym w ustawianiu głośności ( więcej informacji można znaleźć na stronie http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes ). Możemy jednak powstrzymać go od bałaganu z woluminami.

Otwórz /etc/pulse/default.pa

i znajdź linię

load-module module-udev-detect

i zmień na

load-module module-udev-detect ignore_dB=1

Uruchom ponownie pulseaudio.

killall pulseaudio

Teraz, jeśli wyciszysz głośność głośnika, zmiana głośności głównej nie wpłynie na to. Słuchawki będą działać, ale głośnik pozostanie cichy.


Byłoby inne podejście, ale niestety nie mam kanału głośności Głośnika, tylko Master i PCM.
htorque

1

Sprawdź gniazdo ACPID pod kątem zmian, można to zrobić za pomocą Pythona lub C lub skryptu powłoki ( kod Pythona do sterowania odtwarzaniem wtyczki słuchawek i pauzą w Rhythmbox). Sprawdź zmiany napięcia ACPID, aby wykryć wtyczkę i wtyczkę słuchawek. Można się jednak spodziewać sekundowego opóźnienia.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.