mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-19 06:32:34 +02:00
2022-11-02 Fred Gleason <fredg@paravelsystems.com>
* Refactored rdcatch(1) and rdcatchd(8) to use the notification mechanism instead for distributing meter updates instead of the 'Enable Metering' catch command. Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
parent
54d8bd4a10
commit
ae3542f9a4
@ -23604,3 +23604,7 @@
|
||||
catch command.
|
||||
2022-11-01 Fred Gleason <fredg@paravelsystems.com>
|
||||
* Added a 'Reload Decks' operation to 'RDCatchEvent'.
|
||||
2022-11-02 Fred Gleason <fredg@paravelsystems.com>
|
||||
* Refactored rdcatch(1) and rdcatchd(8) to use the notification
|
||||
mechanism instead for distributing meter updates instead of the
|
||||
'Enable Metering' catch command.
|
||||
|
@ -655,14 +655,14 @@
|
||||
</table>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="sect.rdcatch_stop_deck">
|
||||
<title>Stop Deck Operation</title>
|
||||
<sect2 xml:id="sect.rdcatch_send_meter_levels">
|
||||
<title>Send Meter Levels Operation</title>
|
||||
<para>
|
||||
Emitted by <command>rdcatch</command><manvolnum>1</manvolnum> to
|
||||
abort a Record or Play-out event.
|
||||
Emitted by <command>rdcatchd</command><manvolnum>8</manvolnum> to
|
||||
update audio meter levels for active record and play-out decks.
|
||||
</para>
|
||||
<table xml:id="table.rdcatch_stop_deck" frame="all" pgwide="0">
|
||||
<title>RDCatch Stop Deck Fields</title>
|
||||
<table xml:id="table.rdcatch_send_meter_levels" frame="all" pgwide="0">
|
||||
<title>RDCatch Send Meter Levels Fields</title>
|
||||
<tgroup cols="3" align="left" colsep="1" rowsep="1">
|
||||
<colspec colname="Field" colwidth="10.0*"/>
|
||||
<colspec colname="Offset" colwidth="2.0*"/>
|
||||
@ -686,20 +686,12 @@
|
||||
<row>
|
||||
<entry>Operation</entry>
|
||||
<entry>2</entry>
|
||||
<entry>Integer. 4 [RDCatchEvent::StopDeckOp]</entry>
|
||||
<entry>Integer. 8 [RDCatchEvent::SendMeterLevelsOp]</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Target Hostname</entry>
|
||||
<entry>Meter Entry</entry>
|
||||
<entry>3</entry>
|
||||
<entry>String, from STATIONS.NAME</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Deck Channel</entry>
|
||||
<entry>4</entry>
|
||||
<entry>
|
||||
Integer. Record decks have values in the range 1-127,
|
||||
while play decks have values in the range 128-254.
|
||||
</entry>
|
||||
<entry>String, <replaceable>chan</replaceable>:<replaceable>left-lvl</replaceable>:<replaceable>right-lvl</replaceable></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
@ -817,6 +809,57 @@
|
||||
</table>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="sect.rdcatch_stop_deck">
|
||||
<title>Stop Deck Operation</title>
|
||||
<para>
|
||||
Emitted by <command>rdcatch</command><manvolnum>1</manvolnum> to
|
||||
abort a Record or Play-out event.
|
||||
</para>
|
||||
<table xml:id="table.rdcatch_stop_deck" frame="all" pgwide="0">
|
||||
<title>RDCatch Stop Deck Fields</title>
|
||||
<tgroup cols="3" align="left" colsep="1" rowsep="1">
|
||||
<colspec colname="Field" colwidth="10.0*"/>
|
||||
<colspec colname="Offset" colwidth="2.0*"/>
|
||||
<colspec colname="Value" colwidth="10.0*"/>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>Field</entry>
|
||||
<entry>Offset</entry>
|
||||
<entry>Value</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Keyword</entry>
|
||||
<entry>0</entry>
|
||||
<entry>CATCH</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Originating Hostname</entry>
|
||||
<entry>1</entry>
|
||||
<entry>String, from STATIONS.NAME</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Operation</entry>
|
||||
<entry>2</entry>
|
||||
<entry>Integer. 4 [RDCatchEvent::StopDeckOp]</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Target Hostname</entry>
|
||||
<entry>3</entry>
|
||||
<entry>String, from STATIONS.NAME</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Deck Channel</entry>
|
||||
<entry>4</entry>
|
||||
<entry>
|
||||
Integer. Record decks have values in the range 1-127,
|
||||
while play decks have values in the range 128-254.
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
</sect2>
|
||||
|
||||
</sect1>
|
||||
|
||||
</article>
|
||||
|
@ -23,6 +23,43 @@
|
||||
#include "rdcatchevent.h"
|
||||
#include "rdapplication.h"
|
||||
|
||||
RDCatchMeterLevel::RDCatchMeterLevel(int deck,int16_t *lvls)
|
||||
{
|
||||
d_deck_channel=deck;
|
||||
for(int i=0;i<RDCatchMeterLevel::LastChannel;i++) {
|
||||
d_levels[i]=-lvls[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unsigned RDCatchMeterLevel::deckChannel() const
|
||||
{
|
||||
return d_deck_channel;
|
||||
}
|
||||
|
||||
|
||||
int16_t RDCatchMeterLevel::level(Channel chan) const
|
||||
{
|
||||
return -d_levels[chan];
|
||||
}
|
||||
|
||||
|
||||
QString RDCatchMeterLevel::dump() const
|
||||
{
|
||||
QString lvls;
|
||||
QString ret;
|
||||
|
||||
for(int j=0;j<RDCatchMeterLevel::LastChannel;j++) {
|
||||
lvls+=QString::asprintf(":%04X",d_levels[j]);
|
||||
}
|
||||
ret+=QString::asprintf("%u",d_deck_channel)+lvls;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
RDCatchEvent::RDCatchEvent(RDDeck::Status status)
|
||||
{
|
||||
clear();
|
||||
@ -157,6 +194,18 @@ void RDCatchEvent::setInputMonitorActive(bool state)
|
||||
}
|
||||
|
||||
|
||||
QList<RDCatchMeterLevel> RDCatchEvent::meterLevels() const
|
||||
{
|
||||
return d_meter_levels;
|
||||
}
|
||||
|
||||
|
||||
void RDCatchEvent::setMeterLevels(const QList<RDCatchMeterLevel> &lvls)
|
||||
{
|
||||
d_meter_levels=lvls;
|
||||
}
|
||||
|
||||
|
||||
bool RDCatchEvent::read(const QString &str)
|
||||
{
|
||||
// printf("RDCatchEvent::read(\"%s\")\n",str.toUtf8().constData());
|
||||
@ -205,6 +254,32 @@ bool RDCatchEvent::read(const QString &str)
|
||||
}
|
||||
break;
|
||||
|
||||
case RDCatchEvent::SendMeterLevelsOp:
|
||||
for(int i=2;i<f0.size();i++) {
|
||||
QStringList f1=f0.at(i).split(":",QString::KeepEmptyParts);
|
||||
if(f1.size()==(1+RDCatchMeterLevel::LastChannel)) {
|
||||
chan=f1.at(0).toUInt(&ok);
|
||||
if(chan>=255) {
|
||||
d_meter_levels.clear();
|
||||
return false;
|
||||
}
|
||||
int16_t lvls[RDCatchMeterLevel::LastChannel];
|
||||
for(int j=0;j<RDCatchMeterLevel::LastChannel;j++) {
|
||||
int lvl=f1.at(1+j).toInt(&ok,16);
|
||||
if((!ok)||(lvl>0xFFFF)) {
|
||||
d_meter_levels.clear();
|
||||
return false;
|
||||
}
|
||||
lvls[j]=-(int16_t)lvl;
|
||||
}
|
||||
d_meter_levels.push_back(RDCatchMeterLevel(chan,lvls));
|
||||
}
|
||||
}
|
||||
d_operation=op;
|
||||
d_host_name=f0.at(1);
|
||||
return true;
|
||||
break;
|
||||
|
||||
case RDCatchEvent::DeckStatusQueryOp:
|
||||
if(f0.size()!=3) {
|
||||
return false;
|
||||
@ -347,6 +422,12 @@ QString RDCatchEvent::write() const
|
||||
case RDCatchEvent::LastOp:
|
||||
break;
|
||||
|
||||
case RDCatchEvent::SendMeterLevelsOp:
|
||||
for(int i=0;i<d_meter_levels.size();i++) {
|
||||
ret+=" "+d_meter_levels.at(i).dump();
|
||||
}
|
||||
break;
|
||||
|
||||
case RDCatchEvent::SetInputMonitorOp:
|
||||
ret+=" "+d_target_host_name;
|
||||
ret+=QString::asprintf(" %u",d_deck_channel);
|
||||
@ -391,6 +472,12 @@ QString RDCatchEvent::dump() const
|
||||
ret+=QString::asprintf("event number: %u\n",d_event_number);
|
||||
break;
|
||||
|
||||
case RDCatchEvent::SendMeterLevelsOp:
|
||||
for(int i=0;i<d_meter_levels.size();i++) {
|
||||
ret+="meter level: "+d_meter_levels.at(i).dump()+"\n";
|
||||
}
|
||||
break;
|
||||
|
||||
case RDCatchEvent::DeckStatusQueryOp:
|
||||
ret+="operation: RDCatchEvent::DeckStatusQueryOp\n";
|
||||
break;
|
||||
@ -449,4 +536,5 @@ void RDCatchEvent::clear()
|
||||
d_event_number=0;
|
||||
d_input_monitor_active=false;
|
||||
d_deck_status=RDDeck::Offline;
|
||||
d_meter_levels.clear();
|
||||
}
|
||||
|
@ -21,18 +21,36 @@
|
||||
#ifndef RDCATCHEVENT_H
|
||||
#define RDCATCHEVENT_H
|
||||
|
||||
#include <QList>
|
||||
#include <QString>
|
||||
#include <QVariant>
|
||||
|
||||
#include <rddeck.h>
|
||||
|
||||
class RDCatchMeterLevel
|
||||
{
|
||||
public:
|
||||
enum Channel {Left=0,Right=1,LastChannel=2};
|
||||
RDCatchMeterLevel(int deck,int16_t *lvls);
|
||||
unsigned deckChannel() const;
|
||||
int16_t level(Channel chan) const;
|
||||
QString dump() const;
|
||||
|
||||
private:
|
||||
unsigned d_deck_channel;
|
||||
int16_t d_levels[Channel::LastChannel];
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class RDCatchEvent
|
||||
{
|
||||
public:
|
||||
enum Operation {NullOp=0,DeckEventProcessedOp=1,
|
||||
DeckStatusQueryOp=2,DeckStatusResponseOp=3,
|
||||
StopDeckOp=4,SetInputMonitorOp=5,SetInputMonitorResponseOp=6,
|
||||
ReloadDecksOp=7,LastOp=8};
|
||||
ReloadDecksOp=7,SendMeterLevelsOp=8,LastOp=9};
|
||||
RDCatchEvent(RDDeck::Status status);
|
||||
RDCatchEvent();
|
||||
Operation operation() const;
|
||||
@ -55,6 +73,8 @@ class RDCatchEvent
|
||||
void setDeckStatus(RDDeck::Status status);
|
||||
bool inputMonitorActive() const;
|
||||
void setInputMonitorActive(bool state);
|
||||
QList<RDCatchMeterLevel> meterLevels() const;
|
||||
void setMeterLevels(const QList<RDCatchMeterLevel> &lvls);
|
||||
bool read(const QString &str);
|
||||
QString write() const;
|
||||
QString dump() const;
|
||||
@ -70,6 +90,7 @@ class RDCatchEvent
|
||||
unsigned d_deck_channel;
|
||||
int d_event_number;
|
||||
bool d_input_monitor_active;
|
||||
QList<RDCatchMeterLevel> d_meter_levels;
|
||||
RDDeck::Status d_deck_status;
|
||||
};
|
||||
|
||||
|
@ -205,7 +205,7 @@ void DeckMon::setStatus(RDDeck::Status status,int id,const QString &cutname)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
void DeckMon::setLeftMeter(int level)
|
||||
{
|
||||
mon_left_meter->setPeakBar(level);
|
||||
@ -216,19 +216,39 @@ void DeckMon::setRightMeter(int level)
|
||||
{
|
||||
mon_right_meter->setPeakBar(level);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
void DeckMon::processCatchEvent(RDCatchEvent *evt)
|
||||
{
|
||||
if((evt->hostName()==mon_station)&&(evt->deckChannel()==mon_channel)) {
|
||||
// printf("processCatchEvent(): %s\n",evt->dump().toUtf8().constData());
|
||||
|
||||
QList<RDCatchMeterLevel> meter_levels;
|
||||
|
||||
if(evt->hostName()==mon_station) {
|
||||
switch(evt->operation()) {
|
||||
case RDCatchEvent::DeckEventProcessedOp:
|
||||
mon_event_light->trigger(evt->eventNumber());
|
||||
if(evt->deckChannel()==mon_channel) {
|
||||
mon_event_light->trigger(evt->eventNumber());
|
||||
}
|
||||
break;
|
||||
|
||||
case RDCatchEvent::DeckStatusResponseOp:
|
||||
setStatus(evt->deckStatus(),evt->eventId(),
|
||||
RDCut::cutName(evt->cartNumber(),evt->cutNumber()));
|
||||
if(evt->deckChannel()==mon_channel) {
|
||||
setStatus(evt->deckStatus(),evt->eventId(),
|
||||
RDCut::cutName(evt->cartNumber(),evt->cutNumber()));
|
||||
}
|
||||
break;
|
||||
|
||||
case RDCatchEvent::SendMeterLevelsOp:
|
||||
meter_levels=evt->meterLevels();
|
||||
for(int i=0;i<meter_levels.size();i++) {
|
||||
if(meter_levels.at(i).deckChannel()==mon_channel) {
|
||||
mon_left_meter->
|
||||
setPeakBar(meter_levels.at(i).level(RDCatchMeterLevel::Left));
|
||||
mon_right_meter->
|
||||
setPeakBar(meter_levels.at(i).level(RDCatchMeterLevel::Right));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RDCatchEvent::SetInputMonitorResponseOp:
|
||||
@ -248,6 +268,7 @@ void DeckMon::processCatchEvent(RDCatchEvent *evt)
|
||||
break;
|
||||
|
||||
case RDCatchEvent::DeckStatusQueryOp:
|
||||
case RDCatchEvent::ReloadDecksOp:
|
||||
case RDCatchEvent::StopDeckOp:
|
||||
case RDCatchEvent::SetInputMonitorOp:
|
||||
case RDCatchEvent::NullOp:
|
||||
|
@ -43,8 +43,8 @@ class DeckMon : public RDFrame
|
||||
|
||||
public slots:
|
||||
void setStatus(RDDeck::Status status,int id,const QString &cutname);
|
||||
void setLeftMeter(int level);
|
||||
void setRightMeter(int level);
|
||||
// void setLeftMeter(int level);
|
||||
// void setRightMeter(int level);
|
||||
void processCatchEvent(RDCatchEvent *evt);
|
||||
|
||||
protected:
|
||||
|
@ -195,9 +195,11 @@ MainWidget::MainWidget(RDConfig *c,QWidget *parent)
|
||||
connect(catch_connect.back()->connector(),
|
||||
SIGNAL(connected(int,bool)),
|
||||
this,SLOT(connectedData(int,bool)));
|
||||
/*
|
||||
connect(catch_connect.back()->connector(),
|
||||
SIGNAL(meterLevel(int,int,int,int)),
|
||||
this,SLOT(meterLevelData(int,int,int,int)));
|
||||
*/
|
||||
catch_connect.back()->connector()->
|
||||
connectHost(q->value(1).toString(),RDCATCHD_TCP_PORT,
|
||||
rda->config()->password());
|
||||
@ -754,6 +756,7 @@ void MainWidget::catchEventReceivedData(RDCatchEvent *evt)
|
||||
|
||||
switch(evt->operation()) {
|
||||
case RDCatchEvent::DeckStatusResponseOp:
|
||||
printf("catchEventReceivedData(): %s\n",evt->dump().toUtf8().constData());
|
||||
if(evt->eventId()>0) {
|
||||
if(!catch_recordings_model->refresh(evt->eventId())) {
|
||||
catch_recordings_model->addRecord(evt->eventId());
|
||||
@ -765,6 +768,8 @@ void MainWidget::catchEventReceivedData(RDCatchEvent *evt)
|
||||
case RDCatchEvent::DeckEventProcessedOp:
|
||||
case RDCatchEvent::DeckStatusQueryOp:
|
||||
case RDCatchEvent::StopDeckOp:
|
||||
case RDCatchEvent::ReloadDecksOp:
|
||||
case RDCatchEvent::SendMeterLevelsOp:
|
||||
case RDCatchEvent::SetInputMonitorOp:
|
||||
case RDCatchEvent::SetInputMonitorResponseOp:
|
||||
case RDCatchEvent::NullOp:
|
||||
@ -900,7 +905,7 @@ void MainWidget::playStoppedData(int handle)
|
||||
rda->cae()->unloadPlay(catch_play_handle);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
void MainWidget::meterLevelData(int serial,int deck,int l_r,int level)
|
||||
{
|
||||
DeckMon *monitor;
|
||||
@ -918,7 +923,7 @@ void MainWidget::meterLevelData(int serial,int deck,int l_r,int level)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
void MainWidget::selectionChangedData(const QItemSelection &before,
|
||||
const QItemSelection &after)
|
||||
|
@ -90,7 +90,7 @@ class MainWidget : public RDMainWindow
|
||||
void initData(bool);
|
||||
void playedData(int);
|
||||
void playStoppedData(int);
|
||||
void meterLevelData(int,int,int,int);
|
||||
// void meterLevelData(int,int,int,int);
|
||||
void selectionChangedData(const QItemSelection &before,
|
||||
const QItemSelection &after);
|
||||
void doubleClickedData(const QModelIndex &index);
|
||||
|
@ -637,12 +637,14 @@ void RecordListModel::updateRow(int row,RDSqlQuery *q)
|
||||
//
|
||||
// Qt::BackgroundRole:
|
||||
//
|
||||
if(q->value(25).toInt()==0) {
|
||||
d_back_colors[row]=QVariant();
|
||||
if(d_statuses.at(row)==RDDeck::Idle) { // So we don't trump a realtime status
|
||||
if(q->value(25).toInt()==0) {
|
||||
d_back_colors[row]=QVariant();
|
||||
}
|
||||
else {
|
||||
d_back_colors[row]=QColor(EVENT_ERROR_COLOR);
|
||||
}
|
||||
}
|
||||
else {
|
||||
d_back_colors[row]=QColor(EVENT_ERROR_COLOR);
|
||||
}
|
||||
|
||||
//
|
||||
// Qt::DecorationType
|
||||
@ -949,6 +951,9 @@ QString RecordListModel::GetDestinationName(QString station,int matrix,
|
||||
|
||||
void RecordListModel::UpdateStatus(int line)
|
||||
{
|
||||
printf("RecordListModel::UpdateStatus(%d)\n",line);
|
||||
printf(" using status: %u\n",d_statuses.at(line));
|
||||
|
||||
switch(d_statuses.at(line)) {
|
||||
case RDDeck::Offline:
|
||||
case RDDeck::LastStatus:
|
||||
@ -972,6 +977,8 @@ void RecordListModel::UpdateStatus(int line)
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
RDRecording::ExitCode code=RDRecording::InternalError;
|
||||
QString err_text=tr("Unknown");
|
||||
|
||||
|
@ -526,6 +526,7 @@ void MainObject::catchEventReceivedData(RDCatchEvent *evt)
|
||||
break;
|
||||
|
||||
case RDCatchEvent::DeckEventProcessedOp:
|
||||
case RDCatchEvent::SendMeterLevelsOp:
|
||||
case RDCatchEvent::DeckStatusResponseOp:
|
||||
case RDCatchEvent::SetInputMonitorResponseOp:
|
||||
case RDCatchEvent::NullOp:
|
||||
@ -1152,7 +1153,29 @@ void MainObject::runCartData(int chan,int number,unsigned cartnum)
|
||||
void MainObject::meterData()
|
||||
{
|
||||
short levels[2];
|
||||
QList<RDCatchMeterLevel> meter_levels;
|
||||
|
||||
for(int i=0;i<MAX_DECKS;i++) {
|
||||
if(catch_record_deck_status[i]==RDDeck::Recording) {
|
||||
rda->cae()->
|
||||
inputMeterUpdate(catch_record_card[i],catch_record_stream[i],levels);
|
||||
meter_levels.push_back(RDCatchMeterLevel(i,levels));
|
||||
}
|
||||
if(catch_playout_deck_status[i]==RDDeck::Recording) {
|
||||
rda->cae()->
|
||||
outputMeterUpdate(catch_playout_card[i],catch_playout_port[i],levels);
|
||||
meter_levels.push_back(RDCatchMeterLevel(i+129,levels));
|
||||
}
|
||||
}
|
||||
if(meter_levels.size()>0) {
|
||||
RDCatchEvent *evt=new RDCatchEvent();
|
||||
evt->setOperation(RDCatchEvent::SendMeterLevelsOp);
|
||||
evt->setMeterLevels(meter_levels);
|
||||
rda->ripc()->sendCatchEvent(evt);
|
||||
delete evt;
|
||||
}
|
||||
|
||||
/*
|
||||
for(int i=0;i<MAX_DECKS;i++) {
|
||||
if(catch_record_deck_status[i]==RDDeck::Recording) {
|
||||
rda->cae()->inputMeterUpdate(catch_record_card[i],catch_record_stream[i],
|
||||
@ -1166,6 +1189,7 @@ void MainObject::meterData()
|
||||
SendMeterLevel(i+129,levels);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user