2017-09-19 Fred Gleason <fredg@paravelsystems.com>

* Added support for cart/cut rendering to the 'Render Log' dialog
	in rdlogedit(1).
	* Added a length check when rendering to cart/cut in
	'lib/rdrenderer.cpp'.
This commit is contained in:
Fred Gleason 2017-09-19 11:06:56 -04:00
parent 288eddca4c
commit 78fa7dbe17
13 changed files with 161 additions and 36 deletions

View File

@ -16027,3 +16027,8 @@
to be midnight.
2017-09-19 Fred Gleason <fredg@paravelsystems.com>
* Added a 'Render Log' dialog to rdlogedit(1).
2017-09-19 Fred Gleason <fredg@paravelsystems.com>
* Added support for cart/cut rendering to the 'Render Log' dialog
in rdlogedit(1).
* Added a length check when rendering to cart/cut in
'lib/rdrenderer.cpp'.

View File

@ -2230,6 +2230,10 @@ Zkuste to, prosím, znovu!</translation>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDReport</name>

View File

@ -2221,6 +2221,10 @@ bitte erneut versuchen!</translation>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDReport</name>

View File

@ -2223,6 +2223,10 @@ please try again!</source>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDReport</name>

View File

@ -1882,6 +1882,10 @@ please try again!</source>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDSoundPanel</name>

View File

@ -2171,6 +2171,10 @@ prøv ein gong til!</translation>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDReport</name>

View File

@ -2171,6 +2171,10 @@ prøv ein gong til!</translation>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDReport</name>

View File

@ -2170,6 +2170,10 @@ por favor, tente novamente!</translation>
<source>failed to play (NO AUDIO AVAILABLE)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rendered log is too long!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RDReport</name>

View File

