diff --git a/ChangeLog b/ChangeLog index a55ba092..7f5bfa93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16658,3 +16658,6 @@ * Incremented the package version to 2.19.2int01. 2018-08-15 Fred Gleason * Fixed a regression in rivendell_filter(1) that caused a segfault. +2018-06-20 Fred Gleason + * Added a 'TranscodingDelay=' parameter to the '[Tuning]' section + of rd.conf(5). diff --git a/conf/rd.conf-sample b/conf/rd.conf-sample index 1855cdad..cc133119 100644 --- a/conf/rd.conf-sample +++ b/conf/rd.conf-sample @@ -130,6 +130,10 @@ ChannelsPerPcm=-1 UseRealtime=Yes RealtimePriority=9 +; Introduce a delay of this many microseconds in each loop iteration +; when transcoding files. +TranscodingDelay=0 + [Format] ; This value is used when testing and developing new features in the ; audio drivers. It should never be altered on a production system. diff --git a/lib/rdaudioconvert.cpp b/lib/rdaudioconvert.cpp index 5da0db17..3a10ad3e 100644 --- a/lib/rdaudioconvert.cpp +++ b/lib/rdaudioconvert.cpp @@ -58,9 +58,10 @@ #define STAGE2_XFER_SIZE 2048 #define STAGE2_BUFFER_SIZE 49152 -RDAudioConvert::RDAudioConvert(const QString &station_name,QObject *parent) +RDAudioConvert::RDAudioConvert(RDConfig *config,QObject *parent) : QObject(parent) { + conv_config=config; conv_start_point=-1; conv_end_point=-1; conv_speed_ratio=1.0; @@ -68,7 +69,7 @@ RDAudioConvert::RDAudioConvert(const QString &station_name,QObject *parent) conv_settings=NULL; conv_src_wavedata=new RDWaveData(); conv_dst_wavedata=NULL; - RDLibraryConf *conf=new RDLibraryConf(station_name,0); + RDLibraryConf *conf=new RDLibraryConf(config->stationName(),0); conv_src_converter=conf->srcConverter(); delete conf; @@ -658,7 +659,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile, return RDAudioConvert::ErrorFormatError; } memmove(buffer,mad_stream.next_frame,left_over); - + usleep(conv_config->transcodingDelay()); } memset(buffer+left_over,0,MAD_BUFFER_GUARD); mad_stream_buffer(&mad_stream,buffer,MAD_BUFFER_GUARD+left_over); @@ -888,6 +889,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1SndFile(const QString &dstfile, if((end-start)transcodingDelay()); } delete buffer; sf_close(sf_dst); @@ -1076,6 +1078,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage2Convert(const QString &srcfile, sf_close(dst_sf); return RDAudioConvert::ErrorNoSpace; } + usleep(conv_config->transcodingDelay()); } // @@ -1099,6 +1102,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage2Convert(const QString &srcfile, sf_close(dst_sf); return RDAudioConvert::ErrorNoSpace; } + usleep(conv_config->transcodingDelay()); } delete st_conv; } @@ -1511,6 +1515,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer3(SNDFILE *src_sf, return RDAudioConvert::ErrorNoSpace; } } + usleep(conv_config->transcodingDelay()); } } else { @@ -1521,6 +1526,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer3(SNDFILE *src_sf, ::close(dst_fd); return RDAudioConvert::ErrorNoSpace; } + usleep(conv_config->transcodingDelay()); } } } @@ -1650,6 +1656,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer2Wav(SNDFILE *src_sf, else { fprintf(stderr,"TwoLAME encode error\n"); } + usleep(conv_config->transcodingDelay()); } if((s=twolame_encode_flush(lameopts,mpeg,2048))>=0) { if(wave->writeWave(mpeg,s)!=s) { @@ -1752,6 +1759,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer2(SNDFILE *src_sf, else { fprintf(stderr,"TwoLAME encode error\n"); } + usleep(conv_config->transcodingDelay()); } if((s=twolame_encode_flush(lameopts,mpeg,2048))>=0) { if(write(dst_fd,mpeg,s)!=s) { @@ -1818,6 +1826,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm16(SNDFILE *src_sf, delete wave; return RDAudioConvert::ErrorNoSpace; } + usleep(conv_config->transcodingDelay()); } delete sf_buffer; wave->closeWave(); @@ -1867,6 +1876,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm24(SNDFILE *src_sf, delete wave; return RDAudioConvert::ErrorNoSpace; } + usleep(conv_config->transcodingDelay()); } delete sf_buffer; delete pcm24; diff --git a/lib/rdaudioconvert.h b/lib/rdaudioconvert.h index bba529ed..b66f9b9d 100644 --- a/lib/rdaudioconvert.h +++ b/lib/rdaudioconvert.h @@ -36,6 +36,7 @@ #include +#include "rdconfig.h" #include "rdsettings.h" #include "rdwavedata.h" #include "rdwavefile.h" @@ -48,7 +49,7 @@ class RDAudioConvert : public QObject ErrorNoDestination=3,ErrorInvalidSource=4,ErrorInternal=5, ErrorFormatNotSupported=6,ErrorNoDisc=7,ErrorNoTrack=8, ErrorInvalidSpeed=9,ErrorFormatError=10,ErrorNoSpace=11}; - RDAudioConvert(const QString &station_name,QObject *parent=0); + RDAudioConvert(RDConfig *config,QObject *parent=0); ~RDAudioConvert(); void setSourceFile(const QString &filename); void setDestinationFile(const QString &filename); @@ -117,6 +118,7 @@ class RDAudioConvert : public QObject void *conv_mad_handle; void *conv_lame_handle; void *conv_twolame_handle; + RDConfig *conv_config; #ifdef HAVE_MAD void (*mad_stream_init)(struct mad_stream *); void (*mad_frame_init)(struct mad_frame *); diff --git a/lib/rdconfig.cpp b/lib/rdconfig.cpp index 35f32682..10448807 100644 --- a/lib/rdconfig.cpp +++ b/lib/rdconfig.cpp @@ -467,6 +467,12 @@ int RDConfig::realtimePriority() return conf_realtime_priority; } + +int RDConfig::transcodingDelay() const +{ + return conf_transcoding_delay; +} + // Don't use this method in application code, use RDTempDirectory() QString RDConfig::tempDirectory() { @@ -633,6 +639,7 @@ void RDConfig::load() conf_enable_mixer_logging=profile->boolValue("Caed","EnableMixerLogging"); conf_use_realtime=profile->boolValue("Tuning","UseRealtime",false); conf_realtime_priority=profile->intValue("Tuning","RealtimePriority",9); + conf_transcoding_delay=profile->intValue("Tuning","TranscodingDelay"); conf_temp_directory=profile->stringValue("Tuning","TempDirectory",""); conf_sas_station=profile->stringValue("SASFilter","Station",""); conf_sas_matrix=profile->intValue("SASFilter","Matrix",0); @@ -743,6 +750,7 @@ void RDConfig::clear() conf_enable_mixer_logging=false; conf_use_realtime=false; conf_realtime_priority=9; + conf_transcoding_delay=0; conf_temp_directory=""; conf_sas_station=""; conf_sas_matrix=-1; diff --git a/lib/rdconfig.h b/lib/rdconfig.h index 5f32238e..fdda95b2 100644 --- a/lib/rdconfig.h +++ b/lib/rdconfig.h @@ -110,6 +110,7 @@ class RDConfig #endif bool useRealtime(); int realtimePriority(); + int transcodingDelay() const; QString tempDirectory(); QString sasStation() const; int sasMatrix() const; @@ -177,6 +178,7 @@ class RDConfig QString conf_cae_logfile; bool conf_enable_mixer_logging; bool conf_use_realtime; + int conf_transcoding_delay; int conf_realtime_priority; QString conf_temp_directory; QString conf_sas_station; diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index 61e85626..19e4cf2b 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -660,7 +660,7 @@ unsigned RDFeed::postFile(RDStation *station,const QString &srcfile,Error *err, // Convert Cut // tmpfile=GetTempFilename(); - RDAudioConvert *conv=new RDAudioConvert(station->name(),this); + RDAudioConvert *conv=new RDAudioConvert(feed_config,this); conv->setSourceFile(srcfile); conv->setDestinationFile(tmpfile); RDSettings *settings=new RDSettings(); diff --git a/lib/rdrenderer.cpp b/lib/rdrenderer.cpp index 39cb7e18..227e533b 100644 --- a/lib/rdrenderer.cpp +++ b/lib/rdrenderer.cpp @@ -586,7 +586,7 @@ bool RDRenderer::ConvertAudio(const QString &srcfile,const QString &dstfile, { RDAudioConvert::ErrorCode err_code; - RDAudioConvert *conv=new RDAudioConvert(render_station->name(),this); + RDAudioConvert *conv=new RDAudioConvert(render_config,this); conv->setSourceFile(srcfile); conv->setDestinationFile(dstfile); conv->setDestinationSettings(s); diff --git a/rdcatchd/batch.cpp b/rdcatchd/batch.cpp index 7daae048..aca8b6b3 100644 --- a/rdcatchd/batch.cpp +++ b/rdcatchd/batch.cpp @@ -400,7 +400,7 @@ bool MainObject::Export(CatchEvent *evt) return false; } RDCart *cart=new RDCart(cut->cartNumber()); - RDAudioConvert *conv=new RDAudioConvert(catch_config->stationName(),this); + RDAudioConvert *conv=new RDAudioConvert(catch_config,this); conv->setSourceFile(RDCut::pathName(evt->cutName())); conv->setRange(cut->startPoint(),cut->endPoint()); conv->setDestinationFile(RDEscapeString(evt->tempName())); @@ -472,7 +472,7 @@ bool MainObject::Import(CatchEvent *evt) unsigned msecs=wave->getExtTimeLength(); delete wave; RDCart *cart=new RDCart(cut->cartNumber()); - RDAudioConvert *conv=new RDAudioConvert(catch_config->stationName(),this); + RDAudioConvert *conv=new RDAudioConvert(catch_config,this); conv->setSourceFile(RDEscapeString(evt->tempName())); conv->setDestinationFile(RDCut::pathName(evt->cutName())); RDSettings *settings=new RDSettings(); diff --git a/rdrepld/citadelxds.cpp b/rdrepld/citadelxds.cpp index 8078123c..4c2eef43 100644 --- a/rdrepld/citadelxds.cpp +++ b/rdrepld/citadelxds.cpp @@ -347,7 +347,7 @@ bool CitadelXds::PostCut(const QString &cutname,const QString &filename) } RDSettings *settings=new RDSettings(); QString tempfile=RDTempDirectory::basePath()+"/"+filename; - RDAudioConvert *conv=new RDAudioConvert(rdconfig->stationName()); + RDAudioConvert *conv=new RDAudioConvert(rdconfig); conv->setSourceFile(RDCut::pathName(cutname)); conv->setDestinationFile(tempfile); conv->setRange(cut->startPoint(),cut->endPoint()); diff --git a/tests/audio_convert_test.cpp b/tests/audio_convert_test.cpp index 63a6269c..72dab668 100644 --- a/tests/audio_convert_test.cpp +++ b/tests/audio_convert_test.cpp @@ -179,7 +179,7 @@ MainObject::MainObject(QObject *parent) exit(256); } - RDAudioConvert *conv=new RDAudioConvert(rdconfig->stationName(),this); + RDAudioConvert *conv=new RDAudioConvert(rdconfig,this); conv->setSourceFile(source_filename); conv->setDestinationFile(destination_filename); conv->setDestinationSettings(destination_settings); diff --git a/utils/rdconvert/rdconvert.cpp b/utils/rdconvert/rdconvert.cpp index b87f61e2..c3c0ecc9 100644 --- a/utils/rdconvert/rdconvert.cpp +++ b/utils/rdconvert/rdconvert.cpp @@ -186,7 +186,7 @@ MainObject::MainObject(QObject *parent) exit(256); } - RDAudioConvert *conv=new RDAudioConvert(rdconfig->stationName(),this); + RDAudioConvert *conv=new RDAudioConvert(rdconfig,this); conv->setSourceFile(source_filename); conv->setDestinationFile(destination_filename); conv->setDestinationSettings(destination_settings); diff --git a/web/rdxport/export.cpp b/web/rdxport/export.cpp index 85c496f1..cc8032e7 100644 --- a/web/rdxport/export.cpp +++ b/web/rdxport/export.cpp @@ -145,7 +145,7 @@ void Xport::Export() XmlExit("unable to create temporary directory ["+err_msg+"]",500); } QString tmpfile=tempdir->path()+"/exported_audio"; - RDAudioConvert *conv=new RDAudioConvert(xport_config->stationName()); + RDAudioConvert *conv=new RDAudioConvert(xport_config); conv->setSourceFile(RDCut::pathName(cartnum,cutnum)); conv->setDestinationFile(tmpfile); conv->setDestinationSettings(settings); diff --git a/web/rdxport/import.cpp b/web/rdxport/import.cpp index f13442a6..7133c11e 100644 --- a/web/rdxport/import.cpp +++ b/web/rdxport/import.cpp @@ -200,7 +200,7 @@ void Xport::Import() XmlExit("Duplicate Cart Title Not Allowed",404,"import.cpp",LINE_NUMBER); } } - RDAudioConvert *conv=new RDAudioConvert(xport_config->stationName()); + RDAudioConvert *conv=new RDAudioConvert(xport_config); conv->setSourceFile(filename); conv->setDestinationFile(RDCut::pathName(cartnum,cutnum)); conv->setDestinationSettings(settings);