added a lot of options for rendering via command-line and finally made it working with new projectRenderer-class

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@974 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Tobias Doerffel
2008-05-15 16:58:14 +00:00
parent ef9c08894c
commit 18b1081326
5 changed files with 197 additions and 33 deletions

View File

@@ -1,3 +1,14 @@
2008-05-14 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* include/project_renderer.h:
* src/core/main.cpp:
* src/core/project_renderer.cpp:
added a lot of options for rendering via command-line and finally made
it working with new projectRenderer-class
* include/mixer.h:
removed 16x oversampling
2008-05-13 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* include/track.h:

View File

@@ -2,8 +2,8 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.50)
AC_INIT(lmms, 0.4.0-svn20080511, lmms-devel/at/lists/dot/sf/dot/net)
AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080511)
AC_INIT(lmms, 0.4.0-svn20080515, lmms-devel/at/lists/dot/sf/dot/net)
AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080515)
AM_CONFIG_HEADER(config.h)

View File

@@ -66,6 +66,8 @@ public slots:
void startProcessing( void );
void abortProcessing( void );
void updateConsoleProgress( void );
signals:
void progressChanged( int );
@@ -78,6 +80,7 @@ private:
mixer::qualitySettings m_qualitySettings;
mixer::qualitySettings m_oldQualitySettings;
volatile int m_progress;
volatile bool m_abort;
} ;

View File

@@ -28,6 +28,7 @@
#include <QtCore/QFileInfo>
#include <QtCore/QLocale>
#include <QtCore/QTime>
#include <QtCore/QTimer>
#include <QtCore/QTranslator>
#include <QtGui/QApplication>
#include <QtGui/QSplashScreen>
@@ -83,8 +84,12 @@ int main( int argc, char * * argv )
QApplication app( argc, argv );
QString extension = "wav";
QString file_to_load, file_to_render;
QString file_to_load, render_out;
mixer::qualitySettings qs( mixer::qualitySettings::Mode_HighQuality );
projectRenderer::outputSettings os( 44100, FALSE, 160 );
projectRenderer::ExportFileTypes eft = projectRenderer::WaveFile;
for( int i = 1; i < argc; ++i )
{
@@ -106,11 +111,28 @@ int main( int argc, char * * argv )
{
printf( "\nLinux MultiMedia Studio %s\n"
"Copyright (c) 2004-2008 LMMS developers.\n\n"
"usage: lmms [ -r <file_to_render> [ -o <format> ] [ -h ] "
"[ <file_to_load> ]\n"
"-r, --render render given file.\n"
"-o, --output-format <format> specify format of render-output where\n"
"usage: lmms [ -r <project file> [ -f <format> ] [ -s <samplerate> ]\n"
" [ -b <bitrate> ] [ -i <method> ] [ -x <value> ] [ -h ]\n"
" [ <file to load> ]\n\n"
"-r, --render <project file> render given project file\n"
"-o, --output <file> render into <file>\n"
"-f, --output-format <format> specify format of render-output where\n"
" format is either 'wav' or 'ogg'.\n"
"-s, --samplerate <samplerate> specify output samplerate in Hz\n"
" range: 44100 to 192000\n"
" default: 44100.\n"
"-b, --bitrate <bitrate> specify output bitrate in kHz\n"
" default: 160.\n"
"-i, --interpolation <method> specify interpolation method\n"
" possible values:\n"
" - linear.\n"
" - sincfastest.\n"
" - sincmedium.\n"
" - sincbest.\n"
" default: sincfastest.\n"
"-x, --oversampling <value> specify oversampling\n"
" possible values: 1, 2, 4, 8\n"
" default: 2\n"
"-v, --version show version information and exit.\n"
"-h, --help show this usage message and exit.\n\n",
PACKAGE_VERSION );
@@ -120,17 +142,120 @@ int main( int argc, char * * argv )
QString( argv[i] ) == "-r" ) )
{
file_to_load = QString( argv[i + 1] );
file_to_render = baseName( file_to_load ) + ".";
render_out = baseName( file_to_load ) + ".";
++i;
}
else if( argc > i && ( QString( argv[i] ) == "--output" ||
QString( argv[i] ) == "-o" ) )
{
render_out = baseName( QString( argv[i + 1] ) ) + ".";
++i;
}
else if( argc > i &&
( QString( argv[i] ) == "--output-format" ||
QString( argv[i] ) == "-o" ) )
( QString( argv[i] ) == "--format" ||
QString( argv[i] ) == "-f" ) )
{
extension = QString( argv[i + 1] );
if( extension != "wav" && extension != "ogg" )
const QString ext = QString( argv[i + 1] );
if( ext == "wav" )
{
eft = projectRenderer::WaveFile;
}
else if( ext == "ogg" )
{
eft = projectRenderer::OggFile;
}
else
{
printf( "\nInvalid output format %s.\n\n"
"Try \"%s --help\" for more information.\n\n", argv[i + 1], argv[0] );
return( EXIT_FAILURE );
}
++i;
}
else if( argc > i &&
( QString( argv[i] ) == "--samplerate" ||
QString( argv[i] ) == "-s" ) )
{
sample_rate_t sr = QString( argv[i + 1] ).toUInt();
if( sr >= 44100 && sr <= 192000 )
{
os.samplerate = sr;
}
else
{
printf( "\nInvalid samplerate %s.\n\n"
"Try \"%s --help\" for more information.\n\n", argv[i + 1], argv[0] );
return( EXIT_FAILURE );
}
++i;
}
else if( argc > i &&
( QString( argv[i] ) == "--bitrate" ||
QString( argv[i] ) == "-b" ) )
{
int br = QString( argv[i + 1] ).toUInt();
if( br >= 64 && br <= 384 )
{
os.bitrate = br;
}
else
{
printf( "\nInvalid bitrate %s.\n\n"
"Try \"%s --help\" for more information.\n\n", argv[i + 1], argv[0] );
return( EXIT_FAILURE );
}
++i;
}
else if( argc > i &&
( QString( argv[i] ) == "--interpolation" ||
QString( argv[i] ) == "-i" ) )
{
const QString ip = QString( argv[i + 1] );
if( ip == "linear" )
{
qs.interpolation = mixer::qualitySettings::Interpolation_Linear;
}
else if( ip == "sincfastest" )
{
qs.interpolation = mixer::qualitySettings::Interpolation_SincFastest;
}
else if( ip == "sincmedium" )
{
qs.interpolation = mixer::qualitySettings::Interpolation_SincMedium;
}
else if( ip == "sincbest" )
{
qs.interpolation = mixer::qualitySettings::Interpolation_SincBest;
}
else
{
printf( "\nInvalid interpolation method %s.\n\n"
"Try \"%s --help\" for more information.\n\n", argv[i + 1], argv[0] );
return( EXIT_FAILURE );
}
++i;
}
else if( argc > i &&
( QString( argv[i] ) == "--oversampling" ||
QString( argv[i] ) == "-x" ) )
{
int os = QString( argv[i + 1] ).toUInt();
switch( os )
{
case 1:
qs.oversampling = mixer::qualitySettings::Oversampling_None;
break;
case 2:
qs.oversampling = mixer::qualitySettings::Oversampling_2x;
break;
case 4:
qs.oversampling = mixer::qualitySettings::Oversampling_4x;
break;
case 8:
qs.oversampling = mixer::qualitySettings::Oversampling_8x;
break;
default:
printf( "\nInvalid oversampling %s.\n\n"
"Try \"%s --help\" for more information.\n\n", argv[i + 1], argv[0] );
return( EXIT_FAILURE );
}
@@ -148,13 +273,6 @@ int main( int argc, char * * argv )
}
}
bool gui_startup = TRUE;
if( file_to_render != "" )
{
file_to_render += extension;
gui_startup = FALSE;
}
QString pos = QLocale::system().name().left( 2 );
// load translation for Qt-widgets/-dialogs
@@ -171,7 +289,7 @@ int main( int argc, char * * argv )
return( EXIT_FAILURE );
}
if( gui_startup )
if( render_out == "" )
{
QApplication::setStyle( new lmmsStyle() );
@@ -244,16 +362,25 @@ int main( int argc, char * * argv )
}
else
{
// we're going to render our song
engine::init( FALSE );
engine::getSong()->loadProject( file_to_load );
/* exportProjectDialog * e = new exportProjectDialog(
file_to_render,
engine::getMainWindow() );
e->show();
QTime t;
t.start();
e->exportBtnClicked();
printf("export took %d ms\n",t.elapsed());*/
// create renderer
projectRenderer * r = new projectRenderer( qs, os, eft,
render_out + QString( ( eft == projectRenderer::WaveFile ) ?
"wav" : "ogg" ) );
QCoreApplication::instance()->connect( r, SIGNAL( finished() ),
SLOT( quit() ) );
// timer for progress-updates
QTimer * t = new QTimer( r );
r->connect( t, SIGNAL( timeout() ),
SLOT( updateConsoleProgress() ) );
t->start( 50 );
// start now!
r->startProcessing();
}
return( app.exec() );

