mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-22 07:39:35 +02:00
2018-06-12 Fred Gleason <fredg@paravelsystems.com>
* 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.
This commit is contained in:
parent
ea11505dbe
commit
bb60b722d1
@ -17048,3 +17048,11 @@
|
||||
2018-06-12 Fred Gleason <fredg@paravelsystems.com>
|
||||
* 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 <fredg@paravelsystems.com>
|
||||
* 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.
|
||||
|
74
cae/cae.cpp
74
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;j++) {
|
||||
update_meters[j][i]=false;
|
||||
}
|
||||
}
|
||||
for(int i=0;i<RD_MAX_CARDS;i++) {
|
||||
cae_driver[i]=RDStation::None;
|
||||
@ -1808,6 +1811,15 @@ void MainObject::DispatchCommand(int ch)
|
||||
return;
|
||||
}
|
||||
meter_port[ch]=port;
|
||||
for(int i=2;i<argnum[ch];i++) {
|
||||
sscanf(args[ch][i],"%d",&card);
|
||||
if((card<0)||(card>=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;i<RD_MAX_CARDS;i++) {
|
||||
update_meters[i][ch]=false;
|
||||
for(int j=0;j<RD_MAX_STREAMS;j++) {
|
||||
if(record_owner[i][j]==ch) {
|
||||
unsigned len=0;
|
||||
@ -2307,30 +2320,35 @@ void MainObject::FreeMadDecoder(int card,int stream)
|
||||
void MainObject::SendMeterLevelUpdate(const QString &type,int cardnum,
|
||||
int portnum,short levels[])
|
||||
{
|
||||
char msg[1500];
|
||||
int n=snprintf(msg,1500,"ML %s %d %d %d %d",
|
||||
(const char *)type,cardnum,portnum,levels[0],levels[1]);
|
||||
SendMeterUpdate(msg,n);
|
||||
for(int l=0;l<CAE_MAX_CONNECTIONS;l++) {
|
||||
if((meter_port[l]>0)&&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;l<CAE_MAX_CONNECTIONS;l++) {
|
||||
if((meter_port[l]>0)&&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;i<RD_MAX_STREAMS;i++) {
|
||||
n=snprintf(msg,1500,"MP %d %d %d",cardnum,i,pos[i]);
|
||||
SendMeterUpdate(msg,n);
|
||||
for(unsigned k=0;k<RD_MAX_STREAMS;k++) {
|
||||
for(int l=0;l<CAE_MAX_CONNECTIONS;l++) {
|
||||
if((meter_port[l]>0)&&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;j<RD_MAX_PORTS;j++) {
|
||||
for(unsigned k=0;k<RD_MAX_STREAMS;k++) {
|
||||
SendMeterOutputStatusUpdate(i,j,k);
|
||||
for(unsigned l=0;l<CAE_MAX_CONNECTIONS;l++) {
|
||||
if((meter_port[l]>0)&&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;i<CAE_MAX_CONNECTIONS;i++) {
|
||||
if(meter_port[i]>0) {
|
||||
meter_socket->writeBlock(msg,len,socket[i]->peerAddress(),meter_port[i]);
|
||||
for(unsigned l=0;l<CAE_MAX_CONNECTIONS;l++) {
|
||||
if((meter_port[l]>0)&&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[])
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -1459,11 +1459,14 @@
|
||||
<sect2>
|
||||
<title><command>Meter Enable</command></title>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
<para>
|
||||
<userinput>ME
|
||||
<replaceable>udp-port</replaceable>!</userinput>
|
||||
<replaceable>udp-port</replaceable>
|
||||
<replaceable>card0</replaceable>
|
||||
<replaceable>..</replaceable>!</userinput>
|
||||
</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
@ -1476,6 +1479,16 @@
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<replaceable>card0</replaceable>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Audio card number for which to send updates.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
@ -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<int> *cards)
|
||||
{
|
||||
QString cmd=QString().sprintf("ME %u",cae_meter_socket->port());
|
||||
for(unsigned i=0;i<cards->size();i++) {
|
||||
if(cards->at(i)>=0) {
|
||||
bool found=false;
|
||||
for(unsigned j=0;j<i;j++) {
|
||||
if(cards->at(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;
|
||||
|
@ -45,6 +45,7 @@ class RDCae : public QObject
|
||||
RDCae(RDStation *station,RDConfig *config,QObject *parent=0);
|
||||
~RDCae();
|
||||
void connectHost();
|
||||
void enableMetering(std::vector<int> *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
|
||||
|
@ -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<int> 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;
|
||||
|
@ -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);
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <rdapplication.h>
|
||||
#include <rdcheck_daemons.h>
|
||||
#include <rddbheartbeat.h>
|
||||
#include <rdescape_string.h>
|
||||
|
||||
#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<int> 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);
|
||||
|
@ -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;
|
||||
|
@ -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<int> cards;
|
||||
cards.push_back(rda->libraryConf()->inputCard());
|
||||
cards.push_back(rda->libraryConf()->outputCard());
|
||||
rda->cae()->enableMetering(&cards);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWidget::userData()
|
||||
{
|
||||
QString sql;
|
||||
|
@ -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();
|
||||
|
@ -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<int> 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();
|
||||
|
@ -49,6 +49,7 @@ class MainWidget : public QWidget
|
||||
QSizePolicy sizePolicy() const;
|
||||
|
||||
private slots:
|
||||
void caeConnectedData(bool state);
|
||||
void userData();
|
||||
void masterTimerData();
|
||||
void meterData();
|
||||
|
Loading…
x
Reference in New Issue
Block a user