Chargement...
 
Skip to main content

5 - Les serveurs son : JACK, PipeWire, PulseAudio et autres...


afficher les x-runs dans un terminal[résolu]

France
Bonjour,
y a-t-il une commande pour être informé, dans un terminal, des décrochages(x-runs) ?
Je compte faire apparaître ces décrochages dans le "post window" de superCollider.

damien
France
re-
j'ai trouvé ça sur GitHub
je vais tâcher de comprendre comment s'en servir..
France
Alors..
j'ai le code suivant qui fonctionne très bien dans un terminal.. malheureusement pas avec la commande "/path/to/./xruncounter".unixCmd de superCollider.

Copy to clipboard
#include "stdio.h" #include "errno.h" #include "unistd.h" #include "signal.h" #include "stdlib.h" #include "jack/jack.h" /* gcc -Wall xruncounter.c -lm `pkg-config --cflags --libs jack` -o xruncounter */ jack_client_t *client; void jack_shutdown (void *arg) { exit (1); } int jack_xrun_callback(void *arg) { /* count xruns */ static int xruns = 0; xruns += 1; fprintf (stderr, "xrun %i \n", xruns); return 0; } void signal_handler (int sig) { jack_client_close (client); fprintf (stderr, " signal received, exiting ...\n"); exit (0); } int main (int argc, char *argv[]) { if ((client = jack_client_open ("xruncounter", JackNullOption, NULL)) == 0) { fprintf (stderr, "jack server not running?\n"); return 1; } signal (SIGQUIT, signal_handler); signal (SIGTERM, signal_handler); signal (SIGHUP, signal_handler); signal (SIGINT, signal_handler); jack_set_xrun_callback(client, jack_xrun_callback, 0); jack_on_shutdown (client, jack_shutdown, 0); if (jack_activate (client)) { fprintf (stderr, "cannot activate client"); return 1; } while (1) { usleep (100000); } jack_client_close (client); exit (0); }

un programme de type 'hello_world' imprime comme il faut son message avec "/path/to/./hello_world".unixCmd dans supercollider
Copy to clipboard
#include "stdio.h" #include "errno.h" #include "unistd.h" #include "signal.h" #include "stdlib.h" #include "jack/jack.h" int main(void) { int i; fprintf(stderr, "Hello world! %i \n", 666); }


je vais encore gratter un peu mais le résultat attendu semble pas loin
France
Suite et fin, ça fonctionne très bien. Je n'avais pas précisé l'os est librazik4 et il important d'installer les paquets libjack-jackd2-dev et gcc.

La fonction : jack_xrun_callback change un peu :

Copy to clipboard
int jack_xrun_callback(void *arg) { /* count xruns */ static int xruns = 0; xruns += 1; fprintf (stdout, "!xrun %i \n", xruns); fflush(stdout); // permet au subshell d'imprimer sur stdout return 0; }

France
Bravo à toi dawamss.
Et merci d'avoir partagé tout ceci avec tout le monde ici même.

Par curiosité, à quoi ça te sert de faire apparaître les décrochages audio dans supercollider ? C'est pour monitorer ton système ?
France
plusieurs raisons à ça :
l'IDE officiel de superCollider affiche dans un cadre la conso DSP. C'est très pratique dans la phase d'élaboration de SynthDef et Pdef.. Aussi, au moment de booter le server 'SCSynth', s'il n'y a pas d'instance de jack ouverte, SC va démarrer jack dans son coin.. on aura pas de retour de xrun à ce moment là. L'idéal serait d'intégrer un nouveau cadre 'xrun' dans l'IDE.. je n'ai pas les compétences pour ça.
Aussi, même si Cadence (ou autre) est ouvert, j'utilise principalement SC en mode plein écran, je trouve pratique/suffisant d'avoir un retour dans le 'post window'. Il y a un fort potentiel des xruns lors de certaines étapes de sauvegarde : Archive.write, SynthDef().store...
Je développe un programme (sous SC) que je commence à proposer en 'beta'. Donc autant d'ordinateurs que de config différentes. Encore une fois, il me semble pratique d'avoir ce retour d'informations sans avoir à surveiller Cadence ou autre.

Ce petit bout de code devrait encore subir une 'amélioration' : j'aimerai, à la place d'imprimer sur stdout, envoyer ce message via OSC. Ce serait pratique pour les config 'headless' et correspondrai mieux aux pratiques de SC. Aussi ça se rapprocherai des 'jack-tools'.
France
OK, c'est un bon projet ça !
Si tu penses que le programme final devrait faire partie de LibraZiK, fais moi signe.
France
Ok, une version OSC de ce code. Les paquets liblo-dev, libjack-jackd2-dev et gcc sont nécessaires. Le programme attend un port sur lequel envoyer ses messages. Lancer (par exemple pour le port 57120) /path/to/xrunToOsc 57120.
Si vous voyez des trucs pas malins dans ce code, n'hésitez pas à le faire savoir.
Copy to clipboard
#include "stdio.h" #include "errno.h" #include "signal.h" #include "stdlib.h" #ifndef WIN32 #include "unistd.h" #include "lo/lo.h" #include "jack/jack.h" #endif /* gcc -Wall xrunToOsc.c -lm `pkg-config --cflags --libs liblo jack` -o xrunToOsc */ jack_client_t *client; void jack_shutdown (void *arg) { exit (1); } void signal_handler (int sig) { jack_client_close (client); fprintf (stderr, " signal received, exiting ...\n"); exit (0); } int main(int argc, char *argv[]) { lo_address t = lo_address_new(NULL, argv[1]); int jack_xrun_callback(void *arg) { static int xruns = 0; xruns += 1; lo_send(t, "/xRuns", "i", xruns); return 0; } if ((client = jack_client_open ("simple", JackNullOption, NULL)) == 0) { fprintf (stderr, "jack server not running?\n"); return 1; } signal (SIGQUIT, signal_handler); signal (SIGTERM, signal_handler); signal (SIGHUP, signal_handler); signal (SIGINT, signal_handler); jack_set_xrun_callback(client, jack_xrun_callback, 0); jack_on_shutdown (client, jack_shutdown, 0); if (jack_activate (client)) { fprintf (stderr, "cannot activate client"); return 1; } while (1) { usleep (100000); } jack_client_close (client); exit (0); } /* vi:set ts=8 sts=4 sw=4: */