Chargement...
 
Skip to main content

1 - Le matériel et les pilotes ALSA, FFADO, ...


[FAIT] Changement aléatoire du bus ID de l'usb

France
Bonjour, je recopie ici un truc que j'ai posté par ailleurs sur un autre site. Si quelqu'un veut le bouger dans les astuces (section adéquate), y apporter une modif ou si vous pigez pas, mal ou n'arrivez pas à le faire tourner, je le laisse aussi ici parce que ça permet d'en causer plus facilement.

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

Avec linux, beaucoup de gens râlent à propos de l'usb qui est très capricieux. Alors oui. Mais non. Il se trouve que je viens d'être confronté au problème et qu'il est possible que j'ai une solution viable.

1) le souci: L'usb est fiable, en fait. Par contre, ce qui l'est moins, fonction du bios voire du chipset usb utilisé, c'est le numéro ID des bus usb. Si vous avez fait un lsusb pour connaître le numéro ID du bus sur lequel vous branchez toujours votre interface audio (admettons le bus 3), vous avez vraisemblablement dû mettre "usb3" dans votre rtirq, comme on vous le dit partout à longueur de net; c'est mieux que de mettre "usb" tout court parce que ça ne donne la haute priorité qu'à ce bus là sur lequel vous ne branchez rien d'autre et du coup ça évite de donner une priorité 80 à votre combo clavier souris ainsi qu'à cette superoouaibcam que vous avec branché il y a 18 mois et qui n'a jamais servi. Jusque là tout est ok sauf que des fois l'interface se comporte comme si elle n'était pas en haute priorité. La raison? L'affectation du bus ID n'est pas fixe (chez moi il alterne selon les démarrages entre le 1 et le 3). pour le vérifier, faites un lsusb à chaque démarrage et vérifiez que le bus ID du port usb de votre interface a toujours le même numéro.

2) si ce n'est pas le cas, voici un script maison qu'il vous faudra adapter:


------------------------------------------
Copy to clipboard
#!/bin/bash usb=$(lsusb | grep EGO | cut -c7) ((a = 1)) ((b = 3)) if (("$usb"=="$a")) then rm /etc/default/rtirq & cp /etc/default/rtirq1 /etc/default/rtirq elif (("$usb"=="$b")) then rm /etc/default/rtirq & cp /etc/default/rtirq3 /etc/default/rtirq fi /etc/init.d/rtirq restart

--------------------------------------------

-Première ligne, on touche pas.
-deuxième ligne, une variable (nommé "usb") dont la valeur sera le 7° caractère de la ligne contenant la suite de caractères EGO quand on fait un lsusb. C'est cette suite de caractère qu'il faut adapter. Vous faites un lsusb manuel dans une console, dans les lignes qui s'affichent vous cherchez celle de votre interface et vous choisissez dans cette ligne une suite de caractères qui ne se trouve pas dans les autres lignes et vous remplacez mon EGO par cette suite de caractères TELLE QU'ELLE APPARAIT dans le lsusb.

