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

Я хочу следующее:

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

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

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

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

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

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

Когда я подключаю наушники, я хочу, чтобы звук был отключен и установлен на определенный уровень громкости. Код, написанный Карлом Билефельдтом, может работать на каком-то оборудовании, но это не мое. Когда я отсоединяю наушники, я хочу, чтобы звук был отключен (или установлен на определенный уровень громкости). Мотивировано aking1012. Я заставил его работать, взломав код ядра (после обнаружения чувствительности гнезда код кодека), но это довольно громоздкое решение.

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

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

8 ответов

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

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

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

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

3
ответ дан 25 May 2018 в 23:16

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

2
ответ дан 25 May 2018 в 23:16
  • 1
    Похоже, это просто для USB-наушников ... это правильно? – Mu Mind 6 October 2012 в 03:55

Я не знаю, сколько у вас опыта кодирования, но вы упоминали 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
ответ дан 25 May 2018 в 23:16
  • 1
    К сожалению, ни одно из событий * не было подключено к моим наушникам. В любом случае +1 - возможно, это помогает другим пользователям. – htorque 3 February 2011 в 23:53
  • 2
    +1, работает для меня, event.value действительно переключается ... но операция read возвращает , когда значение изменяется ... может быть, вы знаете, как сделать это не блокирующим? Спасибо, в любом случае! – Kevin 28 June 2013 в 20:57
  • 3
    Вы добавляете O_NONBLOCK при открытии устройства и проверяете возвращаемое значение read. Если он отрицательный, чтение либо заблокировало, либо возникла какая-либо другая ошибка. Существуют и другие более сложные способы сделать это без опроса, если вы включите его в более крупную программу. – Karl Bielefeldt 28 June 2013 в 21:29

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

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

1
ответ дан 25 May 2018 в 23:16

Если вы

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

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

1
ответ дан 25 May 2018 в 23:16
  • 1
    Был бы другой подход, но, к сожалению, у меня нет громкоговорителя громкоговорителей, только Master и PCM. – htorque 8 February 2011 в 22:59

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

1
ответ дан 25 May 2018 в 23:16

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

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

0
ответ дан 25 May 2018 в 23:16

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

0
ответ дан 25 May 2018 в 23:16
  • 1
    Добро пожаловать в Ask Ubuntu! Хотя это теоретически может ответить на вопрос , было бы предпочтительно включить здесь основные части ответа и предоставить ссылку для справки. – Kevin Bowen 5 June 2013 в 06:53

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

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