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

Мне нужно следующее:

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

Установка уровней громкости не проблема, но мне как-то нужно это делать при отключении / подключении наушников, поэтому я ищу способ получать уведомления об этих событиях.

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

Есть ли другие способы сделать это (возможно, через PulseAudio)?

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


Подводя итог тому, что я пробовал до сих пор:

  • Ear Candy: в моей системе вообще не работал. Кажется, это заброшенный проект?
  • Код, опубликованный Карлом Билефельдом , может работать на каком-то оборудовании, а на моем - нет.
  • Идея из Стивена Полгера проваливается из-за отсутствия канала «Динамик».
  • По мотивам aking1012 я заставил его работать, взломав код ядра (после нахождения кода, чувствительного к гнезду кодека), но это довольно громоздкое решение.

Итак, я все еще ищу простой способ сделать это.

36
задан 13 April 2017 в 15:25

9 ответов

Ear Candy имеет некоторые функции для работы со вставкой / удалением наушников.

0
ответ дан 13 April 2017 в 15:25

Я думаю, вы можете достичь того, что вам нужно, используя это: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458

0
ответ дан 13 April 2017 в 15:25

Pulseaudio имеет модуль, поставляемый по умолчанию, который предназначен для достижения именно этого:

http://pulseaudio.org/wiki/Modules#module-device-restore

0
ответ дан 13 April 2017 в 15:25

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

0
ответ дан 13 April 2017 в 15:25

Во время UDS для Oneiric был сеанс об обнаружении гнезда. См. план для деталей. Похоже, это будет именно то, что я ищу: разные уровни громкости для разных устройств - только не на каждом оборудовании:

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

< coling> это будет поддерживаться (на некоторых ч / б) да. Шкалы времени "скорые": p
< coling> (я также ожидал бы, что экранное меню будет отображаться (с текущей громкостью), когда разъемы подключены / отключены)

[ 1115] Обновление для 11.10

Теперь это должно быть для работы в Oneiric - к сожалению, мой ThinkPad T510, похоже, является одной из систем, которые в настоящее время не поддерживаются.

Еще одно продолжение от Дэвида Хеннингсона:

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

Хорошая новость: в готовящемся Ubuntu Oneiric (11.10) это действительно работает. Плохая новость: это работает не для всех.

Подробнее здесь .

Обновление для 12.04

Теперь оно работает с моим ThinkPad T510 (и многими другими моделями) в Ubuntu 12.04 (версия для разработчиков).

0
ответ дан 13 April 2017 в 15:25

Если вы сделаете

amixer sset 'Speaker' playback 0%

, громкость динамика будет отключена, но наушники продолжат работать. Отключение наушников означает отсутствие звука. Что почти то, что вы хотите ...

Однако ...

Если вы измените регулятор громкости, настройка громкости «Динамик» будет установлена ​​снова. Это потому, что 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

Теперь, если вы отключите громкость динамика, изменение мастер-громкости не повлияет на него. Поэтому наушники будут работать, а динамик будет молчать.

0
ответ дан 13 April 2017 в 15:25

Чтобы установить уровень громкости с консоли, используйте команду amixer. Например:

amixer sset Мастер воспроизведения 0%

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

Я не знаю, как изменить это, когда Вы подключаете свои наушники ... но, возможно, кто-то может помочь вам в этом

0
ответ дан 13 April 2017 в 15:25

Проверьте dmesg и другие файлы журнала. Вероятно, при подключении / отключении запускаются определенные сообщения.

Затем вы можете использовать демон для анализа этого файла журнала и обнаружения событий. Я думаю, вы знаете, что делать с этого момента:)

0
ответ дан 13 April 2017 в 15:25

Я не знаю, сколько кодирования опыта Вы имеете, но Вы упомянули 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 для меня, но Вам, вероятно, придется попробовать некоторых для нахождения, который это находится в системе. Вы должны будете прочитать полномочия на том устройстве. Программа распечатает название устройства, и тип, код и значение первого события перед выходом.

2
ответ дан 13 April 2017 в 15:25

Другие вопросы по тегам:

Похожие вопросы: