web-dev-qa-db-fra.com

Comment changer automatiquement le niveau de volume lors du débranchement / du branchement d'un casque?

Ce que je veux, c'est ce qui suit:

  • Lorsque je branche mes écouteurs, je veux que le son soit non-muet et réglé sur un niveau de volume spécifique.
  • Lorsque je débranche mon casque, je veux que le son soit coupé (ou réglé sur un niveau de volume spécifique).

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:

  • Ear Candy: ça ne fonctionnait pas du tout sur mon système. Semble être un projet abandonné?
  • Le code posté par Karl Bielefeldt pourrait fonctionner sur du matériel, mais pas sur le mien.
  • L'idée de StephenPaulger échoue en raison de l'absence d'un canal "Président".
  • Motivé par aking1012 Je l'ai fait en cherchant dans le code du noyau (après avoir trouvé le code de détection de prise du codec), mais c'est une solution plutôt lourde.

Donc, je cherche toujours un moyen facile de faire cela.

36
htorque

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).

3
htorque

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

3
Luciano Facchinelli

Ear Candy a quelques fonctionnalités pour traiter l’insertion/le retrait du casque.

2
zacharyliu

Je ne sais pas combien d'expérience vous avez en matière de codage, mais vous avez mentionné inotifywaitname__, 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.

2
Karl Bielefeldt

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 :)

1
Pedro Loureiro

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.

1
Stephen Paulger

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.

1
t3pleni9

Je pense que vous pourriez obtenir ce dont vous avez besoin en utilisant ceci: https://bbs.archlinux.org/viewtopic.php?pid=1105458#p1105458

0
Zilmar

Pulseaudio a un module livré par défaut qui est conçu pour atteindre exactement ceci:

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

0
towolf