2021-06-23 Fred Gleason <fredg@paravelsystems.com>

* Added a voice tracker widget to the right-hand side of
	rdairplay(1).

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-06-23 12:11:59 -04:00
parent b98b33cfe2
commit 25c13af6c0
9 changed files with 529 additions and 315 deletions

View File

@ -21957,3 +21957,6 @@
* Broke out voicetracker functionality from rdlogedit(1) into * Broke out voicetracker functionality from rdlogedit(1) into
'RDTrackerEditDialog', 'RDTrackerModel', 'RDTrackerTableView' 'RDTrackerEditDialog', 'RDTrackerModel', 'RDTrackerTableView'
and 'RDTrackerWidget' classes. and 'RDTrackerWidget' classes.
2021-06-23 Fred Gleason <fredg@paravelsystems.com>
* Added a voice tracker widget to the right-hand side of
rdairplay(1).

View File

@ -301,12 +301,12 @@ int RDLogModel::append(const QString &logname,bool track_ptrs)
void RDLogModel::clear() void RDLogModel::clear()
{ {
if(d_log_lines.size()>0) { if(d_log_lines.size()>0) {
beginRemoveRows(QModelIndex(),0,lineCount()-1); beginResetModel();
for(int i=0;i<d_log_lines.size();i++) { for(int i=0;i<d_log_lines.size();i++) {
delete d_log_lines.at(i); delete d_log_lines.at(i);
} }
d_log_lines.clear(); d_log_lines.clear();
endRemoveRows(); endResetModel();
} }
d_log_name=""; d_log_name="";
d_max_id=0; d_max_id=0;

View File

@ -389,6 +389,8 @@ RDTrackerWidget::RDTrackerWidget(QString *import_path,QWidget *parent)
d_delete_button->setFont(buttonFont()); d_delete_button->setFont(buttonFont());
d_delete_button->setText(tr("Delete\nTrack")); d_delete_button->setText(tr("Delete\nTrack"));
connect(d_delete_button,SIGNAL(clicked()),this,SLOT(deleteData())); connect(d_delete_button,SIGNAL(clicked()),this,SLOT(deleteData()));
setDisabled(true);
} }
@ -483,6 +485,8 @@ bool RDTrackerWidget::load(const QString &logname)
tr("No voicetracking group has been defined for this service,\ntherefore only existing transitions will be editable.")); tr("No voicetracking group has been defined for this service,\ntherefore only existing transitions will be editable."));
} }
setEnabled(true);
return true; return true;
} }
@ -494,6 +498,7 @@ void RDTrackerWidget::unload()
if(d_size_altered) { if(d_size_altered) {
d_log_model->save(rda->config()); d_log_model->save(rda->config());
} }
d_log_model->clear();
if(d_log_lock!=NULL) { if(d_log_lock!=NULL) {
delete d_log_lock; delete d_log_lock;
d_log_lock=NULL; d_log_lock=NULL;
@ -512,6 +517,8 @@ void RDTrackerWidget::unload()
} }
d_tracks=0; d_tracks=0;
LoadTrack(-1);
setDisabled(true);
} }
@ -1758,7 +1765,7 @@ void RDTrackerWidget::resizeEvent(QResizeEvent *e)
delete d_wave_map[i]; delete d_wave_map[i];
d_wave_map[i]=new QPixmap(size().width()-90,77); d_wave_map[i]=new QPixmap(size().width()-90,77);
} }
DragTrack(0,0); LoadTrack(d_track_line);
} }
d_track1_button->setGeometry(size().width()-80,4,70,70); d_track1_button->setGeometry(size().width()-80,4,70,70);
@ -1810,12 +1817,14 @@ void RDTrackerWidget::paintEvent(QPaintEvent *e)
if(d_track_line<0) { if(d_track_line<0) {
p=new QPainter(); p=new QPainter();
for(int i=0;i<3;i++) { for(int i=0;i<3;i++) {
p->begin(d_wave_map[i]); if(!d_wave_map[i]->isNull()) {
p->setPen(TRACKER_TEXT_COLOR); p->begin(d_wave_map[i]);
p->setBackground(Qt::gray); p->setPen(TRACKER_TEXT_COLOR);
p->eraseRect(0,0,d_wave_map[i]->size().width(), p->setBackground(Qt::gray);
d_wave_map[i]->size().height()); p->eraseRect(0,0,d_wave_map[i]->size().width(),
p->end(); d_wave_map[i]->size().height());
p->end();
}
} }
delete p; delete p;
} }
@ -2169,9 +2178,11 @@ void RDTrackerWidget::LoadTrack(int line)
if(d_wpg[i]!=NULL) { if(d_wpg[i]!=NULL) {
delete d_wpg[i]; delete d_wpg[i];
} }
d_wpg[i]=new RDWavePainter(d_wave_map[i],d_track_cuts[i], if(!d_wave_map[i]->isNull()) {
rda->station(),rda->user(),rda->config()); d_wpg[i]=new RDWavePainter(d_wave_map[i],d_track_cuts[i],
d_wpg[i]->end(); rda->station(),rda->user(),rda->config());
d_wpg[i]->end();
}
} }
} }
@ -2258,6 +2269,7 @@ void RDTrackerWidget::LoadTrack(int line)
DrawTrackMap(0); DrawTrackMap(0);
DrawTrackMap(1); DrawTrackMap(1);
DrawTrackMap(2); DrawTrackMap(2);
UpdateControls(); UpdateControls();
} }
@ -2820,7 +2832,7 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
QColor back_color; QColor back_color;
switch(trackno) { switch(trackno) {
case 0: case 0:
if(d_wave_name[0].isEmpty()) { if(d_wave_name[0].isEmpty()&&(!d_wave_map[0]->isNull())) {
p=new QPainter(d_wave_map[0]); p=new QPainter(d_wave_map[0]);
p->setBackground(Qt::gray); p->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[0]->size().width(), p->eraseRect(0,0,d_wave_map[0]->size().width(),
@ -2829,108 +2841,111 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
delete p; delete p;
} }
else { else {
d_wpg[0]->begin(d_wave_map[0]); if(!d_wave_map[0]->isNull()&&(!d_wave_map[0]->isNull())) {
d_wpg[0]->setFont(labelFont()); d_wpg[0]->begin(d_wave_map[0]);
d_wpg[0]->setPen(TRACKER_TEXT_COLOR); d_wpg[0]->setFont(labelFont());
d_wpg[0]->setBackground(palette().color(QPalette::Background)); d_wpg[0]->setPen(TRACKER_TEXT_COLOR);
d_wpg[0]->eraseRect(0,0,d_wave_map[0]->size().width(), d_wpg[0]->setBackground(palette().color(QPalette::Background));
d_wave_map[0]->size().height()); d_wpg[0]->eraseRect(0,0,d_wave_map[0]->size().width(),
if(!d_wave_name[0].isEmpty()) { d_wave_map[0]->size().height());
d_wpg[0]->drawWaveByMsecs(0,d_wave_map[0]->width(), if(!d_wave_name[0].isEmpty()) {
d_wave_origin[0], d_wpg[0]->drawWaveByMsecs(0,d_wave_map[0]->width(),
d_wave_origin[0]+d_wave_width,800, d_wave_origin[0],
RDWavePainter::Mono,Qt::black, d_wave_origin[0]+d_wave_width,800,
d_loglines[0]-> RDWavePainter::Mono,Qt::black,
startPoint(RDLogLine::CartPointer), d_loglines[0]->
d_loglines[0]-> startPoint(RDLogLine::CartPointer),
endPoint(RDLogLine::CartPointer)); d_loglines[0]->
endPoint(RDLogLine::CartPointer));
// //
// Draw Segue Markers // Draw Segue Markers
// //
if(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)>=0) { if(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)- xpos=(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,true);
xpos=(d_loglines[0]->segueEndPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,false);
}
//
// Draw Start Marker
//
xpos=(d_loglines[0]->startPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos, DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,true);
xpos=(d_loglines[0]->segueEndPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,false);
}
//
// Draw Start Marker
//
xpos=(d_loglines[0]->startPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_START_END_MARKER_COLOR,10,true);
//
// Draw End Marker
//
xpos=(d_loglines[0]->endPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_START_END_MARKER_COLOR,10,false);
//
// Draw Fadedown Marker
//
if(d_loglines[0]->fadedownPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[0]->fadedownPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_FADE_MARKER_COLOR,30,true);
}
//
// Draw Rubber Bands
//
DrawRubberBand(d_wpg[0],0);
//
// Draw Menu Marker
//
if(d_menu_clicked_point>=0 && d_rightclick_track==0) {
DrawCursor(d_wpg[0],d_wave_map[0]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,true); RD_START_END_MARKER_COLOR,10,true);
DrawCursor(d_wpg[0],d_wave_map[0]->height(),d_menu_clicked_point,
//
// Draw End Marker
//
xpos=(d_loglines[0]->endPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_START_END_MARKER_COLOR,10,false); RD_START_END_MARKER_COLOR,10,false);
}
//
// Draw Fadedown Marker
//
if(d_loglines[0]->fadedownPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[0]->fadedownPoint(RDLogLine::CartPointer)-
d_wave_origin[0])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[0],d_wave_map[0]->height(),xpos,
RD_FADE_MARKER_COLOR,30,true);
}
//
// Draw Rubber Bands
//
DrawRubberBand(d_wpg[0],0);
//
// Draw Menu Marker
//
if(d_menu_clicked_point>=0 && d_rightclick_track==0) {
DrawCursor(d_wpg[0],d_wave_map[0]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,true);
DrawCursor(d_wpg[0],d_wave_map[0]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,false);
}
}
d_wpg[0]->setPen(TRACKER_TEXT_COLOR);
d_wpg[0]->drawText(5,14,d_loglines[0]->
resolveWildcards(rda->logeditConf()->waveformCaption()));
d_wpg[0]->end();
} }
d_wpg[0]->setPen(TRACKER_TEXT_COLOR);
d_wpg[0]->drawText(5,14,d_loglines[0]->
resolveWildcards(rda->logeditConf()->waveformCaption()));
d_wpg[0]->end();
} }
break; break;
case 1: case 1:
if(d_wave_name[1].isEmpty()) { if(d_wave_name[1].isEmpty()) {
p=new QPainter(d_wave_map[1]); if(!d_wave_map[1]->isNull()) {
if(d_loaded) { p=new QPainter(d_wave_map[1]);
p->setBackground(palette().color(QPalette::Background)); if(d_loaded) {
p->setFont(labelFont()); p->setBackground(palette().color(QPalette::Background));
p->setPen(TRACKER_TEXT_COLOR); p->setFont(labelFont());
p->eraseRect(0,0,d_wave_map[1]->size().width(), p->setPen(TRACKER_TEXT_COLOR);
d_wave_map[1]->size().height()); p->eraseRect(0,0,d_wave_map[1]->size().width(),
p->drawText(5,14,d_loglines[1]->markerComment()); d_wave_map[1]->size().height());
}
else {
p->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
}
if(d_start_time>QTime(0,0,0)) {
p->setFont(labelFont());
p->setPen(TRACKER_TEXT_COLOR);
p->drawText(550,75,tr("Start")+" "+
d_start_time.toString("h:mm:ss"));
}
p->end();
delete p;
} }
else {
p->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
}
if(d_start_time>QTime(0,0,0)) {
p->setFont(labelFont());
p->setPen(TRACKER_TEXT_COLOR);
p->drawText(550,75,tr("Start")+" "+
d_start_time.toString("h:mm:ss"));
}
p->end();
delete p;
} }
else { else {
if((d_loglines[1]->transType()==RDLogLine::Segue)) { if((d_loglines[1]->transType()==RDLogLine::Segue)) {
@ -2942,127 +2957,131 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
switch(d_deck_state) { switch(d_deck_state) {
case RDTrackerWidget::DeckTrack2: case RDTrackerWidget::DeckTrack2:
case RDTrackerWidget::DeckTrack3: case RDTrackerWidget::DeckTrack3:
p=new QPainter(d_wave_map[1]); if(!d_wave_map[1]->isNull()) {
p->setPen(TRACKER_RECORD_COLOR); p=new QPainter(d_wave_map[1]);
p->setBrush(TRACKER_RECORD_COLOR); p->setPen(TRACKER_RECORD_COLOR);
p->setBackground(back_color); p->setBrush(TRACKER_RECORD_COLOR);
p->eraseRect(0,0,d_wave_map[1]->size().width(), p->setBackground(back_color);
d_wave_map[1]->size().height()); p->eraseRect(0,0,d_wave_map[1]->size().width(),
p->fillRect(-d_wave_origin[1]/ d_wave_map[1]->size().height());
TRACKER_MSECS_PER_PIXEL, p->fillRect(-d_wave_origin[1]/
TRACKER_Y_HEIGHT/4, TRACKER_MSECS_PER_PIXEL,
d_recording_pos/TRACKER_MSECS_PER_PIXEL, TRACKER_Y_HEIGHT/4,
TRACKER_Y_HEIGHT/2,TRACKER_RECORD_COLOR); d_recording_pos/TRACKER_MSECS_PER_PIXEL,
p->setFont(labelFont()); TRACKER_Y_HEIGHT/2,TRACKER_RECORD_COLOR);
if(d_start_time>QTime(0,0,0)) { p->setFont(labelFont());
p->setPen(TRACKER_TEXT_COLOR); if(d_start_time>QTime(0,0,0)) {
track_time=d_start_time; p->setPen(TRACKER_TEXT_COLOR);
track_time=track_time. track_time=d_start_time;
addMSecs(d_time_remaining_start-d_time_counter); track_time=track_time.
p->drawText(550,75,tr("Time")+" "+track_time.toString("h:mm:ss")); addMSecs(d_time_remaining_start-d_time_counter);
} p->drawText(550,75,tr("Time")+" "+track_time.toString("h:mm:ss"));
p->end(); }
delete p; p->end();
delete p;
}
break; break;
default: default:
d_wpg[1]->begin(d_wave_map[1]); if(!d_wave_map[1]->isNull()) {
d_wpg[1]->setFont(labelFont()); d_wpg[1]->begin(d_wave_map[1]);
d_wpg[1]->setPen(TRACKER_TEXT_COLOR); d_wpg[1]->setFont(labelFont());
d_wpg[1]->setBackground(back_color); d_wpg[1]->setPen(TRACKER_TEXT_COLOR);
d_wpg[1]->eraseRect(0,0,d_wave_map[1]->size().width(), d_wpg[1]->setBackground(back_color);
d_wave_map[1]->size().height()); d_wpg[1]->eraseRect(0,0,d_wave_map[1]->size().width(),
if(!d_wave_name[1].isEmpty()) { d_wave_map[1]->size().height());
d_wpg[1]->drawWaveByMsecs(0,d_wave_map[1]->width(), if(!d_wave_name[1].isEmpty()) {
d_wave_origin[1], d_wpg[1]->drawWaveByMsecs(0,d_wave_map[1]->width(),
d_wave_origin[1]+d_wave_width,800, d_wave_origin[1],
RDWavePainter::Mono,Qt::black, d_wave_origin[1]+d_wave_width,800,
d_loglines[1]-> RDWavePainter::Mono,Qt::black,
startPoint(RDLogLine::CartPointer), d_loglines[1]->
d_loglines[1]-> startPoint(RDLogLine::CartPointer),
endPoint(RDLogLine::CartPointer)); d_loglines[1]->
} endPoint(RDLogLine::CartPointer));
if(d_track_line>=0) { }
if(d_track_line>=0) {
// //
// Draw Segue Markers // Draw Segue Markers
// //
if(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)>=0) { if(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)- xpos=(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos, DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,true); RD_SEGUE_MARKER_COLOR,20,true);
xpos=(d_loglines[1]->segueEndPoint(RDLogLine::CartPointer)- xpos=(d_loglines[1]->segueEndPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos, DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,false); RD_SEGUE_MARKER_COLOR,20,false);
} }
// //
// Draw Fadeup Marker // Draw Fadeup Marker
// //
if(d_loglines[1]->fadeupPoint(RDLogLine::CartPointer)>=0) { if(d_loglines[1]->fadeupPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[1]->fadeupPoint(RDLogLine::CartPointer)- xpos=(d_loglines[1]->fadeupPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_FADE_MARKER_COLOR,30,false);
}
//
// Draw Start Marker
//
xpos=(d_loglines[1]->startPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos, DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_FADE_MARKER_COLOR,30,false);
}
//
// Draw Start Marker
//
xpos=(d_loglines[1]->startPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_START_END_MARKER_COLOR,10,true);
//
// Draw Fadedown Marker
//
if(d_loglines[1]->fadedownPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[1]->fadedownPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_FADE_MARKER_COLOR,30,true);
}
//
// Draw End Marker
//
xpos=(d_loglines[1]->endPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_START_END_MARKER_COLOR,10,false);
//
// Draw Rubber Bands
//
DrawRubberBand(d_wpg[1],1);
//
// Draw Menu Marker
//
if(d_menu_clicked_point>=0 && d_rightclick_track==1) {
DrawCursor(d_wpg[1],d_wave_map[1]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,true); RD_START_END_MARKER_COLOR,10,true);
DrawCursor(d_wpg[1],d_wave_map[1]->height(),d_menu_clicked_point,
//
// Draw Fadedown Marker
//
if(d_loglines[1]->fadedownPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[1]->fadedownPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_FADE_MARKER_COLOR,30,true);
}
//
// Draw End Marker
//
xpos=(d_loglines[1]->endPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_START_END_MARKER_COLOR,10,false); RD_START_END_MARKER_COLOR,10,false);
}
d_wpg[1]->setPen(TRACKER_TEXT_COLOR); //
d_wpg[1]->drawText(5,14,d_loglines[1]->title()); // Draw Rubber Bands
//
DrawRubberBand(d_wpg[1],1);
//
// Draw Menu Marker
//
if(d_menu_clicked_point>=0 && d_rightclick_track==1) {
DrawCursor(d_wpg[1],d_wave_map[1]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,true);
DrawCursor(d_wpg[1],d_wave_map[1]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,false);
}
d_wpg[1]->setPen(TRACKER_TEXT_COLOR);
d_wpg[1]->drawText(5,14,d_loglines[1]->title());
}
if(d_start_time>QTime(0,0,0)) {
d_wpg[1]->drawText(550,75,tr("Start")+" "+
d_start_time.toString("h:mm:ss"));
}
d_wpg[1]->end();
} }
if(d_start_time>QTime(0,0,0)) {
d_wpg[1]->drawText(550,75,tr("Start")+" "+
d_start_time.toString("h:mm:ss"));
}
d_wpg[1]->end();
break; break;
} }
} }
break; break;
case 2: case 2:
if(d_wave_name[2].isEmpty()) { if(d_wave_name[2].isEmpty()&&(!d_wave_map[2]->isNull())) {
p=new QPainter(d_wave_map[2]); p=new QPainter(d_wave_map[2]);
p->setBackground(Qt::gray); p->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[2]->size().width(), p->eraseRect(0,0,d_wave_map[2]->size().width(),
@ -3077,117 +3096,117 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
else { else {
back_color=Qt::lightGray; back_color=Qt::lightGray;
} }
d_wpg[2]->begin(d_wave_map[2]); if(!d_wave_map[2]->isNull()) {
d_wpg[2]->setFont(labelFont()); d_wpg[2]->begin(d_wave_map[2]);
d_wpg[2]->setBackground(back_color); d_wpg[2]->setFont(labelFont());
d_wpg[2]->eraseRect(0,0,d_wave_map[2]->size().width(), d_wpg[2]->setBackground(back_color);
d_wave_map[2]->size().height()); d_wpg[2]->eraseRect(0,0,d_wave_map[2]->size().width(),
if(!d_wave_name[2].isEmpty()) { d_wave_map[2]->size().height());
d_wpg[2]-> if(!d_wave_name[2].isEmpty()) {
drawWaveByMsecs(0,d_wave_map[2]->width(),d_wave_origin[2], d_wpg[2]->
d_wave_origin[2]+d_wave_width,800, drawWaveByMsecs(0,d_wave_map[2]->width(),d_wave_origin[2],
RDWavePainter::Mono,Qt::black, d_wave_origin[2]+d_wave_width,800,
d_loglines[2]->startPoint(RDLogLine::CartPointer), RDWavePainter::Mono,Qt::black,
d_loglines[2]->endPoint(RDLogLine::CartPointer)); d_loglines[2]->startPoint(RDLogLine::CartPointer),
d_loglines[2]->endPoint(RDLogLine::CartPointer));
// //
// Draw Talk Markers // Draw Talk Markers
// //
if(d_loglines[2]->talkEndPoint()>0) { if(d_loglines[2]->talkEndPoint()>0) {
int tsxpos; int tsxpos;
int texpos; int texpos;
if(d_loglines[2]->talkStartPoint()==0){ if(d_loglines[2]->talkStartPoint()==0){
tsxpos=(d_loglines[2]->startPoint()- tsxpos=(d_loglines[2]->startPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
else {
tsxpos=(d_loglines[2]->talkStartPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
if(d_loglines[2]->talkEndPoint()==0) {
texpos=(d_loglines[2]->startPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
else {
if(d_loglines[2]->talkStartPoint()==0) {
texpos=(d_loglines[2]->startPoint()+
d_loglines[2]->talkEndPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
} }
else { else {
texpos=(d_loglines[2]->talkEndPoint()- tsxpos=(d_loglines[2]->talkStartPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
} }
if(d_loglines[2]->talkEndPoint()==0) {
texpos=(d_loglines[2]->startPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
else {
if(d_loglines[2]->talkStartPoint()==0) {
texpos=(d_loglines[2]->startPoint()+
d_loglines[2]->talkEndPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
else {
texpos=(d_loglines[2]->talkEndPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
}
if(tsxpos!=texpos){
DrawCursor(d_wpg[2],d_wave_map[2]->height(),tsxpos,
RD_TALK_MARKER_COLOR,20,true);
DrawCursor(d_wpg[2],d_wave_map[2]->height(),texpos,
RD_TALK_MARKER_COLOR,20,false);
}
} }
if(tsxpos!=texpos){
DrawCursor(d_wpg[2],d_wave_map[2]->height(),tsxpos,
RD_TALK_MARKER_COLOR,20,true);
DrawCursor(d_wpg[2],d_wave_map[2]->height(),texpos,
RD_TALK_MARKER_COLOR,20,false);
}
}
// //
// Draw Fadeup Marker // Draw Fadeup Marker
// //
if(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)>=0) { if(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)- xpos=(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[2],d_wave_map[2]->height(),xpos,
RD_FADE_MARKER_COLOR,30,false);
}
//
// Draw Start Marker
//
xpos=(d_loglines[2]->startPoint(RDLogLine::CartPointer)-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL; d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[2],d_wave_map[2]->height(),xpos, DrawCursor(d_wpg[2],d_wave_map[2]->height(),xpos,
RD_FADE_MARKER_COLOR,30,false);
}
//
// Draw Start Marker
//
xpos=(d_loglines[2]->startPoint(RDLogLine::CartPointer)-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[2],d_wave_map[2]->height(),xpos,
RD_START_END_MARKER_COLOR,10,true);
//
// Draw End Marker
//
xpos=(d_loglines[2]->endPoint(RDLogLine::CartPointer)-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[2],d_wave_map[2]->height(),xpos,
RD_START_END_MARKER_COLOR,10,false);
//
// Draw Menu Marker
//
if(d_menu_clicked_point>=0 && d_rightclick_track==2) {
DrawCursor(d_wpg[2],d_wave_map[2]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,true); RD_START_END_MARKER_COLOR,10,true);
DrawCursor(d_wpg[2],d_wave_map[2]->height(),d_menu_clicked_point,
//
// Draw End Marker
//
xpos=(d_loglines[2]->endPoint(RDLogLine::CartPointer)-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[2],d_wave_map[2]->height(),xpos,
RD_START_END_MARKER_COLOR,10,false); RD_START_END_MARKER_COLOR,10,false);
}
// //
// Draw Rubber Bands // Draw Menu Marker
// //
DrawRubberBand(d_wpg[2],2); if(d_menu_clicked_point>=0 && d_rightclick_track==2) {
} DrawCursor(d_wpg[2],d_wave_map[2]->height(),d_menu_clicked_point,
d_wpg[2]->setPen(TRACKER_TEXT_COLOR); RD_START_END_MARKER_COLOR,10,true);
d_wpg[2]->drawText(5,14,d_loglines[2]-> DrawCursor(d_wpg[2],d_wave_map[2]->height(),d_menu_clicked_point,
resolveWildcards(rda->logeditConf()->waveformCaption())); RD_START_END_MARKER_COLOR,10,false);
if(d_recording && (d_deck[2]->state()==RDPlayDeck::Playing || }
d_deck[2]->state()==RDPlayDeck::Stopping)) {
int talk_len=d_loglines[2]->talkLength(); //
if(talk_len>0 && d_deck[2]->currentPosition()> // Draw Rubber Bands
d_loglines[2]->talkStartPoint()){ //
talk_len-=d_deck[2]->currentPosition()- DrawRubberBand(d_wpg[2],2);
d_loglines[2]->talkStartPoint();
} }
d_wpg[2]->drawText(550,75,tr("Talk")+ d_wpg[2]->setPen(TRACKER_TEXT_COLOR);
QString().sprintf(" :%d",(talk_len+500)/1000)); d_wpg[2]->drawText(5,14,d_loglines[2]->
resolveWildcards(rda->logeditConf()->waveformCaption()));
if(d_recording && (d_deck[2]->state()==RDPlayDeck::Playing ||
d_deck[2]->state()==RDPlayDeck::Stopping)) {
int talk_len=d_loglines[2]->talkLength();
if(talk_len>0 && d_deck[2]->currentPosition()>
d_loglines[2]->talkStartPoint()){
talk_len-=d_deck[2]->currentPosition()-
d_loglines[2]->talkStartPoint();
}
d_wpg[2]->drawText(550,75,tr("Talk")+
QString().sprintf(" :%d",(talk_len+500)/1000));
}
else {
d_wpg[2]->drawText(550,75,tr("Talk")+QString().
sprintf(" :%d",(d_loglines[2]->talkLength()+500)/1000));
}
d_wpg[2]->end();
} }
else {
d_wpg[2]->drawText(550,75,tr("Talk")+QString().
sprintf(" :%d",(d_loglines[2]->talkLength()+500)/1000));
}
d_wpg[2]->end();
} }
break; break;
} }

View File

@ -30,11 +30,10 @@
#include <rdsvc.h> #include <rdsvc.h>
#include <rdstereometer.h> #include <rdstereometer.h>
#include <rdtransportbutton.h> #include <rdtransportbutton.h>
#include <rdwavepainter.h>
#include <rdwidget.h>
#include <rdtrackermodel.h> #include <rdtrackermodel.h>
#include <rdtrackertableview.h> #include <rdtrackertableview.h>
#include <rdwavepainter.h>
#include <rdwidget.h>
// //
// Widget Settings // Widget Settings
@ -158,7 +157,6 @@ class RDTrackerWidget : public RDWidget
int SingleSelectionLine(bool incl_end_handle=false); int SingleSelectionLine(bool incl_end_handle=false);
void SendNotification(RDNotification::Action action,const QString &log_name); void SendNotification(RDNotification::Action action,const QString &log_name);
void SendNotification(RDNotification::Action action,unsigned cartnum); void SendNotification(RDNotification::Action action,unsigned cartnum);
bool d_segue_loaded; bool d_segue_loaded;
unsigned d_play_start_macro; unsigned d_play_start_macro;
unsigned d_play_end_macro; unsigned d_play_end_macro;

View File

@ -58,6 +58,7 @@ dist_rdairplay_SOURCES = button_log.cpp button_log.h\
rdairplay.cpp rdairplay.h\ rdairplay.cpp rdairplay.h\
start_button.cpp start_button.h\ start_button.cpp start_button.h\
stop_counter.cpp stop_counter.h\ stop_counter.cpp stop_counter.h\
voicetracker.cpp voicetracker.h\
wall_clock.cpp wall_clock.h wall_clock.cpp wall_clock.h
@ -74,6 +75,7 @@ nodist_rdairplay_SOURCES = moc_button_log.cpp\
moc_rdairplay.cpp\ moc_rdairplay.cpp\
moc_start_button.cpp\ moc_start_button.cpp\
moc_stop_counter.cpp\ moc_stop_counter.cpp\
moc_voicetracker.cpp\
moc_wall_clock.cpp moc_wall_clock.cpp
rdairplay_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ @QT5_LIBS@ @MUSICBRAINZ_LIBS@ rdairplay_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ @QT5_LIBS@ @MUSICBRAINZ_LIBS@

View File

@ -51,6 +51,7 @@ MainWidget::MainWidget(RDConfig *config,QWidget *parent)
QString err_msg; QString err_msg;
air_panel=NULL; air_panel=NULL;
air_tracker=NULL;
// //
// Get the Startup Date/Time // Get the Startup Date/Time
@ -579,6 +580,12 @@ MainWidget::MainWidget(RDConfig *config,QWidget *parent)
this,SLOT(panelChannelStoppedData(int,int,int))); this,SLOT(panelChannelStoppedData(int,int,int)));
} }
//
// Voice Tracker
//
air_tracker=new VoiceTracker(this);
air_tracker->hide();
// //
// Full Log List // Full Log List
// //
@ -642,6 +649,14 @@ MainWidget::MainWidget(RDConfig *config,QWidget *parent)
air_log_list[0]->show(); air_log_list[0]->show();
} }
//
// Voice Tracker Button
//
air_tracker_button=new QPushButton(this);
air_tracker_button->setFont(bigButtonFont());
air_tracker_button->setText(tr("Voice\nTracker"));
air_tracker_button->setFocusPolicy(Qt::NoFocus);
connect(air_tracker_button,SIGNAL(clicked()),this,SLOT(trackerButtonData()));
// //
// Button Log // Button Log
@ -1333,6 +1348,8 @@ void MainWidget::fullLogButtonData(int id)
} }
else { else {
air_panel->hide(); air_panel->hide();
ShowTracker(false);
air_tracker_button->setPalette(palette());
for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) { for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) {
if(air_log_list[i]->isVisible()) { if(air_log_list[i]->isVisible()) {
air_log_list[i]->hide(); air_log_list[i]->hide();
@ -1356,11 +1373,28 @@ void MainWidget::panelButtonData()
air_log_button[i]->setPalette(palette()); air_log_button[i]->setPalette(palette());
} }
} }
ShowTracker(false);
air_tracker_button->setPalette(palette());
air_panel->show(); air_panel->show();
air_panel_button->setPalette(active_color); air_panel_button->setPalette(active_color);
} }
void MainWidget::trackerButtonData()
{
for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) {
if(air_log_list[i]->isVisible()) {
air_log_list[i]->hide();
air_log_button[i]->setPalette(palette());
}
}
air_panel->hide();
air_panel_button->setPalette(palette());
ShowTracker(true);
air_tracker_button->setPalette(active_color);
}
void MainWidget::modeButtonData() void MainWidget::modeButtonData()
{ {
int mach=-1; int mach=-1;
@ -2011,8 +2045,14 @@ void MainWidget::resizeEvent(QResizeEvent *e)
// //
// Sound Panel // Sound Panel
// //
// air_panel->setGeometry(w/2,140,(w/2)-20,h-210); if(air_panel!=NULL) {
air_panel->setGeometry(510,140,w-510,h-215); air_panel->setGeometry(510,140,w-510,h-215);
}
//
// Voice Tracker
//
air_tracker->setGeometry(510,140,w-510,h-215);
// //
// Full Log Widgets // Full Log Widgets
@ -2033,9 +2073,20 @@ void MainWidget::resizeEvent(QResizeEvent *e)
air_empty_cart->setGeometry(520,size().height()-51,32,32); air_empty_cart->setGeometry(520,size().height()-51,32,32);
air_panel_button->setGeometry(562,size().height()-65,80,60); int xpos=562;
air_panel_button->setGeometry(xpos,size().height()-65,80,60);
xpos+=85;
if((size().width()>=(510+air_tracker->sizeHint().width()))&&
(size().height()>=(140+air_tracker->sizeHint().height()))) {
air_tracker_button->setGeometry(xpos,size().height()-65,80,60);
xpos+=85;
air_tracker_button->show();
}
else {
air_tracker_button->hide();
}
for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) { for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) {
air_log_button[i]->setGeometry(647+i*123,size().height()-65,118,60); air_log_button[i]->setGeometry(xpos+i*123,size().height()-65,118,60);
} }
} }
@ -2472,3 +2523,17 @@ RDAirPlayConf::Channel MainWidget::PanelChannel(int mport) const
} }
return chan; return chan;
} }
void MainWidget::ShowTracker(bool state)
{
if(state) {
setMinimumWidth(510+air_tracker->sizeHint().width());
setMinimumHeight(140+air_tracker->sizeHint().height());
air_tracker->show();
}
else {
setMinimumSize(sizeHint());
air_tracker->hide();
}
}