-a et b sont deux valeurs de comparaison (en l'occurrence les différentes ID que prend le bus usb). Si chez vous le bus est des fois ID2 des fois ID 4, vous remplacez 1 par 2 et 3 par 4 et s'il y a une troisième valeur vous faites ((c==X)) où X représente la troisième ID.

-à partid du if, on compare la variable (donc la valeur effective du bus ID) avec a et b. (écentuellement c). si la variable est égale à a alors on remplace /etc/default/irq par un fichier rtirq1 que l'on renomme rtirq; si la variable est égale à b on remplace par un fichier rtirq3 qu'on renomme rtirq (et pour c on rajoute

Copy to clipboard
elif (("$usb"=="$c")) then rm /etc/default/rtirq & cp /etc/default/rtirqX /etc/default/rtirq


avant le fi qui termine le cycle d'instructions).

La dernière ligne relance la lecture du rtirq.


En parallèle, il vous faut aussi créer deux copies de votre rtirq, dans /etc/default/rtirq1 vous aurez la ligne RTIRQ_NAME_LIST="rtc usb1" et dans /etc/default/rtirq3 vous aurez la ligne RTIRQ_NAME_LIST="rtc usb3". Si vous êtes sous debian, vous enregistrez mon script /etc/init.d/sardonicus_saved_my_life, vous le rendez exécutable (chmod a+x) et vous faites un lien symbolique vers un runlevel avec un numéro très élevé ou bien, plus simple, vous éditez /etc/rc.local et vous ajoutez "/etc/init.d/sardonicus_saved_my_life" (sans les guillemets) avant le "exit 0". Pour les autres distros, faites une recherche sur la manière de lancer un script pendant la phase de boot mais arrangez vous pour qu'il n'intervienne pas AVANT le script rtirq d'origine!!! Redémarrez votre machine, ou mieux puisqu'on n'est pas sous windows, lancez le script et hop ça marche, cette fois ci en manuel mais dès le prochain reboot ce sera transparent et automatique.
France
Chouette astuce. Pas compliquée à mettre en œuvre, et qui peut en aider plus d'un ici.

Pour info, j'ai édité ton message pour qu'il s'affiche correctement (utilise la fonction de prévisualisation la prochaine fois).

Je suis d'accord avec toi, on peut laisser cette astuce dans le forum pour l'instant, histoire qu'elle soit discutée si besoin, et puis on pourra en faire une page de documentation ensuite.

Encore merci pour le partage de cette astuce bien utile !
France
Merci! De rien! J'en ai un peu ch... pour avoir qq chose de présentable ici (pas l'habitude...), tu as bien fait. Je réfléchis à un moyen d'automatiser encore plus (comment récupérer automatiquement l'identifiant de l'interface) histoire de n'avoir qu'un script sans intervention humaine à mettre en place et éventuellement pouvoir en faire un paquet Pour les distro majeures et sérieuses (la tienne et débian donc 😊 ). Work in progress donc.
France
Merci sardonicus pour l'astuce, elle sera sûrement plus utile ici
que sur le forum de R...., mince, faut pas le dire....Ah si,
j'oubliais, ici on a le droit de le prononcer, Reaper 😉.
Et c'est super de partager ça et de contribuer ici.

Je ne me souviens pas d'avoir été confronté à ce problème mais il est possible
que, les rares fois où j'ai eu des soucis de reconnaissance de ma carte son usb,
le numéro ID en soit la cause. Je vais surveiller ça de plus près du coup.
France
😊 Belle avoinée AFienne... Concernant le souci USB, j'ai mis du temps à me rendre compte qu'il y avait CE problème pour la simple et bonne raison qu'en bon vieux con de 51 balais, j'ai pour réflexe de bosser avec peu de pistes (de 12 à 24 grand max en moyenne) et sans instru virtuels ou alors à dose homéopathique. De fait, ma bécane ne rame jamais puisque je reste dans du light niveau utilisation des ressources. Ca m'est donc arrivé avec un projet où j'ai dû cherché des sons sur des instrus virtuels qui pompaient bien et là ça c'est mis à patiner (alors que ça n'aurait pas dû).
France
Bon, première petite modif qui simplifie (pas besoin d'identifier la carte avec précision si vous n'avez qu'une seule interface audio):

Il faut remplacer

usb=$(lsusb | grep EGO | cut -c7)

par

usb=$(cat /proc/asound/card0/usbbus | cut -c3)

qui récupère d'office l'ID du bus usb sur lequel se trouve l'interface.

La première solution reste viable si vous avez une interface usb et un chipset intégré actif et que vous n'avez pas donné la priorité à l'interface usb (soit snd-usb-audio index=-1 ou -2 dans /etc/modprobe.d/alsa-base.conf).

Je fais un essai de suite et je viens raconter le comment du quoi. A de suite!
France
Bon, je viens de tester. 3 redémarrages, les deux premiers en USB3 et le troisième en USB1. Le changement sur le script fonctionne parfaitement, ce qui supprime l'obligation d'identifier l'interface avec précision. Reste juste à trouver un moyen élégant de modifier le RTIRQ_NAME_LIST="rtc usbX" dans le rtirq plutôt que de faire une copie; pour mon cas, la copie est plus propre (pas de risque d'erreur) mais je présume que c'est pas la méthode la plus orthodoxe de faire.
France
Variante du jour 😊

Copy to clipboard
#!/bin/bash usb=$(cat /proc/asound/card0/usbbus | cut -c3) ((a = 1)) ((b = 3)) if (("$usb"=="$a")) then cat /etc/default/rtirq | sed -i -e "s/rtc usb3/rtc usb$usb/g" /etc/default/rtirq elif (("$usb"=="$b")) then cat /etc/default/rtirq | sed -i -e "s/rtc usb1/rtc usb$usb/g" /etc/default/rtirq fi /etc/init.d/rtirq restart


Avantage: Pas besoin de fichier de remplacement, on remplace directement l'ID dans le rtirq d'origine (pour peu que l'on ait bien RTIRQ_NAME_LIST="rtc usb3 (ou usb1) suivi de ce que l'on veut mais au moins "rtc usb au début)
Inconvénient: faut que je prévois plus de cas... Je reviens!
France
Nouvel essai, je pense définitif. Prévu pour 8 bus USB distincts, intervient directement sur le fichier /etc/default/rtirq sans aucune intervention autre que d'avoir son interface usb en priorité 0. Chez moi, ça tourne nickel. Si quelqu'un peut faire des essais et reporter les éventuelles conneries, ça m'arrangerait. Pensez quand même à sauvegarder votre rtirq avant!

Copy to clipboard
#!/bin/bash usb=$(cat /proc/asound/card0/usbbus | cut -c3) ((a = 1)) ((b = 2)) ((c = 3)) ((d = 4)) ((e = 5)) ((f = 6)) ((g = 7)) ((h = 8)) if (("$usb"=="$a")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb1/g" /etc/default/rtirq elif (("$usb"=="$b")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb2/g" /etc/default/rtirq elif (("$usb"=="$c")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb3/g" /etc/default/rtirq elif (("$usb"=="$d")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb4/g" /etc/default/rtirq elif (("$usb"=="$e")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb5/g" /etc/default/rtirq elif (("$usb"=="$f")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb6/g" /etc/default/rtirq elif (("$usb"=="$g")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb7/g" /etc/default/rtirq elif (("$usb"=="$h")) then cat /etc/default/rtirq | sed -i -e "s/usb[1-8]/usb8/g" /etc/default/rtirq fi /etc/init.d/rtirq restart


Voilà! On rend exécutable et on s'arrange pour lancer le bouzin après le lancement de rtirq.

Moi content!
France
Et bien quand "t'as une idée dans la tête, tu ne l'as pas ailleurs" (comme disait ma grand mère quand j'étais gamin) ! 😀

Merci pour ce partage.
France
De rien. En tant que tel, je pense que ça peut passer dans les astuces, non? Fautdrait que je me penche sur la faisabilité d'un paquet .deb dans un avenir proche, ça simplifierait l'install pour les debiano-libraziko-boubounteux réfractaires à la ligne de commande (à ce hors sujet, je ne saurais trop conseiller MC comme gestionnaire de fichiers principal. C'est bien, MC: 20 ans de service et jamais eu à le regretter).
Bonjour,

sauf erreur tu dois pouvoir simplifier ta dernière version ainsi :

Copy to clipboard
#!/bin/bash usb=$(cat /proc/asound/card0/usbbus | cut -c3) sed -i -e '/^RTIRQ_NAME_LIST=/s/usb[1-9]/"${usb}"/' /etc/default/rtirq /etc/init.d/rtirq restart

Oups, voilà une version corrigée 😀)

Copy to clipboard
sed -i '/^RTIRQ_NAME_LIST=/s/usb[1-9]/"usb${usb}"/' /etc/default/rtirq

France
J'avais commencé par là mais ça ne donne pas le résultat escompté.

Exemple de sortie avec cette version du script chez moi:

Copy to clipboard
Setting IRQ priorities: start [rtc] irq=8 pid=53 prio=90: OK. Setting IRQ priorities: start [uhci_hcd] irq=16 pid=103 prio=88: OK. Setting IRQ priorities: start [uhci_hcd] irq=17 pid=104 prio=87: OK. Setting IRQ priorities: start [uhci_hcd] irq=18 pid=105 prio=86: OK. Setting IRQ priorities: start [uhci_hcd] irq=18 pid=108 prio=85: OK. Setting IRQ priorities: start [uhci_hcd] irq=19 pid=107 prio=85: OK. Setting IRQ priorities: start [uhci_hcd] irq=23 pid=106 prio=84: OK. Setting IRQ priorities: start [ehci_hcd] irq=18 pid=110 prio=88: OK. Setting IRQ priorities: start [ehci_hcd] irq=23 pid=116 prio=87: OK.



Il met TOUS les usb en haute priorité. C'est justement ce que je ne veux pas. Alors, certes, cette version du script devrait THEORIQUEMENT marcher comme on l'attend mais, pour la raison qu'il insère RTIRQ_NAME_LIST="rtc "usb${usb}"" dans le rtirq au lieu de RTIRQ_NAME_LIST="rtc usbX", ben ça sort de la M...

Pour comparaison, ma dernière version du script sort:

Copy to clipboard
Setting IRQ priorities: start [rtc] irq=8 pid=53 prio=90: OK. Setting IRQ priorities: start [usb1] irq=16 pid=103 prio=88: OK.


uniquement et c'est ce qui est attendu.
étonnant ! 😀)
ça doit être lié à une différence de config entre nos deux installations !?

par curiosité, est-ce que tu pourrais me dire le résulat de ces deux commandes :

Copy to clipboard
cat /proc/asound/card?/usbbus


et :

Copy to clipboard
grep ^RTIRQ_NAME_LIST /etc/rtirq.conf /etc/default/rtirq


c'est vraiment juste par curiosité de comprendre, comme ton script fonctionne on va pas le casser,
"quand ça marche c'est pas la peine de réparer" 😉
France
Copy to clipboard
cat /proc/asound/card?/usbbus


001/002
(soit "le bus/l'identifiant sur le bus")



Copy to clipboard
grep ^RTIRQ_NAME_LIST /etc/rtirq.conf /etc/default/rtirq


Copy to clipboard
grep: /etc/rtirq.conf: Aucun fichier ou dossier de ce type /etc/default/rtirq:RTIRQ_NAME_LIST="rtc usb1"



Logique, vu que debian contre ce qui me semble être une arch 😉
Bon, hum, comment dire, en recopiant mon brouillon je m'étais mélangé dans
les quotes simples/doubles entre ta version originale et la mienne sur le urxv term à côté 😀)

