2025-08-20 Fred Gleason <fredg@paravelsystems.com>

* Fixed a bug in 'RDCut::setMetadata()' where processing an
	'RDWaveData' structure containing segue data but no endpoint data
	could result with a record where the value of
	'CUTS.SEGUE_END_POINT' was greater than that of 'CUTS.END_POINT'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason
2025-08-20 18:53:49 -04:00
parent abfb782a91
commit cc4a25de31
5 changed files with 38 additions and 11 deletions

View File

@@ -25028,3 +25028,8 @@
2025-07-05 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in rdadmin(1) that thew a SQL error when creating
a new Host record.
2025-08-20 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in 'RDCut::setMetadata()' where processing an
'RDWaveData' structure containing segue data but no endpoint data
could result with a record where the value of
'CUTS.SEGUE_END_POINT' was greater than that of 'CUTS.END_POINT'.

View File

@@ -919,6 +919,9 @@ void RDCart::setMacros(const QString &cmds) const
void RDCart::getMetadata(RDWaveData *data) const
{
//
// Load an RDWaveData instance with data from a DB CART record
//
QString sql;
RDSqlQuery *q;
@@ -964,6 +967,9 @@ void RDCart::getMetadata(RDWaveData *data) const
void RDCart::setMetadata(const RDWaveData *data)
{
//
// Load a DB CART record with data from an RDWaveData instance
//
QString sql="update `CART` set ";
if(!data->title().isEmpty()) {
sql+=QString("`TITLE`='")+RDEscapeString(data->title().left(191))+"',";

View File

@@ -138,8 +138,8 @@ class RDCart
QString macros() const;
void setMacros(const QString &cmds) const;
bool validateLengths(int len) const;
void getMetadata(RDWaveData *data) const;
void setMetadata(const RDWaveData *data);
void getMetadata(RDWaveData *data) const; // DB=>FILE
void setMetadata(const RDWaveData *data); // FILE=>DB
QString xml(bool include_cuts,bool absolute,
RDSettings *settings=NULL,int cutnum=-1) const;
void updateLength();

View File

@@ -1016,6 +1016,9 @@ bool RDCut::copyTo(RDStation *station,RDUser *user,
void RDCut::getMetadata(RDWaveData *data,bool incl_str_fields) const
{
//
// Load an RDWaveData instance with data from a DB CUTS record
//
QString sql;
RDSqlQuery *q;
@@ -1081,6 +1084,9 @@ void RDCut::getMetadata(RDWaveData *data,bool incl_str_fields) const
void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const
{
//
// Load a DB CUT record with data from an RDWaveData instance
//
QString sql="update `CUTS` set ";
if(!data->description().isEmpty()) {
sql+=QString("`DESCRIPTION`='")+
@@ -1118,17 +1124,23 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const
RDEscapeString(data->releaseMbId().left(40))+"',";
}
sql+=QString::asprintf("`PLAY_GAIN`=%d,",data->playGain());
//
// Ensure sane START_POINT and END_POINT values
//
if(data->startPos()>=0) {
sql+=QString::asprintf("`START_POINT`=%d,",data->startPos());
}
if(data->endPos()>=0) {
if(data->endPos()>length()) {
sql+=QString::asprintf("`END_POINT`=%d,",length());
}
else {
sql+=QString::asprintf("`END_POINT`=%d,",data->endPos());
if((unsigned)data->endPos()>length()) {
data->setEndPos(length());
}
sql+=QString::asprintf("`END_POINT`=%d,",data->endPos());
}
//
// Ensure sane TALK_START_POINT and TALK_END_POINT values
//
if((data->talkStartPos()==data->startPos())&&
(data->talkEndPos()==data->endPos())) {
sql+="`TALK_START_POINT`=-1,`TALK_END_POINT`=-1,";
@@ -1151,6 +1163,10 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const
}
}
}
//
// Ensure sane SEGUE_START_POINT and SEGUE_END_POINT values
//
if(((data->segueStartPos()==data->startPos())&&
(data->segueEndPos()==data->endPos()))||(data->segueStartPos()==0)) {
sql+="`SEGUE_START_POINT`=-1,`SEGUE_END_POINT`=-1,";
@@ -1169,6 +1185,7 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const
if(data->endPos()<0) {
sql+=QString::asprintf("`SEGUE_END_POINT`=%d,",
data->segueStartPos()+1);
// data->segueStartPos()+1);
}
else {
sql+=QString::asprintf("`SEGUE_END_POINT`=%d,",data->endPos());
@@ -1232,8 +1249,7 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const
sql=sql.left(sql.length()-1);
}
sql+=QString(" where `CUT_NAME`='")+RDEscapeString(cut_name)+"'";
RDSqlQuery *q=new RDSqlQuery(sql);
delete q;
RDSqlQuery::apply(sql);
//
// Sanity Check: NEVER permit the 'description' field to be empty.

View File

@@ -134,8 +134,8 @@ class RDCut
void logPlayout() const;
bool copyTo(RDStation *station,RDUser *user,const QString &cutname,
RDConfig *config) const;
void getMetadata(RDWaveData *data,bool incl_str_fields) const;
void setMetadata(RDWaveData *data,bool incl_str_fields) const;
void getMetadata(RDWaveData *data,bool incl_str_fields) const; // DB=>FILE
void setMetadata(RDWaveData *data,bool incl_str_fields) const; // FILE=>DB
bool checkInRecording(const QString &station_name,const QString &user_name,
QString src_hostname,RDSettings *settings,
unsigned msecs) const;