diff --git a/ChangeLog b/ChangeLog index c95cf20b..a33741f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15452,3 +15452,6 @@ 2016-08-02 Fred Gleason * Added a work-around in 'lib/rdwavefile.cpp' to ensure that RDXL chunks are always of even length. +2016-08-03 Fred Gleason + * Fixed a bug in rdlibrary(1) that caused exports to contain incorrect + marker data in the RDXL file structure. diff --git a/lib/rdaudioconvert.cpp b/lib/rdaudioconvert.cpp index 89476374..091029d9 100644 --- a/lib/rdaudioconvert.cpp +++ b/lib/rdaudioconvert.cpp @@ -1937,7 +1937,8 @@ void RDAudioConvert::ApplyId3Tag(const QString &filename,RDWaveData *wavedata) } RDCart *cart=new RDCart(wavedata->cartNumber()); if(cart->exists()) { - QString xml=cart->xml(true,conv_settings,wavedata->cutNumber()); + QString xml= + cart->xml(true,conv_start_point<0,conv_settings,wavedata->cutNumber()); frame=new ID3_Frame(ID3FID_USERTEXT); frame->GetField(ID3FN_DESCRIPTION)->Set("rdxl"); frame->GetField(ID3FN_TEXTENC)->Set(ID3TE_NONE); diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 67468b83..c1bff591 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -985,7 +985,8 @@ bool RDCart::validateLengths(int len) const } -QString RDCart::xml(bool include_cuts,RDSettings *settings,int cutnum) const +QString RDCart::xml(bool include_cuts,bool absolute, + RDSettings *settings,int cutnum) const { #ifdef WIN32 return QString(); @@ -1025,16 +1026,6 @@ QString RDCart::xml(bool include_cuts,RDSettings *settings,int cutnum) const "METADATA_DATETIME,"+ // 24 "CONDUCTOR "+ // 25 QString().sprintf("from CART where NUMBER=%u",cart_number); - /* - sql=QString().sprintf("select TYPE,GROUP_NAME,TITLE,ARTIST,ALBUM,YEAR,\ - LABEL,CLIENT,AGENCY,PUBLISHER,COMPOSER,USER_DEFINED,\ - USAGE_CODE,FORCED_LENGTH,AVERAGE_LENGTH,\ - LENGTH_DEVIATION,AVERAGE_SEGUE_LENGTH,\ - AVERAGE_HOOK_LENGTH,CUT_QUANTITY,LAST_CUT_PLAYED,\ - VALIDITY,\ - ENFORCE_LENGTH,ASYNCRONOUS,OWNER,METADATA_DATETIME \ - from CART where NUMBER=%u",cart_number); - */ q=new RDSqlQuery(sql); if(q->first()) { ret+="\n"; @@ -1090,7 +1081,7 @@ QString RDCart::xml(bool include_cuts,RDSettings *settings,int cutnum) const q1=new RDSqlQuery(sql); while(q1->next()) { cut=new RDCut(q1->value(0).toString()); - ret+=cut->xml(settings); + ret+=cut->xml(absolute,settings); delete cut; } delete q1; @@ -1098,7 +1089,7 @@ QString RDCart::xml(bool include_cuts,RDSettings *settings,int cutnum) const else { cut=new RDCut(RDCut::cutName(cart_number,cutnum)); if(cut->exists()) { - ret+=cut->xml(settings); + ret+=cut->xml(absolute,settings); } delete cut; } diff --git a/lib/rdcart.h b/lib/rdcart.h index af4e2765..c448e436 100644 --- a/lib/rdcart.h +++ b/lib/rdcart.h @@ -136,7 +136,8 @@ class RDCart bool validateLengths(int len) const; void getMetadata(RDWaveData *data) const; void setMetadata(const RDWaveData *data); - QString xml(bool include_cuts,RDSettings *settings=NULL,int cutnum=-1) const; + QString xml(bool include_cuts,bool absolute, + RDSettings *settings=NULL,int cutnum=-1) const; void updateLength(); void updateLength(bool enforce_length,unsigned length); void resetRotation() const; diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index 85bd772a..89a74b0c 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -1156,7 +1156,7 @@ void RDCut::setMetadata(RDWaveData *data) const } -QString RDCut::xml(RDSettings *settings) const +QString RDCut::xml(bool absolute,RDSettings *settings) const { #ifdef WIN32 return QString(); @@ -1273,17 +1273,70 @@ QString RDCut::xml(RDSettings *settings) const ret+=" "+RDXmlField("channels",settings->channels()); } ret+=" "+RDXmlField("playGain",q->value(28).toUInt()); - ret+=" "+RDXmlField("startPoint",q->value(29).toInt()); - ret+=" "+RDXmlField("endPoint",q->value(30).toInt()); - ret+=" "+RDXmlField("fadeupPoint",q->value(31).toInt()); - ret+=" "+RDXmlField("fadedownPoint",q->value(32).toInt()); - ret+=" "+RDXmlField("segueStartPoint",q->value(33).toInt()); - ret+=" "+RDXmlField("segueEndPoint",q->value(34).toInt()); - ret+=" "+RDXmlField("segueGain",q->value(35).toInt()); - ret+=" "+RDXmlField("hookStartPoint",q->value(36).toInt()); - ret+=" "+RDXmlField("hookEndPoint",q->value(37).toInt()); - ret+=" "+RDXmlField("talkStartPoint",q->value(38).toInt()); - ret+=" "+RDXmlField("talkEndPoint",q->value(39).toInt()); + if(absolute) { + ret+=" "+RDXmlField("startPoint",q->value(29).toInt()); + ret+=" "+RDXmlField("endPoint",q->value(30).toInt()); + ret+=" "+RDXmlField("fadeupPoint",q->value(31).toInt()); + ret+=" "+RDXmlField("fadedownPoint",q->value(32).toInt()); + ret+=" "+RDXmlField("segueStartPoint",q->value(33).toInt()); + ret+=" "+RDXmlField("segueEndPoint",q->value(34).toInt()); + ret+=" "+RDXmlField("segueGain",q->value(35).toInt()); + ret+=" "+RDXmlField("hookStartPoint",q->value(36).toInt()); + ret+=" "+RDXmlField("hookEndPoint",q->value(37).toInt()); + ret+=" "+RDXmlField("talkStartPoint",q->value(38).toInt()); + ret+=" "+RDXmlField("talkEndPoint",q->value(39).toInt()); + } + else { + ret+=" "+RDXmlField("startPoint",0); + ret+=" "+ + RDXmlField("endPoint",q->value(30).toInt()-q->value(29).toInt()); + if(q->value(31).toInt()<0) { + ret+=" "+RDXmlField("fadeupPoint",-1); + } + else { + ret+=" "+ + RDXmlField("fadeupPoint",q->value(31).toInt()-q->value(29).toInt()); + } + if(q->value(32).toInt()<0) { + ret+=" "+RDXmlField("fadedownPoint",-1); + } + else { + ret+=" "+ + RDXmlField("fadedownPoint",q->value(32).toInt()-q->value(29).toInt()); + } + if(q->value(33).toInt()<0) { + ret+=" "+RDXmlField("segueStartPoint",-1); + ret+=" "+RDXmlField("segueEndPoint",-1); + } + else { + ret+=" "+RDXmlField("segueStartPoint", + q->value(33).toInt()-q->value(29).toInt()); + ret+=" "+RDXmlField("segueEndPoint", + q->value(34).toInt()-q->value(29).toInt()); + } + ret+=" "+RDXmlField("segueGain",q->value(35).toInt()); + if(q->value(36).toInt()<0) { + ret+=" "+RDXmlField("hookStartPoint",-1); + ret+=" "+RDXmlField("hookEndPoint",-1); + } + else { + ret+=" "+RDXmlField("hookStartPoint", + q->value(36).toInt()-q->value(29).toInt()); + ret+=" "+RDXmlField("hookEndPoint", + q->value(37).toInt()-q->value(29).toInt()); + } + if(q->value(38).toInt()<0) { + ret+=" "+RDXmlField("talkStartPoint",-1); + ret+=" "+RDXmlField("talkEndPoint",-1); + } + else { + ret+=" "+RDXmlField("talkStartPoint", + q->value(38).toInt()-q->value(29).toInt()); + ret+=" "+RDXmlField("talkEndPoint", + q->value(39).toInt()-q->value(29).toInt()); + } + } + ret+="\n"; } delete q; diff --git a/lib/rdcut.h b/lib/rdcut.h index 60860de4..0c22c8e0 100644 --- a/lib/rdcut.h +++ b/lib/rdcut.h @@ -127,7 +127,7 @@ class RDCut RDConfig *config) const; void getMetadata(RDWaveData *data) const; void setMetadata(RDWaveData *data) const; - QString xml(RDSettings *settings=NULL) const; + QString xml(bool absolute,RDSettings *settings=NULL) const; bool checkInRecording(const QString &stationname,RDSettings *settings, unsigned msecs) const; void autoTrim(RDCut::AudioEnd end,int level); diff --git a/utils/rdexport/rdexport.cpp b/utils/rdexport/rdexport.cpp index 1cbc93f9..04cb5cc2 100644 --- a/utils/rdexport/rdexport.cpp +++ b/utils/rdexport/rdexport.cpp @@ -435,7 +435,7 @@ void MainObject::ExportCut(RDCart *cart,RDCut *cut) filename+="xml"; if((f=fopen(filename,"w"))!=NULL) { fprintf(f,"%s\n", - (const char *)cart->xml(true,&settings,cut->cutNumber())); + (const char *)cart->xml(true,true,&settings,cut->cutNumber())); fclose(f); } } diff --git a/web/rdxport/carts.cpp b/web/rdxport/carts.cpp index 8307a23b..e921c1ae 100644 --- a/web/rdxport/carts.cpp +++ b/web/rdxport/carts.cpp @@ -104,7 +104,7 @@ void Xport::AddCart() printf("\n"); printf("\n"); if(cart->exists()) { - printf("%s",(const char *)cart->xml(false)); + printf("%s",(const char *)cart->xml(false,true)); } delete cart; printf("\n"); @@ -173,7 +173,7 @@ void Xport::ListCarts() printf("\n"); while(q->next()) { cart=new RDCart(q->value(0).toUInt()); - printf("%s",(const char *)cart->xml(include_cuts)); + printf("%s",(const char *)cart->xml(include_cuts,true)); delete cart; } printf("\n"); @@ -215,7 +215,7 @@ void Xport::ListCart() printf("\n"); printf("\n"); cart=new RDCart(cart_number); - printf("%s",(const char *)cart->xml(include_cuts)); + printf("%s",(const char *)cart->xml(include_cuts,true)); delete cart; printf("\n"); @@ -390,7 +390,7 @@ void Xport::EditCart() printf("Status: 200\n\n"); printf("\n"); printf("\n"); - printf("%s",(const char *)cart->xml(include_cuts)); + printf("%s",(const char *)cart->xml(include_cuts,true)); delete cart; printf("\n"); @@ -479,7 +479,7 @@ void Xport::AddCut() printf("\n"); cut=new RDCut(cart_number,cut_number); if(cut->exists()) { - printf("%s",(const char *)cut->xml()); + printf("%s",(const char *)cut->xml(true)); } delete cut; delete cart; @@ -524,7 +524,7 @@ void Xport::ListCuts() while(q->next()) { cut=new RDCut(q->value(0).toString()); if(cut->exists()) { - printf("%s",(const char *)cut->xml()); + printf("%s",(const char *)cut->xml(true)); } delete cut; } @@ -570,7 +570,7 @@ void Xport::ListCut() printf("Status: 200\n\n"); printf("\n"); printf("\n"); - printf("%s",(const char *)cut->xml()); + printf("%s",(const char *)cut->xml(true)); printf("\n"); delete cut; @@ -843,7 +843,7 @@ void Xport::EditCut() printf("Status: 200\n\n"); printf("\n"); printf("\n"); - printf("%s",(const char *)cut->xml()); + printf("%s",(const char *)cut->xml(true)); printf("\n"); delete cut; diff --git a/web/rdxport/export.cpp b/web/rdxport/export.cpp index 04d2b483..a7367a2f 100644 --- a/web/rdxport/export.cpp +++ b/web/rdxport/export.cpp @@ -127,7 +127,7 @@ void Xport::Export() if(cart->enforceLength()) { speed_ratio=(float)cut->length()/(float)cart->forcedLength(); } - rdxl=cart->xml(true,settings,cutnum); + rdxl=cart->xml(true,start_point<0,settings,cutnum); delete cut; delete cart; }