Explorar o código

Set file_offset to start of actual track.

saybur %!s(int64=2) %!d(string=hai) anos
pai
achega
f52687e022
Modificáronse 2 ficheiros con 10 adicións e 6 borrados
  1. 7 3
      lib/CUEParser/src/CUEParser.cpp
  2. 3 3
      src/BlueSCSI_cdrom.cpp

+ 7 - 3
lib/CUEParser/src/CUEParser.cpp

@@ -57,7 +57,7 @@ void CUEParser::restart()
 const CUETrackInfo *CUEParser::next_track()
 {
     // Previous track info is needed to track file offset
-    uint32_t prev_data_start = m_track_info.data_start;
+    uint32_t prev_track_start = m_track_info.track_start;
     uint32_t prev_sector_length = get_sector_length(m_track_info.file_mode, m_track_info.track_mode); // Defaults to 2352 before first track
 
     bool got_track = false;
@@ -71,7 +71,7 @@ const CUETrackInfo *CUEParser::next_track()
             m_track_info.file_mode = parse_file_mode(skip_space(p));
             m_track_info.file_offset = 0;
             m_track_info.track_mode = CUETrack_AUDIO;
-            prev_data_start = 0;
+            prev_track_start = 0;
             prev_sector_length = get_sector_length(m_track_info.file_mode, m_track_info.track_mode);
         }
         else if (strncasecmp(m_parse_pos, "TRACK ", 6) == 0)
@@ -109,7 +109,6 @@ const CUETrackInfo *CUEParser::next_track()
             }
             else if (index == 1)
             {
-                m_track_info.file_offset += (uint64_t)(time - prev_data_start) * prev_sector_length;
                 m_track_info.data_start = time;
                 got_data = true;
             }
@@ -124,9 +123,14 @@ const CUETrackInfo *CUEParser::next_track()
     }
 
     if (got_track && got_data)
+    {
+        m_track_info.file_offset += (uint64_t)(m_track_info.track_start - prev_track_start) * prev_sector_length;
         return &m_track_info;
+    }
     else
+    {
         return nullptr;
+    }
 }
 
 bool CUEParser::start_line()

+ 3 - 3
src/BlueSCSI_cdrom.cpp

@@ -230,7 +230,7 @@ static uint32_t getLeadOutLBA(const CUETrackInfo* lasttrack)
         image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
         uint32_t lastTrackBlocks = (img.file.size() - lasttrack->file_offset)
                 / lasttrack->sector_length;
-        return lasttrack->data_start + lastTrackBlocks + 1;
+        return lasttrack->track_start + lastTrackBlocks + 1;
     }
     else
     {
@@ -976,7 +976,7 @@ static void doPlayAudio(uint32_t lba, uint32_t length)
         }
 
         uint64_t offset = trackinfo.file_offset
-                + trackinfo.sector_length * (lba - trackinfo.data_start);
+                + trackinfo.sector_length * (lba - trackinfo.track_start);
         debuglog("------ Play audio CD: ", (int)length, " sectors starting at ", (int)lba,
            ", track number ", trackinfo.track_number, ", data offset in file ", (int)offset);
 
@@ -1120,7 +1120,7 @@ static void doReadCD(uint32_t lba, uint32_t length, uint8_t sector_type,
     getTrackFromLBA(parser, lba, &trackinfo);
 
     // Figure out the data offset in the file
-    uint64_t offset = trackinfo.file_offset + trackinfo.sector_length * (lba - trackinfo.data_start);
+    uint64_t offset = trackinfo.file_offset + trackinfo.sector_length * (lba - trackinfo.track_start);
     debuglog("------ Read CD: ", (int)length, " sectors starting at ", (int)lba,
            ", track number ", trackinfo.track_number, ", sector size ", (int)trackinfo.sector_length,
            ", main channel ", main_channel, ", sub channel ", sub_channel,