diff --git a/ChangeLog b/ChangeLog index 0a0f1d8b..eee42d16 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20754,3 +20754,5 @@ 2020-12-27 Fred Gleason * Refactored 'ListLogs' dialog in rdairplay(1) to use 'RDLogListModel'. +2020-12-27 Fred Gleason + * Removed the 'RDLogEvent' class. diff --git a/lib/Makefile.am b/lib/Makefile.am index e9152f0b..b16f501f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -162,7 +162,6 @@ dist_librd_la_SOURCES = dbversion.h\ rdlivewiredestination.cpp rdlivewiredestination.h\ rdlivewiresource.cpp rdlivewiresource.h\ rdlog.cpp rdlog.h\ - rdlog_event.cpp rdlog_event.h\ rdlog_icons.cpp rdlog_icons.h\ rdlog_line.cpp rdlog_line.h\ rdlogedit_conf.cpp rdlogedit_conf.h\ diff --git a/lib/lib.pro b/lib/lib.pro index e71b59a1..6a8719cf 100644 --- a/lib/lib.pro +++ b/lib/lib.pro @@ -116,7 +116,6 @@ SOURCES += rdlistselector.cpp SOURCES += rdlistview.cpp SOURCES += rdlistviewitem.cpp SOURCES += rdlog.cpp -SOURCES += rdlog_event.cpp SOURCES += rdlog_icons.cpp SOURCES += rdlog_line.cpp SOURCES += rdlogedit_conf.cpp @@ -262,7 +261,6 @@ HEADERS += rdlistselector.h HEADERS += rdlistview.h HEADERS += rdlistviewitem.h HEADERS += rdlog.h -HEADERS += rdlog_event.h HEADERS += rdlog_icons.h HEADERS += rdlog_line.h HEADERS += rdlogedit_conf.h diff --git a/lib/rdevent_line.cpp b/lib/rdevent_line.cpp index f6e2cf6f..4ca82197 100644 --- a/lib/rdevent_line.cpp +++ b/lib/rdevent_line.cpp @@ -914,7 +914,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, } -bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, +bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname, RDLogLine *link_logline,const QString &track_str, const QString &label_cart,const QString &track_cart, QString *errors) @@ -949,11 +949,11 @@ bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, // Insert Parent Link // if(log->includeImportMarkers()) { - e->insert(e->size(),1); + e->insert(e->lineCount(),1); logline=new RDLogLine(); *logline=*link_logline; logline->setId(e->nextId()); - *(e->logLine(e->size()-1))=*logline; + *(e->logLine(e->lineCount()-1))=*logline; delete logline; logline=NULL; @@ -1024,8 +1024,8 @@ bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, // if(q->value(8).toUInt()==RDLogLine::TrafficLink) { if((!event_nested_event.isEmpty()&&(event_nested_event!=event_name))) { - e->insert(e->size(),1); - logline=e->logLine(e->size()-1); + e->insert(e->lineCount(),1); + logline=e->logLine(e->lineCount()-1); logline->setId(e->nextId()); logline->setStartTime(RDLogLine::Logged,time); logline->setType(RDLogLine::TrafficLink); @@ -1046,8 +1046,8 @@ bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, // Voicetrack Marker // if(q->value(8).toUInt()==RDLogLine::Track) { - e->insert(e->size(),1); - logline=e->logLine(e->size()-1); + e->insert(e->lineCount(),1); + logline=e->logLine(e->lineCount()-1); logline->setId(e->nextId()); logline->setStartTime(RDLogLine::Logged,time); logline->setType(RDLogLine::Track); @@ -1068,8 +1068,8 @@ bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, // Label/Note Cart // if(q->value(8).toUInt()==RDLogLine::Marker) { - e->insert(e->size(),1); - logline=e->logLine(e->size()-1); + e->insert(e->lineCount(),1); + logline=e->logLine(e->lineCount()-1); logline->setId(e->nextId()); logline->setStartTime(RDLogLine::Logged,time); logline->setType(RDLogLine::Marker); @@ -1090,8 +1090,8 @@ bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, // Cart // if(q->value(8).toUInt()==RDLogLine::Cart) { - e->insert(e->size(),1); - logline=e->logLine(e->size()-1); + e->insert(e->lineCount(),1); + logline=e->logLine(e->lineCount()-1); logline->setId(e->nextId()); logline->setSource(event_src); logline-> @@ -1166,8 +1166,8 @@ bool RDEventLine::linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, while(q->next()&&(fill_start_time<=time)) { if((time.addMSecs(q->value(1).toInt())<=end_time)&& (time.addMSecs(q->value(1).toInt())>time)) { - e->insert(e->size(),1); - logline=e->logLine(e->size()-1); + e->insert(e->lineCount(),1); + logline=e->logLine(e->lineCount()-1); logline->setId(e->nextId()); logline->setStartTime(RDLogLine::Logged,time); logline->setType(RDLogLine::Cart); diff --git a/lib/rdevent_line.h b/lib/rdevent_line.h index c77995be..446955ee 100644 --- a/lib/rdevent_line.h +++ b/lib/rdevent_line.h @@ -23,7 +23,7 @@ #include -#include +#include #include #include #include @@ -78,7 +78,7 @@ class RDEventLine bool save(RDConfig *config); bool generateLog(QString logname,const QString &svcname, QString *errors,QString clockname); - bool linkLog(RDLogEvent *e,RDLog *log,const QString &svcname, + bool linkLog(RDLogModel *e,RDLog *log,const QString &svcname, RDLogLine *link_logline,const QString &track_str, const QString &label_cart,const QString &track_cart, QString *errors); diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index 51dfb288..12fece28 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -40,7 +40,6 @@ #include "rdfeed.h" #include "rdlibrary_conf.h" #include "rdlog.h" -#include "rdlog_event.h" #include "rdpodcast.h" #include "rdrenderer.h" #include "rdtempdirectory.h" @@ -1440,7 +1439,7 @@ unsigned RDFeed::postLog(const QString &logname,const QTime &start_time, QString err_msg; RDRenderer *renderer=NULL; RDSettings *settings=NULL; - RDLogEvent *log_event=NULL; + RDLogModel *log_model=NULL; feed_render_start_line=start_line; feed_render_end_line=end_line; @@ -1451,11 +1450,11 @@ unsigned RDFeed::postLog(const QString &logname,const QTime &start_time, // // Open Log // - log_event=new RDLogEvent(logname); - log_event->load(); - if(!log_event->exists()) { + log_model=new RDLogModel(logname,false,this); + log_model->load(); + if(!log_model->exists()) { *err=RDFeed::ErrorNoLog; - delete log_event; + delete log_model; return 0; } @@ -1476,12 +1475,12 @@ unsigned RDFeed::postLog(const QString &logname,const QTime &start_time, connect(renderer,SIGNAL(lineStarted(int,int)), this,SLOT(renderLineStartedData(int,int))); - if(!renderer->renderToFile(tmpfile,log_event,settings,start_time,stop_at_stop, + if(!renderer->renderToFile(tmpfile,log_model,settings,start_time,stop_at_stop, &err_msg,start_line,end_line)) { *err=RDFeed::ErrorRenderError; delete renderer; delete settings; - delete log_event; + delete log_model; unlink(tmpfile); return 0; } @@ -1493,7 +1492,7 @@ unsigned RDFeed::postLog(const QString &logname,const QTime &start_time, // QFile f(tmpfile); unsigned cast_id= - CreateCast(&destfile,f.size(),log_event->length(0,log_event->size())); + CreateCast(&destfile,f.size(),log_model->length(0,log_model->lineCount())); RDPodcast *cast=new RDPodcast(feed_config,cast_id); SavePodcast(cast_id,tmpfile); unlink(tmpfile); @@ -1516,7 +1515,7 @@ unsigned RDFeed::postLog(const QString &logname,const QTime &start_time, cast->setItemTitle(log->description()); } cast->setItemImageId(defaultItemImageId()); - cast->setAudioTime(log_event->length(start_line,1+end_line)); + cast->setAudioTime(log_model->length(start_line,1+end_line)); delete log; postXml(); @@ -1525,7 +1524,7 @@ unsigned RDFeed::postLog(const QString &logname,const QTime &start_time, delete cast; delete settings; - delete log_event; + delete log_model; unlink(tmpfile); return cast_id; diff --git a/lib/rdlog.cpp b/lib/rdlog.cpp index aea8a28b..dbaf4337 100644 --- a/lib/rdlog.cpp +++ b/lib/rdlog.cpp @@ -2,7 +2,7 @@ // // Abstract a Rivendell Log. // -// (C) Copyright 2002-2003,2016-2018 Fred Gleason +// (C) Copyright 2002-2020 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 @@ -457,9 +457,9 @@ int RDLog::removeTracks(RDStation *station,RDUser *user,RDConfig *config) const } -RDLogEvent *RDLog::createLogEvent() const +RDLogModel *RDLog::createLogEvent() const { - return new RDLogEvent(name()); + return new RDLogModel(name(),false); } diff --git a/lib/rdlog.h b/lib/rdlog.h index 329644e8..a1550b2c 100644 --- a/lib/rdlog.h +++ b/lib/rdlog.h @@ -2,7 +2,7 @@ // // Abstract a Rivendell Log // -// (C) Copyright 2002-2018 Fred Gleason +// (C) Copyright 2002-2020 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 @@ -22,7 +22,7 @@ #define RDLOG_H #include -#include +#include #include #include @@ -76,7 +76,7 @@ class RDLog bool remove(RDStation *station,RDUser *user,RDConfig *config) const; void updateTracks(); int removeTracks(RDStation *station,RDUser *user,RDConfig *config) const; - RDLogEvent *createLogEvent() const; + RDLogModel *createLogEvent() const; QString xml() const; static bool create(const QString &name,const QString &svc_name, const QDate &air_date,const QString &user_name, diff --git a/lib/rdlog_event.cpp b/lib/rdlog_event.cpp deleted file mode 100644 index 7c2f38da..00000000 --- a/lib/rdlog_event.cpp +++ /dev/null @@ -1,1262 +0,0 @@ -// rdlog_event.cpp -// -// Abstract Rivendell Log Events. -// -// (C) Copyright 2002-2020 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 "rd.h" -#include "rdapplication.h" -#include "rdconf.h" -#include "rddb.h" -#include "rddebug.h" -#include "rdescape_string.h" -#include "rdlog.h" -#include "rdlog_event.h" -#include "rdreport.h" - -// -// Global Classes -// -RDLogEvent::RDLogEvent(QString name) -{ - log_name=name; - log_max_id=0; -} - - -RDLogEvent::~RDLogEvent() -{ - for(unsigned i=0;iline) { - return true; - } - return false; -} - - -bool RDLogEvent::exists(const QTime &hard_time,int except_line) -{ - for(int i=0;itimeType()==RDLogLine::Hard)&& - (logLine(i)->startTime(RDLogLine::Logged)==hard_time)&& - (i!=except_line)) { - return true; - } - } - return false; -} - - -QString RDLogEvent::logName() const -{ - return log_name; -} - - -void RDLogEvent::setLogName(QString logname) -{ - RDLog *log=new RDLog(logname); - log_name=log->name(); // So we normalize the case - delete log; -} - - -QString RDLogEvent::serviceName() const -{ - return log_service_name; -} - - -int RDLogEvent::load(bool track_ptrs) -{ - RDLogLine line; - QString sql; - RDSqlQuery *q; - - // - // Get the service name - // - sql=QString("select SERVICE from LOGS where ")+ - "NAME=\""+RDEscapeString(log_name)+"\""; - q=new RDSqlQuery(sql); - if(q->next()) { - log_service_name=q->value(0).toString(); - } - delete q; - - RDLog *log=new RDLog(log_name); - log_max_id=log->nextId(); - delete log; - - LoadLines(log_name,0,track_ptrs); - - return log_line.size(); -} - -void RDLogEvent::saveModified(RDConfig *config,bool update_tracks) -{ - for(unsigned i=0;ihasBeenModified()) { - save(config,update_tracks, i); - } - } -} - -void RDLogEvent::save(RDConfig *config,bool update_tracks,int line) -{ - QString sql; - RDSqlQuery *q; - - if(log_name.isEmpty()) { - return; - } - if(line<0) { - if(exists()) { - sql=QString("delete from LOG_LINES where ")+ - "LOG_NAME=\""+RDEscapeString(log_name)+"\""; - RDSqlQuery::apply(sql); - } - if (log_line.size() > 0) { - QString values = ""; - for(unsigned i=0;iclearModified(); - } - RDLog *log=new RDLog(log_name); - if(log->nextId()setNextId(nextId()); - } - if(update_tracks) { - log->updateTracks(); - } - delete log; -} - - -int RDLogEvent::append(const QString &logname,bool track_ptrs) -{ - return LoadLines(logname,log_max_id,track_ptrs); -} - - -void RDLogEvent::clear() -{ - log_name=""; - log_line.resize(0); - log_max_id=0; -} - - -int RDLogEvent::validate(QString *report,const QDate &date) -{ - QString sql; - RDSqlQuery *q; - RDSqlQuery *q1; - int errs=0; - - // - // Report Header - // - *report="Rivendell Log Exception Report\n"; - *report+=QString("Generated at: ")+ - QDate::currentDate().toString("MM/dd/yyyy")+" - "+ - QTime::currentTime().toString("hh:mm:ss")+"\n"; - *report+=QString("Log: ")+log_name+"\n"; - *report+=QString("Effective Airdate: ")+date.toString("MM/dd/yyyy")+"\n"; - *report+="\n"; - - // - // Line Scan - // - for(int i=0;icartNumber()>0) { - sql=QString("select ")+ - "TYPE,"+ // 00 - "TITLE "+ // 01 - "from CART where "+ - QString().sprintf("NUMBER=%d",logLine(i)->cartNumber()); - q=new RDSqlQuery(sql); - if(!q->first()) { - *report+=QString(" ")+ - logLine(i)->startTime(RDLogLine::Logged).toString("hh:mm:ss")+ - QString().sprintf(" - missing cart %06d",logLine(i)->cartNumber())+ - "\n"; - errs++; - } - else { - if((RDCart::Type)q->value(0).toInt()==RDCart::Audio) { - if(logLine(i)->startTime(RDLogLine::Logged).isNull()) { - // - // Handle events with no logged start time (e.g. manual inserts) - // - //TODO do we need to verify date here? - sql=QString("select CUT_NAME from CUTS where ")+ - QString().sprintf("(CART_NUMBER=%u)&&",logLine(i)->cartNumber())+ - "((START_DATETIME is null)||"+ - "(START_DATETIME<=\""+date.toString("yyyy-MM-dd")+" 23:59:59\"))&&"+ - "((END_DATETIME is null)||"+ - "(END_DATETIME>=\""+date.toString("yyyy-MM-dd")+" 00:00:00\"))&&"+ - "("+RDDowCode(date.dayOfWeek())+"=\"Y\")&&(LENGTH>0)"; - } - else { - //TODO Do we need to verify date and logLine(i)->startTime? - sql=QString("select CUT_NAME from CUTS where ")+ - QString().sprintf("(CART_NUMBER=%u)&&",logLine(i)->cartNumber())+ - "((START_DATETIME is null)||"+ - "(START_DATETIME<=\""+date.toString("yyyy-MM-dd")+" "+ - logLine(i)->startTime(RDLogLine::Logged).toString("hh:mm:ss")+ - "\"))&&"+ - "((END_DATETIME is null)||"+ - "(END_DATETIME>=\""+date.toString("yyyy-MM-dd")+" "+ - logLine(i)->startTime(RDLogLine::Logged).toString("hh:mm:ss")+ - "\"))&&"+ - "((START_DAYPART is null)||"+ - "(START_DAYPART<=\""+ - logLine(i)->startTime(RDLogLine::Logged). - toString("hh:mm:ss")+"\"))&&"+ - "((END_DAYPART is null)||"+ - "(END_DAYPART>=\""+logLine(i)->startTime(RDLogLine::Logged). - toString("hh:mm:ss")+"\"))&&"+ - "("+RDDowCode(date.dayOfWeek())+"=\"Y\")&&(LENGTH>0)"; - } - q1=new RDSqlQuery(sql); - if(!q1->first()) { - *report+=QString(" ")+ - logLine(i)->startTime(RDLogLine::Logged).toString("hh:mm:ss")+ - QString().sprintf(" - cart %06d [",logLine(i)->cartNumber())+ - q->value(1).toString()+"] "+QObject::tr("is not playable")+"\n"; - errs++; - } - delete q1; - } - } - delete q; - } - } - *report+="\n"; - if(errs==1) { - *report+=QString().sprintf("%d validation exception found.\n\n",errs); - } - else { - *report+=QString().sprintf("%d validation exceptions found.\n\n",errs); - } - return errs; -} - - -void RDLogEvent::refresh(int line) -{ - if(log_name.isEmpty()||log_line[line]->cartNumber()==0) { - return; - } - QString sql=QString("select ")+ - "CART.TYPE,"+ // 00 - "CART.GROUP_NAME,"+ // 01 - "CART.TITLE,"+ // 02 - "CART.ARTIST,"+ // 03 - "CART.ALBUM,"+ // 04 - "CART.YEAR,"+ // 05 - "CART.LABEL,"+ // 06 - "CART.CLIENT,"+ // 07 - "CART.AGENCY,"+ // 08 - "CART.USER_DEFINED,"+ // 09 - "CART.FORCED_LENGTH,"+ // 10 - "CART.CUT_QUANTITY,"+ // 11 - "CART.LAST_CUT_PLAYED,"+ // 12 - "CART.PLAY_ORDER,"+ // 13 - "CART.ENFORCE_LENGTH,"+ // 14 - "CART.PRESERVE_PITCH,"+ // 15 - "CART.PUBLISHER,"+ // 16 - "CART.COMPOSER,"+ // 17 - "CART.USAGE_CODE,"+ // 18 - "CART.AVERAGE_SEGUE_LENGTH,"+ // 19 - "CART.VALIDITY,"+ // 20 - "CART.NOTES,"+ // 21 - "GROUPS.COLOR "+ // 22 - "from CART left join GROUPS "+ - "on CART.GROUP_NAME=GROUPS.NAME where "+ - QString().sprintf("CART.NUMBER=%u",log_line[line]->cartNumber()); - RDSqlQuery *q=new RDSqlQuery(sql); - if(q->first()) { - switch((RDCart::Type)q->value(0).toInt()) { - case RDCart::Audio: - log_line[line]->setType(RDLogLine::Cart); - break; - - case RDCart::Macro: - log_line[line]->setType(RDLogLine::Macro); - break; - - default: - break; - } - log_line[line]-> - setCartType((RDCart::Type)q->value(0).toInt()); // Cart Type - log_line[line]->setGroupName(q->value(1).toString()); // Group Name - log_line[line]->setTitle(q->value(2).toString()); // Title - log_line[line]->setArtist(q->value(3).toString()); // Artist - log_line[line]->setPublisher(q->value(16).toString()); // Publisher - log_line[line]->setComposer(q->value(17).toString()); // Composer - log_line[line]->setAlbum(q->value(4).toString()); // Album - log_line[line]->setYear(q->value(5).toDate()); // Year - log_line[line]->setLabel(q->value(6).toString()); // Label - log_line[line]->setClient(q->value(7).toString()); // Client - log_line[line]->setAgency(q->value(8).toString()); // Agency - log_line[line]->setUserDefined(q->value(9).toString()); // User Defined - log_line[line]->setUsageCode((RDCart::UsageCode)q->value(16).toInt()); - log_line[line]->setForcedLength(q->value(10).toUInt()); // Forced Length - log_line[line]->setAverageSegueLength(q->value(19).toUInt()); - log_line[line]->setCutQuantity(q->value(11).toUInt()); // Cut Quantity - log_line[line]->setLastCutPlayed(q->value(12).toUInt()); // Last Cut Played - log_line[line]-> - setPlayOrder((RDCart::PlayOrder)q->value(13).toUInt()); // Play Order - log_line[line]-> - setEnforceLength(RDBool(q->value(14).toString())); // Enforce Length - log_line[line]-> - setPreservePitch(RDBool(q->value(15).toString())); // Preserve Pitch - log_line[line]->setValidity((RDCart::Validity)q->value(20).toInt()); - log_line[line]->setCartNotes(q->value(21).toString()); // Cart Notes - log_line[line]->setGroupColor(q->value(22).toString()); // Group Color - } - else { - log_line[line]->setValidity(RDCart::NeverValid); - } - delete q; -} - - -int RDLogEvent::size() const -{ - return log_line.size(); -} - - -void RDLogEvent::insert(int line,int num_lines,bool preserve_trans) -{ - if(!preserve_trans) { - if((line>0)&&(log_line[line-1]!=NULL)) { - log_line[line-1]->setEndPoint(-1,RDLogLine::LogPointer); - log_line[line-1]->setSegueStartPoint(-1,RDLogLine::LogPointer); - log_line[line-1]->setSegueEndPoint(-1,RDLogLine::LogPointer); - } - if(line<(size()-1)) { - log_line[line]->setStartPoint(-1,RDLogLine::LogPointer); - log_line[line]->setHasCustomTransition(false); - } - } - if(linesetId(++log_max_id); - } - return; - } - if(line>=size()) { - for(int i=0;isetId(++log_max_id); - } - return; - } -} - - -void RDLogEvent::remove(int line,int num_lines,bool preserve_trans) -{ - if(!preserve_trans) { - if(line>0) { - log_line[line-1]->setEndPoint(-1,RDLogLine::LogPointer); - log_line[line-1]->setSegueStartPoint(-1,RDLogLine::LogPointer); - log_line[line-1]->setSegueEndPoint(-1,RDLogLine::LogPointer); - } - if(line<((int)log_line.size()-num_lines)) { - log_line[line+num_lines]->setStartPoint(-1,RDLogLine::LogPointer); - log_line[line+num_lines]->setHasCustomTransition(false); - } - } - for(int i=line;i<(line+num_lines);i++) { - delete log_line[i]; - } - std::vector::iterator it=log_line.begin()+line; - log_line.erase(it,it+num_lines); -} - - -void RDLogEvent::move(int from_line,int to_line) -{ - int src_offset=0; - int dest_offset=1; - RDLogLine *srcline; - RDLogLine *destline; - - if(to_line=size()) { - to_line=size()-1; - dest_offset=0; - } - - if(((destline=logLine(to_line+dest_offset))==NULL)|| - (srcline=logLine(from_line+src_offset))==NULL) { - remove(to_line+dest_offset,1); - return; - } - *destline=*srcline; - destline->clearTrackData(RDLogLine::AllTrans); - remove(from_line+src_offset,1); -} - - -void RDLogEvent::copy(int from_line,int to_line) -{ - RDLogLine *srcline; - RDLogLine *destline; - - insert(to_line,1); - if(((destline=logLine(to_line))==NULL)|| - (srcline=logLine(from_line))==NULL) { - remove(to_line,1); - return; - } - *destline=*srcline; - destline->clearExternalData(); - destline->clearTrackData(RDLogLine::AllTrans); - destline->setSource(RDLogLine::Manual); -} - - -int RDLogEvent::length(int from_line,int to_line,QTime *sched_time) -{ - if(sched_time!=NULL) { - *sched_time=QTime(); - } - if(to_line<0) { - to_line=size(); - for(int i=from_line;itimeType()==RDLogLine::Hard) { - to_line=i; - i=size(); - if(sched_time!=NULL) { - *sched_time=logLine(i)->startTime(RDLogLine::Logged); - } - } - } - } - int len=0; - for(int i=from_line;i=size())||(logLine(i+1)->transType()!=RDLogLine::Segue)|| - (logLine(i)->segueStartPoint()<0)) { - len+=logLine(i)->forcedLength(); - } - else { - len+=logLine(i)->segueStartPoint()-logLine(i)->startPoint(); - } - } - - return len; -} - - -int RDLogEvent::lengthToStop(int from_line,QTime *sched_time) -{ - int to_line=-1; - - for(int i=from_line;itransType()==RDLogLine::Stop) { - to_line=i; - } - } - if(to_line<0) { - return -1; - } - return length(from_line,to_line,sched_time); -} - - -bool RDLogEvent::blockLength(int *nominal_length,int *actual_length,int line) -{ - *nominal_length=0; - *actual_length=0; - QTime start_time; - int start_line=-1; - QTime end_time; - int end_line=-1; - - if((line<0)||(line>(size()-1))) { - *nominal_length=0; - *actual_length=0; - return false; - } - - // - // Find Block Start - // - for(int i=line;i>=0;i--) { - if(logLine(i)->timeType()==RDLogLine::Hard) { - start_time=logLine(i)->startTime(RDLogLine::Logged); - start_line=i; - i=-1; - } - } - if(start_line<0) { - return false; - } - - // - // Find Block End - // - for(int i=line+1;itimeType()==RDLogLine::Hard) { - end_time=logLine(i)->startTime(RDLogLine::Logged); - end_line=i; - i=size(); - } - } - if(end_line<0) { - return false; - } - - // - // Calculate Lengths - // - *nominal_length=start_time.msecsTo(end_time); - for(int i=start_line;itransType()==RDLogLine::Segue))) { - *actual_length+=logLine(i)->averageSegueLength(); - } - else { - *actual_length+=logLine(i)->forcedLength(); - } - } - - return true; -} - -QTime RDLogEvent::blockStartTime(int line) -{ - int actual_length=0; - QTime start_time(0,0,0); - QTime return_time(0,0,0); - int start_line=0; - - if((line<0)||(line>(size()-1))) { - actual_length=0; - return return_time; - } - - // - // Find Block Start - // - for(int i=line;i>=0;i--) { - if(logLine(i)->timeType()==RDLogLine::Hard) { - start_time=logLine(i)->startTime(RDLogLine::Logged); - start_line=i; - i=-1; - } - } - if(start_line == line) { - return start_time; - } - - // - // Calculate Lengths - // - for(int i=start_line;itransType()==RDLogLine::Segue))) { - if(logLine(i)->segueStartPoint(RDLogLine::LogPointer)<0) { - actual_length+=100*(logLine(i)->averageSegueLength()/100); - } - else { - if(logLine(i)->startPoint(RDLogLine::LogPointer)<0) { - actual_length+=(logLine(i)->segueStartPoint(RDLogLine::LogPointer)- - logLine(i)->startPoint(RDLogLine::CartPointer)); - } - else { - actual_length+=(logLine(i)->segueStartPoint(RDLogLine::LogPointer)- - logLine(i)->startPoint(RDLogLine::LogPointer)); - } - } - } - else { - actual_length+=100*(logLine(i)->forcedLength()/100); - } - } - return_time=start_time.addMSecs(actual_length); - return return_time; -} - - -RDLogLine *RDLogEvent::logLine(int line) const -{ - if((line<0)||((unsigned)line>=log_line.size())) { - return NULL; - } - return log_line[line]; -} - - -void RDLogEvent::setLogLine(int line,RDLogLine *ll) -{ - int id=log_line[line]->id(); - *log_line[line]=*ll; - log_line[line]->setId(id); -} - - -RDLogLine *RDLogEvent::loglineById(int id, bool ignore_holdovers) const -{ - int line = lineById(id, ignore_holdovers); - if(line == -1) - return NULL; - else - return log_line[line]; -} - - -int RDLogEvent::lineById(int id, bool ignore_holdovers) const -{ - for(int i=0;iisHoldover()) { - continue; - } - if(log_line[i]->id()==id) { - return i; - } - } - return -1; -} - - -int RDLogEvent::lineByStartHour(int hour,RDLogLine::StartTimeType type) const -{ - for(int i=0;istartTime(type).isNull()&& - (log_line[i]->startTime(type).hour()==hour)) { - return i; - } - } - return -1; -} - - -int RDLogEvent::lineByStartHour(int hour) const -{ - int line=-1; - - if((line=lineByStartHour(hour,RDLogLine::Initial))<0) { - if((line=lineByStartHour(hour,RDLogLine::Predicted))<0) { - line=lineByStartHour(hour,RDLogLine::Imported); - } - } - return line; -} - - -int RDLogEvent::nextTimeStart(QTime after) -{ - for(unsigned i=0;itimeType()==RDLogLine::Hard)&& - (log_line[i]->startTime(RDLogLine::Logged)>after)) { - return i; - } - } - return -1; -} - - -RDLogLine::TransType RDLogEvent::nextTransType(int line) -{ - if(line<(size()-1)) { - return logLine(line+1)->transType(); - } - return RDLogLine::Stop; -} - - -void RDLogEvent::removeCustomTransition(int line) -{ - if((line<0)||(line>(size()-1))) { - return; - } - logLine(line)->setStartPoint(-1,RDLogLine::LogPointer); - logLine(line)->setFadeupPoint(-1,RDLogLine::LogPointer); - logLine(line)->setFadeupGain(0); - logLine(line)->setDuckUpGain(0); - logLine(line)->setHasCustomTransition(false); - if(line<1) { - return; - } - if(logLine(line-1)->type()!=RDLogLine::Track) { - logLine(line-1)->setEndPoint(-1,RDLogLine::LogPointer); - logLine(line-1)->setSegueStartPoint(-1,RDLogLine::LogPointer); - logLine(line-1)->setSegueEndPoint(-1,RDLogLine::LogPointer); - logLine(line-1)->setSegueGain(RD_FADE_DEPTH); - logLine(line-1)->setFadedownPoint(-1,RDLogLine::LogPointer); - logLine(line-1)->setFadedownGain(0); - logLine(line-1)->setDuckDownGain(0); - return; - } - if(line<2) { - return; - } - logLine(line-2)->setEndPoint(-1,RDLogLine::LogPointer); - logLine(line-2)->setSegueStartPoint(-1,RDLogLine::LogPointer); - logLine(line-2)->setSegueEndPoint(-1,RDLogLine::LogPointer); - logLine(line-2)->setSegueGain(RD_FADE_DEPTH); - logLine(line-2)->setFadedownPoint(-1,RDLogLine::LogPointer); - logLine(line-2)->setFadedownGain(0); - logLine(line-2)->setDuckDownGain(0); -} - - -int RDLogEvent::nextId() const -{ - int id=-1; - for(int i=0;iid()>id) { - id=log_line[i]->id(); - } - } - return id+1; -} - - -int RDLogEvent::nextLinkId() const -{ - int id=-1; - for(int i=0;ilinkId()>id) { - id=log_line[i]->linkId(); - } - } - return id+1; -} - - -QString RDLogEvent::xml() const -{ - QString ret; - - ret+="\n"; - for(int i=0;ixml(i); - } - ret+="\n"; - - return ret; -} - - -int RDLogEvent::LoadLines(const QString &logname,int id_offset,bool track_ptrs) -{ - RDLogLine line; - RDSqlQuery *q1; - QString sql; - RDSqlQuery *q; - bool prev_custom=false; - unsigned lines=0; - unsigned start_line=log_line.size(); - - // - // Load the group color table - // - std::map group_colors; - sql="select NAME,COLOR from GROUPS"; - q=new RDSqlQuery(sql); - while(q->next()) { - group_colors[q->value(0).toString()]=QColor(q->value(1).toString()); - } - delete q; - - // - // Load log lines - // - sql=QString("select ")+ - "LOG_LINES.LINE_ID,"+ // 00 - "LOG_LINES.CART_NUMBER,"+ // 01 - "LOG_LINES.START_TIME,"+ // 02 - "LOG_LINES.TIME_TYPE,"+ // 03 - "LOG_LINES.TRANS_TYPE,"+ // 04 - "LOG_LINES.START_POINT,"+ // 05 - "LOG_LINES.END_POINT,"+ // 06 - "LOG_LINES.SEGUE_START_POINT,"+ // 07 - "LOG_LINES.SEGUE_END_POINT,"+ // 08 - "CART.TYPE,"+ // 09 - "CART.GROUP_NAME,"+ // 10 - "CART.TITLE,"+ // 11 - "CART.ARTIST,"+ // 12 - "CART.ALBUM,"+ // 13 - "CART.YEAR,"+ // 14 - "CART.LABEL,"+ // 15 - "CART.CLIENT,"+ // 16 - "CART.AGENCY,"+ // 17 - "CART.USER_DEFINED,"+ // 18 - "CART.CONDUCTOR,"+ // 19 - "CART.SONG_ID,"+ // 20 - "CART.FORCED_LENGTH,"+ // 21 - "CART.CUT_QUANTITY,"+ // 22 - "CART.LAST_CUT_PLAYED,"+ // 23 - "CART.PLAY_ORDER,"+ // 24 - "CART.ENFORCE_LENGTH,"+ // 25 - "CART.PRESERVE_PITCH ,"+ // 26 - "LOG_LINES.TYPE,"+ // 27 - "LOG_LINES.COMMENT,"+ // 28 - "LOG_LINES.LABEL,"+ // 29 - "LOG_LINES.GRACE_TIME,"+ // 30 - "LOG_LINES.SOURCE,"+ // 31 - "LOG_LINES.EXT_START_TIME,"+ // 32 - "LOG_LINES.EXT_LENGTH,"+ // 33 - "LOG_LINES.EXT_DATA,"+ // 34 - "LOG_LINES.EXT_EVENT_ID,"+ // 35 - "LOG_LINES.EXT_ANNC_TYPE,"+ // 36 - "LOG_LINES.EXT_CART_NAME,"+ // 37 - "CART.ASYNCRONOUS,"+ // 38 - "LOG_LINES.FADEUP_POINT,"+ // 39 - "LOG_LINES.FADEUP_GAIN,"+ // 40 - "LOG_LINES.FADEDOWN_POINT,"+ // 41 - "LOG_LINES.FADEDOWN_GAIN,"+ // 42 - "LOG_LINES.SEGUE_GAIN,"+ // 43 - "CART.PUBLISHER,"+ // 44 - "CART.COMPOSER,"+ // 45 - "CART.USAGE_CODE,"+ // 46 - "CART.AVERAGE_SEGUE_LENGTH,"+ // 47 - "LOG_LINES.LINK_EVENT_NAME,"+ // 48 - "LOG_LINES.LINK_START_TIME,"+ // 49 - "LOG_LINES.LINK_LENGTH,"+ // 50 - "LOG_LINES.LINK_ID,"+ // 51 - "LOG_LINES.LINK_EMBEDDED,"+ // 52 - "LOG_LINES.ORIGIN_USER,"+ // 53 - "LOG_LINES.ORIGIN_DATETIME,"+ // 54 - "CART.VALIDITY,"+ // 55 - "LOG_LINES.LINK_START_SLOP,"+ // 56 - "LOG_LINES.LINK_END_SLOP,"+ // 57 - "LOG_LINES.DUCK_UP_GAIN,"+ // 58 - "LOG_LINES.DUCK_DOWN_GAIN,"+ // 59 - "CART.START_DATETIME,"+ // 60 - "CART.END_DATETIME,"+ // 61 - "LOG_LINES.EVENT_LENGTH,"+ // 62 - "CART.USE_EVENT_LENGTH,"+ // 63 - "CART.NOTES "+ // 64 - "from LOG_LINES left join CART "+ - "on LOG_LINES.CART_NUMBER=CART.NUMBER where "+ - "LOG_LINES.LOG_NAME=\""+RDEscapeString(logname)+"\" "+ - "order by COUNT"; - q=new RDSqlQuery(sql); - if(q->size()<=0) { - delete q; - return 0; - } - for(int i=0;isize();i++) { - lines++; - line.clear(); - q->next(); - line.setType((RDLogLine::Type)q->value(27).toInt()); // Type - line.setId(q->value(0).toInt()+id_offset); // Log Line ID - if((q->value(0).toInt()+id_offset)>log_max_id) { - log_max_id=q->value(0).toInt()+id_offset; - } - line.setStartTime(RDLogLine::Imported, - QTime().addMSecs(q->value(2).toInt())); // Start Time - line.setStartTime(RDLogLine::Logged, - QTime().addMSecs(q->value(2).toInt())); - line. - setTimeType((RDLogLine::TimeType)q->value(3).toInt()); // Time Type - line. - setTransType((RDLogLine::TransType)q->value(4).toInt()); // Trans Type - line.setMarkerComment(q->value(28).toString()); // Comment - line.setMarkerLabel(q->value(29).toString()); // Label - line.setGraceTime(q->value(30).toInt()); // Grace Time - line.setUseEventLength(RDBool(q->value(63).toString())); // Use Event Length - line.setEventLength(q->value(62).toInt()); // Event Length - line.setSource((RDLogLine::Source)q->value(31).toUInt()); - line.setLinkEventName(q->value(48).toString()); // Link Event Name - line.setLinkStartTime(QTime().addMSecs(q->value(49).toInt())); // Link Start Time - line.setLinkLength(q->value(50).toInt()); // Link Length - line.setLinkStartSlop(q->value(56).toInt()); // Link Start Slop - line.setLinkEndSlop(q->value(57).toInt()); // Link End Slop - line.setLinkId(q->value(51).toInt()); // Link ID - line.setLinkEmbedded(RDBool(q->value(52).toString())); // Link Embedded - line.setOriginUser(q->value(53).toString()); // Origin User - line.setOriginDateTime(q->value(54).toDateTime()); // Origin DateTime - switch(line.type()) { - case RDLogLine::Cart: - line.setCartNumber(q->value(1).toUInt()); // Cart Number - line.setStartPoint(q->value(5).toInt(),RDLogLine::LogPointer); - line.setEndPoint(q->value(6).toInt(),RDLogLine::LogPointer); - line.setSegueStartPoint(q->value(7).toInt(),RDLogLine::LogPointer); - line.setSegueEndPoint(q->value(8).toInt(),RDLogLine::LogPointer); - line.setCartType((RDCart::Type)q->value(9).toInt()); // Cart Type - line.setGroupName(q->value(10).toString()); // Group Name - line.setGroupColor(group_colors[q->value(10).toString()]); - line.setTitle(q->value(11).toString()); // Title - line.setArtist(q->value(12).toString()); // Artist - line.setPublisher(q->value(44).toString()); // Publisher - line.setComposer(q->value(45).toString()); // Composer - line.setAlbum(q->value(13).toString()); // Album - line.setYear(q->value(14).toDate()); // Year - line.setLabel(q->value(15).toString()); // Label - line.setClient(q->value(16).toString()); // Client - line.setAgency(q->value(17).toString()); // Agency - line.setUserDefined(q->value(18).toString()); // User Defined - line.setCartNotes(q->value(64).toString()); // Cart Notes - line.setConductor(q->value(19).toString()); // Conductor - line.setSongId(q->value(20).toString()); // Song ID - line.setUsageCode((RDCart::UsageCode)q->value(46).toInt()); - line.setForcedLength(q->value(21).toUInt()); // Forced Length - if(q->value(7).toInt()<0) { - line.setAverageSegueLength(q->value(47).toInt()); - } - else { - line. - setAverageSegueLength(q->value(7).toInt()-q->value(5).toInt()); - } - line.setCutQuantity(q->value(22).toUInt()); // Cut Quantity - line.setLastCutPlayed(q->value(23).toUInt()); // Last Cut Played - line. - setPlayOrder((RDCart::PlayOrder)q->value(24).toUInt()); // Play Ord - line. - setEnforceLength(RDBool(q->value(25).toString())); // Enforce Length - line. - setPreservePitch(RDBool(q->value(26).toString())); // Preserve Pitch - if(!q->value(32).isNull()) { // Ext Start Time - line.setExtStartTime(q->value(32).toTime()); - } - if(!q->value(33).isNull()) { // Ext Length - line.setExtLength(q->value(33).toInt()); - } - if(!q->value(34).isNull()) { // Ext Data - line.setExtData(q->value(34).toString()); - } - if(!q->value(35).isNull()) { // Ext Event ID - line.setExtEventId(q->value(35).toString()); - } - if(!q->value(36).isNull()) { // Ext Annc. Type - line.setExtAnncType(q->value(36).toString()); - } - if(!q->value(37).isNull()) { // Ext Cart Name - line.setExtCartName(q->value(37).toString()); - } - if(!q->value(39).isNull()) { // FadeUp Point - line.setFadeupPoint(q->value(39).toInt(),RDLogLine::LogPointer); - } - if(!q->value(40).isNull()) { // FadeUp Gain - line.setFadeupGain(q->value(40).toInt()); - } - if(!q->value(41).isNull()) { // FadeDown Point - line.setFadedownPoint(q->value(41).toInt(),RDLogLine::LogPointer); - } - if(!q->value(42).isNull()) { // FadeDown Gain - line.setFadedownGain(q->value(42).toInt()); - } - if(!q->value(43).isNull()) { // Segue Gain - line.setSegueGain(q->value(43).toInt()); - } - if(!q->value(58).isNull()) { // Duck Up Gain - line.setDuckUpGain(q->value(58).toInt()); - } - if(!q->value(59).isNull()) { // Duck Down Gain - line.setDuckDownGain(q->value(59).toInt()); - } - if(!q->value(60).isNull()) { // Start Datetime - line.setStartDatetime(q->value(60).toDateTime()); - } - if(!q->value(61).isNull()) { // End Datetime - line.setEndDatetime(q->value(61).toDateTime()); - } - line.setValidity((RDCart::Validity)q->value(55).toInt()); // Validity - break; - - case RDLogLine::Macro: - line.setCartNumber(q->value(1).toUInt()); // Cart Number - line.setCartType((RDCart::Type)q->value(9).toInt()); // Cart Type - line.setGroupName(q->value(10).toString()); // Group Name - line.setGroupColor(group_colors[q->value(10).toString()]); - line.setTitle(q->value(11).toString()); // Title - line.setArtist(q->value(12).toString()); // Artist - line.setPublisher(q->value(44).toString()); // Publisher - line.setComposer(q->value(45).toString()); // Composer - line.setAlbum(q->value(13).toString()); // Album - line.setYear(q->value(14).toDate()); // Year - line.setLabel(q->value(15).toString()); // Label - line.setClient(q->value(16).toString()); // Client - line.setAgency(q->value(17).toString()); // Agency - line.setUserDefined(q->value(18).toString()); // User Defined - line.setCartNotes(q->value(64).toString()); // Cart Notes - line.setForcedLength(q->value(21).toUInt()); // Forced Length - line.setAverageSegueLength(q->value(21).toInt()); - if(!q->value(32).isNull()) { // Ext Start Time - line.setExtStartTime(q->value(32).toTime()); - } - if(!q->value(33).isNull()) { // Ext Length - line.setExtLength(q->value(33).toInt()); - } - if(!q->value(34).isNull()) { // Ext Data - line.setExtData(q->value(34).toString()); - } - if(!q->value(35).isNull()) { // Ext Event ID - line.setExtEventId(q->value(35).toString()); - } - if(!q->value(36).isNull()) { // Ext Annc. Type - line.setExtAnncType(q->value(36).toString()); - } - if(!q->value(37).isNull()) { // Ext Cart Name - line.setExtCartName(q->value(37).toString()); - } - if(!q->value(38).isNull()) { // Asyncronous - line.setAsyncronous(RDBool(q->value(38).toString())); - } - break; - - case RDLogLine::Marker: - break; - - case RDLogLine::Track: - break; - - case RDLogLine::Chain: - sql=QString("select DESCRIPTION from LOGS where ")+ - "NAME=\""+RDEscapeString(line.markerLabel())+"\""; - q1=new RDSqlQuery(sql); - if(q1->first()) { - line.setMarkerComment(q1->value(0).toString()); - } - delete q1; - break; - - default: - break; - } - - line.setHasCustomTransition(prev_custom||(q->value(5).toInt()>=0)||\ - (q->value(39).toInt()>=0)); - if(line.type()==RDLogLine::Cart) { - prev_custom=(q->value(6).toInt()>=0)||(q->value(7).toInt()>=0)|| - (q->value(8).toInt()>=0)||(q->value(41).toInt()>=0); - } - else { - prev_custom=false; - } - line.clearModified(); - log_line.push_back(new RDLogLine(line)); - } - delete q; - - LoadNowNext(start_line); - - if(track_ptrs) { - // - // Load default cart pointers for "representative" cuts. This is - // really only useful when setting up a voice tracker. - // - for(int i=start_line;icartType()==RDCart::Audio) { - sql=QString("select START_POINT,END_POINT,")+ - "SEGUE_START_POINT,SEGUE_END_POINT,"+ - "TALK_START_POINT,TALK_END_POINT," - "HOOK_START_POINT,HOOK_END_POINT,"+ - "FADEUP_POINT,FADEDOWN_POINT,CUT_NAME,"+ - "ORIGIN_NAME,ORIGIN_DATETIME from CUTS "+ - QString().sprintf("where CART_NUMBER=%u ",ll->cartNumber())+ - "order by CUT_NAME"; - q=new RDSqlQuery(sql); - if(q->first()) { - ll->setStartPoint(q->value(0).toInt(),RDLogLine::CartPointer); - ll->setEndPoint(q->value(1).toInt(),RDLogLine::CartPointer); - ll->setSegueStartPoint(q->value(2).toInt(),RDLogLine::CartPointer); - ll->setSegueEndPoint(q->value(3).toInt(),RDLogLine::CartPointer); - ll->setTalkStartPoint(q->value(4).toInt()); - ll->setTalkEndPoint(q->value(5).toInt()); - ll->setHookStartPoint(q->value(6).toInt()); - ll->setHookEndPoint(q->value(7).toInt()); - ll->setFadeupPoint(q->value(8).toInt(),RDLogLine::CartPointer); - ll->setFadedownPoint(q->value(9).toInt(),RDLogLine::CartPointer); - ll->setCutNumber(RDCut::cutNumber(q->value(10).toString())); - ll->setOriginUser(q->value(11).toString()); - ll->setOriginDateTime(q->value(12).toDateTime()); - } - delete q; - } - } - } - - return lines; -} - - -void RDLogEvent::InsertLines(QString values) { - QString sql; - RDSqlQuery *q; - - sql = QString("insert into LOG_LINES (")+ - "LOG_NAME,"+ // 00 - "LINE_ID,"+ // 01 - "COUNT,"+ // 02 - "CART_NUMBER,"+ // 03 - "START_TIME,"+ // 04 - "TIME_TYPE,"+ // 05 - "TRANS_TYPE,"+ // 06 - "START_POINT,"+ // 07 - "END_POINT,"+ // 08 - "SEGUE_START_POINT,"+ // 09 - "SEGUE_END_POINT,"+ // 10 - "TYPE,"+ // 11 - "COMMENT,"+ // 12 - "LABEL,"+ // 13 - "GRACE_TIME,"+ // 14 - "SOURCE,"+ // 15 - "EXT_START_TIME,"+ // 16 - "EXT_LENGTH,"+ // 17 - "EXT_DATA,"+ // 18 - "EXT_EVENT_ID,"+ // 19 - "EXT_ANNC_TYPE,"+ // 20 - "EXT_CART_NAME,"+ // 21 - "FADEUP_POINT,"+ // 22 - "FADEUP_GAIN,"+ // 23 - "FADEDOWN_POINT,"+ // 24 - "FADEDOWN_GAIN,"+ // 25 - "SEGUE_GAIN,"+ // 26 - "LINK_EVENT_NAME,"+ // 27 - "LINK_START_TIME,"+ // 28 - "LINK_LENGTH,"+ // 29 - "LINK_ID,"+ // 30 - "LINK_EMBEDDED,"+ // 31 - "ORIGIN_USER,"+ // 32 - "ORIGIN_DATETIME,"+ // 33 - "LINK_START_SLOP,"+ // 34 - "LINK_END_SLOP,"+ // 35 - "DUCK_UP_GAIN,"+ // 36 - "DUCK_DOWN_GAIN,"+ // 37 - "EVENT_LENGTH) "+ // 38 - "values "+values; - q=new RDSqlQuery(sql); - delete q; -} - - -void RDLogEvent::InsertLineValues(QString *query, int line) -{ - // one line to save query space - RDLogLine *ll=log_line[line]; - QString sql=QString("(")+ - "\""+RDEscapeString(log_name)+"\","+ - QString().sprintf("%d,",ll->id())+ - QString().sprintf("%d,",line)+ - QString().sprintf("%u,",ll->cartNumber())+ - QString().sprintf("%d,",QTime().msecsTo(ll->startTime(RDLogLine::Logged)))+ - QString().sprintf("%d,",ll->timeType())+ - QString().sprintf("%d,",ll->transType())+ - QString().sprintf("%d,",ll->startPoint(RDLogLine::LogPointer))+ - QString().sprintf("%d,",ll->endPoint(RDLogLine::LogPointer))+ - QString().sprintf("%d,",ll->segueStartPoint(RDLogLine::LogPointer))+ - QString().sprintf("%d,",ll->segueEndPoint(RDLogLine::LogPointer))+ - QString().sprintf("%d,",ll->type())+ - "\""+RDEscapeString(ll->markerComment())+"\","+ - "\""+RDEscapeString(ll->markerLabel())+"\","+ - QString().sprintf("%d,",ll->graceTime())+ - QString().sprintf("%d,",ll->source())+ - RDCheckDateTime(ll->extStartTime(),"hh:mm:ss")+","+ - QString().sprintf("%d,",ll->extLength())+ - "\""+RDEscapeString(ll->extData())+"\","+ - "\""+RDEscapeString(ll->extEventId())+"\","+ - "\""+RDEscapeString(ll->extAnncType())+"\","+ - "\""+RDEscapeString(ll->extCartName())+"\","+ - QString().sprintf("%d,",ll->fadeupPoint(RDLogLine::LogPointer))+ - QString().sprintf("%d,",ll->fadeupGain())+ - QString().sprintf("%d,",ll->fadedownPoint(RDLogLine::LogPointer))+ - QString().sprintf("%d,",ll->fadedownGain())+ - QString().sprintf("%d,",ll->segueGain())+ - "\""+RDEscapeString(ll->linkEventName())+"\","+ - QString().sprintf("%d,",QTime().msecsTo(ll->linkStartTime()))+ - QString().sprintf("%d,",ll->linkLength())+ - QString().sprintf("%d,",ll->linkId())+ - "\""+RDYesNo(ll->linkEmbedded())+"\","+ - "\""+RDEscapeString(ll->originUser())+"\","+ - RDCheckDateTime(ll->originDateTime(),"yyyy-MM-dd hh:mm:ss")+","+ - QString().sprintf("%d,",ll->linkStartSlop())+ - QString().sprintf("%d,",ll->linkEndSlop())+ - QString().sprintf("%d,",ll->duckUpGain())+ - QString().sprintf("%d,",ll->duckDownGain())+ - QString().sprintf("%d)",ll->eventLength()); - *query += sql; -} - -void RDLogEvent::SaveLine(int line) -{ - QString values = ""; - InsertLineValues(&values, line); - InsertLines(values); -} - - -void RDLogEvent::LoadNowNext(unsigned from_line) -{ - std::vector groups; - std::vector now_nexts; - - // - // Load the Lookup Table - // - RDSqlQuery *q=new RDSqlQuery("select NAME,ENABLE_NOW_NEXT from GROUPS"); - while(q->next()) { - groups.push_back(QString(q->value(0).toString())); - now_nexts.push_back(RDBool(q->value(1).toString())); - } - delete q; - - for(unsigned i=from_line;igroupName()==groups[j]) { - log_line[i]->setNowNextEnabled(now_nexts[j]); - } - } - } -} - diff --git a/lib/rdlog_event.h b/lib/rdlog_event.h deleted file mode 100644 index 566e31ff..00000000 --- a/lib/rdlog_event.h +++ /dev/null @@ -1,87 +0,0 @@ -// rdlog_event.h -// -// Abstract Rivendell Log Events -// -// (C) Copyright 2002-2020 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 -#include - -#include -#include - -#ifndef RDLOG_EVENT_H -#define RDLOG_EVENT_H - -#define INSERT_STEP_SIZE 500 - -class RDLogEvent -{ - public: - RDLogEvent(QString logname=""); - ~RDLogEvent(); - bool exists(); - bool exists(int line); - bool exists(const QTime &hard_time,int except_line=-1); - QString logName() const; - void setLogName(QString logname); - QString serviceName() const; - int load(bool track_ptrs=false); - void saveModified(RDConfig *config,bool update_tracks=true); - void save(RDConfig *config,bool update_tracks=true,int line=-1); - int append(const QString &logname,bool track_ptrs=false); - int validate(QString *report,const QDate &date); - void clear(); - void refresh(int line); - int size() const; - void insert(int line,int num_lines,bool preserve_trans=false); - void remove(int line,int num_lines,bool preserve_trans=false); - void move(int from_line,int to_line); - void copy(int from_line,int to_line); - int length(int from_line,int to_line,QTime *sched_time=NULL); - int lengthToStop(int from_line,QTime *sched_time=NULL); - bool blockLength(int *nominal_length,int *actual_length,int line); - QTime blockStartTime(int line); - RDLogLine *logLine(int line) const; - void setLogLine(int line,RDLogLine *ll); - RDLogLine *loglineById(int id, bool ignore_holdovers=false) const; - int lineById(int id, bool ignore_holdovers=false) const; - int lineByStartHour(int hour,RDLogLine::StartTimeType type) const; - int lineByStartHour(int hour) const; - int nextTimeStart(QTime after); - RDLogLine::TransType nextTransType(int); - void removeCustomTransition(int line); - int nextId() const; - int nextLinkId() const; - QString xml() const; - - private: - int LoadLines(const QString &logname,int id_offset,bool track_ptrs); - void SaveLine(int line); - void InsertLines(QString values); - void InsertLineValues(QString *query, int line); - void LoadNowNext(unsigned from_line); - QString log_name; - QString log_service_name; - int log_max_id; - std::vector log_line; -}; - - -#endif // RDLOG_LINE_H diff --git a/lib/rdlogmodel.cpp b/lib/rdlogmodel.cpp index 659fda67..d2974c91 100644 --- a/lib/rdlogmodel.cpp +++ b/lib/rdlogmodel.cpp @@ -30,13 +30,15 @@ RDLogModel::RDLogModel(const QString &logname,bool read_only,QObject *parent) : QAbstractTableModel(parent) { + d_log_name=logname; + d_read_only=read_only; + + MakeModel(); + /* d_fms=NULL; d_bold_fms=NULL; d_log_icons=new RDLogIcons(); d_start_time_style=RDLogModel::Scheduled; - - d_log_name=logname; - d_read_only=read_only; d_max_id=0; // @@ -87,6 +89,16 @@ RDLogModel::RDLogModel(const QString &logname,bool read_only,QObject *parent) d_headers.push_back(tr("Count")); d_alignments.push_back(right); + */ +} + + +RDLogModel::RDLogModel(QObject *parent) + : QAbstractTableModel(parent) +{ + d_read_only=false; + + MakeModel(); } @@ -1598,3 +1610,62 @@ QColor RDLogModel::backgroundColor(int line,RDLogLine *ll) const { return d_palette.color(QPalette::Base); } + + +void RDLogModel::MakeModel() +{ + d_fms=NULL; + d_bold_fms=NULL; + d_log_icons=new RDLogIcons(); + d_start_time_style=RDLogModel::Scheduled; + d_max_id=0; + + // + // Column Attributes + // + unsigned left=Qt::AlignLeft|Qt::AlignVCenter; + unsigned center=Qt::AlignCenter; + unsigned right=Qt::AlignRight|Qt::AlignVCenter; + + d_headers.push_back(tr("Start Time")); + d_alignments.push_back(right); + + d_headers.push_back(tr("Trans")); + d_alignments.push_back(center); + + d_headers.push_back(tr("Cart")); + d_alignments.push_back(center); + + d_headers.push_back(tr("Group")); + d_alignments.push_back(center); + + d_headers.push_back(tr("Length")); + d_alignments.push_back(right); + + d_headers.push_back(tr("Title")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Artist")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Client")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Agency")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Label")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Source")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Ext Data")); + d_alignments.push_back(left); + + d_headers.push_back(tr("Line ID")); + d_alignments.push_back(right); + + d_headers.push_back(tr("Count")); + d_alignments.push_back(right); +} diff --git a/lib/rdlogmodel.h b/lib/rdlogmodel.h index 902a399e..f48ea159 100644 --- a/lib/rdlogmodel.h +++ b/lib/rdlogmodel.h @@ -27,7 +27,6 @@ #include #include -#include #include #include @@ -37,6 +36,7 @@ class RDLogModel : public QAbstractTableModel public: enum StartTimeStyle {Estimated=0,Scheduled=1}; RDLogModel(const QString &logname,bool read_only,QObject *parent=0); + RDLogModel(QObject *parent=0); ~RDLogModel(); QPalette palette(); void setPalette(const QPalette &pal); @@ -98,6 +98,7 @@ class RDLogModel : public QAbstractTableModel void InsertLines(QString values); void InsertLineValues(QString *query, int line); void LoadNowNext(unsigned from_line); + void MakeModel(); QPalette d_palette; QFont d_font; QFontMetrics *d_fms; diff --git a/lib/rdlogplay.cpp b/lib/rdlogplay.cpp index 0a5178b6..f9157746 100644 --- a/lib/rdlogplay.cpp +++ b/lib/rdlogplay.cpp @@ -41,7 +41,7 @@ //#define SHOW_METER_SLOTS RDLogPlay::RDLogPlay(int id,RDEventPlayer *player,QObject *parent) - : QObject(parent),RDLogEvent("") + : RDLogModel(parent) { // // Initialize Data Structures @@ -228,7 +228,7 @@ void RDLogPlay::setOpMode(RDAirPlayConf::OpMode mode) void RDLogPlay::setLogName(QString name) { if(logName()!=name) { - RDLogEvent::setLogName(name); + RDLogModel::setLogName(name); emit renamed(); rda->airplayConf()->setCurrentLog(play_id,name); } @@ -524,11 +524,11 @@ void RDLogPlay::load() // Remove All Idle Events // if((running=runningEvents(lines))==0) { - remove(0,size(),false); + remove(0,lineCount(),false); } else { - if(lines[running-1]<(size()-1)) { - remove(lines[running-1]+1,size()-lines[running-1]-1,false); + if(lines[running-1]<(lineCount()-1)) { + remove(lines[running-1]+1,lineCount()-lines[running-1]-1,false); } for(int i=running-1;i>0;i--) { remove(lines[i-1]+1,lines[i]-lines[i-1]-1,false); @@ -541,20 +541,20 @@ void RDLogPlay::load() // Note that events left in the log are holdovers from a previous log. // Their IDs may clash with those of events in the log we will now load, // and it may be appropriate to ignore them in that case. - for(int i = 0, ilim = size(); i != ilim; ++i) + for(int i = 0, ilim = lineCount(); i != ilim; ++i) logLine(i)->setHoldover(true); // // Load Events // - RDLogEvent::load(); + RDLogModel::load(); play_rescan_pos=0; if(play_timescaling_available) { - for(int i=0;isetTimescalingActive(logLine(i)->enforceLength()); } } - RefreshEvents(0,size()); + RefreshEvents(0,lineCount()); RDLog *log=new RDLog(logName()); play_svc_name=log->service(); delete log; @@ -565,7 +565,7 @@ void RDLogPlay::load() SetTransTimer(); emit transportChanged(); UpdatePostPoint(); - if((running>0)&&(size()>running)) { + if((running>0)&&(lineCount()>running)) { makeNext(running); } @@ -587,21 +587,20 @@ void RDLogPlay::load() void RDLogPlay::append(const QString &log_name) { - int old_size=size(); + int old_size=lineCount(); - if(size()==0) { - // setLogName(RDLog::tableName(log_name)); + if(lineCount()==0) { load(); return; } - RDLogEvent::append(log_name); + RDLogModel::append(log_name); if(play_timescaling_available) { - for(int i=old_size;isetTimescalingActive(logLine(i)->enforceLength()); } } - RefreshEvents(old_size,size()-old_size); + RefreshEvents(old_size,lineCount()-old_size); UpdateStartTimes(old_size); emit reloaded(); SetTransTimer(); @@ -628,7 +627,7 @@ bool RDLogPlay::refresh() return true; } emit refreshStatusChanged(true); - if((size()==0)||(play_log==NULL)) { + if((lineCount()==0)||(play_log==NULL)) { emit refreshStatusChanged(false); emit refreshabilityChanged(false); return true; @@ -637,7 +636,7 @@ bool RDLogPlay::refresh() // // Load the Updated Log // - RDLogEvent *e=new RDLogEvent(); + RDLogModel *e=new RDLogModel(); e->setLogName(logName()); e->load(); play_modified_datetime=play_log->modifiedDatetime(); @@ -665,7 +664,7 @@ bool RDLogPlay::refresh() // // Pass 1: Finished or Active Events // - for(int i=0;istatus()!=RDLogLine::Scheduled) { if((!d->isHoldover()) && (s=e->loglineById(d->id()))!=NULL) { @@ -683,7 +682,7 @@ bool RDLogPlay::refresh() // // Pass 2: Purge Deleted Events // - for(int i=size()-1;i>=0;i--) { + for(int i=lineCount()-1;i>=0;i--) { if(logLine(i)->pass()==0) { remove(i,1,false,true); } @@ -691,7 +690,7 @@ bool RDLogPlay::refresh() // Find first non-holdover event, where start-of-log // new events should be added: - for(int i=0;isize();i++) { + for(int i=0;ilineCount();i++) { if(logLine(i)!=NULL) { if(logLine(i)->isHoldover()) { ++first_non_holdover; @@ -705,7 +704,7 @@ bool RDLogPlay::refresh() // // Pass 3: Add New Events // - for(int i=0;isize();i++) { + for(int i=0;ilineCount();i++) { s=e->logLine(i); if(s->pass()==0) { if((prev_line=(i-1))<0) { // First Event @@ -724,7 +723,7 @@ bool RDLogPlay::refresh() // // Pass 4: Delete Orphaned Past Playouts // - for(int i=size()-1;i>=0;i--) { + for(int i=lineCount()-1;i>=0;i--) { d=logLine(i); if((d->status()==RDLogLine::Finished)&&(d->pass()!=2)) { remove(i,1,false,true); @@ -752,10 +751,10 @@ bool RDLogPlay::refresh() // Clean Up // delete e; - for(int i=0;iclearPass(); } - RefreshEvents(0,size()); + RefreshEvents(0,lineCount()); UpdateStartTimes(next_line); UpdatePostPoint(); SetTransTimer(); @@ -774,7 +773,7 @@ bool RDLogPlay::refresh() void RDLogPlay::save(int line) { - RDLogEvent::save(rda->config(),line); + RDLogModel::save(rda->config(),line); if(play_log!=NULL) { delete play_log; } @@ -821,7 +820,7 @@ void RDLogPlay::insert(int line,int cartnum,RDLogLine::TransType next_type, RDPlayDeck *playdeck; int mod_line=-1; - if(line<(size()-1)) { + if(line<(lineCount()-1)) { if(logLine(line)->hasCustomTransition()) { mod_line=line+1; } @@ -841,9 +840,9 @@ void RDLogPlay::insert(int line,int cartnum,RDLogLine::TransType next_type, if(play_macro_deck->line()>=0) { play_macro_deck->setLine(play_macro_deck->line()+1); } - RDLogEvent::insert(line,1); + RDLogModel::insert(line,1); if((logline=logLine(line))==NULL) { - RDLogEvent::remove(line,1); + RDLogModel::remove(line,1); return; } if(nextLine()>line) { @@ -874,7 +873,7 @@ void RDLogPlay::insert(int line,RDLogLine *l,bool update,bool preserv_custom_tra RDPlayDeck *playdeck; int mod_line=-1; - if(line<(size()-1)) { + if(line<(lineCount()-1)) { if(logLine(line)->hasCustomTransition()) { mod_line=line+1; } @@ -894,9 +893,9 @@ void RDLogPlay::insert(int line,RDLogLine *l,bool update,bool preserv_custom_tra if(play_macro_deck->line()>=0) { play_macro_deck->setLine(play_macro_deck->line()+1); } - RDLogEvent::insert(line,1,preserv_custom_transition); + RDLogModel::insert(line,1,preserv_custom_transition); if((logline=logLine(line))==NULL) { - RDLogEvent::remove(line,1); + RDLogModel::remove(line,1); return; } *logline=*l; @@ -922,16 +921,17 @@ void RDLogPlay::insert(int line,RDLogLine *l,bool update,bool preserv_custom_tra } -void RDLogPlay::remove(int line,int num_lines,bool update,bool preserv_custom_transition) +void RDLogPlay::remove(int line,int num_lines,bool update, + bool preserv_custom_transition) { RDPlayDeck *playdeck; RDLogLine *logline; int mod_line=-1; - if((num_lines==0)||(line<0)||(line>=size())) { + if((num_lines==0)||(line<0)||(line>=lineCount())) { return; } - if((line+num_lines)<(size()-1)) { + if((line+num_lines)<(lineCount()-1)) { if(logLine(line+num_lines)->hasCustomTransition()) { mod_line=line; } @@ -966,13 +966,13 @@ void RDLogPlay::remove(int line,int num_lines,bool update,bool preserv_custom_tr play_macro_deck->setLine(play_macro_deck->line()-num_lines); } - RDLogEvent::remove(line,num_lines,preserv_custom_transition); + RDLogModel::remove(line,num_lines,preserv_custom_transition); if(update) { if(nextLine()>line) { makeNext(nextLine()-num_lines); } UpdateStartTimes(line); - if(size()==0) { + if(lineCount()==0) { emit reloaded(); } if(mod_line>=0) { @@ -993,7 +993,7 @@ void RDLogPlay::move(int from_line,int to_line) RDPlayDeck *playdeck; int mod_line[2]={-1,-1}; - if(from_line<(size()-1)) { + if(from_line<(lineCount()-1)) { if(logLine(from_line+1)->hasCustomTransition()) { if(from_linehasCustomTransition()) { if(from_line>to_line) { mod_line[1]=to_line; @@ -1049,7 +1049,7 @@ void RDLogPlay::move(int from_line,int to_line) if(to_line>from_line) { offset=1; } - RDLogEvent::move(from_line,to_line); + RDLogModel::move(from_line,to_line); if(from_line>to_line) { UpdateStartTimes(to_line); } @@ -1091,7 +1091,7 @@ void RDLogPlay::copy(int from_line,int to_line,RDLogLine::TransType type) int RDLogPlay::topLine() { - for(int i=0;istatus()==RDLogLine::Playing)|| (logLine(i)->status()==RDLogLine::Finishing)|| (logLine(i)->status()==RDLogLine::Paused)) { @@ -1134,7 +1134,7 @@ int RDLogPlay::nextLine(int line) } // End of FIXME - for(int i=line+1;istatus()==RDLogLine::Scheduled) { return i; } @@ -1185,7 +1185,7 @@ void RDLogPlay::transportEvents(int line[]) for(int i=0;istatus()==RDLogLine::Playing)|| (logLine(i)->status()==RDLogLine::Finishing)|| (logLine(i)->status()==RDLogLine::Paused)) { @@ -1251,7 +1251,7 @@ int RDLogPlay::runningEvents(int *lines, bool include_paused) } } else { - for(int i=0;istatus()==RDLogLine::Playing)|| (logLine(i)->status()==RDLogLine::Finishing)) { events[count++]=i; @@ -1702,7 +1702,7 @@ void RDLogPlay::notificationReceivedData(RDNotification *notify) if(notify->type()==RDNotification::CartType) { unsigned cartnum=notify->id().toUInt(); - for(int i=0;icartNumber()==cartnum)&&(ll->status()==RDLogLine::Scheduled)&& ((ll->type()==RDLogLine::Cart)||(ll->type()==RDLogLine::Macro))) { @@ -2060,7 +2060,8 @@ bool RDLogPlay::StartEvent(int line,RDLogLine::TransType trans_type, default: break; } - while((play_next_linestate()==RDLogLine::Ok)|| (logline->state()==RDLogLine::NoCart)|| (logline->state()==RDLogLine::NoCut)) { @@ -2182,7 +2183,7 @@ void RDLogPlay::UpdateStartTimes(int line) else { line=play_next_line; } - for(int i=line;itransType(); @@ -2259,7 +2260,7 @@ void RDLogPlay::FinishEvent(int line) return; } if((play_op_mode==RDAirPlayConf::Auto)&& - (logline->id()!=-1)&&(play_next_lineid()!=-1)&&(play_next_line=0) { if(logline->transType()==RDLogLine::Play) { StartEvent(play_next_line,RDLogLine::Play,0,RDLogLine::StartPlay); @@ -2350,7 +2351,7 @@ QTime RDLogPlay::GetNextStop(int line) return QTime(); } - for(int i=line;itype()==RDLogLine::Cart)&& @@ -2417,7 +2418,8 @@ void RDLogPlay::UpdatePostPoint(int line) offset=0; } else { - if((line=0)&&(play_trans_line=0)&& + (play_trans_linestartTime(RDLogLine::Logged); offset=length(line,post_line)-QTime::currentTime().msecsTo(post_time)- @@ -2452,7 +2454,8 @@ void RDLogPlay::AdvanceActiveEvent() } } else { - if(line<(size()-1)) { + //if(line<(size()-1)) { + if(line<(lineCount())) { RDLogLine *logline; if((logline=logLine(line+1))!=NULL) { trans=logLine(line+1)->transType(); @@ -2502,7 +2505,7 @@ void RDLogPlay::SetTransTimer(QTime current_time,bool stop) } } play_trans_line=-1; - for(int i=0;itimeType()==RDLogLine::Hard)&& ((logline->status()==RDLogLine::Scheduled)|| @@ -2583,7 +2586,7 @@ bool RDLogPlay::GetNextPlayable(int *line,bool skip_meta,bool forced_start) RDLogLine::TransType next_type=RDLogLine::Play; int skipped=0; - for(int i=*line;istatus(); if((status!=RDLogLine::Scheduled)&&(status!=RDLogLine::Finished)) { remove(start_line,i-start_line); return true; } } - remove(start_line,size()-start_line); + remove(start_line,lineCount()-start_line); return false; } @@ -2924,12 +2927,12 @@ void RDLogPlay::SendNowNext() // Get NEXT Event // logline[1]=NULL; - for(int i=nextLine();istatus()==RDLogLine::Scheduled)&& logLine(i)->nowNextEnabled()&&(!logLine(i)->asyncronous())) { logline[1]=logLine(i); - i=size(); + i=lineCount(); } } } diff --git a/lib/rdlogplay.h b/lib/rdlogplay.h index e3d50f45..9b33bbdc 100644 --- a/lib/rdlogplay.h +++ b/lib/rdlogplay.h @@ -2,7 +2,7 @@ // // Rivendell Log Playout Machine // -// (C) Copyright 2002-2019 Fred Gleason +// (C) Copyright 2002-2020 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 @@ -23,17 +23,17 @@ #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include #include -#include +#include #include #include #include @@ -48,7 +48,7 @@ #define LOGPLAY_RESCAN_INTERVAL 5000 #define LOGPLAY_RESCAN_SIZE 30 -class RDLogPlay : public QObject,public RDLogEvent +class RDLogPlay : public RDLogModel { Q_OBJECT public: diff --git a/lib/rdrenderer.cpp b/lib/rdrenderer.cpp index 2043bd32..419aee11 100644 --- a/lib/rdrenderer.cpp +++ b/lib/rdrenderer.cpp @@ -91,8 +91,6 @@ void __RDRenderLogLine::setRamp(RDLogLine::TransType next_trans,int segue_gain) if((next_trans==RDLogLine::Segue)&&(segueStartPoint()>=0)) { ll_ramp_rate=((double)segue_gain)/ ((double)FramesFromMsec(segueEndPoint()-segueStartPoint())); - //ll_ramp_rate=((double)RD_FADE_DEPTH)/ - // ((double)FramesFromMsec(segueEndPoint()-segueStartPoint())); } } @@ -245,72 +243,6 @@ RDRenderer::~RDRenderer() } -bool RDRenderer::renderToFile(const QString &outfile,RDLogEvent *log, - RDSettings *s,const QTime &start_time, - bool ignore_stops,QString *err_msg, - int first_line,int last_line, - const QTime &first_time,const QTime &last_time) -{ - QString temp_output_filename; - char tempdir[PATH_MAX]; - bool ok=false; - FILE *f=NULL; - bool ret; - - // - // Verify Destination - // - if((f=fopen(outfile,"w"))==NULL) { - *err_msg=tr("unable to open output file")+" ["+QString(strerror(errno))+"]"; - return false; - } - fclose(f); - - if(((s->format()!=RDSettings::Pcm16)&&(s->format()!=RDSettings::Pcm24))|| - (s->normalizationLevel()!=0)) { - ProgressMessage("Pass 1 of 2"); - render_total_passes=2; - - // - // Get Temporary File - // - strncpy(tempdir,RDTempDirectory::basePath()+"/rdrenderXXXXXX",PATH_MAX); - temp_output_filename=QString(mkdtemp(tempdir))+"/log.wav"; - ProgressMessage(tr("Using temporary file")+" \""+temp_output_filename+"\"."); - - // - // Render It - // - if(!Render(temp_output_filename,log,s,start_time,ignore_stops,err_msg, - first_line,last_line,first_time,last_time)) { - return false; - } - - // - // Convert It - // - ProgressMessage(tr("Pass 2 of 2")); - ProgressMessage(tr("Writing output file")); - ok=ConvertAudio(temp_output_filename,outfile,s,err_msg); - DeleteTempFile(temp_output_filename); - emit lineStarted(log->size()+1,log->size()+1); - if(!ok) { - return false; - } - } - else { - ProgressMessage(tr("Pass 1 of 1")); - render_total_passes=1; - - ret=Render(outfile,log,s,start_time,ignore_stops,err_msg, - first_line,last_line,first_time,last_time); - emit lineStarted(log->size(),log->size()); - return ret; - } - return true; -} - - bool RDRenderer::renderToFile(const QString &outfile,RDLogModel *model, RDSettings *s,const QTime &start_time, bool ignore_stops,QString *err_msg, @@ -377,79 +309,6 @@ bool RDRenderer::renderToFile(const QString &outfile,RDLogModel *model, } -bool RDRenderer::renderToCart(unsigned cartnum,int cutnum,RDLogEvent *log, - RDSettings *s,const QTime &start_time, - bool ignore_stops,QString *err_msg, - int first_line,int last_line, - const QTime &first_time,const QTime &last_time) -{ - QString temp_output_filename; - char tempdir[PATH_MAX]; - bool ok=false; - - if(first_line<0) { - first_line=0; - } - if(last_line<0) { - last_line=log->size(); - } - - // - // Check that we won't overflow the 32 bit BWF structures - // when we go to import the rendered log back into the audio store - // - if((double)log->length(first_line,last_line-1)/1000.0>= - (1073741824.0/((double)s->channels()*(double)s->sampleRate()))) { - *err_msg=tr("Rendered log is too long!"); - return false; - } - - ProgressMessage(tr("Pass 1 of 2")); - render_total_passes=2; - - // - // Verify Destination - // - if(!RDCart::exists(cartnum)) { - *err_msg=tr("no such cart"); - return false; - } - if(!RDCut::exists(cartnum,cutnum)) { - *err_msg=tr("no such cut"); - return false; - } - - // - // Get Temporary File - // - strncpy(tempdir,RDTempDirectory::basePath()+"/rdrenderXXXXXX",PATH_MAX); - temp_output_filename=QString(mkdtemp(tempdir))+"/log.wav"; - ProgressMessage(tr("Using temporary file")+" \""+temp_output_filename+"\"."); - - // - // Render It - // - if(!Render(temp_output_filename,log,s,start_time,ignore_stops,err_msg, - first_line,last_line,first_time,last_time)) { - return false; - } - - // - // Convert It - // - ProgressMessage(tr("Pass 2 of 2")); - ProgressMessage(tr("Importing cart")); - ok=ImportCart(temp_output_filename,cartnum,cutnum,s->channels(),err_msg); - DeleteTempFile(temp_output_filename); - emit lineStarted(log->size()+1,log->size()+1); - if(!ok) { - return false; - } - - return true; -} - - bool RDRenderer::renderToCart(unsigned cartnum,int cutnum,RDLogModel *model, RDSettings *s,const QTime &start_time, bool ignore_stops,QString *err_msg, @@ -535,177 +394,6 @@ void RDRenderer::abort() } -bool RDRenderer::Render(const QString &outfile,RDLogEvent *log,RDSettings *s, - const QTime &start_time,bool ignore_stops, - QString *err_msg,int first_line,int last_line, - const QTime &first_time,const QTime &last_time) -{ - float *pcm=NULL; - QString temp_output_filename; - QTime current_time; - - render_warnings.clear(); - render_abort=false; - - if(start_time.isNull()) { - current_time=QTime::currentTime(); - } - else { - current_time=start_time; - } - - // - // Open Output File - // - SF_INFO sf_info; - SNDFILE *sf_out; - - memset(&sf_info,0,sizeof(sf_info)); - sf_info.samplerate=rda->system()->sampleRate(); - sf_info.channels=s->channels(); - if(s->format()==RDSettings::Pcm16) { - sf_info.format=SF_FORMAT_WAV|SF_FORMAT_PCM_16; - } - else { - sf_info.format=SF_FORMAT_WAV|SF_FORMAT_PCM_24; - } - sf_out=sf_open(outfile,SFM_WRITE,&sf_info); - if(sf_out==NULL) { - fprintf(stderr,"rdrender: unable to open output file [%s]\n", - sf_strerror(sf_out)); - return 1; - } - - // - // Initialize the log - // - std::vector<__RDRenderLogLine *> lls; - for(int i=0;isize();i++) { - lls.push_back(new __RDRenderLogLine(log->logLine(i),s->channels())); - if(ignore_stops&&(lls.back()->transType()==RDLogLine::Stop)) { - lls.back()->setTransType(RDLogLine::Play); - } - if((!first_time.isNull())&& - (lls.back()->timeType()==RDLogLine::Hard)&& - (first_line==-1)&& - (lls.back()->startTime(RDLogLine::Imported)==first_time)) { - first_line=i; - } - if((!last_time.isNull())&& - (lls.back()->timeType()==RDLogLine::Hard)&& - (last_line==-1)&& - (lls.back()->startTime(RDLogLine::Imported)==last_time)) { - last_line=i; - } - } - if((!first_time.isNull())&&(first_line==-1)) { - *err_msg+=tr("first-time event not found"); - } - if((!last_time.isNull())&&(last_line==-1)) { - if(!err_msg->isEmpty()) { - *err_msg+=", "; - } - *err_msg+=tr("last-time event not found"); - } - if(!err_msg->isEmpty()) { - return false; - } - lls.push_back(new __RDRenderLogLine(new RDLogLine(),s->channels())); - lls.back()->setTransType(RDLogLine::Play); - if((!first_time.isNull())&&(first_line==-1)) { - first_line=log->size(); - } - - // - // Iterate through it - // - for(unsigned i=0;isize()+render_total_passes-1, - log->size()+render_total_passes-1); - *err_msg+="Render aborted.\n"; - sf_close(sf_out); - return false; - } - emit lineStarted(i,log->size()+render_total_passes-1); - if(((first_line==-1)||(first_line<=(int)i))&& - ((last_line==-1)||(last_line>=(int)i))) { - if(lls.at(i)->transType()==RDLogLine::Stop) { - ProgressMessage(current_time,i,tr("STOP")+" ",lls.at(i)->summary()); - render_warnings. - push_back(tr("log render halted at line")+QString().sprintf(" %d ",i)+ - tr("due to STOP")); - break; - } - if(lls.at(i)->open(current_time)) { - ProgressMessage(current_time,i, - RDLogLine::transText(lls.at(i)->transType()), - QString().sprintf(" cart %06u [",lls.at(i)->cartNumber())+ - lls.at(i)->title()+"]"); - sf_count_t frames=0; - if((lls.at(i+1)->transType()==RDLogLine::Segue)&& - (lls.at(i)->segueStartPoint()>=0)) { - if(lls.at(i)->segueStartPoint()>lls.at(i)->startPoint()) { - frames=FramesFromMsec(lls.at(i)->segueStartPoint()- - lls.at(i)->startPoint()); - current_time= - current_time.addMSecs(lls.at(i)->segueStartPoint()- - lls.at(i)->startPoint()); - } - else { - frames=0; - } - } - else { - if(lls.at(i)->endPoint()>lls.at(i)->startPoint()) { - frames=FramesFromMsec(lls.at(i)->endPoint()- - lls.at(i)->startPoint()); - current_time=current_time.addMSecs(lls.at(i)->endPoint()- - lls.at(i)->startPoint()); - } - else { - frames=0; - } - } - pcm=new float[frames*s->channels()]; - memset(pcm,0,frames*s->channels()*sizeof(float)); - - for(unsigned j=0;jchannels()); - } - Sum(pcm,lls.at(i),frames,s->channels()); - sf_writef_float(sf_out,pcm,frames); - delete pcm; - pcm=NULL; - lls.at(i)->setRamp(lls.at(i+1)->transType(),lls.at(i)->segueGain()); - } - else { - if(i<(lls.size()-1)) { - if(lls.at(i)->type()==RDLogLine::Cart) { - ProgressMessage(current_time,i,tr("FAIL"),lls.at(i)->summary()+ - " ("+tr("NO AUDIO AVAILABLE")+")"); - render_warnings. - push_back(lls.at(i)->summary()+tr("at line")+ - QString().sprintf(" %d ",i)+ - tr("failed to play (NO AUDIO AVAILABLE)")); - } - else { - ProgressMessage(current_time,i,tr("SKIP"),lls.at(i)->summary()); - } - } - else { - ProgressMessage(current_time,lls.size()-1, - tr("STOP"),tr("--- end of log ---")); - } - } - } - } - sf_close(sf_out); - - return true; -} - - bool RDRenderer::Render(const QString &outfile,RDLogModel *model,RDSettings *s, const QTime &start_time,bool ignore_stops, QString *err_msg,int first_line,int last_line, diff --git a/lib/rdrenderer.h b/lib/rdrenderer.h index 8ba45065..0f78464d 100644 --- a/lib/rdrenderer.h +++ b/lib/rdrenderer.h @@ -2,7 +2,7 @@ // // Render a Rivendell log to a single audio object. // -// (C) Copyright 2017-2019 Fred Gleason +// (C) Copyright 2017-2020 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 @@ -28,7 +28,6 @@ #include #include -#include #include #include @@ -71,21 +70,11 @@ class RDRenderer : public QObject public: RDRenderer(QObject *parent=0); ~RDRenderer(); - bool renderToFile(const QString &outfile,RDLogEvent *log,RDSettings *s, - const QTime &start_time,bool ignore_stops, - QString *err_msg,int first_line,int last_line, - const QTime &first_time=QTime(), - const QTime &last_time=QTime()); bool renderToFile(const QString &outfile,RDLogModel *model,RDSettings *s, const QTime &start_time,bool ignore_stops, QString *err_msg,int first_line,int last_line, const QTime &first_time=QTime(), const QTime &last_time=QTime()); - bool renderToCart(unsigned cartnum,int cutnum,RDLogEvent *log,RDSettings *s, - const QTime &start_time,bool ignore_stops, - QString *err_msg,int first_line,int last_line, - const QTime &first_time=QTime(), - const QTime &last_time=QTime()); bool renderToCart(unsigned cartnum,int cutnum,RDLogModel *model,RDSettings *s, const QTime &start_time,bool ignore_stops, QString *err_msg,int first_line,int last_line, @@ -101,10 +90,6 @@ class RDRenderer : public QObject void lineStarted(int linno,int totallines); private: - bool Render(const QString &outfile,RDLogEvent *log,RDSettings *s, - const QTime &start_time,bool ignore_stops, - QString *err_msg,int first_line,int last_line, - const QTime &first_time,const QTime &last_time); bool Render(const QString &outfile,RDLogModel *model,RDSettings *s, const QTime &start_time,bool ignore_stops, QString *err_msg,int first_line,int last_line, diff --git a/lib/rdslotbox.h b/lib/rdslotbox.h index 7ba70a45..da461faa 100644 --- a/lib/rdslotbox.h +++ b/lib/rdslotbox.h @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include diff --git a/lib/rdsvc.cpp b/lib/rdsvc.cpp index c6aeb4ee..4edce7ae 100644 --- a/lib/rdsvc.cpp +++ b/lib/rdsvc.cpp @@ -28,6 +28,7 @@ #include "rd.h" #include "rdescape_string.h" #include "rdlog.h" +#include "rdlogmodel.h" #include "rdsvc.h" #include "rdweb.h" @@ -922,8 +923,8 @@ bool RDSvc::linkLog(RDSvc::ImportSource src,const QDate &date, RDSqlQuery *q; QString autofill_errors; QTime prev_start_time; - RDLogEvent *src_event=NULL; - RDLogEvent *dest_event=NULL; + RDLogModel *src_model=NULL; + RDLogModel *dst_model=NULL; RDLogLine *logline=NULL; *err_msg=""; @@ -989,27 +990,27 @@ bool RDSvc::linkLog(RDSvc::ImportSource src,const QDate &date, // // Iterate Through the Log // - src_event=new RDLogEvent(logname); - dest_event=new RDLogEvent(logname); - src_event->load(); - for(int i=0;isize();i++) { - logline=src_event->logLine(i); + src_model=new RDLogModel(logname,true,this); + dst_model=new RDLogModel(logname,true,this); + src_model->load(); + for(int i=0;ilineCount();i++) { + logline=src_model->logLine(i); if(logline->type()==src_type) { RDEventLine *e=new RDEventLine(svc_station); e->setName(logline->linkEventName()); e->load(); - e->linkLog(dest_event,log,svc_name,logline,track_str,label_cart, + e->linkLog(dst_model,log,svc_name,logline,track_str,label_cart, track_cart,&autofill_errors); delete e; emit generationProgress(1+(24*current_link++)/total_links); } else { - dest_event->insert(dest_event->size(),1,true); - *(dest_event->logLine(dest_event->size()-1))=*logline; - dest_event->logLine(dest_event->size()-1)->setId(dest_event->nextId()); + dst_model->insert(dst_model->lineCount(),1,true); + *(dst_model->logLine(dst_model->lineCount()-1))=*logline; + dst_model->logLine(dst_model->lineCount()-1)->setId(dst_model->nextId()); } } - dest_event->save(svc_config); + dst_model->save(svc_config); // // Update the Log Link Status @@ -1029,7 +1030,7 @@ bool RDSvc::linkLog(RDSvc::ImportSource src,const QDate &date, // QString cartname; QString missing_report; - dest_event->validate(&missing_report,date); + dst_model->validate(&missing_report,date); bool event=false; QString link_report=tr("The following events were not placed:\n"); sql=QString("select ")+ @@ -1108,8 +1109,8 @@ bool RDSvc::linkLog(RDSvc::ImportSource src,const QDate &date, // Clean Up // emit generationProgress(24); - delete src_event; - delete dest_event; + delete src_model; + delete dst_model; sql=QString("delete from IMPORTER_LINES where ")+ "STATION_NAME=\""+RDEscapeString(svc_station->name())+"\" && "+ @@ -1142,21 +1143,21 @@ bool RDSvc::clearLogLinks(RDSvc::ImportSource src,const QString &logname, break; } - RDLogEvent *src_event=new RDLogEvent(logname); - RDLogEvent *dest_event=new RDLogEvent(logname); - src_event->load(); + RDLogModel *src_model=new RDLogModel(logname,false,this); + RDLogModel *dst_model=new RDLogModel(logname,false,this); + src_model->load(); RDLogLine *logline=NULL; - for(int i=0;isize();i++) { - logline=src_event->logLine(i); + for(int i=0;ilineCount();i++) { + logline=src_model->logLine(i); if((logline->linkId()<0)||(logline->source()!=event_source)) { - dest_event->insert(dest_event->size(),1,true); - *(dest_event->logLine(dest_event->size()-1))=*logline; - dest_event->logLine(dest_event->size()-1)->setId(dest_event->nextId()); + dst_model->insert(dst_model->lineCount(),1,true); + *(dst_model->logLine(dst_model->lineCount()-1))=*logline; + dst_model->logLine(dst_model->lineCount()-1)->setId(dst_model->nextId()); } } - dest_event->save(svc_config); - delete src_event; - delete dest_event; + dst_model->save(svc_config); + delete src_model; + delete dst_model; RDLog *log=new RDLog(logname); if(src==RDSvc::Traffic) { @@ -1793,9 +1794,8 @@ QString RDSvc::MakeErrorLine(int indent,unsigned lineno,const QString &msg) bool RDSvc::ResolveInlineEvents(const QString &logname,QString *err_msg) - const { - RDLogEvent *evt=NULL; + RDLogModel *model=NULL; RDLogLine *logline=NULL; QTime start; QTime end; @@ -1805,11 +1805,11 @@ bool RDSvc::ResolveInlineEvents(const QString &logname,QString *err_msg) switch(subEventInheritance()) { case RDSvc::ParentEvent: - evt=new RDLogEvent(logname); - evt->load(); + model=new RDLogModel(logname,false,this); + model->load(); ok=true; - for(int i=0;isize();i++) { - logline=evt->logLine(i); + for(int i=0;ilineCount();i++) { + logline=model->logLine(i); if(logline->type()==RDLogLine::MusicLink) { start=logline->linkStartTime(); end=logline->linkStartTime().addSecs(logline->linkLength()); @@ -1847,8 +1847,8 @@ bool RDSvc::ResolveInlineEvents(const QString &logname,QString *err_msg) delete q; } } - delete evt; - evt=NULL; + delete model; + model=NULL; if(!ok) { return false; diff --git a/lib/rdsvc.h b/lib/rdsvc.h index 5d3b08a1..71fb9acc 100644 --- a/lib/rdsvc.h +++ b/lib/rdsvc.h @@ -2,7 +2,7 @@ // // Abstract a Rivendell Service // -// (C) Copyright 2002-2004,2016-2017 Fred Gleason +// (C) Copyright 2002-2020 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 @@ -121,7 +121,7 @@ class RDSvc : public QObject QString *label_cart,QString *track_cart); bool CheckId(std::vector *v,int value); QString MakeErrorLine(int indent,unsigned lineno,const QString &msg) const; - bool ResolveInlineEvents(const QString &logname,QString *err_msg) const; + bool ResolveInlineEvents(const QString &logname,QString *err_msg); QString svc_name; RDStation *svc_station; RDConfig *svc_config; diff --git a/rdairplay/button_log.cpp b/rdairplay/button_log.cpp index 84885afe..347068ba 100644 --- a/rdairplay/button_log.cpp +++ b/rdairplay/button_log.cpp @@ -299,7 +299,7 @@ void ButtonLog::startButton(int id) int line=log_line_box[id]->line(); RDLogLine *logline=log_log->logLine(line); if(line<0) { - line=log_log->size(); + line=log_log->lineCount(); } switch(log_start_button[id]->mode()) { case StartButton::Stop: @@ -345,7 +345,7 @@ void ButtonLog::pauseButtonHotkey(int id) { int line=log_line_box[id]->line(); if (line<0) { - line=log_log->size(); + line=log_log->lineCount(); } if (log_start_button[id]->mode() == StartButton::Play) { log_log->pause(line); @@ -356,7 +356,7 @@ void ButtonLog::stopButtonHotkey(int id) { int line=log_line_box[id]->line(); if (line<0) { - line=log_log->size(); + line=log_log->lineCount(); } log_log->stop(line); } diff --git a/rdairplay/list_log.cpp b/rdairplay/list_log.cpp index 3e9e290e..917b0574 100644 --- a/rdairplay/list_log.cpp +++ b/rdairplay/list_log.cpp @@ -904,10 +904,10 @@ void ListLog::logInsertedData(int line) { bool appended=false; - if(line>=list_log->size()) { - line=list_log->size()-1; + if(line>=list_log->lineCount()) { + line=list_log->lineCount()-1; } - if(line>=list_log->size()-1) { + if(line>=list_log->lineCount()-1) { appended=true; } int count; @@ -1008,7 +1008,7 @@ void ListLog::selectionChangedData() } if(item->text(15).toInt()>=0) { list_endtime_edit->setText(RDGetTimeLength(list_log-> - length(item->text(15).toInt(),list_log->size()),true,false)); + length(item->text(15).toInt(),list_log->lineCount()),true,false)); list_stoptime_label->setText(tr("Next Stop:")); int stoplen=list_log->lengthToStop(item->text(15).toInt()); if(stoplen>=0) { @@ -1071,8 +1071,8 @@ void ListLog::RefreshList() l=new RDListViewItem(list_log_list); l->setText(5,tr("--- end of log ---")); l->setText(15,QString().sprintf("%d",END_MARKER_ID)); - l->setText(14,QString().sprintf("%d",list_log->size())); - for(int i=list_log->size()-1;i>=0;i--) { + l->setText(14,QString().sprintf("%d",list_log->lineCount())); + for(int i=list_log->lineCount()-1;i>=0;i--) { if((logline=list_log->logLine(i))!=NULL) { l=new RDListViewItem(list_log_list); logline->setListViewItem(l); @@ -1460,7 +1460,7 @@ void ListLog::UpdateColor(int line,bool next) void ListLog::SetColor() { - for(int i=0;isize();i++) { + for(int i=0;ilineCount();i++) { UpdateColor(i); } } diff --git a/rdairplay/local_macros.cpp b/rdairplay/local_macros.cpp index 4eb6057f..a89c5199 100644 --- a/rdairplay/local_macros.cpp +++ b/rdairplay/local_macros.cpp @@ -132,7 +132,7 @@ void MainWidget::RunLocalMacros(RDMacro *rml) air_log[rml->arg(0).toInt()-1]->load(); } if(rml->argQuantity()==3) { // Start Log - if(rml->arg(2).toInt()arg(0).toInt()-1]->size()) { + if(rml->arg(2).toInt()arg(0).toInt()-1]->lineCount()) { if(rml->arg(2).toInt()>=0) { // Unconditional start air_log[rml->arg(0).toInt()-1]->play(rml->arg(2).toInt(), RDLogLine::StartMacro); @@ -140,11 +140,11 @@ void MainWidget::RunLocalMacros(RDMacro *rml) if(rml->arg(2).toInt()==-2) { // Start if trans type allows // Find first non-running event bool found=false; - for(int i=0;iarg(0).toInt()-1]->size();i++) { + for(int i=0;iarg(0).toInt()-1]->lineCount();i++) { if((logline=air_log[rml->arg(0).toInt()-1]->logLine(i))!=NULL) { if(logline->status()==RDLogLine::Scheduled) { found=true; - i=air_log[rml->arg(0).toInt()-1]->size(); + i=air_log[rml->arg(0).toInt()-1]->lineCount(); } } } @@ -212,7 +212,7 @@ void MainWidget::RunLocalMacros(RDMacro *rml) return; } if((rml->arg(1).toInt()<0)|| - (rml->arg(1).toInt()>=air_log[rml->arg(0).toInt()-1]->size())) { + (rml->arg(1).toInt()>=air_log[rml->arg(0).toInt()-1]->lineCount())) { if(rml->echoRequested()) { rml->acknowledge(false); rda->ripc()->sendRml(rml); @@ -339,7 +339,7 @@ void MainWidget::RunLocalMacros(RDMacro *rml) return; } if((rml->arg(1).toInt()<0)|| - (rml->arg(1).toInt()>=air_log[rml->arg(0).toInt()-1]->size())) { + (rml->arg(1).toInt()>=air_log[rml->arg(0).toInt()-1]->lineCount())) { if(rml->echoRequested()) { rml->acknowledge(false); rda->ripc()->sendRml(rml); @@ -842,10 +842,10 @@ void MainWidget::RunLocalMacros(RDMacro *rml) } else { air_log[mach-1]-> - insert(air_log[mach-1]->size(), + insert(air_log[mach-1]->lineCount(), rml->arg(1).toUInt(),RDLogLine::NoTrans,trans); air_log[mach-1]-> - makeNext(air_log[mach-1]->size()-1); + makeNext(air_log[mach-1]->lineCount()-1); } if(rml->echoRequested()) { rml->acknowledge(true); diff --git a/rdairplay/loglinebox.h b/rdairplay/loglinebox.h index 49638fcd..7e091bc7 100644 --- a/rdairplay/loglinebox.h +++ b/rdairplay/loglinebox.h @@ -28,7 +28,6 @@ #include #include #include -#include #include // diff --git a/rdairplay/rdairplay.cpp b/rdairplay/rdairplay.cpp index 5b655975..bcf5b3b4 100644 --- a/rdairplay/rdairplay.cpp +++ b/rdairplay/rdairplay.cpp @@ -1268,7 +1268,7 @@ void MainWidget::logReloadedData(int log) rml.setAddress(addr); rml.setEchoRequested(false); - if(air_start_line[log]size()) { + if(air_start_line[log]lineCount()) { rml.setCommand(RDMacro::MN); // Make Next rml.addArg(log+1); rml.addArg(air_start_line[log]); @@ -1443,11 +1443,11 @@ void MainWidget::selectClickedData(int id,int line,RDLogLine::Status status) case StartButton::AddTo: if(line<0) { air_log[id]-> - insert(air_log[id]->size(),air_add_cart,RDLogLine::Play, + insert(air_log[id]->lineCount(),air_add_cart,RDLogLine::Play, rda->airplayConf()->defaultTransType()); - air_log[id]->logLine(air_log[id]->size()-1)-> + air_log[id]->logLine(air_log[id]->lineCount()-1)-> setTransType(rda->airplayConf()->defaultTransType()); - air_log_list[id]->refresh(air_log[id]->size()-1); + air_log_list[id]->refresh(air_log[id]->lineCount()-1); } else { air_log[id]-> @@ -1483,8 +1483,8 @@ void MainWidget::selectClickedData(int id,int line,RDLogLine::Status status) case StartButton::MoveTo: if(air_source_id==id) { if(line<0) { - air_log[id]->move(air_copy_line,air_log[id]->size()); - air_log_list[id]->refresh(air_log[id]->size()-1); + air_log[id]->move(air_copy_line,air_log[id]->lineCount()); + air_log_list[id]->refresh(air_log[id]->lineCount()-1); } else { if(line>air_copy_line) { @@ -1498,8 +1498,8 @@ void MainWidget::selectClickedData(int id,int line,RDLogLine::Status status) air_log[air_source_id]->remove(air_copy_line,1); if(line<0) { air_log[id]-> - insert(air_log[id]->size(),air_add_cart,RDLogLine::Play); - air_log_list[id]->refresh(air_log[id]->size()-1); + insert(air_log[id]->lineCount(),air_add_cart,RDLogLine::Play); + air_log_list[id]->refresh(air_log[id]->lineCount()-1); } else { air_log[id]-> @@ -1525,7 +1525,7 @@ void MainWidget::selectClickedData(int id,int line,RDLogLine::Status status) case StartButton::CopyTo: if(air_source_id==id) { if(line<0) { - air_log[id]->copy(air_copy_line,air_log[id]->size(), + air_log[id]->copy(air_copy_line,air_log[id]->lineCount(), rda->airplayConf()->defaultTransType()); } else { @@ -1535,12 +1535,12 @@ void MainWidget::selectClickedData(int id,int line,RDLogLine::Status status) } else { if(line<0) { - air_log[id]->insert(air_log[id]->size(),air_add_cart, + air_log[id]->insert(air_log[id]->lineCount(),air_add_cart, rda->airplayConf()->defaultTransType(), rda->airplayConf()->defaultTransType()); - air_log[id]->logLine(air_log[id]->size()-1)-> + air_log[id]->logLine(air_log[id]->lineCount()-1)-> setTransType(rda->airplayConf()->defaultTransType()); - air_log_list[id]->refresh(air_log[id]->size()-1); + air_log_list[id]->refresh(air_log[id]->lineCount()-1); } else { air_log[id]-> @@ -1608,11 +1608,11 @@ void MainWidget::cartDroppedData(int id,int line,RDLogLine *ll) else { if(line<0) { air_log[id]-> - insert(air_log[id]->size(),ll->cartNumber(),RDLogLine::Play, + insert(air_log[id]->lineCount(),ll->cartNumber(),RDLogLine::Play, rda->airplayConf()->defaultTransType()); - air_log[id]->logLine(air_log[id]->size()-1)-> + air_log[id]->logLine(air_log[id]->lineCount()-1)-> setTransType(rda->airplayConf()->defaultTransType()); - air_log_list[id]->refresh(air_log[id]->size()-1); + air_log_list[id]->refresh(air_log[id]->lineCount()-1); } else { air_log[id]-> diff --git a/rdlogmanager/clock_listview.h b/rdlogmanager/clock_listview.h index 548562fb..1fcebcec 100644 --- a/rdlogmanager/clock_listview.h +++ b/rdlogmanager/clock_listview.h @@ -26,8 +26,7 @@ #include #include -#include -#include +#include class ClockListView : public RDListView { diff --git a/rdlogmanager/commandline_ops.cpp b/rdlogmanager/commandline_ops.cpp index a0940a62..4887d51f 100644 --- a/rdlogmanager/commandline_ops.cpp +++ b/rdlogmanager/commandline_ops.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include diff --git a/rdlogmanager/generate_log.cpp b/rdlogmanager/generate_log.cpp index 9b3a1c7c..d5502202 100644 --- a/rdlogmanager/generate_log.cpp +++ b/rdlogmanager/generate_log.cpp @@ -339,9 +339,9 @@ void GenerateLog::createData() // // Generate Exception Report // - RDLogEvent *event=new RDLogEvent(logname); - event->load(); - if((event->validate(&report,gen_date_edit->date())==0)&& + RDLogModel *model=new RDLogModel(logname,false,this); + model->load(); + if((model->validate(&report,gen_date_edit->date())==0)&& unused_report.isEmpty()) { QMessageBox::information(this,tr("No Errors"),\ tr("No broken rules or validation exceptions found.")); @@ -357,7 +357,7 @@ void GenerateLog::createData() RDTextFile(report+"\n"+unused_report); } - delete event; + delete model; UpdateControls(); } diff --git a/rdlogmanager/logobject.cpp b/rdlogmanager/logobject.cpp index 7b406439..876a1a89 100644 --- a/rdlogmanager/logobject.cpp +++ b/rdlogmanager/logobject.cpp @@ -109,13 +109,13 @@ void LogObject::userData() // // Generate Exception Report // - RDLogEvent *event=new RDLogEvent(logname); - event->load(); - if((event->validate(&report,start_date)!=0)|| + RDLogModel *model=new RDLogModel(logname,false,this); + model->load(); + if((model->validate(&report,start_date)!=0)|| (!unused_report.isEmpty())) { printf("%s\n\n%s",(const char*)report,(const char*)unused_report); } - delete event; + delete model; } // diff --git a/rdvairplayd/local_macros.cpp b/rdvairplayd/local_macros.cpp index 624a0820..1382ddf7 100644 --- a/rdvairplayd/local_macros.cpp +++ b/rdvairplayd/local_macros.cpp @@ -79,7 +79,7 @@ void MainObject::rmlReceivedData(RDMacro *rml) rml->arg(0).toInt()); } if(rml->argQuantity()==3) { // Start Log - if(rml->arg(2).toInt()size()) { + if(rml->arg(2).toInt()lineCount()) { if(rml->arg(2).toInt()>=0) { // Unconditional start if(air_logs[index]->play(rml->arg(2).toInt(),RDLogLine::StartMacro)) { rda->syslog(LOG_INFO,"started log machine %d at line %d", @@ -98,11 +98,11 @@ void MainObject::rmlReceivedData(RDMacro *rml) if(rml->arg(2).toInt()==-2) { // Start if trans type allows // Find first non-running event bool found=false; - for(int i=0;isize();i++) { + for(int i=0;ilineCount();i++) { if((logline=air_logs[index]->logLine(i))!=NULL) { if(logline->status()==RDLogLine::Scheduled) { found=true; - i=air_logs[index]->size(); + i=air_logs[index]->lineCount(); } } } @@ -183,7 +183,7 @@ void MainObject::rmlReceivedData(RDMacro *rml) return; } if((rml->arg(1).toInt()<0)|| - (rml->arg(1).toInt()>=air_logs[index]->size())) { + (rml->arg(1).toInt()>=air_logs[index]->lineCount())) { if(rml->echoRequested()) { rml->acknowledge(false); rda->ripc()->sendRml(rml); @@ -215,7 +215,7 @@ void MainObject::rmlReceivedData(RDMacro *rml) return; } if((rml->arg(1).toInt()<0)|| - (rml->arg(1).toInt()>=air_logs[index]->size())) { + (rml->arg(1).toInt()>=air_logs[index]->lineCount())) { if(rml->echoRequested()) { rml->acknowledge(false); rda->ripc()->sendRml(rml); @@ -493,11 +493,11 @@ void MainObject::rmlReceivedData(RDMacro *rml) rml->arg(1).toUInt(),next_line,rml->arg(0).toInt()); } else { - air_logs[index]->insert(air_logs[index]->size(), + air_logs[index]->insert(air_logs[index]->lineCount(), rml->arg(1).toUInt(),RDLogLine::Play); - air_logs[index]->makeNext(air_logs[index]->size()-1); + air_logs[index]->makeNext(air_logs[index]->lineCount()-1); rda->syslog(LOG_INFO,"inserted cart %06u at line %d on log machine %d", - rml->arg(1).toUInt(),air_logs[index]->size()-1, + rml->arg(1).toUInt(),air_logs[index]->lineCount()-1, rml->arg(0).toInt()); } if(rml->echoRequested()) { diff --git a/rdvairplayd/rdvairplayd.cpp b/rdvairplayd/rdvairplayd.cpp index c824b3ec..95ae41e9 100644 --- a/rdvairplayd/rdvairplayd.cpp +++ b/rdvairplayd/rdvairplayd.cpp @@ -276,7 +276,7 @@ void MainObject::logReloadedData(int log) rml.setAddress(addr); rml.setEchoRequested(false); - if(air_start_lines[log]size()) { + if(air_start_lines[log]lineCount()) { rml.setCommand(RDMacro::MN); // Make Next rml.addArg(mach+1); rml.addArg(air_start_lines[log]); diff --git a/utils/rdclilogedit/operations.cpp b/utils/rdclilogedit/operations.cpp index 9017f995..4929fe02 100644 --- a/utils/rdclilogedit/operations.cpp +++ b/utils/rdclilogedit/operations.cpp @@ -2,7 +2,7 @@ // // A command-line log editor for Rivendell // -// (C) Copyright 2016-2018 Fred Gleason +// (C) Copyright 2016-2020 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 @@ -27,62 +27,62 @@ void MainObject::Addcart(int line,unsigned cartnum) { - if(line>edit_log_event->size()) { - line=edit_log_event->size(); + if(line>edit_log_model->lineCount()) { + line=edit_log_model->lineCount(); } - edit_log_event->insert(line,1); - edit_log_event->logLine(line)-> + edit_log_model->insert(line,1); + edit_log_model->logLine(line)-> setTransType(rda->airplayConf()->defaultTransType()); - edit_log_event->logLine(line)->setFadeupGain(-3000); - edit_log_event->logLine(line)->setFadedownGain(-3000); - edit_log_event->logLine(line)->setCartNumber(cartnum); - edit_log_event->refresh(line); + edit_log_model->logLine(line)->setFadeupGain(-3000); + edit_log_model->logLine(line)->setFadedownGain(-3000); + edit_log_model->logLine(line)->setCartNumber(cartnum); + edit_log_model->refresh(line); edit_modified=true; } void MainObject::Addchain(int line,const QString &logname) { - if(line>edit_log_event->size()) { - line=edit_log_event->size(); + if(line>edit_log_model->lineCount()) { + line=edit_log_model->lineCount(); } - edit_log_event->insert(line,1); - edit_log_event->logLine(line)->setType(RDLogLine::Chain); - edit_log_event->logLine(line)-> + edit_log_model->insert(line,1); + edit_log_model->logLine(line)->setType(RDLogLine::Chain); + edit_log_model->logLine(line)-> setTransType(rda->airplayConf()->defaultTransType()); - edit_log_event->logLine(line)->setMarkerLabel(logname); - edit_log_event->refresh(line); + edit_log_model->logLine(line)->setMarkerLabel(logname); + edit_log_model->refresh(line); edit_modified=true; } void MainObject::Addmarker(int line) { - if(line>edit_log_event->size()) { - line=edit_log_event->size(); + if(line>edit_log_model->lineCount()) { + line=edit_log_model->lineCount(); } - edit_log_event->insert(line,1); - edit_log_event->logLine(line)->setType(RDLogLine::Marker); - edit_log_event->logLine(line)-> + edit_log_model->insert(line,1); + edit_log_model->logLine(line)->setType(RDLogLine::Marker); + edit_log_model->logLine(line)-> setTransType(rda->airplayConf()->defaultTransType()); - edit_log_event->logLine(line)->setMarkerLabel(tr("Label")); - edit_log_event->logLine(line)->setMarkerComment(tr("Marker Comment")); - edit_log_event->refresh(line); + edit_log_model->logLine(line)->setMarkerLabel(tr("Label")); + edit_log_model->logLine(line)->setMarkerComment(tr("Marker Comment")); + edit_log_model->refresh(line); edit_modified=true; } void MainObject::Addtrack(int line) { - if(line>edit_log_event->size()) { - line=edit_log_event->size(); + if(line>edit_log_model->lineCount()) { + line=edit_log_model->lineCount(); } - edit_log_event->insert(line,1); - edit_log_event->logLine(line)->setType(RDLogLine::Track); - edit_log_event->logLine(line)-> + edit_log_model->insert(line,1); + edit_log_model->logLine(line)->setType(RDLogLine::Track); + edit_log_model->logLine(line)-> setTransType(rda->airplayConf()->defaultTransType()); - edit_log_event->logLine(line)->setMarkerComment(tr("Voice Track")); - edit_log_event->refresh(line); + edit_log_model->logLine(line)->setMarkerComment(tr("Voice Track")); + edit_log_model->refresh(line); edit_modified=true; } @@ -171,10 +171,10 @@ void MainObject::Header() const void MainObject::List() { - for(int i=0;isize();i++) { - printf("%4d %s\n",i,(const char *)ListLine(edit_log_event,i)); + for(int i=0;ilineCount();i++) { + printf("%4d %s\n",i,(const char *)ListLine(edit_log_model,i)); } - printf("%4d --- end of log ---\n",edit_log_event->size()); + printf("%4d --- end of log ---\n",edit_log_model->lineCount()); } @@ -215,9 +215,9 @@ void MainObject::Load(QString logname) delete edit_log; edit_log=NULL; } - if(edit_log_event!=NULL) { - delete edit_log_event; - edit_log_event=NULL; + if(edit_log_model!=NULL) { + delete edit_log_model; + edit_log_model=NULL; } if(edit_log_lock!=NULL) { delete edit_log_lock; @@ -250,8 +250,8 @@ void MainObject::Load(QString logname) edit_log=new RDLog(logname); if(edit_log->exists()) { - edit_log_event=new RDLogEvent(logname); - edit_log_event->load(); + edit_log_model=new RDLogModel(logname,false,this); + edit_log_model->load(); edit_description=edit_log->description(); edit_service=edit_log->service(); edit_start_date=edit_log->startDate(); @@ -268,10 +268,10 @@ void MainObject::Load(QString logname) } -QString MainObject::ListLine(RDLogEvent *evt,int line) const +QString MainObject::ListLine(RDLogModel *model,int line) const { QString ret=""; - RDLogLine *logline=evt->logLine(line); + RDLogLine *logline=model->logLine(line); switch(logline->timeType()) { case RDLogLine::Hard: @@ -282,7 +282,7 @@ QString MainObject::ListLine(RDLogEvent *evt,int line) const case RDLogLine::Relative: ret+=QString(). - sprintf(" %s ",(const char *)evt->blockStartTime(line). + sprintf(" %s ",(const char *)model->blockStartTime(line). toString("hh:mm:ss")); break; @@ -354,15 +354,15 @@ void MainObject::New(const QString &logname) if(edit_log!=NULL) { delete edit_log; } - if(edit_log_event!=NULL) { - delete edit_log_event; + if(edit_log_model!=NULL) { + delete edit_log_model; } if(edit_log_lock!=NULL) { delete edit_log_lock; } edit_log=new RDLog(logname); if(!edit_log->exists()) { - edit_log_event=new RDLogEvent(logname); + edit_log_model=new RDLogModel(logname,false,this); edit_description=logname+" log"; sql=QString("select NAME from SERVICES"); q=new RDSqlQuery(sql); @@ -391,14 +391,14 @@ void MainObject::New(const QString &logname) void MainObject::Remove(int line) { - edit_log_event->remove(line,1); + edit_log_model->remove(line,1); edit_modified=true; } void MainObject::Save() { - edit_log_event->save(rda->config()); + edit_log_model->save(rda->config()); edit_log->setDescription(edit_description); edit_log->setStartDate(edit_start_date); edit_log->setEndDate(edit_end_date); @@ -434,8 +434,8 @@ void MainObject::Saveas(const QString &logname) "SERVICE=\""+RDEscapeString(edit_service)+"\""; q=new RDSqlQuery(sql); delete q; - edit_log_event->setLogName(logname); - edit_log_event->save(rda->config()); + edit_log_model->setLogName(logname); + edit_log_model->save(rda->config()); delete edit_log; edit_log=log; edit_modified=false; @@ -457,12 +457,12 @@ void MainObject::Setautorefresh(bool state) void MainObject::Setcart(int line,unsigned cartnum) { - RDLogLine *logline=edit_log_event->logLine(line); + RDLogLine *logline=edit_log_model->logLine(line); if(logline!=NULL) { if((logline->type()==RDLogLine::Cart)|| (logline->type()==RDLogLine::Macro)) { logline->setCartNumber(cartnum); - edit_log_event->refresh(line); + edit_log_model->refresh(line); edit_modified=true; } else { @@ -477,12 +477,12 @@ void MainObject::Setcart(int line,unsigned cartnum) void MainObject::Setcomment(int line,const QString &str) { - RDLogLine *logline=edit_log_event->logLine(line); + RDLogLine *logline=edit_log_model->logLine(line); if(logline!=NULL) { if((logline->type()==RDLogLine::Marker)|| (logline->type()==RDLogLine::Track)) { logline->setMarkerComment(str); - edit_log_event->refresh(line); + edit_log_model->refresh(line); edit_modified=true; } else { @@ -511,12 +511,12 @@ void MainObject::Setenddate(const QDate &date) void MainObject::Setlabel(int line,const QString &str) { - RDLogLine *logline=edit_log_event->logLine(line); + RDLogLine *logline=edit_log_model->logLine(line); if(logline!=NULL) { if((logline->type()==RDLogLine::Chain)|| (logline->type()==RDLogLine::Marker)) { logline->setMarkerLabel(str); - edit_log_event->refresh(line); + edit_log_model->refresh(line); edit_modified=true; } else { @@ -553,16 +553,16 @@ void MainObject::Setservice(const QString &str) void MainObject::Settime(int line,RDLogLine::TimeType type,const QTime &time) { - edit_log_event->logLine(line)->setTimeType(type); - edit_log_event->logLine(line)->setStartTime(RDLogLine::Logged,time); + edit_log_model->logLine(line)->setTimeType(type); + edit_log_model->logLine(line)->setStartTime(RDLogLine::Logged,time); edit_modified=true; } void MainObject::Settrans(int line,RDLogLine::TransType type) { - edit_log_event->logLine(line)->setTransType(type); - edit_log_event->refresh(line); + edit_log_model->logLine(line)->setTransType(type); + edit_log_model->refresh(line); edit_modified=true; } @@ -580,9 +580,9 @@ void MainObject::Unload() delete edit_log; edit_log=NULL; } - if(edit_log_event!=NULL) { - delete edit_log_event; - edit_log_event=NULL; + if(edit_log_model!=NULL) { + delete edit_log_model; + edit_log_model=NULL; } if(edit_log_lock!=NULL) { delete edit_log_lock; diff --git a/utils/rdclilogedit/parser.cpp b/utils/rdclilogedit/parser.cpp index edb2de34..cf1b53fa 100644 --- a/utils/rdclilogedit/parser.cpp +++ b/utils/rdclilogedit/parser.cpp @@ -2,7 +2,7 @@ // // A command-line log editor for Rivendell // -// (C) Copyright 2016-2018 Fred Gleason +// (C) Copyright 2016-2020 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 @@ -124,7 +124,7 @@ void MainObject::DispatchCommand(QString cmd) // // These need a log loaded // - if((processed)||(edit_log_event!=NULL)) { + if((processed)||(edit_log_model!=NULL)) { if(verb=="addcart") { if(rda->user()->addtoLog()) { if(cmds.size()==3) { @@ -229,7 +229,7 @@ void MainObject::DispatchCommand(QString cmd) if(rda->user()->removefromLog()) { if(cmds.size()==2) { line=cmds[1].toInt(&ok); - if(ok&&(line>=0)&&(linesize())) { + if(ok&&(line>=0)&&(linelineCount())) { Remove(line); } else { @@ -306,7 +306,7 @@ void MainObject::DispatchCommand(QString cmd) if(rda->user()->arrangeLog()) { if(cmds.size()==3) { line=cmds[1].toInt(&ok); - if(ok&&(line>=0)&&(linesize())) { + if(ok&&(line>=0)&&(linelineCount())) { unsigned cartnum=cmds[2].toUInt(&ok); if(ok&&(cartnum<=RD_MAX_CART_NUMBER)) { Setcart(line,cartnum); @@ -334,7 +334,7 @@ void MainObject::DispatchCommand(QString cmd) if(rda->user()->arrangeLog()) { if(cmds.size()>=3) { line=cmds[1].toInt(&ok); - if(ok&&(line>=0)&&(linesize())) { + if(ok&&(line>=0)&&(linelineCount())) { cmds.remove(cmds.begin()); cmds.remove(cmds.begin()); Setcomment(line,cmds.join(" ")); @@ -402,7 +402,7 @@ void MainObject::DispatchCommand(QString cmd) if(rda->user()->arrangeLog()) { if(cmds.size()==3) { line=cmds[1].toInt(&ok); - if(ok&&(line>=0)&&(linesize())) { + if(ok&&(line>=0)&&(linelineCount())) { Setlabel(line,cmds[2]); } else { @@ -494,7 +494,7 @@ void MainObject::DispatchCommand(QString cmd) if(rda->user()->arrangeLog()) { if(cmds.size()>=3) { line=cmds[1].toInt(&ok); - if(ok&&(line>=0)&&(linesize())) { + if(ok&&(line>=0)&&(linelineCount())) { RDLogLine::TimeType ttype=RDLogLine::NoTime; if(cmds[2].lower()=="hard") { ttype=RDLogLine::Hard; @@ -546,7 +546,7 @@ void MainObject::DispatchCommand(QString cmd) if(rda->user()->arrangeLog()) { if(cmds.size()==3) { line=cmds[1].toInt(&ok); - if(ok&&(line>=0)&&(linesize())) { + if(ok&&(line>=0)&&(linelineCount())) { RDLogLine::TransType trans=RDLogLine::NoTrans; if(cmds[2].lower()=="play") { trans=RDLogLine::Play; diff --git a/utils/rdclilogedit/rdclilogedit.cpp b/utils/rdclilogedit/rdclilogedit.cpp index 12e4cee2..6989eb75 100644 --- a/utils/rdclilogedit/rdclilogedit.cpp +++ b/utils/rdclilogedit/rdclilogedit.cpp @@ -2,7 +2,7 @@ // // A command-line log editor for Rivendell // -// (C) Copyright 2016-2018 Fred Gleason +// (C) Copyright 2016-2020 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 @@ -43,7 +43,7 @@ MainObject::MainObject(QObject *parent) edit_quiet_option=false; edit_log=NULL; - edit_log_event=NULL; + edit_log_model=NULL; edit_modified=false; edit_log_lock=NULL; diff --git a/utils/rdclilogedit/rdclilogedit.h b/utils/rdclilogedit/rdclilogedit.h index f2dfeaae..67805f83 100644 --- a/utils/rdclilogedit/rdclilogedit.h +++ b/utils/rdclilogedit/rdclilogedit.h @@ -2,7 +2,7 @@ // // A Command-line log editor for Rivendell // -// (C) Copyright 2016-2018 Fred Gleason +// (C) Copyright 2016-2020 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 @@ -26,7 +26,6 @@ #include #include #include -#include #include #include @@ -72,14 +71,14 @@ class MainObject : public QObject bool TryLock(RDLogLock *lock,const QString &logname); void OverwriteError(const QString &cmd) const; void DispatchCommand(QString cmd); - QString ListLine(RDLogEvent *evt,int line) const; + QString ListLine(RDLogModel *model,int line) const; void PrintPrompt() const; void SendNotification(RDNotification::Action action,const QString &logname); bool edit_quiet_option; QString edit_accum; bool edit_modified; RDLog *edit_log; - RDLogEvent *edit_log_event; + RDLogModel *edit_log_model; QString edit_description; QString edit_service; QDate edit_start_date; diff --git a/utils/rdrender/mainloop.cpp b/utils/rdrender/mainloop.cpp deleted file mode 100644 index 692321a0..00000000 --- a/utils/rdrender/mainloop.cpp +++ /dev/null @@ -1,266 +0,0 @@ -// mainloop.cpp -// -// Render a Rivendell log. -// -// (C) Copyright 2017 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 -#include - -#include - -#include -#include -#include -#include -#include -#include - -#include "rdrender.h" - -int MainObject::MainLoop() -{ - float *pcm=NULL; - QTime current_time=render_start_time; - QString warnings=""; - - // - // Open Log - // - RDLog *log=new RDLog(render_logname); - if(!log->exists()) { - fprintf(stderr,"rdrender: no such log\n"); - return 1; - } - RDLogEvent *log_event=new RDLogEvent(RDLog::tableName(render_logname)); - log_event->load(); - - // - // Open Output File - // - SF_INFO sf_info; - SNDFILE *sf_out; - FILE *f; - char tempdir[PATH_MAX]; - memset(&sf_info,0,sizeof(sf_info)); - sf_info.samplerate=render_system->sampleRate(); - sf_info.channels=render_channels; - if(render_settings.format()==RDSettings::Pcm16) { - sf_info.format=SF_FORMAT_WAV|SF_FORMAT_PCM_16; - } - else { - sf_info.format=SF_FORMAT_WAV|SF_FORMAT_PCM_24; - } - if(render_settings_modified||render_to_file.isEmpty()) { - // - // 2nd pass will be needed, so just create a placeholder for now - // and then output to a temp file - // - Verbose("Pass 1 of 2"); - if(!render_to_file.isEmpty()) { - if((f=fopen(render_to_file,"w"))==NULL) { - fprintf(stderr,"rdrender: unable to open output file [%s]\n", - strerror(errno)); - return 1; - } - fclose(f); - } - strncpy(tempdir,RDTempDir()+"/rdrenderXXXXXX",PATH_MAX); - render_temp_output_filename=QString(mkdtemp(tempdir))+"/log.wav"; - sf_out=sf_open(render_temp_output_filename,SFM_WRITE,&sf_info); - if(sf_out==NULL) { - fprintf(stderr,"rdrender: unable to open temporary file \"%s\" [%s]\n", - (const char *)render_temp_output_filename, - sf_strerror(sf_out)); - return 1; - } - Verbose("Using temporary file \""+render_temp_output_filename+"\"."); - } - else { - Verbose("Pass 1 of 1"); - sf_out=sf_open(render_to_file,SFM_WRITE,&sf_info); - if(sf_out==NULL) { - fprintf(stderr,"rdrender: unable to open output file [%s]\n", - sf_strerror(sf_out)); - return 1; - } - } - - // - // Initialize the log - // - std::vector lls; - for(int i=0;isize();i++) { - lls.push_back(new LogLine(log_event->logLine(i),render_user,render_station, - render_system,render_config,render_channels)); - if(render_ignore_stops&&(lls.back()->transType()==RDLogLine::Stop)) { - lls.back()->setTransType(RDLogLine::Play); - } - if((!render_first_time.isNull())&& - (lls.back()->timeType()==RDLogLine::Hard)&& - (render_first_line==-1)&& - (lls.back()->startTime(RDLogLine::Imported)==render_first_time)) { - render_first_line=i; - } - if((!render_last_time.isNull())&& - (lls.back()->timeType()==RDLogLine::Hard)&& - (render_last_line==-1)&& - (lls.back()->startTime(RDLogLine::Imported)==render_last_time)) { - render_last_line=i; - } - } - QString time_errs=""; - if((!render_first_time.isNull())&&(render_first_line==-1)) { - time_errs+="--first-time event not found"; - } - if((!render_last_time.isNull())&&(render_last_line==-1)) { - if(!time_errs.isEmpty()) { - time_errs+=", "; - } - time_errs+="--last-time event not found"; - } - if(!time_errs.isEmpty()) { - fprintf(stderr,"rdrender: %s\n",(const char *)time_errs); - return 1; - } - lls.push_back(new LogLine(new RDLogLine(),render_user,render_station, - render_system,render_config,render_channels)); - lls.back()->setTransType(RDLogLine::Play); - if((!render_first_time.isNull())&&(render_first_line==-1)) { - render_first_line=log_event->size(); - } - - // - // Iterate through it - // - for(unsigned i=0;i(int)i))) { - if(lls.at(i)->transType()==RDLogLine::Stop) { - Verbose(current_time,i,"STOP ",lls.at(i)->summary()); - warnings+= - QString().sprintf("log render halted at line %d due to STOP\n",i); - break; - } - if(lls.at(i)->open(current_time)) { - Verbose(current_time,i,RDLogLine::transText(lls.at(i)->transType()), - QString().sprintf(" cart %06u [",lls.at(i)->cartNumber())+ - lls.at(i)->title()+"]"); - sf_count_t frames=0; - if((lls.at(i+1)->transType()==RDLogLine::Segue)&& - (lls.at(i)->cut()->segueStartPoint()>=0)) { - frames=FramesFromMsec(lls.at(i)->cut()->segueStartPoint()- - lls.at(i)->cut()->startPoint()); - current_time=current_time.addMSecs(lls.at(i)->cut()->segueStartPoint()- - lls.at(i)->cut()->startPoint()); - } - else { - frames=FramesFromMsec(lls.at(i)->cut()->endPoint()- - lls.at(i)->cut()->startPoint()); - current_time=current_time.addMSecs(lls.at(i)->cut()->endPoint()- - lls.at(i)->cut()->startPoint()); - } - pcm=new float[frames*render_channels]; - memset(pcm,0,frames*render_channels); - - for(unsigned j=0;jsetRamp(lls.at(i+1)->transType()); - } - else { - if(i<(lls.size()-1)) { - if(lls.at(i)->type()==RDLogLine::Cart) { - Verbose(current_time,i,"FAIL",lls.at(i)->summary()+ - " (NO AUDIO AVAILABLE)"); - warnings+= - lls.at(i)->summary()+QString(). - sprintf("at line %d failed to play (NO AUDIO AVAILABLE)\n",i); - } - else { - Verbose(current_time,i,"SKIP",lls.at(i)->summary()); - } - } - else { - Verbose(current_time,lls.size()-1,"STOP","--- end of log ---"); - } - } - } - } - sf_close(sf_out); - - // - // Process 2nd Pass - // - if(render_settings_modified||render_to_file.isEmpty()) { - QString err_msg; - bool ok=false; - Verbose("Pass 2 of 2"); - if(!render_to_file.isEmpty()) { - Verbose("Writing output file"); - ok=ConvertAudio(render_temp_output_filename,render_to_file, - &render_settings,&err_msg); - DeleteCutFile(render_temp_output_filename); - if(!ok) { - fprintf(stderr,"rdrender: unable to convert output [%s]\n", - (const char *)err_msg); - return 1; - } - } - else { - Verbose("Importing cart"); - ok=ImportCart(render_temp_output_filename,render_cart_number, - render_cut_number,&err_msg); - DeleteCutFile(render_temp_output_filename); - if(!ok) { - fprintf(stderr,"rdrender: unable to import to cart [%s]\n", - (const char *)err_msg); - return 1; - } - } - } - fprintf(stderr,"%s",(const char *)warnings); - fflush(stderr); - return 0; -} - - -void MainObject::Sum(float *pcm_out,LogLine *ll,sf_count_t frames) -{ - if(ll->handle()!=NULL) { - float *pcm=new float[frames*render_channels]; - - memset(pcm,0,frames*render_channels); - sf_count_t n=sf_readf_float(ll->handle(),pcm,frames); - for(sf_count_t i=0;irampRate()+ll->rampLevel())/2000.0); - for(sf_count_t j=0;jsetRampLevel((double)n*ll->rampRate()+ll->rampLevel()); - if(nclose(); - } - delete pcm; - } -} diff --git a/utils/rdrender/rdrender.cpp b/utils/rdrender/rdrender.cpp index b7203763..e59ba880 100644 --- a/utils/rdrender/rdrender.cpp +++ b/utils/rdrender/rdrender.cpp @@ -2,7 +2,7 @@ // // Render a Rivendell log. // -// (C) Copyright 2017-2018 Fred Gleason +// (C) Copyright 2017-2020 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 @@ -289,8 +289,8 @@ void MainObject::userData() fprintf(stderr,"rdrender: no such log\n"); exit(1); } - RDLogEvent *log_event=new RDLogEvent(render_logname); - log_event->load(); + RDLogModel *log_model=new RDLogModel(render_logname,false,this); + log_model->load(); // // Render It @@ -300,7 +300,7 @@ void MainObject::userData() connect(r,SIGNAL(progressMessageSent(const QString &)), this,SLOT(printProgressMessage(const QString &))); if(render_to_file.isEmpty()) { - if(!r->renderToCart(render_cart_number,render_cut_number,log_event, + if(!r->renderToCart(render_cart_number,render_cut_number,log_model, &render_settings,render_start_time, render_ignore_stops,&err_msg,render_first_line, render_last_line,render_first_time,render_last_time)) { @@ -309,7 +309,7 @@ void MainObject::userData() } } else { - if(!r->renderToFile(render_to_file,log_event,&render_settings, + if(!r->renderToFile(render_to_file,log_model,&render_settings, render_start_time,render_ignore_stops, &err_msg,render_first_line,render_last_line, render_first_time,render_last_time)) { diff --git a/web/rdxport/logs.cpp b/web/rdxport/logs.cpp index 52f590d2..6588958d 100644 --- a/web/rdxport/logs.cpp +++ b/web/rdxport/logs.cpp @@ -2,7 +2,7 @@ // // Rivendell web service portal -- Log services // -// (C) Copyright 2013-2019 Fred Gleason +// (C) Copyright 2013-2020 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 @@ -30,9 +30,9 @@ #include #include #include -#include #include #include +#include #include #include @@ -224,8 +224,8 @@ void Xport::ListLog() // // Generate Log Listing // - RDLogEvent *log_event=log->createLogEvent(); - log_event->load(true); + RDLogModel *log_model=log->createLogEvent(); + log_model->load(true); // // Process Request @@ -233,7 +233,7 @@ void Xport::ListLog() printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); printf("\n"); - printf("%s\n",(const char *)log_event->xml().utf8()); + printf("%s\n",(const char *)log_model->xml().utf8()); Exit(0); } @@ -291,10 +291,10 @@ void Xport::SaveLog() // // Logline Data // - RDLogEvent *logevt=new RDLogEvent(log_name); + RDLogModel *logmodel=new RDLogModel(log_name,false,this); for(int i=0;iinsert(i,1); - RDLogLine *ll=logevt->logLine(i); + logmodel->insert(i,1); + RDLogLine *ll=logmodel->logLine(i); QString line=QString().sprintf("LINE%d",i); QString str; int integer1; @@ -514,7 +514,7 @@ void Xport::SaveLog() log->setStartDate(start_date); log->setEndDate(end_date); log->setModifiedDatetime(QDateTime::currentDateTime()); - logevt->save(rda->config()); + logmodel->save(rda->config()); SendNotification(RDNotification::LogType,RDNotification::ModifyAction, QVariant(log->name())); RDLogLock::clearLock(lock_guid); @@ -532,7 +532,7 @@ void Xport::SaveLog() log->setStartDate(start_date); log->setEndDate(end_date); log->setModifiedDatetime(QDateTime::currentDateTime()); - logevt->save(rda->config()); + logmodel->save(rda->config()); SendNotification(RDNotification::LogType,RDNotification::ModifyAction, QVariant(log->name())); } @@ -540,7 +540,7 @@ void Xport::SaveLog() XmlExit("invalid log lock",400); } } - XmlExit(QString().sprintf("OK Saved %d events",logevt->size()), + XmlExit(QString().sprintf("OK Saved %d events",logmodel->lineCount()), 200,"logs.cpp",LINE_NUMBER); }