View File

@@ -70,6 +70,7 @@ projectRenderer::projectRenderer( const mixer::qualitySettings & _qs,
QThread( engine::getMixer() ),
m_qualitySettings( _qs ),
m_oldQualitySettings( engine::getMixer()->currentQualitySettings() ),
m_progress( 0 ),
m_abort( FALSE )
{
int idx = 0;
@@ -159,7 +160,7 @@ void projectRenderer::run( void )
song::playPos & pp = engine::getSong()->getPlayPos(
song::Mode_PlaySong );
int progress = 0;
m_progress = 0;
while( engine::getSong()->isExportDone() == FALSE &&
engine::getSong()->isExporting() == TRUE
&& !m_abort )
@@ -167,10 +168,10 @@ void projectRenderer::run( void )
m_fileDev->processNextBuffer();
const int nprog = pp * 100 /
( ( engine::getSong()->length() + 1 ) * 192 );
if( progress != nprog )
if( m_progress != nprog )
{
progress = nprog;
emit progressChanged( progress );
m_progress = nprog;
emit progressChanged( m_progress );
}
}
@@ -198,6 +199,28 @@ void projectRenderer::abortProcessing( void )
void projectRenderer::updateConsoleProgress( void )
{
const int cols = 50;
static int rot = 0;
printf("\r|");
for( int i = 0; i < cols; ++i )
{
printf( "%c",( i*100/cols <= m_progress ? '-' : ' ' ));
}
printf( "| %3d%% ", m_progress );
switch( rot )
{
case 3: putchar( '|' ); break;
case 2: putchar( '/' ); break;
case 1: putchar( '-' ); break;
case 0: putchar( '\\' ); break;
}
rot = ++rot % 4;
}
#include "project_renderer.moc"