From a0bc9392569e5665f7469776fee789107743706e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 28 Apr 2011 19:28:02 +0000 Subject: [PATCH] * Correctly detect Enhanced CDs, and take their extra lead gap into account. * This fixes bug #3025. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41290 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/cdda/cdda.h | 3 ++- .../kernel/file_systems/cdda/kernel_interface.cpp | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/cdda/cdda.h b/src/add-ons/kernel/file_systems/cdda/cdda.h index 293a0d3260..3bcf00a572 100644 --- a/src/add-ons/kernel/file_systems/cdda/cdda.h +++ b/src/add-ons/kernel/file_systems/cdda/cdda.h @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2007-2011, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ #ifndef CDDA_H @@ -12,6 +12,7 @@ static const uint32 kFramesPerSecond = 75; static const uint32 kFramesPerMinute = kFramesPerSecond * 60; static const uint32 kFrameSize = 2352; +static const uint32 kDataTrackLeadGap = 11400; static const uint8 kMaxTracks = 0x63; struct cdtext { diff --git a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp index ab28f8f9a5..1a78ad4b66 100644 --- a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp @@ -653,10 +653,10 @@ Volume::Mount(const char* device) // We do not seem to have an attribute file so this is probably the // first time this CD is inserted. In this case, try to read CD-Text // data. - if (read_cdtext(fDevice, text) != B_OK) - dprintf("CDDA: no CD-Text found.\n"); - else + if (read_cdtext(fDevice, text) == B_OK) doLookup = false; + else + TRACE(("CDDA: no CD-Text found.\n")); } else { doLookup = false; } @@ -677,6 +677,12 @@ Volume::Mount(const char* device) + next.second * kFramesPerSecond + next.frame - startFrame; + // Adjust length of the last audio track according to the Blue Book + // specification in case of an Enhanced CD + if (i + 1 < trackCount && is_data_track(toc->tracks[i + 1]) + && !is_data_track(toc->tracks[i])) + frames -= kDataTrackLeadGap; + totalFrames += frames; if (is_data_track(toc->tracks[i]))