diff --git a/ChangeLog b/ChangeLog index 6d0597dd..b7386074 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17048,3 +17048,11 @@ 2018-06-12 Fred Gleason * Changed the name of the 'Initial Audio Ports' control to 'Active Audio Ports' in the 'Configure JACK' dialog in rdadmin(1). +2018-06-12 Fred Gleason + * Added a 'card-num' parameter to the 'Meter Enable' ['ME'] command + in caed(8). + * Added an 'RDCae::enableMetering()' method. + * Modified rdairplay(1) to enable metering explicitly. + * Modified rdcartslots(1) to enable metering explicitly. + * Modified rdlibrary(1) to enable metering explicitly. + * Modified rdpanel(1) to enable metering explicitly. diff --git a/cae/cae.cpp b/cae/cae.cpp index 10847c78..4c3d7716 100644 --- a/cae/cae.cpp +++ b/cae/cae.cpp @@ -171,6 +171,9 @@ MainObject::MainObject(QObject *parent,const char *name) argnum[i]=0; argptr[i]=0; auth[i]=false; + for(int j=0;j=RD_MAX_CARDS)) { + EchoArgs(ch,'-'); + return; + } + update_meters[card][ch]=true; + } + EchoArgs(ch,'+'); SendMeterOutputStatusUpdate(); return; @@ -1885,6 +1897,7 @@ void MainObject::KillSocket(int ch) auth[ch]=false; meter_port[ch]=0; for(int i=0;i0)&&update_meters[cardnum][l]) { + SendMeterUpdate(QString().sprintf("ML %s %d %d %d %d", + (const char *)type,cardnum,portnum,levels[0],levels[1]),l); + } + } } void MainObject::SendStreamMeterLevelUpdate(int cardnum,int streamnum, short levels[]) { - char msg[1500]; - int n=snprintf(msg,1500,"MO %d %d %d %d", - cardnum,streamnum,levels[0],levels[1]); - SendMeterUpdate(msg,n); + for(int l=0;l0)&&update_meters[cardnum][l]) { + SendMeterUpdate(QString().sprintf("MO %d %d %d %d", + cardnum,streamnum,levels[0],levels[1]),l); + } + } } void MainObject::SendMeterPositionUpdate(int cardnum,unsigned pos[]) { - char msg[1500]; - int n; - for(unsigned i=0;i0)&&update_meters[cardnum][l]) { + SendMeterUpdate(QString().sprintf("MP %d %d %d",cardnum,k,pos[k]),l); + } + } } } @@ -2341,7 +2359,12 @@ void MainObject::SendMeterOutputStatusUpdate() if(cae_driver[i]!=RDStation::None) { for(unsigned j=0;j0)&&update_meters[i][l]) { + SendMeterUpdate(QString().sprintf("MS %d %d %d %d",i,j,k, + output_status_flag[i][j][k]),l); + } + } } } } @@ -2351,23 +2374,20 @@ void MainObject::SendMeterOutputStatusUpdate() void MainObject::SendMeterOutputStatusUpdate(int card,int port,int stream) { - char msg[1500]; - int n; - n=snprintf(msg,1500,"MS %d %d %d %d",card,port,stream, - output_status_flag[card][port][stream]); - SendMeterUpdate(msg,n); -} - - -void MainObject::SendMeterUpdate(const char *msg,unsigned len) -{ - for(unsigned i=0;i0) { - meter_socket->writeBlock(msg,len,socket[i]->peerAddress(),meter_port[i]); + for(unsigned l=0;l0)&&update_meters[card][l]) { + SendMeterUpdate(QString().sprintf("MS %d %d %d %d",card,port,stream, + output_status_flag[card][port][stream]),l); } } } +void MainObject::SendMeterUpdate(const QString &msg,int conn_id) +{ + meter_socket->writeBlock(msg,msg.length(),socket[conn_id]->peerAddress(), + meter_port[conn_id]); +} + int main(int argc,char *argv[]) { diff --git a/cae/cae.h b/cae/cae.h index 77d11e6f..0a5fecd7 100644 --- a/cae/cae.h +++ b/cae/cae.h @@ -142,7 +142,7 @@ class MainObject : public QObject void SendMeterPositionUpdate(int cardnum,unsigned pos[]); void SendMeterOutputStatusUpdate(); void SendMeterOutputStatusUpdate(int card,int port,int stream); - void SendMeterUpdate(const char *msg,unsigned len); + void SendMeterUpdate(const QString &msg,int conn_id); bool debug; unsigned system_sample_rate; Q_INT16 tcp_port; @@ -165,6 +165,7 @@ class MainObject : public QObject bool play_pitch[RD_MAX_CARDS][RD_MAX_STREAMS]; bool port_status[RD_MAX_CARDS][RD_MAX_PORTS]; bool output_status_flag[RD_MAX_CARDS][RD_MAX_PORTS][RD_MAX_STREAMS]; + bool update_meters[RD_MAX_CARDS][CAE_MAX_CONNECTIONS]; struct { int card; int stream; diff --git a/docs/apis/cae.xml b/docs/apis/cae.xml index f26ee313..72ec24c3 100644 --- a/docs/apis/cae.xml +++ b/docs/apis/cae.xml @@ -1459,11 +1459,14 @@ <command>Meter Enable</command> - Set UDP port to whcih to send meter update messages. + Set UDP port to which to send meter update messages for the specified + card(s). ME - udp-port! + udp-port + card0 + ..! @@ -1476,6 +1479,16 @@ + + + card0 + + + + Audio card number for which to send updates. + + + diff --git a/lib/rdcae.cpp b/lib/rdcae.cpp index 0e17be95..3bc9e46e 100644 --- a/lib/rdcae.cpp +++ b/lib/rdcae.cpp @@ -118,10 +118,30 @@ void RDCae::connectHost() SendCommand(QString().sprintf("IS %d %d!",i,j)); } } - SendCommand(QString().sprintf("ME %u!",cae_meter_socket->port())); } } + +void RDCae::enableMetering(std::vector *cards) +{ + QString cmd=QString().sprintf("ME %u",cae_meter_socket->port()); + for(unsigned i=0;isize();i++) { + if(cards->at(i)>=0) { + bool found=false; + for(unsigned j=0;jat(i)==cards->at(j)) { + found=true; + } + } + if(!found) { + cmd+=QString().sprintf(" %d",cards->at(i)); + } + } + } + SendCommand(cmd+"!"); +} + + bool RDCae::loadPlay(int card,QString name,int *stream,int *handle) { int count=0; diff --git a/lib/rdcae.h b/lib/rdcae.h index 60ac5856..47a7990b 100644 --- a/lib/rdcae.h +++ b/lib/rdcae.h @@ -45,6 +45,7 @@ class RDCae : public QObject RDCae(RDStation *station,RDConfig *config,QObject *parent=0); ~RDCae(); void connectHost(); + void enableMetering(std::vector *cards); bool loadPlay(int card,QString name,int *stream,int *handle); void unloadPlay(int handle); void positionPlay(int handle,int pos); @@ -127,4 +128,4 @@ class RDCae : public QObject }; -#endif +#endif // RDCAE_H diff --git a/rdairplay/rdairplay.cpp b/rdairplay/rdairplay.cpp index 224a292f..5b9177ee 100644 --- a/rdairplay/rdairplay.cpp +++ b/rdairplay/rdairplay.cpp @@ -304,6 +304,8 @@ MainWidget::MainWidget(QWidget *parent) // // CAE Connection // + connect(rda->cae(),SIGNAL(isConnected(bool)), + this,SLOT(caeConnectedData(bool))); rda->cae()->connectHost(); // @@ -315,7 +317,7 @@ MainWidget::MainWidget(QWidget *parent) // // RIPC Connection // - connect(rda->ripc(),SIGNAL(connected(bool)),this,SLOT(ripcConnected(bool))); + connect(rda->ripc(),SIGNAL(connected(bool)),this,SLOT(ripcConnectedData(bool))); connect(rda,SIGNAL(userChanged()),this,SLOT(userData())); connect(rda->ripc(),SIGNAL(rmlReceived(RDMacro *)), this,SLOT(rmlReceivedData(RDMacro *))); @@ -914,7 +916,24 @@ QSizePolicy MainWidget::sizePolicy() const } -void MainWidget::ripcConnected(bool state) +void MainWidget::caeConnectedData(bool state) +{ + std::vector cards; + + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::MainLog1Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::MainLog2Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::AuxLog1Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::AuxLog2Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel1Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel2Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel3Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel4Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel5Channel)); + rda->cae()->enableMetering(&cards); +} + + +void MainWidget::ripcConnectedData(bool state) { QString logname; QHostAddress addr; diff --git a/rdairplay/rdairplay.h b/rdairplay/rdairplay.h index d5b7610b..6715b2db 100644 --- a/rdairplay/rdairplay.h +++ b/rdairplay/rdairplay.h @@ -98,7 +98,8 @@ class MainWidget : public QWidget private slots: void logLine(RDConfig::LogPriority prio,const QString &msg); - void ripcConnected(bool state); + void caeConnectedData(bool state); + void ripcConnectedData(bool state); void rmlReceivedData(RDMacro *rml); void gpiStateChangedData(int matrix,int line,bool state); void logChannelStartedData(int id,int mport,int card,int port); diff --git a/rdcartslots/rdcartslots.cpp b/rdcartslots/rdcartslots.cpp index 31d10799..90092903 100644 --- a/rdcartslots/rdcartslots.cpp +++ b/rdcartslots/rdcartslots.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include "rdcartslots.h" @@ -92,6 +93,8 @@ MainWidget::MainWidget(QWidget *parent) // // CAE Connection // + connect(rda->cae(),SIGNAL(isConnected(bool)), + this,SLOT(caeConnectedData(bool))); rda->cae()->connectHost(); // @@ -166,6 +169,22 @@ QSize MainWidget::sizeHint() const } +void MainWidget::caeConnectedData(bool state) +{ + std::vector cards; + + QString sql=QString("select CARD from CARTSLOTS where ")+ + "STATION_NAME=\""+RDEscapeString(rda->config()->stationName())+"\""; + RDSqlQuery *q=new RDSqlQuery(sql); + while(q->next()) { + cards.push_back(q->value(0).toInt()); + } + delete q; + + rda->cae()->enableMetering(&cards); +} + + void MainWidget::rmlReceivedData(RDMacro *rml) { RunLocalMacros(rml); diff --git a/rdcartslots/rdcartslots.h b/rdcartslots/rdcartslots.h index 12481165..6f7f9b09 100644 --- a/rdcartslots/rdcartslots.h +++ b/rdcartslots/rdcartslots.h @@ -56,6 +56,7 @@ class MainWidget : public QWidget QSizePolicy sizePolicy() const; private slots: + void caeConnectedData(bool state); void userData(); void rmlReceivedData(RDMacro *rml); @@ -66,12 +67,6 @@ class MainWidget : public QWidget private: void RunLocalMacros(RDMacro *rml); void SetCaption(); - // RDConfig *panel_config; - // RDCae *panel_cae; - // RDRipc *panel_ripc; - // RDUser *panel_user; - // RDStation *panel_station; - // RDSystem *panel_system; RDEventPlayer *panel_player; QPixmap *lib_rivendell_map; QString panel_filter; diff --git a/rdlibrary/rdlibrary.cpp b/rdlibrary/rdlibrary.cpp index 7a59c6f1..73bee352 100644 --- a/rdlibrary/rdlibrary.cpp +++ b/rdlibrary/rdlibrary.cpp @@ -190,6 +190,8 @@ MainWidget::MainWidget(QWidget *parent) // // CAE Connection // + connect(rda->cae(),SIGNAL(isConnected(bool)), + this,SLOT(caeConnectedData(bool))); rda->cae()->connectHost(); // @@ -483,6 +485,17 @@ QSizePolicy MainWidget::sizePolicy() const } +void MainWidget::caeConnectedData(bool state) +{ + if(state) { + std::vector cards; + cards.push_back(rda->libraryConf()->inputCard()); + cards.push_back(rda->libraryConf()->outputCard()); + rda->cae()->enableMetering(&cards); + } +} + + void MainWidget::userData() { QString sql; diff --git a/rdlibrary/rdlibrary.h b/rdlibrary/rdlibrary.h index 51820397..a9ef7120 100644 --- a/rdlibrary/rdlibrary.h +++ b/rdlibrary/rdlibrary.h @@ -70,6 +70,7 @@ class MainWidget : public QWidget QSizePolicy sizePolicy() const; private slots: + void caeConnectedData(bool state); void userData(); void filterChangedData(const QString &str); void searchClickedData(); diff --git a/rdpanel/rdpanel.cpp b/rdpanel/rdpanel.cpp index 74c21c9d..bcd31b0d 100644 --- a/rdpanel/rdpanel.cpp +++ b/rdpanel/rdpanel.cpp @@ -145,6 +145,8 @@ MainWidget::MainWidget(QWidget *parent) // // CAE Connection // + connect(rda->cae(),SIGNAL(isConnected(bool)), + this,SLOT(caeConnectedData(bool))); rda->cae()->connectHost(); // @@ -342,6 +344,19 @@ QSizePolicy MainWidget::sizePolicy() const } +void MainWidget::caeConnectedData(bool state) +{ + std::vector cards; + + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel1Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel2Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel3Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel4Channel)); + cards.push_back(rda->airplayConf()->card(RDAirPlayConf::SoundPanel5Channel)); + rda->cae()->enableMetering(&cards); +} + + void MainWidget::userData() { SetCaption(); diff --git a/rdpanel/rdpanel.h b/rdpanel/rdpanel.h index 2d56124f..ed75569b 100644 --- a/rdpanel/rdpanel.h +++ b/rdpanel/rdpanel.h @@ -49,6 +49,7 @@ class MainWidget : public QWidget QSizePolicy sizePolicy() const; private slots: + void caeConnectedData(bool state); void userData(); void masterTimerData(); void meterData();