@ -239,6 +239,7 @@ RDRenderer::RDRenderer(RDUser *user,RDStation *station,RDSystem *system,
render_station=station;
render_system=system;
render_config=config;
render_total_passes=0;
}
@ -257,6 +258,7 @@ bool RDRenderer::renderToFile(const QString &outfile,RDLogEvent *log,
char tempdir[PATH_MAX];
bool ok=false;
FILE *f=NULL;
bool ret;
//
// Verify Destination
@ -270,6 +272,8 @@ bool RDRenderer::renderToFile(const QString &outfile,RDLogEvent *log,
if(((s->format()!=RDSettings::Pcm16)&&(s->format()!=RDSettings::Pcm24))||
(s->normalizationLevel()!=0)) {
ProgressMessage("Pass 1 of 2");
render_total_passes=2;
//
// Get Temporary File
//
@ -292,14 +296,19 @@ bool RDRenderer::renderToFile(const QString &outfile,RDLogEvent *log,
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"));
return Render(outfile,log,chans,s,start_time,ignore_stops,err_msg,
first_line,last_line,first_time,last_time);
render_total_passes=1;
ret=Render(outfile,log,chans,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;
}
@ -315,7 +324,26 @@ bool RDRenderer::renderToCart(unsigned cartnum,int cutnum,RDLogEvent *log,
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
//
@ -350,6 +378,7 @@ bool RDRenderer::renderToCart(unsigned cartnum,int cutnum,RDLogEvent *log,
ProgressMessage(tr("Importing cart"));
ok=ImportCart(temp_output_filename,cartnum,cutnum,err_msg);
DeleteTempFile(temp_output_filename);
emit lineStarted(log->size()+1,log->size()+1);
if(!ok) {
return false;
}
@ -453,12 +482,13 @@ bool RDRenderer::Render(const QString &outfile,RDLogEvent *log,unsigned chans,
//
for(unsigned i=0;i<lls.size();i++) {
if(render_abort) {
emit lineStarted(lls.size());
emit lineStarted(log->size()+render_total_passes-1,
log->size()+render_total_passes-1);
*err_msg+="Render aborted.\n";
sf_close(sf_out);
return false;
}
emit lineStarted(i);
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) {

View File

@ -97,7 +97,7 @@ class RDRenderer : public QObject
signals:
void progressMessageSent(const QString &msg);
void lineStarted(int linno);
void lineStarted(int linno,int totallines);
private:
bool Render(const QString &outfile,RDLogEvent *log,unsigned chans,
@ -121,6 +121,7 @@ class RDRenderer : public QObject
RDConfig *render_config;
QStringList render_warnings;
bool render_abort;
int render_total_passes;
};

View File

@ -466,11 +466,11 @@ EditLog::EditLog(QString logname,QString *filter,QString *group,
connect(edit_saveas_button,SIGNAL(clicked()),this,SLOT(saveasData()));
//
// Render As Button
// Render Button
//
edit_renderas_button=new QPushButton(this);
edit_renderas_button->setFont(button_font);
edit_renderas_button->setText(tr("Render")+"\n"+tr("As"));
edit_renderas_button->setText(tr("Render"));
connect(edit_renderas_button,SIGNAL(clicked()),this,SLOT(renderasData()));
//

View File

@ -80,13 +80,25 @@ RenderDialog::RenderDialog(RDStation *station,RDSystem *system,RDConfig *config,
render_settings->setQuality(3);
render_settings->setNormalizationLevel(0);
//
// Render To Type
//
render_to_box=new QComboBox(this);
render_to_box->insertItem(tr("Cart/Cut"));
render_to_box->insertItem(tr("File"));
connect(render_to_box,SIGNAL(activated(int)),this,SLOT(toChangedData(int)));
render_to_label=new QLabel(tr("Render To")+":",this);
render_to_label->setFont(button_font);
render_to_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Filename
//
render_filename_edit=new QLineEdit(this);
render_filename_edit->setReadOnly(true);
connect(render_filename_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(filenameChangedData(const QString &)));
render_filename_label=new QLabel(tr("Render To File")+":",this);
render_filename_label=new QLabel(tr("Cart/Cut")+":",this);
render_filename_label->setFont(button_font);
render_filename_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
render_filename_button=new QPushButton(tr("Select"),this);
@ -168,7 +180,7 @@ RenderDialog::~RenderDialog()
QSize RenderDialog::sizeHint() const
{
return QSize(500,200);
return QSize(500,230);
}
@ -186,6 +198,23 @@ int RenderDialog::exec(RDUser *user,RDLogEvent *log,
}
void RenderDialog::toChangedData(int item)
{
if(item) {
render_filename_label->setText(tr("Filename")+":");
render_filename_edit->setReadOnly(false);
}
else {
render_filename_label->setText(tr("Cart/Cut")+":");
render_filename_edit->setReadOnly(true);
}
render_filename_edit->clear();
render_to_cartnum=0;
render_to_cutnum=-1;
render_render_button->setDisabled(true);
}
void RenderDialog::filenameChangedData(const QString &str)
{
render_render_button->setDisabled(str.isEmpty());
@ -194,13 +223,27 @@ void RenderDialog::filenameChangedData(const QString &str)
void RenderDialog::selectData()
{
QString filename=
QFileDialog::getSaveFileName(render_save_path,RD_AUDIO_FILE_FILTER,this,"",
"RDLogEdit - "+tr("Render Log"));
if(!filename.isEmpty()) {
render_filename_edit->setText(filename);
filenameChangedData(filename);
render_save_path=RDGetPathPart(filename);
if(render_to_box->currentItem()) {
QString filename=
QFileDialog::getSaveFileName(render_save_path,RD_AUDIO_FILE_FILTER,
this,"","RDLogEdit - "+tr("Render Log"));
if(!filename.isEmpty()) {
render_filename_edit->setText(filename);
filenameChangedData(filename);
render_save_path=RDGetPathPart(filename);
}
}
else {
QString cutname;
RDCutDialog *d=new RDCutDialog(&cutname,render_station,render_system,
NULL,NULL,NULL,"",false,true,true,this);
if(d->exec()==0) {
render_to_cartnum=RDCut::cartNumber(cutname);
render_to_cutnum=RDCut::cutNumber(cutname);
render_filename_edit->setText(QString().sprintf("%06u:%03d",
render_to_cartnum,render_to_cutnum));
}
delete d;
}
}
@ -225,6 +268,7 @@ void RenderDialog::audiosettingsData()
void RenderDialog::renderData()
{
QString err_msg;
bool result;
int first_line=0;
int last_line=render_log->size();
@ -238,20 +282,28 @@ void RenderDialog::renderData()
}
RDRenderer *r=
new RDRenderer(render_user,render_station,render_system,render_config,this);
connect(r,SIGNAL(lineStarted(int)),
render_progress_dialog,SLOT(setProgress(int)));
connect(r,SIGNAL(lineStarted(int,int)),
render_progress_dialog,SLOT(setProgress(int,int)));
connect(render_progress_dialog,SIGNAL(cancelled()),r,SLOT(abort()));
render_progress_dialog->setTotalSteps(render_log->size());
if(!r->renderToFile(render_filename_edit->text(),render_log,2,render_settings,
if(render_to_box->currentItem()) {
result=
r->renderToFile(render_filename_edit->text(),render_log,2,render_settings,
start_time,render_ignorestop_box->currentItem(),
&err_msg,first_line,last_line)) {
&err_msg,first_line,last_line);
}
else {
result=
r->renderToCart(render_to_cartnum,render_to_cutnum,render_log,2,
render_settings,start_time,
render_ignorestop_box->currentItem(),
&err_msg,first_line,last_line);
}
if(!result) {
QMessageBox::warning(this,"RDLogEdit - "+tr("Rendering Error"),
err_msg);
render_progress_dialog->setProgress(render_log->size());
delete r;
return;
}
render_progress_dialog->setProgress(render_log->size());
delete r;
done(true);
@ -272,23 +324,26 @@ void RenderDialog::closeEvent(QCloseEvent *e)
void RenderDialog::resizeEvent(QResizeEvent *e)
{
render_filename_label->setGeometry(10,10,95,20);
render_filename_edit->setGeometry(110,10,size().width()-190,20);
render_filename_button->setGeometry(size().width()-70,8,60,25);
render_to_label->setGeometry(10,10,65,20);
render_to_box->setGeometry(80,10,100,20);
render_audiosettings_label->setGeometry(10,40,135,20);
render_audiosettings_edit->setGeometry(150,40,size().width()-230,20);
render_audiosettings_button->setGeometry(size().width()-70,38,60,25);
render_filename_label->setGeometry(10,40,95,20);
render_filename_edit->setGeometry(110,40,size().width()-190,20);
render_filename_button->setGeometry(size().width()-70,38,60,25);
render_starttime_label->setGeometry(10,62,135,20);
render_starttime_box->setGeometry(150,62,160,20);
render_starttime_edit->setGeometry(315,62,80,20);
render_audiosettings_label->setGeometry(10,70,135,20);
render_audiosettings_edit->setGeometry(150,70,size().width()-230,20);
render_audiosettings_button->setGeometry(size().width()-70,68,60,25);
render_events_label->setGeometry(10,84,135,20);
render_events_box->setGeometry(150,84,160,20);
render_starttime_label->setGeometry(10,95,135,20);
render_starttime_box->setGeometry(150,95,160,20);
render_starttime_edit->setGeometry(315,95,80,20);
render_ignorestop_label->setGeometry(10,106,135,20);
render_ignorestop_box->setGeometry(150,106,160,20);
render_events_label->setGeometry(10,117,135,20);
render_events_box->setGeometry(150,117,160,20);
render_ignorestop_label->setGeometry(10,139,135,20);
render_ignorestop_box->setGeometry(150,139,160,20);
render_render_button->
setGeometry(size().width()-180,size().height()-60,80,50);

View File

@ -31,6 +31,7 @@
#include <rdbusybar.h>
#include <rdconfig.h>
#include <rdcut_dialog.h>
#include <rdsettings.h>
#include <rdlog_event.h>
#include <rdsystem.h>
@ -56,6 +57,7 @@ class RenderDialog : public QDialog
int exec(RDUser *user,RDLogEvent *log,int first_line,int last_line);
private slots:
void toChangedData(int item);
void filenameChangedData(const QString &str);
void selectData();
void starttimeSourceData(int item);
@ -77,6 +79,8 @@ class RenderDialog : public QDialog
int render_last_line;
RDSettings *render_settings;
QProgressDialog *render_progress_dialog;
QLabel *render_to_label;
QComboBox *render_to_box;
QLabel *render_filename_label;
QLineEdit *render_filename_edit;
QLabel *render_starttime_label;
@ -93,6 +97,8 @@ class RenderDialog : public QDialog
QPushButton *render_render_button;
QPushButton *render_cancel_button;
QString render_save_path;
unsigned render_to_cartnum;
int render_to_cutnum;
};