frei verwendbar. Achtung - die entsprechende libdev für Jack muss natürlich installiert sein.
Kompilieren mit folgender Makefile. Ein echter C-Programmierer wird sich zwar die Haare raufen (habs mir selber beigebracht und komme aus der Mainfraime-Welt) - aber es funktioniert.
Code: Alles auswählen
all: jackman
jackman: jackman.c
gcc -Wall -Wunused -g -o jackman -lreadline -ljack -lpferd jackman.c
install:
cp jackman /usr/local/bin
clean:
rm jackman
Code: Alles auswählen
// REPORT :JACKMAN
// VERSION :1.1
// ********************************************************************************
// AUFTRAGSNR:Ticket: INTERN
// ********************************************************************************
// KURZBESCHR:Steuerprogramm fuer den Jack-Soundserver
// ********************************************************************************
// ANLAGE/AENDERUNG:20131104
// PROGRAMMBESCHREIBUNG:
// Das Programm dient zur Steuerung der Verbindungen von diversen
// Soundprogrammen über den Jack Sound-Server.
// Die genaue Beschreibung bekommt man duch Starten des
// Programmes und der Eingabe von help.
// Es erfolgt ene Liste der Befehle und Parameter.
// Aenderung am 27.03.2015
// Einbau 3. Suchbegriff und Umstellung Suchroutine
// ********************************************************************************
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
char* strcasestr( char*, char*);
#include <jack/jack.h>
#define HAVEREADLINE
#include <libpferd.h>
/* Command-editing */
#include <readline/readline.h>
#include <readline/history.h>
#include <tzn.h>
char *pzeile;
int rc = 0;
jack_client_t *client;
char clientname[] = "jackman";
jack_port_t *jackport;
const char **ports1 = NULL;
const char **ports2 = NULL;
const char **conns = NULL;
char portnameo[100];
char portnamei[100];
char dummy[100];
char portname[100];
char connname[100];
char porttext[100];
char porttab[100][100];
char conntab[100][100];
int iconntab = 0;
char befehl[1024];
int portflags;
int iport = 0;
int iport2 = 0;
int iconn = 0;
int itab = 0;
int iverbindung = 0;
void fillporttab(void);
void fillconn(void);
void disconnect(void);
void portconnect(void);
void clearall();
void getsystemzeit(void);
int bytes;
int saus = 0;
int porti;
int porto;
char artcon = 'a';
int argcg = 0;
char psuch1[128] = "";
char psuch2[128] = "";
char psuch3[128] = "";
jack_time_t systemzeit;
/* aenderung am 18.01.2013 */
/* listconnsi und listconnso um nur */
/* Input- oder Outputverbindungen an-*/
/* zuzeigen */
int main(int argc, char **argv) {
argcg = argc;
if (argc < 2) {
printf("jackman - Version 1.1\n");
#include <tzp.h>
}
/* am server anmelden */
// client = jack_client_new(clientname);
client = jack_client_open("jackman", JackNoStartServer, NULL);
if (client == NULL) {
printf("Connection not possible - please start jackd\n");
exit(1);
}
rc = jack_activate(client);
if (argc < 2) {
printf("%s%i\n","RC activate=",rc);
}
fillporttab();
fillconn();
lesen:
if (argc < 2) {
printf("Bitte Befehl eingeben (cmd Output-port - Inputport\n");
}
strcpy(portnamei,"");
strcpy(portnameo,"");
pzeile = NULL;
pzeile = readline(NULL);
/* libreadline macht einen alloc auf den pzeile-pointer */
/* daher, wegen speicherleck wieder storage freigeben */
if (pzeile != NULL) {
strncpy(befehl,pzeile,1023);
free(pzeile);
add_history(befehl);
}
else {
strcpy(befehl,"q");
}
nonewline(befehl);
bytes = strlen(befehl);
if (bytes < 1) goto ende;
/* Normale Befehle */
sscanf(befehl,"%s%s%s",dummy,portnamei, portnameo);
/* Suchbegriffe fuellen */
strcpy(psuch1,"$");
strcpy(psuch2,"$");
strcpy(psuch3,"$");
sscanf(befehl,"%s%s%s%s",dummy,psuch1,psuch2,psuch3);
/* Port als ziffer eingegeben - dann umsetzen */
if (portnamei[0] >= '0' &&
portnamei[0] <= '9') {
porti=atoi(portnamei);
strcpy(portnamei,porttab[porti]);
}
if (portnameo[0] >= '0' &&
portnameo[0] <= '9') {
porto=atoi(portnameo);
strcpy(portnameo,porttab[porto]);
}
bytes = strncmp(befehl,"help",4);
if (bytes == 0) {
printf("Folgende Befehle sind zur Zeit realisiert:\n");
printf("clearall - Aufloesen aller Jack-Verbindungen\n");
printf("listports - Liste aller vorhandenen Ports\n");
printf(" - zusaetzlich 3 suchbegriffe(mind 2 Stellen) moeglich\n");
printf("listconns - Liste aller vorhandenen Verbindungen\n");
printf("listconnsi - Liste aller Eingangs-Verbindungen\n");
printf("listconnso - Liste aller Ausgangs-Verbindungen\n");
printf("connect - Herstellen einer Verbindung mit den\n");
printf(" Parametern Ausgangsport - Eingangsport\n");
printf("disconnect - Trennen einer Verbindung mit den\n");
printf(" Parametern Ausgangsport - Eingangsport\n");
printf("save - fuer Scriptgesteuertes oder manuelles\n");
printf(" Sichern der Konfiguration\n");
printf(" Beispiel:\n");
printf(" echo save | jackman > /tmp/konfig\n");
printf(" in der /tmp/konfig stehen die notwendigen\n");
printf(" connects fuer die laufende Session\n");
printf(" ladbar mit:\n");
printf(" cat /tmp/konfig | jackman\n");
printf("systemzeit Zeit des Jack_daemon in Mikrosekunden wird ausgegeben\n");
printf("q - Beenden des Programmes\n");
printf("Es ist moeglich, die gewuenschten Befehle in eine Datei\n");
printf("zu schreiben. Aufruf dann jackman < dateiname\n");
printf(" \n");
printf("Ein beliebiger zusaetzlicher Aufrufparameter sorgt dafuer,\n");
printf("dass zusaetzliche Ausgaben unterdrueckt werden - fuer Ausgabe-\n");
printf("umleitungen zwecks preset-erstellung.\n");
}
bytes = strncmp(befehl,"disconnect",10);
if (bytes == 0) disconnect();
bytes = strncmp(befehl,"connect",7);
if (bytes == 0) portconnect();
bytes = strncmp(befehl,"listports",9);
if (bytes == 0) {
saus = 1;
fillporttab();
saus = 0;
}
bytes = strncmp(befehl,"listconnsi",10);
if (bytes == 0) { artcon='i'; fillconn(); goto lesen;}
bytes = strncmp(befehl,"listconnso",10);
if (bytes == 0) { artcon='o'; fillconn(); goto lesen;}
bytes = strncmp(befehl,"save",4);
if (bytes == 0) { artcon='s'; fillconn(); goto lesen;}
bytes = strncmp(befehl,"listconns",9);
if (bytes == 0) { artcon='a'; fillconn(); goto lesen;}
bytes = strncmp(befehl,"clear",5);
if (bytes == 0) clearall();
bytes = strncmp(befehl,"systemzeit",10);
if (bytes == 0) {getsystemzeit(); goto lesen;}
if (befehl[0] == 'q') goto ende;
goto lesen;
ende:
rc = jack_client_close(client);
if (argc < 2) {
printf("%s%i\n","RC Close:",rc);
}
free(ports1);
free(ports2);
free(conns);
return rc;
}
void getsystemzeit(void) {
systemzeit = jack_get_time();
printf("%s%lli\n","Zeit",systemzeit);
return;
}
void clearall(void) {
char xbyte = ' ';
iconntab = 0;
while (2 < strlen(conntab[iconntab])) {
xbyte = ' ';
strcpy(portnameo,conntab[iconntab]);
unstring(portnameo,&xbyte,portnamei);
printf("%s%s%s\n",portnameo, " ", portnamei);
disconnect();
iconntab = iconntab + 1;
}
return;
}
void portconnect (void) {
printf("connect\n");
bytes = jack_connect(client,portnamei, portnameo);
printf("%s%s%s%s%i\n",portnamei, portnameo ,"-","RC connect",bytes);
return;
}
void disconnect (void) {
printf("disconnect\n");
bytes = jack_disconnect(client,portnamei, portnameo);
printf("%s%i\n","RC Disconnect",bytes);
return;
}
void fillporttab(void) {
int suchen;
int treffer;
ports1 = jack_get_ports (client, NULL, NULL,JackPortIsInput);
ports2 = jack_get_ports (client, NULL, NULL,JackPortIsOutput);
if (ports1[0] == NULL) printf("No Input ports available\n");
if (ports2[0] == NULL) printf("No outp. ports available\n");
suchen = 1;
/* keine Pruefung auf portname, so nix richtig eingegeben */
if (strlen(psuch1) < 2 && strlen(psuch2) < 2 && strlen(psuch3) < 2) {
suchen = 0;
}
iport = 0;
if (argcg < 2) {
printf("Vorhandene Portnamen\n");
}
while (ports1[iport] != NULL) {
treffer = 0;
strcpy(portname,ports1[iport]);
if (saus == 1) {
if (suchen == 0) treffer = 1;
if (strcasestr(portname,psuch1)) treffer = 1;
if (strcasestr(portname,psuch2)) treffer = 1;
if (strcasestr(portname,psuch3)) treffer = 1;
if (treffer == 1) {
printf("%-40s%03i%s\n",portname,iport," Input");
}
} // if saus
strcpy(porttab[iport],portname);
iport = iport + 1;
} // while
iport2 = 0;
while (ports2[iport2] != NULL) {
treffer = 0;
strcpy(portname,ports2[iport2]);
if (saus == 1) {
if (suchen == 0) treffer = 1;
if (strcasestr(portname,psuch1)) treffer = 1;
if (strcasestr(portname,psuch2)) treffer = 1;
if (strcasestr(portname,psuch3)) treffer = 1;
if (treffer == 1) {
printf("%-40s%03i%s\n",portname,iport," Output");
}
} // if saus
strcpy(porttab[iport],portname);
iport = iport + 1;
iport2 = iport2 + 1;
} // while
if (argcg < 2) {
printf("%s%i%s%i\n","Anzahl in Porttab:",iport," suchen ", suchen);
}
return;
}
void fillconn(void) {
static int em = 0;
/* conntab loeschen */
iconntab = -1;
while (iconntab < 100) {
strcpy(conntab[iconntab],"");
iconntab = iconntab + 1;
}
if (em == 0) {
em = 1;
return;
}
iconn = 0;
iverbindung = 0;
iconntab = -1;
if (argcg < 2) {
printf("Vorhandene Verbindungen\n");
}
while (iconn < iport) {
jackport = jack_port_by_name(client,porttab[iconn]);
portflags = jack_port_flags(jackport);
if (portflags & JackPortIsInput) {
strcpy(porttext,"Input");
}
else {
strcpy(porttext,"Output");
}
conns = jack_port_get_all_connections(client,jackport);
if (conns != NULL) {
/* interne while zu den ports um liste aufzubereiten */
itab = 0;
while (conns[itab] != NULL) {
strcpy(connname,conns[itab]);
if (artcon == 'a') {
printf("%-30s%s%s%30s\n",porttab[iconn],porttext,"<->",connname);
}
if (artcon == 'i' && porttext[0] == 'I') {
printf("%-30s%s%s%20s\n",porttab[iconn],porttext,"<==",connname);
}
if (artcon == 'o' && porttext[0] == 'O') {
printf("%-30s%s%s%20s\n",porttab[iconn],porttext,"==>",connname);
}
if (artcon == 's' && porttext[0] == 'O') {
printf("%s%s%s%s\n","connect ",porttab[iconn]," ",connname);
}
itab = itab + 1;
iverbindung = iverbindung + 1;
iconntab = iconntab + 1;
sprintf(conntab[iconntab],"%s%s%s",porttab[iconn]," ",connname);
} // ende while2
}
iconn = iconn + 1;
} //ende while1
if (argcg < 2) {
printf("%s%i\n","Anzahl Verbindungen",iverbindung);
}
return;
}