--- b/libk3b/core/k3bdefaultexternalprograms.cpp +++ a/libk3b/core/k3bdefaultexternalprograms.cpp @@ -172,13 +172,16 @@ QString K3b::AbstractCdrtoolsProgram::versionIdentifier( const ExternalBin& bin K3b::CdrecordProgram::CdrecordProgram() - : K3b::AbstractCdrtoolsProgram( QLatin1String( "cdrecord" ), QLatin1String("cdrecord") ) + : K3b::AbstractCdrtoolsProgram( QLatin1String( "cdrecord" ), QLatin1String( "wodim" ) ) { } void K3b::CdrecordProgram::parseFeatures( const QString& output, ExternalBin& bin ) const { + if( usingCdrkit( bin ) ) + bin.addFeature( "wodim" ); + if( bin.version().suffix().endsWith( "-dvd" ) ) { bin.addFeature( "dvd-patch" ); bin.setVersion( QString(bin.version().versionString()).remove("-dvd") ); --- b/libk3b/jobs/k3bdvdcopyjob.cpp +++ a/libk3b/jobs/k3bdvdcopyjob.cpp @@ -171,7 +171,7 @@ void K3b::DvdCopyJob::slotDiskInfoReady( if ( d->usedWritingApp == K3b::WritingAppAuto ) { // prefer growisofs to wodim, which doesn't work all that great for DVDs // (and doesn't support BluRay at all) - if (true) + if ( k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "wodim" ) ) d->usedWritingApp = K3b::WritingAppGrowisofs; // otherwise, let's default to cdrecord for the time being // FIXME: use growisofs for non-dao and non-auto mode --- b/libk3b/jobs/k3bmetawriter.cpp +++ a/libk3b/jobs/k3bmetawriter.cpp @@ -266,6 +266,7 @@ bool K3b::MetaWriter::determineUsedAppAndMode() cdrecordOnTheFly = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "audio-stdin" ); cdrecordCdText = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "cdtext" ); cdrecordBluRay = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "blu-ray" ); + cdrecordWodim = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "wodim" ); } if( k3bcore->externalBinManager()->binObject("growisofs") ) { growisofsBluRay = k3bcore->externalBinManager()->binObject("growisofs")->hasFeature( "blu-ray" ); --- b/libk3b/projects/datacd/k3bdatajob.cpp +++ a/libk3b/projects/datacd/k3bdatajob.cpp @@ -811,9 +811,12 @@ bool K3b::DataJob::waitForBurnMedium() d->usedWritingApp = writingApp(); // let's default to cdrecord for the time being (except for special cases below) - // but prefer growisofs for DVDs + // but prefer growisofs to wodim for DVDs if ( d->usedWritingApp == K3b::WritingAppAuto ) { - d->usedWritingApp = K3b::WritingAppCdrecord; + if (k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "wodim" )) + d->usedWritingApp = K3b::WritingAppGrowisofs; + else + d->usedWritingApp = K3b::WritingAppCdrecord; } // ------------------------------- @@ -929,7 +932,10 @@ bool K3b::DataJob::waitForBurnMedium() else if ( foundMedium & K3b::Device::MEDIA_BD_ALL ) { d->usedWritingApp = writingApp(); if( d->usedWritingApp == K3b::WritingAppAuto ) { - d->usedWritingApp = K3b::WritingAppCdrecord; + if (k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "wodim" )) + d->usedWritingApp = K3b::WritingAppGrowisofs; + else + d->usedWritingApp = K3b::WritingAppCdrecord; } if ( d->usedWritingApp == K3b::WritingAppCdrecord && --- b/libk3b/projects/k3bcdrecordwriter.cpp +++ a/libk3b/projects/k3bcdrecordwriter.cpp @@ -399,7 +399,7 @@ void K3b::CdrecordWriter::start() if( !d->cdrecordBinObject->copyright().isEmpty() ) emit infoMessage( i18n("Using %1 %2 – Copyright © %3" - ,QLatin1String("Cdrecord") + ,(d->cdrecordBinObject->hasFeature( "wodim" ) ? "Wodim" : "Cdrecord" ) ,d->cdrecordBinObject->version() ,d->cdrecordBinObject->copyright()), MessageInfo ); --- b/libk3bdevice/k3bdevice.cpp +++ a/libk3bdevice/k3bdevice.cpp @@ -3611,7 +3611,7 @@ int K3b::Device::Device::nextWritableAddress() const // // The state of the last session has to be "empty" (0x0) or "incomplete" (0x1) - // The procedure here is taken from the dvd+rw-tools + // The procedure here is taken from the dvd+rw-tools and wodim // if( !(inf->border & 0x2) ) { // the incomplete track number is the first track in the last session (the empty session) --- b/src/k3bsystemproblemdialog.cpp +++ a/src/k3bsystemproblemdialog.cpp @@ -231,7 +231,8 @@ void K3b::SystemProblemDialog::checkSystem( QWidget* parent, NotificationLevel l // Kernel 2.6.16.something seems to introduce another problem which was apparently worked around in cdrecord 2.01.01a05 // if( K3b::simpleKernelVersion() >= K3b::Version( 2, 6, 8 ) && - k3bcore->externalBinManager()->binObject( "cdrecord" )->version() < K3b::Version( 2, 1, 1, "a05" ) ) { + k3bcore->externalBinManager()->binObject( "cdrecord" )->version() < K3b::Version( 2, 1, 1, "a05" ) && + !k3bcore->externalBinManager()->binObject( "cdrecord" )->hasFeature( "wodim" ) ) { if( k3bcore->externalBinManager()->binObject( "cdrecord" )->hasFeature( "suidroot" ) ) { showBinSettingsButton = true; problems.append( K3b::SystemProblem( K3b::SystemProblem::CRITICAL, --- b/src/option/k3bexternalbinpermissionmodel.cpp +++ a/src/option/k3bexternalbinpermissionmodel.cpp @@ -46,7 +46,8 @@ bool shouldRunSuidRoot( const K3b::ExternalBin* bin ) if( bin->name() == "cdrecord" ) { return ( K3b::simpleKernelVersion() < K3b::Version( 2, 6, 8 ) || - bin->version() >= K3b::Version( 2, 1, 1, "a05" ) ); + bin->version() >= K3b::Version( 2, 1, 1, "a05" ) || + bin->hasFeature( "wodim" ) ); } else if( bin->name() == "cdrdao" ) { return true;