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

36

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 constaté /proc/asound/card0/codec#0que les écouteurs étaient branchés ou non. J'ai donc essayé de le contrôler en utilisant inotifywaitet de modifier le niveau du volume en fonction des notifications modifiées . Malheureusement inotifywaité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 publié 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 'Speaker'.
  • Motivé par aking1012, je l'ai fait fonctionner en bidouillant dans le code du noyau (après avoir trouvé le code du codec sensible au jack), mais c'est une solution plutôt lourde.

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

htorque
la source
Excellente question, je veux faire ça aussi!
Stephen Paulger
sympa ... mais je pense qu'un correctif à alsa sera nécessaire pour la réponse "instantanée" souhaitée sur plug / unplug. sinon, cela fonctionnerait ou semblerait fonctionner, mais en cas de charge ou dans d’autres conditions, la réponse risque de prendre du retard. pense que vous devez vous placer entre l'événement plug et la bascule de sortie. probablement possible, mais sooooo ne vaut pas un correctif individuel à moins qu’un alsa dev ne s’engage à trunk.
RobotHumans
Une approche consisterait à charger le module dans gdb, à attendre l'arrêt des événements sonores "normaux", à utiliser l'option d'enregistrement, à brancher et débrancher les écouteurs et à voir ce qui s'est passé lors de l'enregistrement de débogage.
RobotHumans
combien de retard êtes-vous à l'aise avec?
RobotHumans

Réponses:

3

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

Luciano Facchinelli
la source
3

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 rapproché?

<coling> cela sera supporté (sur certains h / w) oui. Les échelles de temps sont "soonish": p
<coling> (je m'attendrais aussi à ce que l'OSD soit affiché (avec le volume actuel) lorsque les prises sont branchées / débranchées)

Mise à jour du 11.10

Cela devrait maintenant fonctionner 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:

En bref, c'est une fonctionnalité souhaitable, et nous allons dans cette direction, mais lentement, car la fonctionnalité est plus complexe qu'il n'y parait à 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 du 12.04

Il fonctionne maintenant avec mon ThinkPad T510 (et de nombreux autres modèles) sous Ubuntu 12.04 (version de développement).

htorque
la source
Existe-t-il un suivi du matériel actuellement pris en charge ou quelque chose de similaire?
Mu Mind
2

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

Zacharyliu
la source
1
On dirait que cela ne concerne que les casques USB ... est-ce correct?
Mu Mind
2

Je ne sais pas combien d'expérience vous avez en matière de codage, mais vous avez dit: inotifywaitje suppose que vous êtes au moins à l'aise avec les scripts shell. Le programme C suivant, basé sur cet article , devrait être capable de détecter le branchement ou le débranchement de votre casque, après quoi vous pouvez 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. C’est /dev/input/event7pour 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.

Karl Bielefeldt
la source
Malheureusement, aucun événement * ne s'est avéré connecté à mon casque. Quoi qu'il en soit, +1 - peut-être est-il utile pour les autres utilisateurs.
Htorque
+1, fonctionne pour moi, event.valueest effectivement commuté ... mais l' readopération ne revient que lorsque la valeur change ... peut-être savez-vous comment faire en sorte qu'il ne bloque pas? Merci quand même!
Kevin
Vous ajoutez O_NONBLOCKlorsque vous ouvrez le périphérique et vérifiez la valeur de retour du fichier read. Si le résultat est négatif, la lecture aurait été bloquée ou une autre erreur serait survenue. Il existe d'autres moyens plus compliqués de procéder sans interrogation si vous intégrez ceci dans un programme plus vaste.
Karl Bielefeldt
1

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

Pedro Loureiro
la source
1

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é. Ceci est dû au fait que pulseaudio essaie d’être intelligent avec le réglage des volumes (voir http://pulseaudio.org/wiki/PulseAudioStoleMyVolumes pour plus d’informations). Nous pouvons 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.

StephenPaulger
la source
Ce serait une approche différente, mais malheureusement, je n'ai pas de canal de volume de haut-parleur, mais uniquement de maître et de PCM.
Htorque
1

Vérifiez que le socket ACPID ne contient pas de modifications. Vous pouvez le faire à l’aide de Python, C ou un script shell ( code Python permettant de contrôler la lecture du plug-in des écouteurs et de faire une pause dans rhythmbox). 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.

t3pleni9
la source