View File

@ -35,6 +35,7 @@
#include "post_counter.h" #include "post_counter.h"
#include "pie_counter.h" #include "pie_counter.h"
#include "stop_counter.h" #include "stop_counter.h"
#include "voicetracker.h"
#include "wall_clock.h" #include "wall_clock.h"
// //
@ -80,6 +81,7 @@ class MainWidget : public RDMainWindow
void copyButtonData(); void copyButtonData();
void fullLogButtonData(int); void fullLogButtonData(int);
void panelButtonData(); void panelButtonData();
void trackerButtonData();
void modeButtonData(); void modeButtonData();
void selectClickedData(int id,int line,RDLogLine::Status status); void selectClickedData(int id,int line,RDLogLine::Status status);
void selectClickedData(unsigned cartnum,int row,int col); void selectClickedData(unsigned cartnum,int row,int col);
@ -112,9 +114,12 @@ class MainWidget : public RDMainWindow
bool AssertChannelLock(int dir,int card,int port); bool AssertChannelLock(int dir,int card,int port);
bool AssertChannelLock(int dir,int achan); bool AssertChannelLock(int dir,int achan);
int AudioChannel(int card,int port) const; int AudioChannel(int card,int port) const;
void ShowTracker(bool state);
RDAirPlayConf::Channel PanelChannel(int mport) const; RDAirPlayConf::Channel PanelChannel(int mport) const;
RDLogPlay *air_log[RDAIRPLAY_LOG_QUANTITY]; RDLogPlay *air_log[RDAIRPLAY_LOG_QUANTITY];
RDSoundPanel *air_panel; RDSoundPanel *air_panel;
VoiceTracker *air_tracker;
QPushButton *air_tracker_button;
PostCounter *air_post_counter; PostCounter *air_post_counter;
PieCounter *air_pie_counter; PieCounter *air_pie_counter;
RDStereoMeter *air_stereo_meter; RDStereoMeter *air_stereo_meter;

