mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2026-01-13 08:05:55 +01:00
2019-08-06 Fred Gleason <fredg@paravelsystems.com>
* Refactored ripcd(8) to manage JACK port [dis]connections directly, rather than by delegation to caed(8).
This commit is contained in:
@@ -129,7 +129,12 @@ nodist_ripcd_SOURCES = moc_am16.cpp\
|
||||
moc_wheatnet_lio.cpp\
|
||||
moc_wheatnet_slio.cpp
|
||||
|
||||
ripcd_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ @QT4_LIBS@ @LIBHPI@ -lQt3Support
|
||||
ripcd_LDADD = @LIB_RDLIBS@\
|
||||
@LIBVORBIS@\
|
||||
@QT4_LIBS@\
|
||||
@LIBHPI@\
|
||||
@LIBJACK@\
|
||||
-lQt3Support
|
||||
|
||||
CLEANFILES = *~\
|
||||
*.idb\
|
||||
|
||||
@@ -242,6 +242,7 @@ void MainObject::RunLocalMacros(RDMacro *rml_in)
|
||||
int d;
|
||||
RDMatrix::GpioType gpio_type;
|
||||
QByteArray data;
|
||||
int err;
|
||||
|
||||
rda->syslog(LOG_INFO,"received rml: \"%s\" from %s",
|
||||
(const char *)rml_in->toString().toUtf8(),
|
||||
@@ -399,6 +400,7 @@ void MainObject::RunLocalMacros(RDMacro *rml_in)
|
||||
break;
|
||||
|
||||
case RDMacro::JC:
|
||||
#ifdef JACK
|
||||
if(rml->argQuantity()!=2) {
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(false);
|
||||
@@ -406,14 +408,45 @@ void MainObject::RunLocalMacros(RDMacro *rml_in)
|
||||
}
|
||||
return;
|
||||
}
|
||||
rda->cae()->connectJackPorts(rml->arg(0),rml->arg(1));
|
||||
if(ripcd_jack_client!=NULL) {
|
||||
if((err=jack_connect(ripcd_jack_client,rml->arg(1).toUtf8(),
|
||||
rml->arg(0).toUtf8()))==0) {
|
||||
rda->syslog(LOG_DEBUG,
|
||||
"executed JACK port connection \"%s %s\"",
|
||||
(const char *)rml->arg(0).toUtf8(),
|
||||
(const char *)rml->arg(1).toUtf8());
|
||||
}
|
||||
else {
|
||||
if(err!=EEXIST) {
|
||||
rda->syslog(LOG_WARNING,
|
||||
"JACK port connection \"%s %s\" failed, err: %d",
|
||||
(const char *)rml->arg(0).toUtf8(),
|
||||
(const char *)rml->arg(1).toUtf8(),
|
||||
err);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(false);
|
||||
sendRml(rml);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(true);
|
||||
sendRml(rml);
|
||||
}
|
||||
#else
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(false);
|
||||
sendRml(rml);
|
||||
}
|
||||
#endif // JACK
|
||||
break;
|
||||
|
||||
case RDMacro::JD:
|
||||
#ifdef JACK
|
||||
if(rml->argQuantity()!=2) {
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(false);
|
||||
@@ -421,11 +454,39 @@ void MainObject::RunLocalMacros(RDMacro *rml_in)
|
||||
}
|
||||
return;
|
||||
}
|
||||
rda->cae()->disconnectJackPorts(rml->arg(0),rml->arg(1));
|
||||
if(ripcd_jack_client!=NULL) {
|
||||
if((err=jack_disconnect(ripcd_jack_client,rml->arg(1).toUtf8(),
|
||||
rml->arg(0).toUtf8()))==0) {
|
||||
rda->syslog(LOG_DEBUG,
|
||||
"executed JACK port disconnection \"%s %s\"",
|
||||
(const char *)rml->arg(0).toUtf8(),
|
||||
(const char *)rml->arg(1).toUtf8());
|
||||
}
|
||||
else {
|
||||
rda->syslog(LOG_WARNING,
|
||||
"JACK port disconnection \"%s %s\" failed, err: %d",
|
||||
(const char *)rml->arg(0).toUtf8(),
|
||||
(const char *)rml->arg(1).toUtf8(),
|
||||
err);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(false);
|
||||
sendRml(rml);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(true);
|
||||
sendRml(rml);
|
||||
}
|
||||
#else
|
||||
if(rml->echoRequested()) {
|
||||
rml->acknowledge(false);
|
||||
sendRml(rml);
|
||||
}
|
||||
#endif // JACK
|
||||
break;
|
||||
|
||||
case RDMacro::LO:
|
||||
|
||||
106
ripcd/ripcd.cpp
106
ripcd/ripcd.cpp
@@ -188,6 +188,17 @@ MainObject::MainObject(QObject *parent)
|
||||
ripcd_garbage_timer=new QTimer(this);
|
||||
connect(ripcd_garbage_timer,SIGNAL(timeout()),this,SLOT(garbageData()));
|
||||
|
||||
//
|
||||
// JACK
|
||||
//
|
||||
#ifdef JACK
|
||||
ripcd_start_jack_timer=new QTimer(this);
|
||||
ripcd_start_jack_timer->setSingleShot(true);
|
||||
connect(ripcd_start_jack_timer, SIGNAL(timeout()),this,SLOT(startJackData()));
|
||||
ripcd_start_jack_timer->start(5000);
|
||||
#endif // JACK
|
||||
|
||||
|
||||
rda->syslog(LOG_INFO,"started");
|
||||
}
|
||||
|
||||
@@ -337,7 +348,7 @@ void MainObject::exitTimerData()
|
||||
delete ripcd_switcher[i];
|
||||
}
|
||||
}
|
||||
rda->syslog(LOG_INFO,"ripcd exiting normally");
|
||||
rda->syslog(LOG_INFO,"exiting normally");
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
@@ -357,6 +368,99 @@ void MainObject::garbageData()
|
||||
}
|
||||
|
||||
|
||||
void MainObject::startJackData()
|
||||
{
|
||||
#ifdef JACK
|
||||
jack_options_t jackopts=JackNullOption;
|
||||
jack_status_t jackstat=JackFailure;
|
||||
|
||||
//
|
||||
// Attempt to Connect to Jack Server
|
||||
//
|
||||
jackopts=JackNoStartServer;
|
||||
if(rda->station()->jackServerName().isEmpty()) {
|
||||
ripcd_jack_client=jack_client_open("rivendell-ripcd",jackopts,&jackstat);
|
||||
}
|
||||
else {
|
||||
ripcd_jack_client=
|
||||
jack_client_open("rivendell-ripcd",jackopts,&jackstat,
|
||||
(const char *)rda->station()->jackServerName());
|
||||
}
|
||||
if(ripcd_jack_client==NULL) {
|
||||
if((jackstat&JackInvalidOption)!=0) {
|
||||
fprintf (stderr, "invalid or unsupported JACK option\n");
|
||||
rda->syslog(LOG_WARNING,"invalid or unsupported JACK option");
|
||||
}
|
||||
|
||||
if((jackstat&JackServerError)!=0) {
|
||||
fprintf (stderr, "communication error with the JACK server\n");
|
||||
rda->syslog(LOG_WARNING,"communication error with the JACK server");
|
||||
}
|
||||
|
||||
if((jackstat&JackNoSuchClient)!=0) {
|
||||
fprintf (stderr, "requested JACK client does not exist\n");
|
||||
rda->syslog(LOG_WARNING,"requested JACK client does not exist");
|
||||
}
|
||||
|
||||
if((jackstat&JackLoadFailure)!=0) {
|
||||
fprintf (stderr, "unable to load internal JACK client\n");
|
||||
rda->syslog(LOG_WARNING,"unable to load internal JACK client");
|
||||
}
|
||||
|
||||
if((jackstat&JackInitFailure)!=0) {
|
||||
fprintf (stderr, "unable to initialize JACK client\n");
|
||||
rda->syslog(LOG_WARNING,"unable to initialize JACK client");
|
||||
}
|
||||
|
||||
if((jackstat&JackShmFailure)!=0) {
|
||||
fprintf (stderr, "unable to access JACK shared memory\n");
|
||||
rda->syslog(LOG_WARNING,"unable to access JACK shared memory");
|
||||
}
|
||||
|
||||
if((jackstat&JackVersionError)!=0) {
|
||||
fprintf (stderr, "JACK protocol version mismatch\n");
|
||||
rda->syslog(LOG_WARNING,"JACK protocol version mismatch");
|
||||
}
|
||||
|
||||
if((jackstat&JackServerStarted)!=0) {
|
||||
fprintf (stderr, "JACK server started\n");
|
||||
rda->syslog(LOG_WARNING,"JACK server started");
|
||||
}
|
||||
|
||||
if((jackstat&JackServerFailed)!=0) {
|
||||
fprintf (stderr, "unable to communication with JACK server\n");
|
||||
rda->syslog(LOG_WARNING,"unable to communicate with JACK server");
|
||||
}
|
||||
|
||||
if((jackstat&JackNameNotUnique)!=0) {
|
||||
fprintf (stderr, "JACK client name not unique\n");
|
||||
rda->syslog(LOG_WARNING,"JACK client name not unique");
|
||||
}
|
||||
|
||||
if((jackstat&JackFailure)!=0) {
|
||||
fprintf (stderr, "JACK general failure\n");
|
||||
rda->syslog(LOG_WARNING,"JACK general failure");
|
||||
}
|
||||
fprintf (stderr, "no connection to JACK server\n");
|
||||
rda->syslog(LOG_WARNING,"no connection to JACK server");
|
||||
return;
|
||||
}
|
||||
// jack_connected=true;
|
||||
// jack_set_process_callback(jack_client,JackProcess,0);
|
||||
// jack_set_sample_rate_callback(jack_client,JackSampleRate,0);
|
||||
//jack_set_port_connect_callback(jack_client,JackPortConnectCB,this);
|
||||
#ifdef HAVE_JACK_INFO_SHUTDOWN
|
||||
// jack_on_info_shutdown(jack_client,JackInfoShutdown,0);
|
||||
#else
|
||||
// jack_on_shutdown(jack_client,JackShutdown,0);
|
||||
#endif // HAVE_JACK_INFO_SHUTDOWN
|
||||
rda->syslog(LOG_INFO,"connected to JACK server");
|
||||
|
||||
|
||||
#endif // JACK
|
||||
}
|
||||
|
||||
|
||||
void MainObject::SetUser(QString username)
|
||||
{
|
||||
rda->station()->setUserName(username);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//
|
||||
// Rivendell Interprocess Communication Daemon
|
||||
//
|
||||
// (C) Copyright 2002-2018 Fred Gleason <fredg@paravelsystems.com>
|
||||
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License version 2 as
|
||||
@@ -32,6 +32,10 @@
|
||||
#include <qtimer.h>
|
||||
#include <qudpsocket.h>
|
||||
|
||||
#ifdef JACK
|
||||
#include <jack/jack.h>
|
||||
#endif // JACK
|
||||
|
||||
#include <rdnotification.h>
|
||||
#include <rdsocket.h>
|
||||
#include <rdttydevice.h>
|
||||
@@ -79,6 +83,7 @@ class MainObject : public QObject
|
||||
void killData(int conn_id);
|
||||
void exitTimerData();
|
||||
void garbageData();
|
||||
void startJackData();
|
||||
|
||||
private:
|
||||
void SetUser(QString username);
|
||||
@@ -132,6 +137,10 @@ class MainObject : public QObject
|
||||
unsigned ripc_macro_cart[RD_MAX_MACRO_TIMERS];
|
||||
RDMulticaster *ripcd_notification_mcaster;
|
||||
QTimer *ripcd_garbage_timer;
|
||||
#ifdef JACK
|
||||
jack_client_t *ripcd_jack_client;
|
||||
QTimer *ripcd_start_jack_timer;
|
||||
#endif // JACK
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user