Chapitre 5. Jouer avec le client simple

À moins que vous n'utilisiez quelquechose come JACKControl, vous n'avez probablement pas noté que le simple client a déjà une connexion entre un port de capture et son entrée, et entre un port playback et sa sortie. jack_lsp permet de vous montrer ces connexions, seulement si vous utilisez l'option -c.

Comment le simple client contrôle t'il ceci ? Jetez un coup d'oeil dans le code source et vous verrez :

     if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == NULL) {
                fprintf(stderr, "Cannot find any physical capture ports\n");
                exit(1);
        }

        if (jack_connect (client, ports[0], jack_port_name (input_port))) {
                fprintf (stderr, "cannot connect input ports\n");
        }

        free (ports);

        if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL) {
                fprintf(stderr, "Cannot find any physical playback ports\n");
                exit(1);
        }

        if (jack_connect (client, jack_port_name (output_port), ports[0])) {
                fprintf (stderr, "cannot connect output ports\n");
        }

        free (ports);

Détaillons juste le premier morceau de code :

    if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == NULL) {
                fprintf(stderr, "Cannot find any physical capture ports\n");
                exit(1);
        }

Regardez aussi cette doc

Documentation for jack_get_ports.

La partie importante est "This function returns a NULL-terminated array of ports that match the specified arguments. The caller is responsible for calling free(3) any non-NULL returned value". Regardons comment ceci est utilisé:

Si la fonction jack_get_ports renvoie la valeur NULL, il n'y a aucun port physique (et simpleclient se termine).

Le premier port sera connecté à notre port d'entrée. Voici la section appropriée:

     if (jack_connect (client, ports[0], jack_port_name (input_port))) {
                fprintf (stderr, "cannot connect input ports\n");
        }

        free (ports);

La fonction principale ici est jack_connect. Son principe est assez clair, il connecte des ports.

La méthode renvoie 0 en cas de succès et un code d'erreur différent de zéro autrement. Il est également intéressant de noter que les ports doivent être donnés de la bonne manière : les flags de chaque port sont vérifiés pour s'assurer que le port de source est un port de sortie et le port de destination est un port d'entrée.

Notez en outre que dans le simple client, nous avons spécifié "jack_port_name (input_port)". Une nouvelle fonction ! C'est parce que la fonction jack_connect s'attend à ce que les ensembles de caractères identifient les ports, c.-à-d. les noms des ports, et non les structures représentant les ports. La fonction jack_port_name trouve simplement le nom de nos port d'entrée. Intéressant, les noms mentionnés ici sont identiques aux noms utilisés avec jack_connect.

Ajoutez la ligne suivante du code quelque part dans le client simple, juste avant que sleep :

    printf("%s\n",jack_port_name (input_port));

Le code sortie-port-connexion fonctionne exactement de la même manière.

Le dernier morceau de code que nous devons détailler est "free (ports);", ceci libère simplement l'espace utilisé par le noms des ports.

Le beep est mono, comment l'avoir en stéréo. Pour cela il faut utiliser le code qui traite de la connection des ports playbacks

if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL) { fprintf(stderr, "Cannot find any physical playback ports\n"); exit(1); } if (jack_connect (client, jack_port_name (output_port), ports[0])) { fprintf (stderr, "cannot connect output ports\n"); } free (ports);

Maintenant, rappelez-vous que jack_get_ports renverra un ensemble de noms de ports (terminés par NULL) basés sur les flags. Dans ce cas-ci, il renverra un ensemble de ports physique de sortie. Ainsi, sur un système standard avec 2 ports de sortie physiques (gauche et droite), nous aurons deux ports dans l'ensemble. Pour faire des signaux sonores stéréo, tout ce que nous devons faire c'est de relier la sortie du simple client à chaque port de l'ensemble trouvé. Voici le code modifié :

	if ((ports = jack_get_ports (client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL) {
		fprintf(stderr, "Cannot find any physical playback ports\n");
		exit(1);
	}
	
	int i=0;
	while(ports[i]!=NULL){
	  if (jack_connect (client, jack_port_name (output_port), ports[i])) {
	    fprintf (stderr, "cannot connect output ports\n");
	  }
	  i++;
	}

	free (ports);

Simple, hein ? Compilez ceci et assurez-vous que cela fonctionne - reliez le métronome, ou n'importe quelle autre source, et utilisez "jack_connect -c" pour voir quels connexion ont été établis.