diff --git a/devices/cdparanoia.cpp b/devices/cdparanoia.cpp index b750d0f05..13825ffd5 100644 --- a/devices/cdparanoia.cpp +++ b/devices/cdparanoia.cpp @@ -30,12 +30,13 @@ static QSet lockedDevices; static QMutex mutex; -CdParanoia::CdParanoia(const QString &device, bool full, bool noSkip, bool playback) +CdParanoia::CdParanoia(const QString &device, bool full, bool noSkip, bool playback, int offset) : drive(0) , paranoia(0) , paranoiaMode(0) , neverSkip(noSkip) , maxRetries(20) + , seekOffst(offset) { QMutexLocker locker(&mutex); if (!lockedDevices.contains(device)) { @@ -103,9 +104,9 @@ qint16 * CdParanoia::read() int CdParanoia::seek(long sector, int mode) { #ifdef CDIOPARANOIA_FOUND - return paranoia ? cdio_paranoia_seek(paranoia, sector, mode) : -1; + return paranoia ? cdio_paranoia_seek(paranoia, sector+seekOffst, mode) : -1; #else - return paranoia ? paranoia_seek(paranoia, sector, mode) : -1; + return paranoia ? paranoia_seek(paranoia, sector+seekOffst, mode) : -1; #endif } diff --git a/devices/cdparanoia.h b/devices/cdparanoia.h index e20b606b3..eeed2d281 100644 --- a/devices/cdparanoia.h +++ b/devices/cdparanoia.h @@ -51,7 +51,7 @@ extern "C" { class CdParanoia { public: - CdParanoia(const QString &device, bool full, bool noSkip, bool playback=false); + explicit CdParanoia(const QString &device, bool full, bool noSkip, bool playback, int offset); ~CdParanoia(); inline operator bool() const { return !dev.isEmpty(); } @@ -90,6 +90,7 @@ private: int paranoiaMode; bool neverSkip; int maxRetries; + int seekOffst; }; #endif diff --git a/devices/extractjob.cpp b/devices/extractjob.cpp index bd87f6ba0..1b1f95e68 100644 --- a/devices/extractjob.cpp +++ b/devices/extractjob.cpp @@ -87,7 +87,7 @@ void ExtractJob::run() emit result(Device::Cancelled); } else { QStringList encParams=encoder.params(value, encoder.transcoder ? "pipe:" : "-", destFile); - CdParanoia cdparanoia(srcFile, Settings::self()->paranoiaFull(), Settings::self()->paranoiaNeverSkip()); + CdParanoia cdparanoia(srcFile, Settings::self()->paranoiaFull(), Settings::self()->paranoiaNeverSkip(), false, Settings::self()->paranoiaOffset()); if (!cdparanoia) { emit result(Device::FailedToLockDevice); diff --git a/gui/settings.cpp b/gui/settings.cpp index 7b0fa5a58..ac8803a68 100644 --- a/gui/settings.cpp +++ b/gui/settings.cpp @@ -537,6 +537,11 @@ bool Settings::paranoiaNeverSkip() { return cfg.get("paranoiaNeverSkip", true); } + +int Settings::paranoiaOffset() +{ + return cfg.get("paranoiaOffset", 0); +} #endif #if defined CDDB_FOUND && defined MUSICBRAINZ5_FOUND @@ -1012,6 +1017,11 @@ void Settings::saveParanoiaNeverSkip(bool v) { cfg.set("paranoiaNeverSkip", v); } + +void Settings::saveParanoiaOffset(int v) +{ + cfg.set("paranoiaOffset", v); +} #endif #if defined CDDB_FOUND && defined MUSICBRAINZ5_FOUND diff --git a/gui/settings.h b/gui/settings.h index 59102bbd7..545048182 100644 --- a/gui/settings.h +++ b/gui/settings.h @@ -108,6 +108,7 @@ public: bool cdAuto(); bool paranoiaFull(); bool paranoiaNeverSkip(); + int paranoiaOffset(); #endif #if defined CDDB_FOUND && defined MUSICBRAINZ5_FOUND bool useCddb(); @@ -211,6 +212,7 @@ public: void saveCdAuto(bool v); void saveParanoiaFull(bool v); void saveParanoiaNeverSkip(bool v); + void saveParanoiaOffset(int v); #endif #if defined CDDB_FOUND && defined MUSICBRAINZ5_FOUND void saveUseCddb(bool v); diff --git a/http/httpsocket.cpp b/http/httpsocket.cpp index 8c9b71dae..3da75475c 100644 --- a/http/httpsocket.cpp +++ b/http/httpsocket.cpp @@ -292,7 +292,7 @@ void HttpSocket::readClient() QStringList parts=song.file.split("/", QString::SkipEmptyParts); if (parts.length()>=3) { QString dev=QLatin1Char('/')+parts.at(1)+QLatin1Char('/')+parts.at(2); - CdParanoia cdparanoia(dev, false, false, true); + CdParanoia cdparanoia(dev, false, false, true, Settings::self()->paranoiaOffset()); if (cdparanoia) { int firstSector = cdparanoia.firstSectorOfTrack(song.id);