Я хочу следующее:
Когда я подключаю наушники, я хочу, чтобы звук был отключен и установлен на определенный уровень громкости. Когда я отсоединяю наушники, я хочу, чтобы звук был отключен (или установлен на определенный уровень громкости).Настройка уровней громкости не является проблемой, но мне как-то нужно это делать, когда вы не подключаете наушники, поэтому я ищу способ получить уведомление об этих событиях. [!d4 ]
Я быстро обнаружил, что /proc/asound/card0/codec#0 указывает, подключены ли наушники или нет, поэтому я попытался контролировать его с помощью inotifywait и изменить уровень громкости на основе измененных уведомлений.
Существуют ли другие способы сделать это (возможно, через PulseAudio)?
Аудиоустройство: Intel HDA, аудиокодек: Conexant CX20585.
Подводя итог тому, что я пробовал до сих пор:
Когда я подключаю наушники, я хочу, чтобы звук был отключен и установлен на определенный уровень громкости. Код, написанный Карлом Билефельдтом, может работать на каком-то оборудовании, но это не мое. Когда я отсоединяю наушники, я хочу, чтобы звук был отключен (или установлен на определенный уровень громкости). Мотивировано aking1012. Я заставил его работать, взломав код ядра (после обнаружения чувствительности гнезда код кодека), но это довольно громоздкое решение.Итак, я все еще ищу легкий способ сделать это.
Чтобы установить уровень громкости с консоли, используйте команду amixer. Например:
amixer sset Мастер-воспроизведение 0%Устанавливает ваш уровень на 0%
Я не знаю, как это изменить, когда вы подключаетесь ваши наушники ... но, возможно, кто-то может помочь вам с этим
Ухо 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 для меня, но вам, возможно, придется попробовать несколько, чтобы найти, что находится в вашей системе. Вам понадобятся права на чтение на этом устройстве. Программа выведет имя устройства, а также тип, код и значение первого события перед выходом.
Проверьте dmesg и другие файлы журналов. Вероятно, включение / выключение некоторых сообщений.
Затем вы можете использовать демон для анализа этого файла журнала и обнаружения событий. Я думаю, вы знаете, что делать с этого момента:)
Если вы
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 для управления воспроизведением и паузой в наушниках в ритм-боксе). Проверьте изменения напряжения ACPID, чтобы обнаружить плагин для наушников и разъем для наушников. Можно ожидать задержку в секундах.
У Pulseaudio есть модуль, отправленный по умолчанию, который предназначен для достижения именно этого:
http://pulseaudio.org/wiki/Modules#module-device-restore
Я думаю, вы можете достичь того, что вам нужно, используя это: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458