SVN commit 1144809 by mmalek: Fixed freeze on ripping Audio CD using external encoder. It was caused by single kDebug() expression in the loop which was causing infinite loop when debug output was turned off. Fixed by using K3b::Process and its splitted output functionality. BUG: 236466 M +5 -0 ChangeLog M +11 -10 plugins/encoder/external/k3bexternalencoder.cpp M +1 -1 plugins/encoder/external/k3bexternalencoder.h --- branches/k3b/2.0/ChangeLog #1144808:1144809 @@ -1,3 +1,8 @@ +2.0.1 +===== +Bugfixes: + * Freeze on ripping Audio CD using external encoder to MP3 or FLAC (236466) + 2.0 === Changes (since 1.0.5): --- branches/k3b/2.0/plugins/encoder/external/k3bexternalencoder.cpp #1144808:1144809 @@ -18,11 +18,11 @@ #include #include "k3bcore.h" +#include "k3bprocess.h" #include #include #include -#include #include #include @@ -72,7 +72,7 @@ class K3bExternalEncoder::Private { public: - KProcess* process; + K3b::Process* process; QString fileName; K3b::Msf length; @@ -181,15 +181,17 @@ disconnect( d->process ); d->process->deleteLater(); } - d->process = new KProcess(); - d->process->setOutputChannelMode( KProcess::MergedChannels ); + d->process = new K3b::Process(); + d->process->setSplitStdout( true ); connect( d->process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotExternalProgramFinished(int, QProcess::ExitStatus)) ); - connect( d->process, SIGNAL(readyRead()), - this, SLOT(slotExternalProgramOutput()) ); + connect( d->process, SIGNAL(stderrLine(QString)), + this, SLOT(slotExternalProgramOutput(QString)) ); + connect( d->process, SIGNAL(stdoutLine(QString)), + this, SLOT(slotExternalProgramOutput(QString)) ); d->process->setProgram( params ); - d->process->start(); + d->process->start( KProcess::SeparateChannels ); if( d->process->waitForStarted() ) { if( d->cmd.writeWaveHeader ) @@ -291,10 +293,9 @@ } -void K3bExternalEncoder::slotExternalProgramOutput() +void K3bExternalEncoder::slotExternalProgramOutput( const QString& line ) { - while ( d->process->canReadLine() ) - kDebug() << "(" << d->cmd.name << ") " << d->process->readLine(); + kDebug() << "(" << d->cmd.name << ") " << line; } --- branches/k3b/2.0/plugins/encoder/external/k3bexternalencoder.h #1144808:1144809 @@ -43,7 +43,7 @@ private Q_SLOTS: void slotExternalProgramFinished( int, QProcess::ExitStatus ); - void slotExternalProgramOutput(); + void slotExternalProgramOutput( const QString& line ); private: virtual bool initEncoderInternal( const QString& extension, const K3b::Msf& length, const MetaData& metaData );