Ce que je veux, c'est ce qui suit:
Régler les niveaux de volume n’est pas un problème, mais j’ai besoin de le faire lorsque je débranche/branche le casque. Je cherche donc un moyen d’être averti de ces événements.
J'ai rapidement trouvé /proc/asound/card0/codec#0
pour indiquer si des écouteurs sont branchés ou non. J'ai donc essayé de le surveiller à l'aide de inotifywait
et de modifier le niveau du volume en fonction des notifications modifiées . Malheureusement, inotifywait
a échoué car proc n'est pas un système de fichiers ordinaire.
Y a-t-il d'autres moyens de faire cela (peut-être via PulseAudio)?
Périphérique audio: Intel HDA , codec audio: Conexant CX20585 .
Pour résumer ce que j'ai essayé jusqu'à présent:
Donc, je cherche toujours un moyen facile de faire cela.
Au cours de l'UDS pour Oneiric, une session a été consacrée à la détection des prises. Voir le plan pour plus de détails. Il semble que cela fasse exactement ce que je recherche: différents niveaux de volume pour différents périphériques, mais pas sur tous les matériels:
<htorque> Je suis curieux de savoir si je pourrai avoir différents niveaux de volume pour différents appareils (par exemple, un son interne en sourdine, un casque à 75%) dans un avenir proche?
<coling> cela sera supporté (sur certains h/w) oui. Les délais sont "soonish": p
<coling> (je m'attendrais aussi à ce que l'OSD apparaisse (avec le volume actuel) lorsque les prises sont branchées/débranchées)
Mise à jour pour 11.10
Cela devrait maintenant être travaillant dans Oneiric - malheureusement, mon ThinkPad T510 semble être l'un des systèmes qui n'est actuellement pas pris en charge.
Un autre suivi de David Henningsson:
Pour résumer, c’est une fonctionnalité souhaitable, et nous allons dans cette direction, mais lentement, car elle est plus complexe qu’elle ne le semble à première vue.
La bonne nouvelle: dans Ubuntu Oneiric (11.10), cela fonctionne. La mauvaise nouvelle: cela ne fonctionne pas pour tout le monde.
Plus ici .
Mise à jour pour 12.04
Il fonctionne maintenant avec mon ThinkPad T510 (et de nombreux autres modèles) sous Ubuntu 12.04 (version de développement).
Pour définir le niveau de volume à partir de la console, utilisez la commande amixer. Par exemple:
amixer sset Lecture principale 0%
Mettra votre niveau à 0%
Je ne sais pas comment changer cela quand vous branchez vos écouteurs ... mais peut-être que quelqu'un peut vous aider avec ça
Ear Candy a quelques fonctionnalités pour traiter l’insertion/le retrait du casque.
Je ne sais pas combien d'expérience vous avez en matière de codage, mais vous avez mentionné inotifywait
name__, je vais donc supposer que vous êtes au moins à l'aise avec les scripts Shell. Le programme C suivant, basé sur cet article , devrait permettre de détecter le branchement ou le débranchement de votre casque, après quoi vous pourrez effectuer les actions de votre choix.
#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;
}
Le programme prend un argument, qui devrait être un chemin d'accès au périphérique d'événements d'entrée pour vos écouteurs. Il s’agit de /dev/input/event7
pour moi, mais vous devrez peut-être en essayer quelques-uns pour savoir lequel est sur votre système. Vous aurez besoin d'autorisations de lecture sur ce périphérique. Le programme imprimera le nom du périphérique, ainsi que le type, le code et la valeur du premier événement avant de quitter.
Vérifiez dmesg et autres fichiers journaux. Le fait de brancher/débrancher déclenche probablement des messages particuliers.
Ensuite, vous pouvez utiliser un démon pour analyser ce fichier journal et détecter les événements. Je pense que vous savez quoi faire à partir de ce moment :)
Si tu fais
amixer sset 'Speaker' playback 0%
le volume du haut-parleur sera coupé mais les écouteurs continueront à fonctionner. Débrancher le casque signifie pas de son. C'est presque ce que tu veux ...
Cependant ...
Si vous modifiez le contrôle du volume, le réglage du volume du haut-parleur sera à nouveau configuré. C'est parce que pulseaudio essaie d'être intelligent avec le réglage des volumes (Voir http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes pour plus d'informations). Nous pouvons cependant l’empêcher de jouer avec les volumes.
Ouvrez /etc/Pulse/default.pa
et trouver la ligne
load-module module-udev-detect
et le changer en
load-module module-udev-detect ignore_dB=1
Redémarrez pulseaudio.
killall pulseaudio
Désormais, si vous désactivez le volume du haut-parleur, le volume principal ne sera pas affecté. Les écouteurs fonctionneront donc, mais le haut-parleur restera silencieux.
Recherchez des modifications dans le socket ACPID, à l’aide de python ou du script C ou Shell, ( code Python pour contrôler le jeu du plug-in des écouteurs et faire une pause dans la boîte à rythmes). Vérifiez les changements de tension ACPID pour détecter le plug-in et la prise de sortie pour écouteur. Un délai de quelques secondes peut être attendu cependant.
Je pense que vous pourriez obtenir ce dont vous avez besoin en utilisant ceci: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458
Pulseaudio a un module livré par défaut qui est conçu pour atteindre exactement ceci: