Chargement...
 
[Voir/Cacher menus de gauche]
[Voir/Cacher menus de droite]

Dans la foulée des scripts de lancement donnés par Tumulte et pour faire suite au tuto Associer deux cartes son avec Jack, voici à titre d'exemple complet les scripts de lancement qui permettent de choisir les cartes en capture et en playback ainsi que les applications à lancer.

Le premier script (s2c.bash pour Start 2 Cartes)) utilise la commande sed pour connaître la liste des cartes son ainsi que les scripts de lancement d'applications. Pour l'IHM simplifiée il utilise zenity voir l'exemple Scripts bash par Tumulte (par Tumulte).

Son rôle est de choisir une carte en capture, une carte en playback et un script de lancement d'application à l'aide de trois dialogues successifs puis de lancer le script d'application avec en paramètres les deux cartes choisies.
Tout le traitement est délégué aux scripts de lancement d'application, ce qui permet de rester très général.

Les autre scripts sont les scripts de lancement des applications.

Le principe est de définir des scripts de lancement dans des fichiers ayant un nom répondant à la syntaxe suivante :
s2c_*.bash ou * est remplacé par le nom de l'application à lancer, par exemple mon script de lancement d'Audacity aura pour nom s2c_Audacity.bash.

Les scripts de lancement doivent être placés dans un répertoire précis pour pouvoir les localiser. J'ai choisi le répertoire ~/bin qui chez moi est dans le PATH, ce qui permet de lancer mes applications préférées. Mais rien n'empêche de choisir un autre emplacement.

Les scripts de lancement d'application ont la charge de lancer tout ce qui est nécessaire à la bonne exécution d'une ou des applications (lancer jackd, meterbridge, Audacity... et autres). Je donne pour exemple s2c_Audacity.bash mais on peut faire ce qu'on veut dès lors qu'on a besoin d'associer deux cartes son.

En fin de page on trouvera quelques informations sur l'utilisation de la commande sed.

Le script s2c.bash

#!/bin/bash
# script start-2-cartes.bash
#----------------------------------------------------------------------------
# Script de lancement d'applications prenant en compte deux cartes son,
# une carte en capture et l'autre carte en playback, a l'aide d'une saisie des 
# cartes par IHM (zenity)
#----------------------------------------------------------------------------

#--- Etape choix des cartes ----

les_cartes_brutes=/tmp/cartes_brutes
les_cartes=/tmp/cartes

# creation du fichier ${les_cartes} contenant pour chaque carte une ligne 
# formee de 3 colonnes : N° de carte, Nom de carte, Type de carte

# elimination des lignes en trop de /proc/asound/cards (les lignes en trop
# commencent par plein de blancs)...
sed '/               /d' /proc/asound/cards >${les_cartes_brutes}

# nettoyage des lignes 
sed '{s/ //; s/\[//; s/\]://; s/ - .*$// }' ${les_cartes_brutes} > ${les_cartes}

#-- fonction d'IHM permettant de choisir une carte son et de récupérer 
#-- le numero de ligne de la carte dans le fichier ${les_cartes}
#-- on récupère le numéro de la carte choisie auquel on ajoute 1.
function quelle_carte 
{
    numcarte=$(zenity --list \
      --title="Choisissez la carte son en ${1}" --width=400 --height=200\
      --column="Numero" --column="Nom" --column="Type"\
        `cat ${les_cartes}`);
    let ligne=(${numcarte}+1)
}

# recuperation du numero de ligne de la carte choisie en capture
quelle_carte CAPTURE

# recuperation du nom de la carte en capture a partir de son numero de ligne
# dans le fichier ${les_cartes}
capture=$(cat ${les_cartes} | sed -n ${ligne}p | sed "{s/[0-9] //; s/ .*$//}");

# recuperation du numero de ligne de la carte choisie en playback
quelle_carte PLAYBACK

# recuperation du nom de la carte en playback a partir de son numero de ligne
# dans le fichier ${les_cartes}
playback=$(cat ${les_cartes} | sed -n ${ligne}p | sed "{s/[0-9] //; s/ .*$//}");


#--- Etape choix de l'application à lancer ----

# Les applications sont à lancer par des scripts stockés dans le repertoire REP défini
# plus bas.
# Ces script doivent satisfaire trois exigences :
# 	1) avoir pour nom : ${REP}/s2c_*.bash * etant le nom désignant 
#          l'application.
#       2) accepter deux parametres : 
#            le premier désigne le nom de la carte en capture,
#            le deuxieme désigne le nom de la carte en playback.
#       3) être exécutables
#

# Recupère les scripts de lancement des applications dans le repertoire ${REP}
REP=~/bin
rep_ret=`pwd`
cd ${REP}
applis_brutes=`ls s2c_*.bash`
echo ${applis_brutes}
cd ${rep_ret}

# Construit la liste des applications trouvées
applis=`echo ${applis_brutes} | sed 's/s2c_//g' | sed 's/\.bash//g'`
echo ${applis}

# Demande à l'utilisateur de choisir l'application à lancer
appli=$(zenity --list \
      --title="Choisissez l'application à démarrer" --width=200 --height=100\
      --column="Application" ${applis}
	);

# Lance l'application choisie avec en paramètres les deux cartes
${REP}/s2c_${appli}.bash ${capture} ${playback}

# Efface les fichiers temporaires
rm ${les_cartes_brutes}
rm ${les_cartes}

#--fin du script--


Le script s2c_Audacity.bash

Ce script peut être lancé par un autre script ou manuellement pourvu qu'on lui passe en paramètre la carte son en capture et la carte son en playback.

Par exemple :

s2c_Audacity.bash 1 3
ou
s2c_Audacity.bash CODEC Pro

#!/bin/bash
# script s2c_Audacity.bash
#----------------------------------------------------------------------------
# Script de lancement d'Audacity et Qjackctl prenant en compte deux cartes son,
# une carte en capture (parametre 1)  et l'autre carte en playback (parametre 2).
#
# Après ce lancement il suffit de mettre Audacity en pause et de cliquer
# sur enregistrement pour voir apparaître les connexions entre PortAudio et
# system. PortAudio est l'interface entre Audacity et jackd et system est le 
# client Jack composé des deux cartes son.
#----------------------------------------------------------------------------

#-- Les cartes son peuvent être connues par la commande : cat /proc/asound/cards.
#-- On utilise les noms plutot que les numéros car les cartes USB peuvent être
#-- détectées dans n'importe quel ordre.

#-- La carte en capture.
capture=${1}
echo capture = ${capture}
#-- La carte en playback.
playback=${2}
echo playback = ${playback}

function configure_audacity 
{
    #-- La fonction "configure_audacity" remplace trois paramètres 
    #-- dans la section [AudioIO] du fichier de configuration d'audacity.
    #
    #-- ${1} premier paramètre pour le paramètre Host,
    #-- ${2} deuxième paramètre pour le paramètre RecordingDevice,
    #-- ${3} troisième paramètre pour le paramètre PlaybackDevice.

    #-- Les fichiers temporaires seront stockés dans TMP, notamment les  
    #-- fichiers sed-audacity.bash et audacity.cfg-new.
    TMP=/tmp

    #-- Le fichier de configuration d'audacity est CONF.
    CONF=~/.audacity-data/audacity.cfg

    #-- Construction du script de remplacement sed-audacity.bash dans TMP.
    #-- La construction se fait à l'aide de sed, en trois passes au moyen 
    #-- de pipe "|", une passe par paramètres.
    #-- Il y a sûrement moyen de faire mieux :-)

    #-- Remplacement de la valeur du paramètre Host par ${1}.
    echo "sed 's/Host=.*$/Host=${1}/g' ${CONF} |\\" > ${TMP}/sed-audacity.bash

    #-- Remplacement de la valeur du paramètre RecordingDevice par ${2}.
    echo "sed 's/RecordingDevice=.*$/RecordingDevice=${2}/g'|\\" >> ${TMP}/sed-audacity.bash

    #-- Remplacement de la valeur du paramètre PlaybackDevice par ${3}.
    echo "sed 's/PlaybackDevice=.*$/PlaybackDevice=${3}/g' >${TMP}/audacity.cfg-new" >> ${TMP}/sed-audacity.bash

    #-- Lancement du remplacement.
    bash -f ${TMP}/sed-audacity.bash

    #-- Destruction du script de remplacement.
    rm ${TMP}/sed-audacity.bash

    #-- Sauvegarde de audacity.cfg en audacity.cfg-old 
    #-- et remplacement par audacity.cfg-new.
    cp ${CONF} ${CONF}-old 
    mv ${TMP}/audacity.cfg-new ${CONF};
}

#-- Les paramètres de jackd peuvent être connus par : man jackd.
#-- Lancement de jackd en arrière plan (avec "&" en fin de commande).
#-- jackd crée un client "system" composé des deux cartes ${capture} 
#-- et ${playback} avec les paramètres physiques suivants :

    priorite=70
    rate=44100
    sample=256
    period=2

jackd -P ${priorite} -d alsa -C hw:${capture}  \
                             -P hw:${playback} \
                             -r ${rate}        \
                             -p ${sample}      \
                             -n ${period} &

#-- Récupération de l'ID de jackd.
jackd_ID=$!

