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
'RDTrackerEditDialog', 'RDTrackerModel', 'RDTrackerTableView'
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()
{
if(d_log_lines.size()>0) {
beginRemoveRows(QModelIndex(),0,lineCount()-1);
beginResetModel();
for(int i=0;i<d_log_lines.size();i++) {
delete d_log_lines.at(i);
}
d_log_lines.clear();
endRemoveRows();
endResetModel();
}
d_log_name="";
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->setText(tr("Delete\nTrack"));
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."));
}
setEnabled(true);
return true;
}
@ -494,6 +498,7 @@ void RDTrackerWidget::unload()
if(d_size_altered) {
d_log_model->save(rda->config());
}
d_log_model->clear();
if(d_log_lock!=NULL) {
delete d_log_lock;
d_log_lock=NULL;
@ -512,6 +517,8 @@ void RDTrackerWidget::unload()
}
d_tracks=0;
LoadTrack(-1);
setDisabled(true);
}
@ -1758,7 +1765,7 @@ void RDTrackerWidget::resizeEvent(QResizeEvent *e)
delete d_wave_map[i];
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);
@ -1810,12 +1817,14 @@ void RDTrackerWidget::paintEvent(QPaintEvent *e)
if(d_track_line<0) {
p=new QPainter();
for(int i=0;i<3;i++) {
p->begin(d_wave_map[i]);
p->setPen(TRACKER_TEXT_COLOR);
p->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[i]->size().width(),
d_wave_map[i]->size().height());
p->end();
if(!d_wave_map[i]->isNull()) {
p->begin(d_wave_map[i]);
p->setPen(TRACKER_TEXT_COLOR);
p->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[i]->size().width(),
d_wave_map[i]->size().height());
p->end();
}
}
delete p;
}
@ -2169,9 +2178,11 @@ void RDTrackerWidget::LoadTrack(int line)
if(d_wpg[i]!=NULL) {
delete d_wpg[i];
}
d_wpg[i]=new RDWavePainter(d_wave_map[i],d_track_cuts[i],
rda->station(),rda->user(),rda->config());
d_wpg[i]->end();
if(!d_wave_map[i]->isNull()) {
d_wpg[i]=new RDWavePainter(d_wave_map[i],d_track_cuts[i],
rda->station(),rda->user(),rda->config());
d_wpg[i]->end();
}
}
}
@ -2258,6 +2269,7 @@ void RDTrackerWidget::LoadTrack(int line)
DrawTrackMap(0);
DrawTrackMap(1);
DrawTrackMap(2);
UpdateControls();
}
@ -2820,7 +2832,7 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
QColor back_color;
switch(trackno) {
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->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[0]->size().width(),
@ -2829,108 +2841,111 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
delete p;
}
else {
d_wpg[0]->begin(d_wave_map[0]);
d_wpg[0]->setFont(labelFont());
d_wpg[0]->setPen(TRACKER_TEXT_COLOR);
d_wpg[0]->setBackground(palette().color(QPalette::Background));
d_wpg[0]->eraseRect(0,0,d_wave_map[0]->size().width(),
d_wave_map[0]->size().height());
if(!d_wave_name[0].isEmpty()) {
d_wpg[0]->drawWaveByMsecs(0,d_wave_map[0]->width(),
d_wave_origin[0],
d_wave_origin[0]+d_wave_width,800,
RDWavePainter::Mono,Qt::black,
d_loglines[0]->
startPoint(RDLogLine::CartPointer),
d_loglines[0]->
endPoint(RDLogLine::CartPointer));
if(!d_wave_map[0]->isNull()&&(!d_wave_map[0]->isNull())) {
d_wpg[0]->begin(d_wave_map[0]);
d_wpg[0]->setFont(labelFont());
d_wpg[0]->setPen(TRACKER_TEXT_COLOR);
d_wpg[0]->setBackground(palette().color(QPalette::Background));
d_wpg[0]->eraseRect(0,0,d_wave_map[0]->size().width(),
d_wave_map[0]->size().height());
if(!d_wave_name[0].isEmpty()) {
d_wpg[0]->drawWaveByMsecs(0,d_wave_map[0]->width(),
d_wave_origin[0],
d_wave_origin[0]+d_wave_width,800,
RDWavePainter::Mono,Qt::black,
d_loglines[0]->
startPoint(RDLogLine::CartPointer),
d_loglines[0]->
endPoint(RDLogLine::CartPointer));
//
// Draw Segue Markers
//
if(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)-
//
// Draw Segue Markers
//
if(d_loglines[0]->segueStartPoint(RDLogLine::CartPointer)>=0) {
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;
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);
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);
}
//
// 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;
case 1:
if(d_wave_name[1].isEmpty()) {
p=new QPainter(d_wave_map[1]);
if(d_loaded) {
p->setBackground(palette().color(QPalette::Background));
p->setFont(labelFont());
p->setPen(TRACKER_TEXT_COLOR);
p->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
p->drawText(5,14,d_loglines[1]->markerComment());
if(!d_wave_map[1]->isNull()) {
p=new QPainter(d_wave_map[1]);
if(d_loaded) {
p->setBackground(palette().color(QPalette::Background));
p->setFont(labelFont());
p->setPen(TRACKER_TEXT_COLOR);
p->eraseRect(0,0,d_wave_map[1]->size().width(),
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 {
if((d_loglines[1]->transType()==RDLogLine::Segue)) {
@ -2942,127 +2957,131 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
switch(d_deck_state) {
case RDTrackerWidget::DeckTrack2:
case RDTrackerWidget::DeckTrack3:
p=new QPainter(d_wave_map[1]);
p->setPen(TRACKER_RECORD_COLOR);
p->setBrush(TRACKER_RECORD_COLOR);
p->setBackground(back_color);
p->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
p->fillRect(-d_wave_origin[1]/
TRACKER_MSECS_PER_PIXEL,
TRACKER_Y_HEIGHT/4,
d_recording_pos/TRACKER_MSECS_PER_PIXEL,
TRACKER_Y_HEIGHT/2,TRACKER_RECORD_COLOR);
p->setFont(labelFont());
if(d_start_time>QTime(0,0,0)) {
p->setPen(TRACKER_TEXT_COLOR);
track_time=d_start_time;
track_time=track_time.
addMSecs(d_time_remaining_start-d_time_counter);
p->drawText(550,75,tr("Time")+" "+track_time.toString("h:mm:ss"));
}
p->end();
delete p;
if(!d_wave_map[1]->isNull()) {
p=new QPainter(d_wave_map[1]);
p->setPen(TRACKER_RECORD_COLOR);
p->setBrush(TRACKER_RECORD_COLOR);
p->setBackground(back_color);
p->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
p->fillRect(-d_wave_origin[1]/
TRACKER_MSECS_PER_PIXEL,
TRACKER_Y_HEIGHT/4,
d_recording_pos/TRACKER_MSECS_PER_PIXEL,
TRACKER_Y_HEIGHT/2,TRACKER_RECORD_COLOR);
p->setFont(labelFont());
if(d_start_time>QTime(0,0,0)) {
p->setPen(TRACKER_TEXT_COLOR);
track_time=d_start_time;
track_time=track_time.
addMSecs(d_time_remaining_start-d_time_counter);
p->drawText(550,75,tr("Time")+" "+track_time.toString("h:mm:ss"));
}
p->end();
delete p;
}
break;
default:
d_wpg[1]->begin(d_wave_map[1]);
d_wpg[1]->setFont(labelFont());
d_wpg[1]->setPen(TRACKER_TEXT_COLOR);
d_wpg[1]->setBackground(back_color);
d_wpg[1]->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
if(!d_wave_name[1].isEmpty()) {
d_wpg[1]->drawWaveByMsecs(0,d_wave_map[1]->width(),
d_wave_origin[1],
d_wave_origin[1]+d_wave_width,800,
RDWavePainter::Mono,Qt::black,
d_loglines[1]->
startPoint(RDLogLine::CartPointer),
d_loglines[1]->
endPoint(RDLogLine::CartPointer));
}
if(d_track_line>=0) {
if(!d_wave_map[1]->isNull()) {
d_wpg[1]->begin(d_wave_map[1]);
d_wpg[1]->setFont(labelFont());
d_wpg[1]->setPen(TRACKER_TEXT_COLOR);
d_wpg[1]->setBackground(back_color);
d_wpg[1]->eraseRect(0,0,d_wave_map[1]->size().width(),
d_wave_map[1]->size().height());
if(!d_wave_name[1].isEmpty()) {
d_wpg[1]->drawWaveByMsecs(0,d_wave_map[1]->width(),
d_wave_origin[1],
d_wave_origin[1]+d_wave_width,800,
RDWavePainter::Mono,Qt::black,
d_loglines[1]->
startPoint(RDLogLine::CartPointer),
d_loglines[1]->
endPoint(RDLogLine::CartPointer));
}
if(d_track_line>=0) {
//
// Draw Segue Markers
//
if(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,true);
xpos=(d_loglines[1]->segueEndPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,false);
//
// Draw Segue Markers
//
if(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[1]->segueStartPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,true);
xpos=(d_loglines[1]->segueEndPoint(RDLogLine::CartPointer)-
d_wave_origin[1])/TRACKER_MSECS_PER_PIXEL;
DrawCursor(d_wpg[1],d_wave_map[1]->height(),xpos,
RD_SEGUE_MARKER_COLOR,20,false);
}
//
// Draw Fadeup Marker
//
if(d_loglines[1]->fadeupPoint(RDLogLine::CartPointer)>=0) {
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 Fadeup Marker
//
if(d_loglines[1]->fadeupPoint(RDLogLine::CartPointer)>=0) {
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;
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)-
//
// 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_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);
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);
}
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;
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->setBackground(Qt::gray);
p->eraseRect(0,0,d_wave_map[2]->size().width(),
@ -3077,117 +3096,117 @@ void RDTrackerWidget::DrawTrackMap(int trackno)
else {
back_color=Qt::lightGray;
}
d_wpg[2]->begin(d_wave_map[2]);
d_wpg[2]->setFont(labelFont());
d_wpg[2]->setBackground(back_color);
d_wpg[2]->eraseRect(0,0,d_wave_map[2]->size().width(),
d_wave_map[2]->size().height());
if(!d_wave_name[2].isEmpty()) {
d_wpg[2]->
drawWaveByMsecs(0,d_wave_map[2]->width(),d_wave_origin[2],
d_wave_origin[2]+d_wave_width,800,
RDWavePainter::Mono,Qt::black,
d_loglines[2]->startPoint(RDLogLine::CartPointer),
d_loglines[2]->endPoint(RDLogLine::CartPointer));
//
// Draw Talk Markers
//
if(d_loglines[2]->talkEndPoint()>0) {
int tsxpos;
int texpos;
if(d_loglines[2]->talkStartPoint()==0){
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()-
if(!d_wave_map[2]->isNull()) {
d_wpg[2]->begin(d_wave_map[2]);
d_wpg[2]->setFont(labelFont());
d_wpg[2]->setBackground(back_color);
d_wpg[2]->eraseRect(0,0,d_wave_map[2]->size().width(),
d_wave_map[2]->size().height());
if(!d_wave_name[2].isEmpty()) {
d_wpg[2]->
drawWaveByMsecs(0,d_wave_map[2]->width(),d_wave_origin[2],
d_wave_origin[2]+d_wave_width,800,
RDWavePainter::Mono,Qt::black,
d_loglines[2]->startPoint(RDLogLine::CartPointer),
d_loglines[2]->endPoint(RDLogLine::CartPointer));
//
// Draw Talk Markers
//
if(d_loglines[2]->talkEndPoint()>0) {
int tsxpos;
int texpos;
if(d_loglines[2]->talkStartPoint()==0){
tsxpos=(d_loglines[2]->startPoint()-
d_wave_origin[2])/TRACKER_MSECS_PER_PIXEL;
}
else {
texpos=(d_loglines[2]->talkEndPoint()-
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;
}
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
//
if(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)>=0) {
xpos=(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)-
//
// Draw Fadeup Marker
//
if(d_loglines[2]->fadeupPoint(RDLogLine::CartPointer)>=0) {
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;
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);
DrawCursor(d_wpg[2],d_wave_map[2]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,false);
}
//
// Draw Rubber Bands
//
DrawRubberBand(d_wpg[2],2);
}
d_wpg[2]->setPen(TRACKER_TEXT_COLOR);
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();
//
// 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);
DrawCursor(d_wpg[2],d_wave_map[2]->height(),d_menu_clicked_point,
RD_START_END_MARKER_COLOR,10,false);
}
//
// Draw Rubber Bands
//
DrawRubberBand(d_wpg[2],2);
}
d_wpg[2]->setPen(TRACKER_TEXT_COLOR);
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();
}
}
break;
}

View File

@ -30,11 +30,10 @@
#include <rdsvc.h>
#include <rdstereometer.h>
#include <rdtransportbutton.h>
#include <rdwavepainter.h>
#include <rdwidget.h>
#include <rdtrackermodel.h>
#include <rdtrackertableview.h>
#include <rdwavepainter.h>
#include <rdwidget.h>
//
// Widget Settings
@ -158,7 +157,6 @@ class RDTrackerWidget : public RDWidget
int SingleSelectionLine(bool incl_end_handle=false);
void SendNotification(RDNotification::Action action,const QString &log_name);
void SendNotification(RDNotification::Action action,unsigned cartnum);
bool d_segue_loaded;
unsigned d_play_start_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\
start_button.cpp start_button.h\
stop_counter.cpp stop_counter.h\
voicetracker.cpp voicetracker.h\
wall_clock.cpp wall_clock.h
@ -74,6 +75,7 @@ nodist_rdairplay_SOURCES = moc_button_log.cpp\
moc_rdairplay.cpp\
moc_start_button.cpp\
moc_stop_counter.cpp\
moc_voicetracker.cpp\
moc_wall_clock.cpp
rdairplay_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ @QT5_LIBS@ @MUSICBRAINZ_LIBS@

View File

@ -51,7 +51,8 @@ MainWidget::MainWidget(RDConfig *config,QWidget *parent)
QString err_msg;
air_panel=NULL;
air_tracker=NULL;
//
// Get the Startup Date/Time
//
@ -579,6 +580,12 @@ MainWidget::MainWidget(RDConfig *config,QWidget *parent)
this,SLOT(panelChannelStoppedData(int,int,int)));
}
//
// Voice Tracker
//
air_tracker=new VoiceTracker(this);
air_tracker->hide();
//
// Full Log List
//
@ -642,6 +649,14 @@ MainWidget::MainWidget(RDConfig *config,QWidget *parent)
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
@ -1333,6 +1348,8 @@ void MainWidget::fullLogButtonData(int id)
}
else {
air_panel->hide();
ShowTracker(false);
air_tracker_button->setPalette(palette());
for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) {
if(air_log_list[i]->isVisible()) {
air_log_list[i]->hide();
@ -1356,11 +1373,28 @@ void MainWidget::panelButtonData()
air_log_button[i]->setPalette(palette());
}
}
ShowTracker(false);
air_tracker_button->setPalette(palette());
air_panel->show();
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()
{
int mach=-1;
@ -2011,8 +2045,14 @@ void MainWidget::resizeEvent(QResizeEvent *e)
//
// Sound Panel
//
// air_panel->setGeometry(w/2,140,(w/2)-20,h-210);
air_panel->setGeometry(510,140,w-510,h-215);
if(air_panel!=NULL) {
air_panel->setGeometry(510,140,w-510,h-215);
}
//
// Voice Tracker
//
air_tracker->setGeometry(510,140,w-510,h-215);
//
// Full Log Widgets
@ -2033,9 +2073,20 @@ void MainWidget::resizeEvent(QResizeEvent *e)
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++) {
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;
}
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 "pie_counter.h"
#include "stop_counter.h"
#include "voicetracker.h"
#include "wall_clock.h"
//
@ -80,6 +81,7 @@ class MainWidget : public RDMainWindow
void copyButtonData();
void fullLogButtonData(int);
void panelButtonData();
void trackerButtonData();
void modeButtonData();
void selectClickedData(int id,int line,RDLogLine::Status status);
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 achan);
int AudioChannel(int card,int port) const;
void ShowTracker(bool state);
RDAirPlayConf::Channel PanelChannel(int mport) const;
RDLogPlay *air_log[RDAIRPLAY_LOG_QUANTITY];
RDSoundPanel *air_panel;
VoiceTracker *air_tracker;
QPushButton *air_tracker_button;
PostCounter *air_post_counter;
PieCounter *air_pie_counter;
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