Copy to clipboard
#!/bin/bash usb=$(cat /proc/asound/card?/usbbus | cut -c3) sed -i '/^RTIRQ_NAME_LIST=/s/usb[1-9]/usb'${usb}'/' /etc/default/rtirq /etc/init.d/rtirq restart


testé chez-moi (en changeant le fichier cible et le init-script pour ma distro Slackware, ci-dessus adapté pour ta Debian 😉

ça devrait mieux te plaire 😊
France
Ha ben là ça me plait complètement, oui!

Joli, sobre, élégant au sens mathématique. Merci!
France
@Sardonicus, j'ai édité certains de tes messages pour les mettre en forme, notamment avec la balise de CODE :
Note modération : merci d'utiliser la balise CODE lorsque tu copies/colles du code sur le site. Celles-ci permettent un meilleur affichage.
Lmao Code
Voir également cette page.


Chouette ce script. Bientôt prêt à être mis en astuce/tuto dans le wiki au rythme où ça avance 😎
France
Yep, j'y penserai aussi pour les lignes de commande et les sorties consoles, désolé.

Reste à voir si certaines CM ont plus de 10 bus usb (auquel cas, ça risque de compliquer sérieusement les choses). Chez moi, le max c'est 8 mais c'est au mieux 4 cas (deux fixes, deux portables) et vu la flopée de cartes mères...
France
sardonicus écrit:
Reste à voir si certaines CM ont plus de 10 bus usb (auquel cas, ça risque de compliquer sérieusement les choses). Chez moi, le max c'est 8 mais c'est au mieux 4 cas (deux fixes, deux portables) et vu la flopée de cartes mères...


Très bonne remarque. Y'a pas moyen de remplacer les "((a = 1)), ((b = 2)),..." par une énumération automatique ?
Page: 1/3  [Suivant]
1  2  3