diff --git a/src/track/serato/markers.cpp b/src/track/serato/markers.cpp index a6b6845983a..7fa76b2607f 100644 --- a/src/track/serato/markers.cpp +++ b/src/track/serato/markers.cpp @@ -270,7 +270,7 @@ QByteArray SeratoMarkers::dump() const { return data; } -QList SeratoMarkers::getCues() const { +QList SeratoMarkers::getCues(double timingOffsetMillis) const { qDebug() << "Reading cues from 'Serato Markers_' tag data..."; QList cueInfos; @@ -281,7 +281,7 @@ QList SeratoMarkers::getCues() const { case SeratoMarkersEntry::TypeId::Cue: { CueInfo cueInfo( CueType::HotCue, - pEntry->getStartPosition(), + pEntry->getStartPosition() + timingOffsetMillis, std::nullopt, cueIndex, "", diff --git a/src/track/serato/markers.h b/src/track/serato/markers.h index 1081c82913f..2e9d9084bb6 100644 --- a/src/track/serato/markers.h +++ b/src/track/serato/markers.h @@ -155,7 +155,7 @@ class SeratoMarkers final { m_trackColor = color; } - QList getCues() const; + QList getCues(double timingOffsetMillis) const; private: QList m_entries; diff --git a/src/track/serato/markers2.cpp b/src/track/serato/markers2.cpp index b574a0ec271..908eb3ba92b 100644 --- a/src/track/serato/markers2.cpp +++ b/src/track/serato/markers2.cpp @@ -438,7 +438,7 @@ QByteArray SeratoMarkers2::dump() const { return outerData.leftJustified(size, '\0'); } -QList SeratoMarkers2::getCues() const { +QList SeratoMarkers2::getCues(double timingOffsetMillis) const { qDebug() << "Reading cues from 'Serato Markers2' tag data..."; QList cueInfos; for (auto& pEntry : m_entries) { @@ -448,7 +448,7 @@ QList SeratoMarkers2::getCues() const { const SeratoMarkers2CueEntry* pCueEntry = static_cast(pEntry.get()); CueInfo cueInfo( CueType::HotCue, - pCueEntry->getPosition(), + pCueEntry->getPosition() + timingOffsetMillis, std::nullopt, pCueEntry->getIndex(), pCueEntry->getLabel(), diff --git a/src/track/serato/markers2.h b/src/track/serato/markers2.h index fb87f7f9f11..52b396f6233 100644 --- a/src/track/serato/markers2.h +++ b/src/track/serato/markers2.h @@ -398,7 +398,7 @@ class SeratoMarkers2 final { m_entries = std::move(entries); } - QList getCues() const; + QList getCues(double timingOffsetMillis) const; RgbColor::optional_t getTrackColor() const; bool isBpmLocked() const; diff --git a/src/track/serato/tags.cpp b/src/track/serato/tags.cpp index 318cccaebf8..a97dd7fed53 100644 --- a/src/track/serato/tags.cpp +++ b/src/track/serato/tags.cpp @@ -59,14 +59,23 @@ RgbColor SeratoTags::displayedToStoredTrackColor(RgbColor::optional_t color) { return RgbColor(colorCode); } -QList SeratoTags::getCues() const { +double SeratoTags::findTimingOffsetMillis(const QString& filePath) { + // TODO: Find timing offset using mp3guessenc + Q_UNUSED(filePath); + + return 0; +} + +QList SeratoTags::getCues(const QString& filePath) const { // Import "Serato Markers2" first, then overwrite values with those // from "Serato Markers_". This is what Serato does too (i.e. if // "Serato Markers_" and "Serato Markers2" contradict each other, // Serato will use the values from "Serato Markers_"). + double timingOffsetMillis = SeratoTags::findTimingOffsetMillis(filePath); + QMap cueMap; - for (const CueInfo& cueInfo : m_seratoMarkers2.getCues()) { + for (const CueInfo& cueInfo : m_seratoMarkers2.getCues(timingOffsetMillis)) { DEBUG_ASSERT(cueInfo.getHotCueNumber()); int index = *cueInfo.getHotCueNumber(); DEBUG_ASSERT(index >= 0); @@ -75,7 +84,7 @@ QList SeratoTags::getCues() const { // TODO: If a hotcue is set in SeratoMarkers2, but not in SeratoMarkers_, // we could remove it from the output. We'll just leave it in for now. - for (const CueInfo& cueInfo : m_seratoMarkers.getCues()) { + for (const CueInfo& cueInfo : m_seratoMarkers.getCues(timingOffsetMillis)) { DEBUG_ASSERT(cueInfo.getHotCueNumber()); int index = *cueInfo.getHotCueNumber(); DEBUG_ASSERT(index >= 0); diff --git a/src/track/serato/tags.h b/src/track/serato/tags.h index 025da901722..cacea53c3cb 100644 --- a/src/track/serato/tags.h +++ b/src/track/serato/tags.h @@ -17,6 +17,7 @@ class SeratoTags final { static RgbColor::optional_t storedToDisplayedTrackColor(RgbColor color); static RgbColor displayedToStoredTrackColor(RgbColor::optional_t color); + static double findTimingOffsetMillis(const QString& filePath); bool isEmpty() const { return m_seratoMarkers.isEmpty() && m_seratoMarkers2.isEmpty(); @@ -38,7 +39,7 @@ class SeratoTags final { return m_seratoMarkers2.dump(); } - QList getCues() const; + QList getCues(const QString& filePath) const; RgbColor::optional_t getTrackColor() const; bool isBpmLocked() const; diff --git a/src/track/track.cpp b/src/track/track.cpp index 7e559656796..574f2579fa8 100644 --- a/src/track/track.cpp +++ b/src/track/track.cpp @@ -158,7 +158,7 @@ void Track::importMetadata( // FIXME: Move the Track::setCuePoints call to another location, // because we need the sample rate to calculate sample // positions for cues (and *correct* sample rate isn't known here). - setCuePoints(newSeratoTags.getCues()); + setCuePoints(newSeratoTags.getCues(getLocation())); setColor(newSeratoTags.getTrackColor()); setBpmLocked(newSeratoTags.isBpmLocked()); #endif // __EXTRA_METADATA__