#-- Attente pendant une seconde que jackd se mette en place.
sleep 1

#-- Lancement de Qjackctl en arrière plan ("&" en fin de commande).
#-- Qjackctl va prendre jackd déjà lancé et ignorera les réglages 
#-- définis dans une précédente session.
qjackctl &

#-- Récupération de l'ID de qjackctl.
qjackctl_ID=$!

#-- Attente pendant une seconde que qjackctl se mette en place.
sleep 1

#-- Lancement du paramétrage d'Audacity à l'aide de la fonction
#-- configure_audacity définie plus haut avec les paramètres suivants :
#--   Host            = JACK Audio Connection Kit
#--   RecordingDevice = system
#--   PlaybackDevice  = system
configure_audacity "JACK Audio Connection Kit" system system

#-- Lancement d'Audacity en arrière plan ("&" en fin de commande).
audacity &

#-- Récupération de l'ID de Audacity.
audacity_ID=$!

#-- Attendre que Qjackctl se termine.
wait ${qjackctl_ID}

#-- Arrêt de jackd.
kill -s KILL ${jackd_ID}

#-- Arrêt d'audacity s'il n'est pas déjà arrêté.
kill -s KILL ${audacity_ID}

#-- Fin du script --


La partie délicate est l'utilisation de sed qui est assez complexe car très puissant. Sed a pour avantage la concision, ce qui permet de faire en une ligne l'équivalent de plusieurs dizaines de lignes de script.

Par exemple la commande :
sed '/               /d' /proc/asound/cards >${les_cartes_brutes}

permet d'éliminer les lignes en trop du fichier /proc/asound/cards.

Sed lit les lignes du fichier et s'il rencontre une suite de blancs, élimine la ligne. Le résultat final est stocké dans le fichier dont le nom est contenu dans la variable ${les_cartes_brutes}.

La commande :
sed '{s/ //; s/\[//; s/\]://; s/ - .*$// }' ${les_cartes_brutes} > ${les_cartes}

Elimine le premier blanc des ligne
s/ //
élimine le caractère s/\[//élimine les caractères " rel="">
s/\[//
élimine les caractères
:
s/\]://
puis élimine depuis les caractères " - " jusqu'à la fin de la ligne ".*$" avec
s/ - .*$//

En fait la commande s/c// remplace le caractère c par rien. La syntaxe est la suivante : s/chaine à trouver/chaine à substituer/

Les caractères ésotériques :
.*$
signifient tous les caractères jusqu'à la fin de la ligne.

Pour se documenter sur sed : http://www.grymoire.com/Unix/Sed.html en anglais,
et entre autre : http://www.commentcamarche.net/faq/5588-sed-substitution en français.


[+]

Collaborateur(s) de cette page : olinuxx , utilisateur_anonyme , pianolivier et cjpsimon .
Page dernièrement modifiée le Vendredi 06 novembre 2015 14:47:59 par olinuxx.
Le contenu de cette page est licencié sous les termes licence.

Documentation [Afficher / Cacher]

Faire un don
[Afficher / Cacher]

Connexion
[Afficher / Cacher]


Mégaphone [Afficher / Cacher]

calixtus06, 12:46, mer. 11 Dec 2024: Bonjour et bienvenue à EtienneMAG7 :-)
calixtus06, 08:35, mer. 27 Nov 2024: Bonjour et bienvenue à remjai :-)
olinuxx, 18:41, jeu. 21 Nov 2024: Bonjour et bienvenue à CHV
calixtus06, 12:08, jeu. 21 Nov 2024: Bonjour et bienvenue à Istvan et Fass :-)
allany, 08:09, lun. 18 Nov 2024: @bda : ça fait plaisir mais il faut aussi remercier r1, sub26nico, calixtus06 et olinuxx sans qui l'édito mensuel ne serait pas. Un vrai travail d'équipe, quoi !
olinuxx, 21:42, dim. 17 Nov 2024: Bonjour et bienvenue à nounours 04 cool
bda, 20:09, ven. 15 Nov 2024: Merci allany, ton édito me réchauffe :-)
olinuxx, 18:58, jeu. 14 Nov 2024: Bonjour et bienvenue à Ereintefer cool
olinuxx, 14:28, lun. 11 Nov 2024: Bonjour et bienvenue à UMusique cool
calixtus06, 14:31, jeu. 07 Nov 2024: Bonjour et bienvenue à Niko80lille :-)
allany, 17:31, mer. 06 Nov 2024: Pas de chichis, pas de cérémonial, juste l'éditorial ! [Lien]
calixtus06, 18:51, lun. 28 Oct 2024: Bonjour et bienvenue à dawaninja :-)