Як автоматично змінити рівень гучності при відключенні / підключенні навушників?


36

Мені хочеться:

  • Коли я підключаю навушники, я хочу, щоб звук не було вимкнено і встановлено на певний рівень гучності.
  • Коли я відключаю навушники, я хочу, щоб звук був відключений (або встановлений на певний рівень гучності).

Встановлення рівня гучності не є проблемою, але мені потрібно якось це робити, коли відключати / підключати навушники, тому я шукаю спосіб отримувати сповіщення про ці події.

Я швидко виявив, /proc/asound/card0/codec#0чи є навушники підключені чи ні, тому спробував відстежувати це за допомогою inotifywaitта змінювати рівень гучності на основі модифікованих повідомлень. На жаль, inotifywaitне вдалося, тому що Proc не є звичайною файловою системою.

Чи є інші способи зробити це (можливо, через PulseAudio)?

Аудіопристрій: Intel HDA , аудіокодек: Conexant CX20585 .


Підсумовуючи те, що я намагався до цього часу:

  • Вушні цукерки: у моїй системі взагалі не працювали. Здається, це покинутий проект?
  • Код, опублікований Карлом Білефельдтом, може працювати на певному апаратному забезпеченні, але не на моєму.
  • Ідея StephenPaulger провалюється через відсутність каналу "Speaker".
  • Мотивований aking1012, я змусив його працювати, взломивши код ядра (після того, як знайшов код зондування кодека коду), але це досить громіздке рішення.

Отже, я все ще шукаю простий спосіб зробити це.


Відмінне запитання, я теж хочу це зробити!
Стівен Полгер

приємно ... але я думаю, патч до альси буде необхідний для бажаної "миттєвої" відповіді на підключення / відключення. інакше це спрацювало б, здавалося б, спрацювало, але при навантаженні чи інших умовах реакція може відставати. думаю, вам доведеться вступити між подією плагіну та перемикачем виводу. Мабуть, можливо, але sooooo не вартує індивідуальної основи виправлення, якщо alsa dev не скаже, що це буде здійснено до ствола.
RobotHumans

одним із підходів буде завантаження модуля в gdb, очікування припинення нормальних звукових подій, використання опції запису, підключення та відключення головних телефонів та перегляд того, що сталося під час запису налагодження.
RobotHumans

з якою затримкою вам комфортно?
RobotHumans

Відповіді:


3

Щоб встановити рівень гучності з консолі, використовуйте командний змішувач. Наприклад:

amixer sset Головне відтворення 0%

Установить ваш рівень 0%

Я не знаю, як це змінити, коли ви підключаєте навушники ... але, можливо, хтось може вам у цьому допомогти


3

Під час UDS для Oneiric відбувся сеанс щодо виявлення джека. Детальні відомості див. У кресленні . Здається, це точно зробить те, що я шукаю: різні рівні гучності для різних пристроїв - тільки не на кожному обладнання:

<htorque> щось мені цікаво: чи зможу я скоро мати різний рівень гучності для різних пристроїв (наприклад, внутрішній звук, відключений звук, навушники 75%)?

<Коливання> це буде підтримуватися (на деяку годину / час) так. Часові шкали "скорочуються": p
<дзвонити> (я також очікував, що відображатиметься екранне меню (з поточним обсягом), коли гнізда підключаються / відключаються від мережі)

Оновлення до 11.10

Зараз він повинен працювати в Oneiric - на жаль, здається, що мій ThinkPad T510 є однією із систем, яка наразі не підтримується.

Ще одне спостереження від Девіда Хенінгссона:

Коротше кажучи, це бажана особливість, і ми рухаємось у цьому напрямку, але повільно, оскільки ця функція є складнішою, ніж здається на перший погляд.

Хороша новина: у майбутньому Ubuntu Oneiric (11.10) це насправді працює. Погана новина: працює не для всіх.

Більше тут .

Оновлення за 12.04

Зараз він працює з моїм ThinkPad T510 (та багатьма іншими моделями) в Ubuntu 12.04 (версія розробки).


Чи є що-небудь відстеження, яке обладнання зараз підтримується, або щось для цього?
Mu Mind

2

Ear Candy має певні функціональні можливості для вставки / видалення навушників.


1
Схоже, це лише для USB-навушників ... це правильно?
Mu Mind

2

Я не знаю, скільки у вас є кодування, але ви згадали, inotifywaitтож я припускаю, що вам принаймні зручні сценарії оболонки. Наступна програма C на основі цієї статті повинна мати можливість виявити підключення або відключення навушників, після чого ви можете виконувати всі необхідні дії.

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

Програма бере один аргумент, який має бути шляху до пристрою введення подій для ваших навушників. Це /dev/input/event7для мене, але вам, можливо, доведеться спробувати кілька, щоб знайти, що це у вашій системі. Вам потрібні дозволи на читання на цьому пристрої. Перед виходом програма надрукує ім’я пристрою, тип, код та значення першої події.


На жаль, жодна подія * не виявилася підключеною до моїх навушників. У будь-якому разі +1 - можливо, це допоможе іншим користувачам.
htorque

+1, працює для мене, event.valueдійсно перемикається ... але readоперація повертається лише тоді, коли значення змінюється ... можливо, ви знаєте, як зробити це не блокуючим? все одно, дякую!
Кевін

Ви додаєте, O_NONBLOCKвідкриваючи пристрій, і перевіряєте значення повернення read. Якщо це негативно, читання було б заблоковано, або сталася якась інша помилка. Є й інші складніші способи зробити це без опитування, якщо ви включаєте це у більшу програму.
Карл Білефельдт

1

Перевірте dmesg та інші файли журналу. Можливо, підключення / виведення запускає певні повідомлення.

Тоді ви можете використовувати демон для розбору цього файлу журналу та виявлення подій. Я думаю, ви знаєте, що з цього моменту робити :)


1

Якщо ти зробиш

amixer sset 'Speaker' playback 0%

гучність динаміка буде вимкнено, але навушники працюватимуть далі. Відключення навушників означає відсутність звуку. Що майже те, що ви хочете ...

Однак ...

Якщо ви зміните регулятор гучності, знову буде встановлено гучність 'Speaker'. Це відбувається тому, що pulseaudio намагається бути розумним у встановленні гучності (див. Http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes для отримання додаткової інформації). Однак ми можемо не допустити того, щоб возитися з обсягами.

Відкрийте /etc/pulse/default.pa

і знайдіть лінію

load-module module-udev-detect

і змінити його на

load-module module-udev-detect ignore_dB=1

Перезапустіть pulseaudio.

killall pulseaudio

Тепер, якщо ви вимкнете гучність динаміка, зміна головної гучності на це не вплине. Таким чином, навушники будуть працювати, але динамік буде мовчати.


Був би інший підхід, але, на жаль, у мене немає каналу гучності динаміків, лише Master та PCM.
htorque

1

Перевірте розетку ACPID на наявність змін, це можна зробити за допомогою python або C або скрипту оболонки, ( код Python для управління відтворенням плагінів навушників і пауза на ритмбоксі). Перевірте, чи є зміни напруги ACPID, щоб виявити плагін навушників і вилку навушників. Хоча на секунду можна очікувати затримки.



0

Я думаю, ви можете досягти того, що вам потрібно, використовуючи це: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458


Ласкаво просимо до Ask Ubuntu! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Кевін Боуен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.