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

То, что я хочу, это следующее:

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

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

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

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

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


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

  • Ear Candy: вообще не работал в моей системе. Кажется, заброшенный проект?
  • Код, опубликованный Karl Bielefeldt, может работать на некоторых аппаратных средствах, но не на моем.
  • Идея от Stephen Paulger проваливается из-за отсутствия канала "Speaker".
  • По RobotHumans я заставил его работать, взломав код ядра (после нахождения кода кодека, распознающего домкрат), но это довольно громоздкое решение.

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

9 ответов

Решение

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

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

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

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

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

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

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

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

Больше здесь.

Обновление от 12.04

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

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

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

Установлю свой уровень на 0%

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

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

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

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

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

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

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

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

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

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

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

http://pulseaudio.org/wiki/Modules

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