mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-07-26 17:38:15 +02:00
Merged v2.19_convtune
This commit is contained in:
commit
ff078cfd15
@ -16658,3 +16658,6 @@
|
|||||||
* Incremented the package version to 2.19.2int01.
|
* Incremented the package version to 2.19.2int01.
|
||||||
2018-08-15 Fred Gleason <fredg@paravelsystems.com>
|
2018-08-15 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Fixed a regression in rivendell_filter(1) that caused a segfault.
|
* Fixed a regression in rivendell_filter(1) that caused a segfault.
|
||||||
|
2018-06-20 Fred Gleason <fredg@paravelsystems.com>
|
||||||
|
* Added a 'TranscodingDelay=' parameter to the '[Tuning]' section
|
||||||
|
of rd.conf(5).
|
||||||
|
@ -130,6 +130,10 @@ ChannelsPerPcm=-1
|
|||||||
UseRealtime=Yes
|
UseRealtime=Yes
|
||||||
RealtimePriority=9
|
RealtimePriority=9
|
||||||
|
|
||||||
|
; Introduce a delay of this many microseconds in each loop iteration
|
||||||
|
; when transcoding files.
|
||||||
|
TranscodingDelay=0
|
||||||
|
|
||||||
[Format]
|
[Format]
|
||||||
; This value is used when testing and developing new features in the
|
; This value is used when testing and developing new features in the
|
||||||
; audio drivers. It should never be altered on a production system.
|
; audio drivers. It should never be altered on a production system.
|
||||||
|
@ -58,9 +58,10 @@
|
|||||||
#define STAGE2_XFER_SIZE 2048
|
#define STAGE2_XFER_SIZE 2048
|
||||||
#define STAGE2_BUFFER_SIZE 49152
|
#define STAGE2_BUFFER_SIZE 49152
|
||||||
|
|
||||||
RDAudioConvert::RDAudioConvert(const QString &station_name,QObject *parent)
|
RDAudioConvert::RDAudioConvert(RDConfig *config,QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
{
|
{
|
||||||
|
conv_config=config;
|
||||||
conv_start_point=-1;
|
conv_start_point=-1;
|
||||||
conv_end_point=-1;
|
conv_end_point=-1;
|
||||||
conv_speed_ratio=1.0;
|
conv_speed_ratio=1.0;
|
||||||
@ -68,7 +69,7 @@ RDAudioConvert::RDAudioConvert(const QString &station_name,QObject *parent)
|
|||||||
conv_settings=NULL;
|
conv_settings=NULL;
|
||||||
conv_src_wavedata=new RDWaveData();
|
conv_src_wavedata=new RDWaveData();
|
||||||
conv_dst_wavedata=NULL;
|
conv_dst_wavedata=NULL;
|
||||||
RDLibraryConf *conf=new RDLibraryConf(station_name,0);
|
RDLibraryConf *conf=new RDLibraryConf(config->stationName(),0);
|
||||||
conv_src_converter=conf->srcConverter();
|
conv_src_converter=conf->srcConverter();
|
||||||
delete conf;
|
delete conf;
|
||||||
|
|
||||||
@ -658,7 +659,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile,
|
|||||||
return RDAudioConvert::ErrorFormatError;
|
return RDAudioConvert::ErrorFormatError;
|
||||||
}
|
}
|
||||||
memmove(buffer,mad_stream.next_frame,left_over);
|
memmove(buffer,mad_stream.next_frame,left_over);
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
memset(buffer+left_over,0,MAD_BUFFER_GUARD);
|
memset(buffer+left_over,0,MAD_BUFFER_GUARD);
|
||||||
mad_stream_buffer(&mad_stream,buffer,MAD_BUFFER_GUARD+left_over);
|
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)<buffer_size) {
|
if((end-start)<buffer_size) {
|
||||||
buffer_size=end-start;
|
buffer_size=end-start;
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
delete buffer;
|
delete buffer;
|
||||||
sf_close(sf_dst);
|
sf_close(sf_dst);
|
||||||
@ -1076,6 +1078,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage2Convert(const QString &srcfile,
|
|||||||
sf_close(dst_sf);
|
sf_close(dst_sf);
|
||||||
return RDAudioConvert::ErrorNoSpace;
|
return RDAudioConvert::ErrorNoSpace;
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1099,6 +1102,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage2Convert(const QString &srcfile,
|
|||||||
sf_close(dst_sf);
|
sf_close(dst_sf);
|
||||||
return RDAudioConvert::ErrorNoSpace;
|
return RDAudioConvert::ErrorNoSpace;
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
delete st_conv;
|
delete st_conv;
|
||||||
}
|
}
|
||||||
@ -1511,6 +1515,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer3(SNDFILE *src_sf,
|
|||||||
return RDAudioConvert::ErrorNoSpace;
|
return RDAudioConvert::ErrorNoSpace;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1521,6 +1526,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer3(SNDFILE *src_sf,
|
|||||||
::close(dst_fd);
|
::close(dst_fd);
|
||||||
return RDAudioConvert::ErrorNoSpace;
|
return RDAudioConvert::ErrorNoSpace;
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1650,6 +1656,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer2Wav(SNDFILE *src_sf,
|
|||||||
else {
|
else {
|
||||||
fprintf(stderr,"TwoLAME encode error\n");
|
fprintf(stderr,"TwoLAME encode error\n");
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
if((s=twolame_encode_flush(lameopts,mpeg,2048))>=0) {
|
if((s=twolame_encode_flush(lameopts,mpeg,2048))>=0) {
|
||||||
if(wave->writeWave(mpeg,s)!=s) {
|
if(wave->writeWave(mpeg,s)!=s) {
|
||||||
@ -1752,6 +1759,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Layer2(SNDFILE *src_sf,
|
|||||||
else {
|
else {
|
||||||
fprintf(stderr,"TwoLAME encode error\n");
|
fprintf(stderr,"TwoLAME encode error\n");
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
if((s=twolame_encode_flush(lameopts,mpeg,2048))>=0) {
|
if((s=twolame_encode_flush(lameopts,mpeg,2048))>=0) {
|
||||||
if(write(dst_fd,mpeg,s)!=s) {
|
if(write(dst_fd,mpeg,s)!=s) {
|
||||||
@ -1818,6 +1826,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm16(SNDFILE *src_sf,
|
|||||||
delete wave;
|
delete wave;
|
||||||
return RDAudioConvert::ErrorNoSpace;
|
return RDAudioConvert::ErrorNoSpace;
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
delete sf_buffer;
|
delete sf_buffer;
|
||||||
wave->closeWave();
|
wave->closeWave();
|
||||||
@ -1867,6 +1876,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm24(SNDFILE *src_sf,
|
|||||||
delete wave;
|
delete wave;
|
||||||
return RDAudioConvert::ErrorNoSpace;
|
return RDAudioConvert::ErrorNoSpace;
|
||||||
}
|
}
|
||||||
|
usleep(conv_config->transcodingDelay());
|
||||||
}
|
}
|
||||||
delete sf_buffer;
|
delete sf_buffer;
|
||||||
delete pcm24;
|
delete pcm24;
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
#include <qobject.h>
|
#include <qobject.h>
|
||||||
|
|
||||||
|
#include "rdconfig.h"
|
||||||
#include "rdsettings.h"
|
#include "rdsettings.h"
|
||||||
#include "rdwavedata.h"
|
#include "rdwavedata.h"
|
||||||
#include "rdwavefile.h"
|
#include "rdwavefile.h"
|
||||||
@ -48,7 +49,7 @@ class RDAudioConvert : public QObject
|
|||||||
ErrorNoDestination=3,ErrorInvalidSource=4,ErrorInternal=5,
|
ErrorNoDestination=3,ErrorInvalidSource=4,ErrorInternal=5,
|
||||||
ErrorFormatNotSupported=6,ErrorNoDisc=7,ErrorNoTrack=8,
|
ErrorFormatNotSupported=6,ErrorNoDisc=7,ErrorNoTrack=8,
|
||||||
ErrorInvalidSpeed=9,ErrorFormatError=10,ErrorNoSpace=11};
|
ErrorInvalidSpeed=9,ErrorFormatError=10,ErrorNoSpace=11};
|
||||||
RDAudioConvert(const QString &station_name,QObject *parent=0);
|
RDAudioConvert(RDConfig *config,QObject *parent=0);
|
||||||
~RDAudioConvert();
|
~RDAudioConvert();
|
||||||
void setSourceFile(const QString &filename);
|
void setSourceFile(const QString &filename);
|
||||||
void setDestinationFile(const QString &filename);
|
void setDestinationFile(const QString &filename);
|
||||||
@ -117,6 +118,7 @@ class RDAudioConvert : public QObject
|
|||||||
void *conv_mad_handle;
|
void *conv_mad_handle;
|
||||||
void *conv_lame_handle;
|
void *conv_lame_handle;
|
||||||
void *conv_twolame_handle;
|
void *conv_twolame_handle;
|
||||||
|
RDConfig *conv_config;
|
||||||
#ifdef HAVE_MAD
|
#ifdef HAVE_MAD
|
||||||
void (*mad_stream_init)(struct mad_stream *);
|
void (*mad_stream_init)(struct mad_stream *);
|
||||||
void (*mad_frame_init)(struct mad_frame *);
|
void (*mad_frame_init)(struct mad_frame *);
|
||||||
|
@ -467,6 +467,12 @@ int RDConfig::realtimePriority()
|
|||||||
return conf_realtime_priority;
|
return conf_realtime_priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int RDConfig::transcodingDelay() const
|
||||||
|
{
|
||||||
|
return conf_transcoding_delay;
|
||||||
|
}
|
||||||
|
|
||||||
// Don't use this method in application code, use RDTempDirectory()
|
// Don't use this method in application code, use RDTempDirectory()
|
||||||
QString RDConfig::tempDirectory()
|
QString RDConfig::tempDirectory()
|
||||||
{
|
{
|
||||||
@ -633,6 +639,7 @@ void RDConfig::load()
|
|||||||
conf_enable_mixer_logging=profile->boolValue("Caed","EnableMixerLogging");
|
conf_enable_mixer_logging=profile->boolValue("Caed","EnableMixerLogging");
|
||||||
conf_use_realtime=profile->boolValue("Tuning","UseRealtime",false);
|
conf_use_realtime=profile->boolValue("Tuning","UseRealtime",false);
|
||||||
conf_realtime_priority=profile->intValue("Tuning","RealtimePriority",9);
|
conf_realtime_priority=profile->intValue("Tuning","RealtimePriority",9);
|
||||||
|
conf_transcoding_delay=profile->intValue("Tuning","TranscodingDelay");
|
||||||
conf_temp_directory=profile->stringValue("Tuning","TempDirectory","");
|
conf_temp_directory=profile->stringValue("Tuning","TempDirectory","");
|
||||||
conf_sas_station=profile->stringValue("SASFilter","Station","");
|
conf_sas_station=profile->stringValue("SASFilter","Station","");
|
||||||
conf_sas_matrix=profile->intValue("SASFilter","Matrix",0);
|
conf_sas_matrix=profile->intValue("SASFilter","Matrix",0);
|
||||||
@ -743,6 +750,7 @@ void RDConfig::clear()
|
|||||||
conf_enable_mixer_logging=false;
|
conf_enable_mixer_logging=false;
|
||||||
conf_use_realtime=false;
|
conf_use_realtime=false;
|
||||||
conf_realtime_priority=9;
|
conf_realtime_priority=9;
|
||||||
|
conf_transcoding_delay=0;
|
||||||
conf_temp_directory="";
|
conf_temp_directory="";
|
||||||
conf_sas_station="";
|
conf_sas_station="";
|
||||||
conf_sas_matrix=-1;
|
conf_sas_matrix=-1;
|
||||||
|
@ -110,6 +110,7 @@ class RDConfig
|
|||||||
#endif
|
#endif
|
||||||
bool useRealtime();
|
bool useRealtime();
|
||||||
int realtimePriority();
|
int realtimePriority();
|
||||||
|
int transcodingDelay() const;
|
||||||
QString tempDirectory();
|
QString tempDirectory();
|
||||||
QString sasStation() const;
|
QString sasStation() const;
|
||||||
int sasMatrix() const;
|
int sasMatrix() const;
|
||||||
@ -177,6 +178,7 @@ class RDConfig
|
|||||||
QString conf_cae_logfile;
|
QString conf_cae_logfile;
|
||||||
bool conf_enable_mixer_logging;
|
bool conf_enable_mixer_logging;
|
||||||
bool conf_use_realtime;
|
bool conf_use_realtime;
|
||||||
|
int conf_transcoding_delay;
|
||||||
int conf_realtime_priority;
|
int conf_realtime_priority;
|
||||||
QString conf_temp_directory;
|
QString conf_temp_directory;
|
||||||
QString conf_sas_station;
|
QString conf_sas_station;
|
||||||
|
@ -660,7 +660,7 @@ unsigned RDFeed::postFile(RDStation *station,const QString &srcfile,Error *err,
|
|||||||
// Convert Cut
|
// Convert Cut
|
||||||
//
|
//
|
||||||
tmpfile=GetTempFilename();
|
tmpfile=GetTempFilename();
|
||||||
RDAudioConvert *conv=new RDAudioConvert(station->name(),this);
|
RDAudioConvert *conv=new RDAudioConvert(feed_config,this);
|
||||||
conv->setSourceFile(srcfile);
|
conv->setSourceFile(srcfile);
|
||||||
conv->setDestinationFile(tmpfile);
|
conv->setDestinationFile(tmpfile);
|
||||||
RDSettings *settings=new RDSettings();
|
RDSettings *settings=new RDSettings();
|
||||||
|
@ -586,7 +586,7 @@ bool RDRenderer::ConvertAudio(const QString &srcfile,const QString &dstfile,
|
|||||||
{
|
{
|
||||||
RDAudioConvert::ErrorCode err_code;
|
RDAudioConvert::ErrorCode err_code;
|
||||||
|
|
||||||
RDAudioConvert *conv=new RDAudioConvert(render_station->name(),this);
|
RDAudioConvert *conv=new RDAudioConvert(render_config,this);
|
||||||
conv->setSourceFile(srcfile);
|
conv->setSourceFile(srcfile);
|
||||||
conv->setDestinationFile(dstfile);
|
conv->setDestinationFile(dstfile);
|
||||||
conv->setDestinationSettings(s);
|
conv->setDestinationSettings(s);
|
||||||
|
@ -400,7 +400,7 @@ bool MainObject::Export(CatchEvent *evt)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
RDCart *cart=new RDCart(cut->cartNumber());
|
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->setSourceFile(RDCut::pathName(evt->cutName()));
|
||||||
conv->setRange(cut->startPoint(),cut->endPoint());
|
conv->setRange(cut->startPoint(),cut->endPoint());
|
||||||
conv->setDestinationFile(RDEscapeString(evt->tempName()));
|
conv->setDestinationFile(RDEscapeString(evt->tempName()));
|
||||||
@ -472,7 +472,7 @@ bool MainObject::Import(CatchEvent *evt)
|
|||||||
unsigned msecs=wave->getExtTimeLength();
|
unsigned msecs=wave->getExtTimeLength();
|
||||||
delete wave;
|
delete wave;
|
||||||
RDCart *cart=new RDCart(cut->cartNumber());
|
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->setSourceFile(RDEscapeString(evt->tempName()));
|
||||||
conv->setDestinationFile(RDCut::pathName(evt->cutName()));
|
conv->setDestinationFile(RDCut::pathName(evt->cutName()));
|
||||||
RDSettings *settings=new RDSettings();
|
RDSettings *settings=new RDSettings();
|
||||||
|
@ -347,7 +347,7 @@ bool CitadelXds::PostCut(const QString &cutname,const QString &filename)
|
|||||||
}
|
}
|
||||||
RDSettings *settings=new RDSettings();
|
RDSettings *settings=new RDSettings();
|
||||||
QString tempfile=RDTempDirectory::basePath()+"/"+filename;
|
QString tempfile=RDTempDirectory::basePath()+"/"+filename;
|
||||||
RDAudioConvert *conv=new RDAudioConvert(rdconfig->stationName());
|
RDAudioConvert *conv=new RDAudioConvert(rdconfig);
|
||||||
conv->setSourceFile(RDCut::pathName(cutname));
|
conv->setSourceFile(RDCut::pathName(cutname));
|
||||||
conv->setDestinationFile(tempfile);
|
conv->setDestinationFile(tempfile);
|
||||||
conv->setRange(cut->startPoint(),cut->endPoint());
|
conv->setRange(cut->startPoint(),cut->endPoint());
|
||||||
|
@ -179,7 +179,7 @@ MainObject::MainObject(QObject *parent)
|
|||||||
exit(256);
|
exit(256);
|
||||||
}
|
}
|
||||||
|
|
||||||
RDAudioConvert *conv=new RDAudioConvert(rdconfig->stationName(),this);
|
RDAudioConvert *conv=new RDAudioConvert(rdconfig,this);
|
||||||
conv->setSourceFile(source_filename);
|
conv->setSourceFile(source_filename);
|
||||||
conv->setDestinationFile(destination_filename);
|
conv->setDestinationFile(destination_filename);
|
||||||
conv->setDestinationSettings(destination_settings);
|
conv->setDestinationSettings(destination_settings);
|
||||||
|
@ -186,7 +186,7 @@ MainObject::MainObject(QObject *parent)
|
|||||||
exit(256);
|
exit(256);
|
||||||
}
|
}
|
||||||
|
|
||||||
RDAudioConvert *conv=new RDAudioConvert(rdconfig->stationName(),this);
|
RDAudioConvert *conv=new RDAudioConvert(rdconfig,this);
|
||||||
conv->setSourceFile(source_filename);
|
conv->setSourceFile(source_filename);
|
||||||
conv->setDestinationFile(destination_filename);
|
conv->setDestinationFile(destination_filename);
|
||||||
conv->setDestinationSettings(destination_settings);
|
conv->setDestinationSettings(destination_settings);
|
||||||
|
@ -145,7 +145,7 @@ void Xport::Export()
|
|||||||
XmlExit("unable to create temporary directory ["+err_msg+"]",500);
|
XmlExit("unable to create temporary directory ["+err_msg+"]",500);
|
||||||
}
|
}
|
||||||
QString tmpfile=tempdir->path()+"/exported_audio";
|
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->setSourceFile(RDCut::pathName(cartnum,cutnum));
|
||||||
conv->setDestinationFile(tmpfile);
|
conv->setDestinationFile(tmpfile);
|
||||||
conv->setDestinationSettings(settings);
|
conv->setDestinationSettings(settings);
|
||||||
|
@ -200,7 +200,7 @@ void Xport::Import()
|
|||||||
XmlExit("Duplicate Cart Title Not Allowed",404,"import.cpp",LINE_NUMBER);
|
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->setSourceFile(filename);
|
||||||
conv->setDestinationFile(RDCut::pathName(cartnum,cutnum));
|
conv->setDestinationFile(RDCut::pathName(cartnum,cutnum));
|
||||||
conv->setDestinationSettings(settings);
|
conv->setDestinationSettings(settings);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user