2022-08-04 Fred Gleason <fredg@paravelsystems.com>

* Added a 'Router' column to the event list in rdcatch(1).

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2022-08-04 16:05:15 -04:00
parent cdc9c77139
commit c142728131
3 changed files with 112 additions and 82 deletions

View File

@ -23223,3 +23223,5 @@
2022-08-04 Fred Gleason <fredg@paravelsystems.com> 2022-08-04 Fred Gleason <fredg@paravelsystems.com>
* Added interlock logic to the 'Edit Switcher Event' dialog in * Added interlock logic to the 'Edit Switcher Event' dialog in
rdcatch(1) to prevent creation of events containing null endpoints. rdcatch(1) to prevent creation of events containing null endpoints.
2022-08-04 Fred Gleason <fredg@paravelsystems.com>
* Added a 'Router' column to the event list in rdcatch(1).

View File

@ -48,88 +48,91 @@ RecordListModel::RecordListModel(QObject *parent)
d_headers.push_back(tr("End")); // 03 d_headers.push_back(tr("End")); // 03
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Source")); // 04 d_headers.push_back(tr("Router")); // 04
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Destination")); // 05 d_headers.push_back(tr("Source")); // 05
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Su")); // 06 d_headers.push_back(tr("Destination")); // 06
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Mo")); // 07 d_headers.push_back(tr("Su")); // 07
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Tu")); // 08 d_headers.push_back(tr("Mo")); // 08
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("We")); // 09 d_headers.push_back(tr("Tu")); // 09
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Th")); // 10 d_headers.push_back(tr("We")); // 10
d_alignments.push_back(left);
d_headers.push_back(tr("Th")); // 11
d_alignments.push_back(center); d_alignments.push_back(center);
d_headers.push_back(tr("Fr")); // 11 d_headers.push_back(tr("Fr")); // 12
d_alignments.push_back(center); d_alignments.push_back(center);
d_headers.push_back(tr("Sa")); // 12 d_headers.push_back(tr("Sa")); // 13
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("RSS Feed")); // 13 d_headers.push_back(tr("RSS Feed")); // 14
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Origin")); // 14 d_headers.push_back(tr("Origin")); // 15
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("One Shot")); // 15 d_headers.push_back(tr("One Shot")); // 16
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Trim Threshold")); // 16 d_headers.push_back(tr("Trim Threshold")); // 17
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("StartDate Offset")); // 17 d_headers.push_back(tr("StartDate Offset")); // 18
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("EndDate Offset")); // 18 d_headers.push_back(tr("EndDate Offset")); // 19
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Format")); // 19 d_headers.push_back(tr("Format")); // 20
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Channels")); // 20 d_headers.push_back(tr("Channels")); // 21
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Sample Rate")); // 21 d_headers.push_back(tr("Sample Rate")); // 22
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Bit Rate")); // 22 d_headers.push_back(tr("Bit Rate")); // 23
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Host")); // 23 d_headers.push_back(tr("Host")); // 24
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Deck")); // 24 d_headers.push_back(tr("Deck")); // 25
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Cut")); // 25 d_headers.push_back(tr("Cut")); // 26
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Cart")); // 26 d_headers.push_back(tr("Cart")); // 27
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("ID")); // 27 d_headers.push_back(tr("ID")); // 28
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Type")); // 28 d_headers.push_back(tr("Type")); // 29
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Status")); // 29 d_headers.push_back(tr("Status")); // 30
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("Exit Code")); // 30 d_headers.push_back(tr("Exit Code")); // 31
d_alignments.push_back(left); d_alignments.push_back(left);
d_headers.push_back(tr("State")); // 31 d_headers.push_back(tr("State")); // 32
d_alignments.push_back(left); d_alignments.push_back(left);
updateModel(); updateModel();
@ -493,9 +496,29 @@ void RecordListModel::updateModel()
{ {
QList<QVariant> texts; QList<QVariant> texts;
QList<QVariant> icons; QList<QVariant> icons;
QString sql;
RDSqlQuery *q=NULL; RDSqlQuery *q=NULL;
QString sql=sqlFields()+
//
// Load Router Table
//
d_router_names.clear();
sql=QString("select ")+
"`STATION_NAME`,"+ // 00
"`MATRIX`,"+ // 01
"`NAME` "+ // 02
"from `MATRICES`";
q=new RDSqlQuery(sql);
while(q->next()) {
d_router_names[q->value(0).toString()][q->value(1).toInt()]=
q->value(2).toString();
}
delete q;
//
// Load Model Rows
//
sql=sqlFields()+
d_filter_sql+ d_filter_sql+
"order by `RECORDINGS`.`START_TIME` "; "order by `RECORDINGS`.`START_TIME` ";
beginResetModel(); beginResetModel();
@ -545,6 +568,7 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
QString sql; QString sql;
RDSqlQuery *q1=NULL; RDSqlQuery *q1=NULL;
RDCut *cut=NULL; RDCut *cut=NULL;
QMap<int,QString> names;
// //
// Event Values // Event Values
@ -587,25 +611,25 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
} }
texts[0]=q->value(1); // Description texts[0]=q->value(1); // Description
if(q->value(7).toString()=="Y") { // Sun if(q->value(7).toString()=="Y") { // Sun
texts[6]=tr("Su"); texts[7]=tr("Su");
} }
if(q->value(8).toString()=="Y") { // Mon if(q->value(8).toString()=="Y") { // Mon
texts[7]=tr("Mo"); texts[8]=tr("Mo");
} }
if(q->value(9).toString()=="Y") { // Tue if(q->value(9).toString()=="Y") { // Tue
texts[8]=tr("Tu"); texts[9]=tr("Tu");
} }
if(q->value(10).toString()=="Y") { // Wed if(q->value(10).toString()=="Y") { // Wed
texts[9]=tr("We"); texts[10]=tr("We");
} }
if(q->value(11).toString()=="Y") { // Thu if(q->value(11).toString()=="Y") { // Thu
texts[10]=tr("Th"); texts[11]=tr("Th");
} }
if(q->value(12).toString()=="Y") { // Fri if(q->value(12).toString()=="Y") { // Fri
texts[11]=tr("Fr"); texts[12]=tr("Fr");
} }
if(q->value(13).toString()=="Y") { // Sat if(q->value(13).toString()=="Y") { // Sat
texts[12]=tr("Sa"); texts[13]=tr("Sa");
} }
switch((RDRecording::Type)q->value(26).toInt()) { switch((RDRecording::Type)q->value(26).toInt()) {
@ -613,27 +637,27 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
case RDRecording::Playout: case RDRecording::Playout:
case RDRecording::Download: case RDRecording::Download:
case RDRecording::Upload: case RDRecording::Upload:
texts[14]=q->value(40).toString()+" - "+q->value(41).toDateTime(). texts[15]=q->value(40).toString()+" - "+q->value(41).toDateTime().
toString("M/dd/yyyy hh:mm:ss"); toString("M/dd/yyyy hh:mm:ss");
break; break;
default: default:
break; break;
} }
texts[15]=q->value(29).toString(); // One Shot texts[16]=q->value(29).toString(); // One Shot
texts[16]=QString::asprintf("%d ", // Trim Threshold texts[17]=QString::asprintf("%d ", // Trim Threshold
-q->value(17).toInt())+tr("dB"); -q->value(17).toInt())+tr("dB");
texts[17]=q->value(18).toString(); // Startdate Offset texts[18]=q->value(18).toString(); // Startdate Offset
texts[18]=q->value(19).toString(); // Enddate Offset texts[19]=q->value(19).toString(); // Enddate Offset
texts[23]=q->value(3).toString(); // Station texts[24]=q->value(3).toString(); // Station
texts[24]=q->value(24).toString(); // Deck texts[25]=q->value(24).toString(); // Deck
texts[25]=q->value(6).toString(); // Cut Name texts[26]=q->value(6).toString(); // Cut Name
if(q->value(24).toInt()>=0) { if(q->value(24).toInt()>=0) {
texts[26]=q->value(25).toString(); // Macro Cart texts[27]=q->value(25).toString(); // Macro Cart
} }
texts[27]=q->value(0).toString(); // Id texts[28]=q->value(0).toString(); // Id
texts[28]=q->value(26).toString(); // Type texts[29]=q->value(26).toString(); // Type
texts[31]=QString::asprintf("%u",RDDeck::Idle); texts[32]=QString::asprintf("%u",RDDeck::Idle);
switch((RDRecording::Type)q->value(26).toInt()) { switch((RDRecording::Type)q->value(26).toInt()) {
case RDRecording::Recording: case RDRecording::Recording:
@ -668,7 +692,8 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
q->value(39).toInt()); q->value(39).toInt());
break; break;
} }
texts[5]=tr("Cut")+" "+q->value(6).toString();
texts[6]=tr("Cut")+" "+q->value(6).toString();
sql=QString("select ")+ sql=QString("select ")+
"`SWITCH_STATION`,"+ // 00 "`SWITCH_STATION`,"+ // 00
"`SWITCH_MATRIX` "+ // 01 "`SWITCH_MATRIX` "+ // 01
@ -677,43 +702,43 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
QString::asprintf("(`CHANNEL`=%d)",q->value(24).toInt()); QString::asprintf("(`CHANNEL`=%d)",q->value(24).toInt());
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
if(q1->first()) { // Source if(q1->first()) { // Source
texts[4]=GetSourceName(q1->value(0).toString(),q1->value(1).toInt(), texts[5]=GetSourceName(q1->value(0).toString(),q1->value(1).toInt(),
q->value(14).toInt()); q->value(14).toInt());
} }
delete q1; delete q1;
switch((RDSettings::Format)q->value(20).toInt()) { // Format switch((RDSettings::Format)q->value(20).toInt()) { // Format
case RDSettings::Pcm16: case RDSettings::Pcm16:
texts[19]=tr("PCM16"); texts[20]=tr("PCM16");
break; break;
case RDSettings::Pcm24: case RDSettings::Pcm24:
texts[19]=tr("PCM24"); texts[20]=tr("PCM24");
break; break;
case RDSettings::MpegL1: case RDSettings::MpegL1:
texts[19]=tr("MPEG Layer 1"); texts[20]=tr("MPEG Layer 1");
break; break;
case RDSettings::MpegL2: case RDSettings::MpegL2:
case RDSettings::MpegL2Wav: case RDSettings::MpegL2Wav:
texts[19]=tr("MPEG Layer 2"); texts[20]=tr("MPEG Layer 2");
break; break;
case RDSettings::MpegL3: case RDSettings::MpegL3:
texts[19]=tr("MPEG Layer 3"); texts[20]=tr("MPEG Layer 3");
break; break;
case RDSettings::Flac: case RDSettings::Flac:
texts[19]=tr("FLAC"); texts[20]=tr("FLAC");
break; break;
case RDSettings::OggVorbis: case RDSettings::OggVorbis:
texts[19]=tr("OggVorbis"); texts[20]=tr("OggVorbis");
break; break;
} }
texts[20]=q->value(21).toString(); // Channels texts[21]=q->value(21).toString(); // Channels
texts[21]=q->value(22).toString(); // Sample Rate texts[22]=q->value(22).toString(); // Sample Rate
texts[22]=q->value(23).toString(); // Bit Rate texts[23]=q->value(23).toString(); // Bit Rate
break; break;
case RDRecording::Playout: case RDRecording::Playout:
@ -725,23 +750,25 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
texts[3]=tr("Len")+": "+RDGetTimeLength(cut->length(),false,false); texts[3]=tr("Len")+": "+RDGetTimeLength(cut->length(),false,false);
} }
delete cut; delete cut;
texts[4]=tr("Cut")+" "+q->value(6).toString(); texts[5]=tr("Cut")+" "+q->value(6).toString();
break; break;
case RDRecording::MacroEvent: case RDRecording::MacroEvent:
texts[1]=q->value(3).toString(); texts[1]=q->value(3).toString();
texts[2]=tr("Hard")+": "+q->value(4).toTime(). texts[2]=tr("Hard")+": "+q->value(4).toTime().
toString(QString::asprintf("hh:mm:ss")); toString(QString::asprintf("hh:mm:ss"));
texts[4]=tr("Cart")+QString::asprintf(" %06d",q->value(25).toInt()); texts[5]=tr("Cart")+QString::asprintf(" %06d",q->value(25).toInt());
break; break;
case RDRecording::SwitchEvent: case RDRecording::SwitchEvent:
texts[1]=q->value(3).toString(); texts[1]=q->value(3).toString();
texts[2]=tr("Hard")+": "+rda->timeString(q->value(4).toTime()); texts[2]=tr("Hard")+": "+rda->timeString(q->value(4).toTime());
texts[4]=GetSourceName(q->value(3).toString(), // Source texts[4]=
d_router_names.value(q->value(3).toString()).value(q->value(24).toInt());
texts[5]=GetSourceName(q->value(3).toString(), // Source
q->value(24).toInt(), q->value(24).toInt(),
q->value(14).toInt()); q->value(14).toInt());
texts[5]=GetDestinationName(q->value(3).toString(), // Dest texts[6]=GetDestinationName(q->value(3).toString(), // Dest
q->value(24).toInt(), q->value(24).toInt(),
q->value(27).toInt()); q->value(27).toInt());
break; break;
@ -749,58 +776,58 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
case RDRecording::Download: case RDRecording::Download:
texts[1]=q->value(3).toString(); texts[1]=q->value(3).toString();
texts[2]=tr("Hard")+": "+rda->timeString(q->value(4).toTime()); texts[2]=tr("Hard")+": "+rda->timeString(q->value(4).toTime());
texts[4]=q->value(42).toString(); texts[5]=q->value(42).toString();
texts[5]=tr("Cut")+" "+q->value(6).toString(); texts[6]=tr("Cut")+" "+q->value(6).toString();
break; break;
case RDRecording::Upload: case RDRecording::Upload:
texts[1]=q->value(3).toString(); texts[1]=q->value(3).toString();
texts[2]=tr("Hard")+": "+rda->timeString(q->value(4).toTime()); texts[2]=tr("Hard")+": "+rda->timeString(q->value(4).toTime());
texts[4]=tr("Cut")+" "+q->value(6).toString(); texts[5]=tr("Cut")+" "+q->value(6).toString();
texts[5]=q->value(42).toString(); texts[6]=q->value(42).toString();
switch((RDSettings::Format)q->value(20).toInt()) { // Format switch((RDSettings::Format)q->value(20).toInt()) { // Format
case RDSettings::Pcm16: case RDSettings::Pcm16:
texts[19]=tr("PCM16"); texts[20]=tr("PCM16");
break; break;
case RDSettings::Pcm24: case RDSettings::Pcm24:
texts[19]=tr("PCM24"); texts[20]=tr("PCM24");
break; break;
case RDSettings::MpegL1: case RDSettings::MpegL1:
texts[19]=tr("MPEG Layer 1"); texts[20]=tr("MPEG Layer 1");
break; break;
case RDSettings::MpegL2: case RDSettings::MpegL2:
case RDSettings::MpegL2Wav: case RDSettings::MpegL2Wav:
texts[19]=tr("MPEG Layer 2"); texts[20]=tr("MPEG Layer 2");
break; break;
case RDSettings::MpegL3: case RDSettings::MpegL3:
texts[19]=tr("MPEG Layer 3"); texts[20]=tr("MPEG Layer 3");
break; break;
case RDSettings::Flac: case RDSettings::Flac:
texts[19]=tr("FLAC"); texts[20]=tr("FLAC");
break; break;
case RDSettings::OggVorbis: case RDSettings::OggVorbis:
texts[19]=tr("OggVorbis"); texts[20]=tr("OggVorbis");
break; break;
} }
if(q->value(44).toString().isEmpty()) { if(q->value(44).toString().isEmpty()) {
texts[13]=tr("[none]"); texts[14]=tr("[none]");
} }
else { else {
texts[13]=q->value(44).toString(); // Feed Key Name texts[14]=q->value(44).toString(); // Feed Key Name
} }
texts[20]=q->value(21).toString(); // Channels texts[22]=q->value(21).toString(); // Channels
texts[21]=q->value(22).toString(); // Sample Rate texts[23]=q->value(22).toString(); // Sample Rate
if(q->value(23).toInt()==0) { // Bit Rate/Quality if(q->value(23).toInt()==0) { // Bit Rate/Quality
texts[22]=QString::asprintf("Qual %d",q->value(43).toInt()); texts[23]=QString::asprintf("Qual %d",q->value(43).toInt());
} }
else { else {
texts[22]=QString::asprintf("%d kb/sec",q->value(23).toInt()/1000); texts[23]=QString::asprintf("%d kb/sec",q->value(23).toInt()/1000);
} }
break; break;

View File

@ -96,6 +96,7 @@ class RecordListModel : public QAbstractTableModel
QList<bool> d_is_nexts; QList<bool> d_is_nexts;
QList<RDDeck::Status> d_statuses; QList<RDDeck::Status> d_statuses;
QList<QList<QVariant> > d_icons; QList<QList<QVariant> > d_icons;
QMap<QString,QMap<int,QString> > d_router_names;
QString d_filter_sql; QString d_filter_sql;
}; };