View File

@ -0,0 +1,72 @@
// voicetracker.cpp
//
// Voice tracker panel for RDAirPlay
//
// (C) Copyright 2021 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
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <rdlist_logs.h>
#include "voicetracker.h"
VoiceTracker::VoiceTracker(QWidget *parent)
: RDWidget(parent)
{
d_tracker_widget=new RDTrackerWidget(&d_import_path,this);
d_load_button=new QPushButton(tr("Load\nLog"),this);
d_load_button->setFont(bigButtonFont());
connect(d_load_button,SIGNAL(clicked()),this,SLOT(loadData()));
}
QSize VoiceTracker::sizeHint() const
{
return d_tracker_widget->sizeHint();
}
void VoiceTracker::loadData()
{
QString logname;
RDListLogs *d=new RDListLogs(&logname,RDLogFilter::StationFilter,"RDAirPlay",
this);
if(d->exec()) {
if(d_tracker_widget->load(logname)) {
d_load_button->disconnect();
connect(d_load_button,SIGNAL(clicked()),this,SLOT(unloadData()));
d_load_button->setText(tr("Unload\nLog"));
}
}
delete d;
}
void VoiceTracker::unloadData()
{
d_tracker_widget->unload();
d_load_button->disconnect();
connect(d_load_button,SIGNAL(clicked()),this,SLOT(loadData()));
d_load_button->setText(tr("Load\nLog"));
}
void VoiceTracker::resizeEvent(QResizeEvent *e)
{
d_tracker_widget->setGeometry(0,0,size().width(),size().height());
d_load_button->setGeometry(size().width()-90,size().height()-50,80,50);
}

50
rdairplay/voicetracker.h Normal file
View File

@ -0,0 +1,50 @@
// voicetracker.h
//
// Voice tracker panel for RDAirPlay
//
// (C) Copyright 2021 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
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef VOICETRACKER_H
#define VOICETRACKER_H
#include <QLabel>
#include <QPushButton>
#include <rdtrackerwidget.h>
#include <rdwidget.h>
class VoiceTracker : public RDWidget
{
Q_OBJECT
public:
VoiceTracker(QWidget *parent=0);
QSize sizeHint() const;
private slots:
void loadData();
void unloadData();
protected:
void resizeEvent(QResizeEvent *e);
private:
RDTrackerWidget *d_tracker_widget;
QPushButton *d_load_button;
QString d_import_path;
};
#endif // VOICETRACKER_H