From 18b1081326123920f30d070314487753a9c1d9b2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Thu, 15 May 2008 16:58:14 +0000 Subject: [PATCH] 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 --- ChangeLog | 11 +++ configure.in | 4 +- include/project_renderer.h | 3 + src/core/main.cpp | 181 +++++++++++++++++++++++++++++----- src/core/project_renderer.cpp | 31 +++++- 5 files changed, 197 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f24896ef..46dbb7867 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-05-14 Tobias Doerffel + + * 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 * include/track.h: diff --git a/configure.in b/configure.in index 483a55fc6..ee714d34a 100644 --- a/configure.in +++ b/configure.in @@ -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) diff --git a/include/project_renderer.h b/include/project_renderer.h index 1f956b2fa..522290a48 100644 --- a/include/project_renderer.h +++ b/include/project_renderer.h @@ -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; } ; diff --git a/src/core/main.cpp b/src/core/main.cpp index d41e66df1..8242de2a5 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -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 [ -o ] [ -h ] " - "[ ]\n" - "-r, --render render given file.\n" - "-o, --output-format specify format of render-output where\n" + "usage: lmms [ -r [ -f ] [ -s ]\n" + " [ -b ] [ -i ] [ -x ] [ -h ]\n" + " [ ]\n\n" + "-r, --render render given project file\n" + "-o, --output render into \n" + "-f, --output-format specify format of render-output where\n" " format is either 'wav' or 'ogg'.\n" + "-s, --samplerate specify output samplerate in Hz\n" + " range: 44100 to 192000\n" + " default: 44100.\n" + "-b, --bitrate specify output bitrate in kHz\n" + " default: 160.\n" + "-i, --interpolation specify interpolation method\n" + " possible values:\n" + " - linear.\n" + " - sincfastest.\n" + " - sincmedium.\n" + " - sincbest.\n" + " default: sincfastest.\n" + "-x, --oversampling 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() ); diff --git a/src/core/project_renderer.cpp b/src/core/project_renderer.cpp index 3f74d83e3..300de1d27 100644 --- a/src/core/project_renderer.cpp +++ b/src/core/project_renderer.cpp @@ -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"