From 25c13af6c0a9eadb62093e8e85e2ac837318ee9f Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Wed, 23 Jun 2021 12:11:59 -0400 Subject: [PATCH] 2021-06-23 Fred Gleason * Added a voice tracker widget to the right-hand side of rdairplay(1). Signed-off-by: Fred Gleason --- ChangeLog | 3 + lib/rdlogmodel.cpp | 4 +- lib/rdtrackerwidget.cpp | 627 +++++++++++++++++++------------------ lib/rdtrackerwidget.h | 6 +- rdairplay/Makefile.am | 2 + rdairplay/rdairplay.cpp | 75 ++++- rdairplay/rdairplay.h | 5 + rdairplay/voicetracker.cpp | 72 +++++ rdairplay/voicetracker.h | 50 +++ 9 files changed, 529 insertions(+), 315 deletions(-) create mode 100644 rdairplay/voicetracker.cpp create mode 100644 rdairplay/voicetracker.h diff --git a/ChangeLog b/ChangeLog index 11cb39d2..c183b460 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21957,3 +21957,6 @@ * Broke out voicetracker functionality from rdlogedit(1) into 'RDTrackerEditDialog', 'RDTrackerModel', 'RDTrackerTableView' and 'RDTrackerWidget' classes. +2021-06-23 Fred Gleason + * Added a voice tracker widget to the right-hand side of + rdairplay(1). diff --git a/lib/rdlogmodel.cpp b/lib/rdlogmodel.cpp index b2551421..e38e60d2 100644 --- a/lib/rdlogmodel.cpp +++ b/lib/rdlogmodel.cpp @@ -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;isetFont(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; } diff --git a/lib/rdtrackerwidget.h b/lib/rdtrackerwidget.h index 30ea6a6e..8dcb469e 100644 --- a/lib/rdtrackerwidget.h +++ b/lib/rdtrackerwidget.h @@ -30,11 +30,10 @@ #include #include #include -#include -#include - #include #include +#include +#include // // 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; diff --git a/rdairplay/Makefile.am b/rdairplay/Makefile.am index 72787f88..098ef176 100644 --- a/rdairplay/Makefile.am +++ b/rdairplay/Makefile.am @@ -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@ diff --git a/rdairplay/rdairplay.cpp b/rdairplay/rdairplay.cpp index c59d3f3a..c081eafc 100644 --- a/rdairplay/rdairplay.cpp +++ b/rdairplay/rdairplay.cpp @@ -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;iisVisible()) { 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;iisVisible()) { + 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;isetGeometry(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(); + } +} diff --git a/rdairplay/rdairplay.h b/rdairplay/rdairplay.h index cf7644fb..b8e280c5 100644 --- a/rdairplay/rdairplay.h +++ b/rdairplay/rdairplay.h @@ -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; diff --git a/rdairplay/voicetracker.cpp b/rdairplay/voicetracker.cpp new file mode 100644 index 00000000..c9f39ca3 --- /dev/null +++ b/rdairplay/voicetracker.cpp @@ -0,0 +1,72 @@ +// voicetracker.cpp +// +// Voice tracker panel for RDAirPlay +// +// (C) Copyright 2021 Fred Gleason +// +// 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 + +#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); +} diff --git a/rdairplay/voicetracker.h b/rdairplay/voicetracker.h new file mode 100644 index 00000000..00f9c9a9 --- /dev/null +++ b/rdairplay/voicetracker.h @@ -0,0 +1,50 @@ +// voicetracker.h +// +// Voice tracker panel for RDAirPlay +// +// (C) Copyright 2021 Fred Gleason +// +// 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 +#include + +#include +#include + +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