SVN commit 1144817 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 --- trunk/extragear/multimedia/k3b/ChangeLog #1144816:1144817 @@ -4,6 +4,11 @@ * Added dynamic hiding of irrelevant actions in mixed project (142954) * Added sorting in data project view (191660) +2.0.1 +===== +Bugfixes: + * Freeze on ripping Audio CD using external encoder to MP3 or FLAC (236466) + 2.0 === Changes (since 1.0.5): --- trunk/extragear/multimedia/k3b/plugins/encoder/external/k3bexternalencoder.cpp #1144816:1144817 @@ -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; } --- trunk/extragear/multimedia/k3b/plugins/encoder/external/k3bexternalencoder.h #1144816:1144817 @@ -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 );