[Scummvm-git-logs] scummvm master -> dea1412b3b4ab05fc8bce00b5f16fd3f21ffc503

sev- noreply at scummvm.org
Thu Oct 12 21:54:57 UTC 2023


This automated email contains information about 14 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
5284c8d7a0 COMMON: Addeed initial stub for CueSheet class
9f3b4b6128 COMMON: Parsing FILE token in CueSheets
7c2514fe1d COMMON: Added parsing of cue sheet metadata to the CueSheet
fef7a4b72d COMMON: Added track parsing to the CueSheet
41d7ca4c19 COMMON: Skip comments in CueSheets
9c0eb812d0 DIRECTOR: Added test for parsing Cue Sheets
4bd9e71f59 COMMON: Parse track performer in cue sheets
824d28ff5e COMMON: Parse pregap for tracks in cue sheet
c5a71570f0 COMMON: Added parsing of catalog and Cue track flags
462870c64d COMMON: Lookup track sector sizes for CueSheet
12cf6c9988 COMMON: Improve debug output in CueSheet
3e32fd3776 COMMON: Added another constructor for CueSheet
587d770786 COMMON: Shortened constant names in CueSheet class
dea1412b3b COMMON: Fix warnings


Commit: 5284c8d7a0c42da9956c96d0197a0c60b7f29a41
    https://github.com/scummvm/scummvm/commit/5284c8d7a0c42da9956c96d0197a0c60b7f29a41
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Addeed initial stub for CueSheet class

Changed paths:
  A common/formats/cue.cpp
  A common/formats/cue.h
    common/formats/module.mk


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
new file mode 100644
index 00000000000..58a5ee4c26e
--- /dev/null
+++ b/common/formats/cue.cpp
@@ -0,0 +1,118 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/formats/cue.h"
+
+namespace Common {
+
+enum {
+	kCueContextHeader,
+	kCueContextFiles,
+	kCueContextTracks,
+};
+
+static String nexttok(const char *s, const char **newP = nullptr) {
+	String res;
+
+	// Scan first non-whitespace
+	while (*s && (*s == ' ' || *s == '\t')) // If we see a whitespace
+		s++;
+
+	if (*s == '"') { // If it is a string then scan till end quote
+		s++; // skip the quote
+
+		while (*s && *s != '"')
+			res += *s++;
+
+		if (*s == '"')
+			s++;
+	} else {
+		while (*s && *s != ' ' && *s != '\t' && *s != '\n' && *s != '\r')
+			res += *s++;
+	}
+
+	if (newP)
+		*newP = s;
+
+	return res;
+}
+
+
+CueSheet::CueSheet(const char *sheet) {
+	String line;
+	_context = kCueContextHeader;
+	const char *s = sheet;
+	int lineNum = 0;
+
+	while (*s) {
+		line.clear();
+
+		// Get a line
+		while (*s && *s != '\n' && *s != '\r') // If we see a whitespace
+			line += *s++;
+
+		// Skip any newlines and line feeds
+		while (*s == '\n' || *s == '\r') {
+			if (*s == '\n')
+				lineNum++;
+
+			s++;
+		}
+
+
+		if (line.empty())
+			continue;
+
+		String firstToken = nexttok(line.c_str()); // Peek into comments
+
+		// Skip non-conformant comments
+		if (firstToken[0] == ';' || (firstToken.size() > 1 && firstToken[0] == '/' && firstToken[1] == '/'))
+			continue;
+
+		switch (_context) {
+		case kCueContextHeader:
+			parseHeaderContext(line.c_str());
+			break;
+
+		case kCueContextFiles:
+			parseFilesContext(line.c_str());
+			break;
+
+		case kCueContextTracks:
+			parseTracksContext(line.c_str());
+			break;
+
+		default:
+			error("CueSheet: bad context %d at line %d", _context, lineNum);
+		}
+	}
+}
+
+void CueSheet::parseHeaderContext(const char *line) {
+}
+
+void CueSheet::parseFilesContext(const char *line) {
+}
+
+void CueSheet::parseTracksContext(const char *line) {
+}
+
+} // End of namespace Common
diff --git a/common/formats/cue.h b/common/formats/cue.h
new file mode 100644
index 00000000000..5aae53d995d
--- /dev/null
+++ b/common/formats/cue.h
@@ -0,0 +1,51 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef COMMON_FORMATS_CUE_H
+#define COMMON_FORMATS_CUE_H
+
+#include "common/hash-str.h"
+#include "common/str.h"
+#include "common/types.h"
+
+namespace Common {
+
+class SeekableReadStream;
+
+/**
+ * A class able to load and parse Cue sheets
+ */
+class CueSheet {
+public:
+	CueSheet(const char *sheet);
+
+private:
+	void parseHeaderContext(const char *line);
+	void parseFilesContext(const char *line);
+	void parseTracksContext(const char *line);
+
+private:
+	int _context;
+};
+
+} // End of namespace Common
+
+#endif
diff --git a/common/formats/module.mk b/common/formats/module.mk
index d653c43c9ef..c0626152c1d 100644
--- a/common/formats/module.mk
+++ b/common/formats/module.mk
@@ -1,6 +1,7 @@
 MODULE := common/formats
 
 MODULE_OBJS := \
+	cue.o \
 	formatinfo.o \
 	iff_container.o \
 	ini-file.o \


Commit: 9f3b4b6128bd32720188b81c1afdb7d116bc54ef
    https://github.com/scummvm/scummvm/commit/9f3b4b6128bd32720188b81c1afdb7d116bc54ef
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Parsing FILE token in CueSheets

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 58a5ee4c26e..6302f61ff09 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -19,6 +19,7 @@
  *
  */
 
+#include "common/str.h"
 #include "common/formats/cue.h"
 
 namespace Common {
@@ -106,7 +107,50 @@ CueSheet::CueSheet(const char *sheet) {
 	}
 }
 
+struct LookupTable {
+	const char *key;
+	int value;
+};
+
+static int lookupInTable(LookupTable *table, const char *key) {
+	while (table->key) {
+		if (!strcmp(key, table->key))
+			return table->value;
+
+		table++;
+	}
+
+	error("CueSheet::lookupInTable(): Unknown token %s", key);
+}
+
+LookupTable fileTypes[] = {
+	{ "BINARY",   CueSheet::kCueFileTypeBinary },
+	{ "AIFF",     CueSheet::kCueFileTypeAIFF },
+	{ "WAVE",     CueSheet::kCueFileTypeWave },
+	{ "MP3",      CueSheet::kCueFileTypeMP3 },
+	{ "MOTOROLA", CueSheet::kCueFileTypeMotorola },
+	{ 0, 0 }
+};
+
 void CueSheet::parseHeaderContext(const char *line) {
+	const char *s = line;
+
+	String command = nexttok(s, &s);
+
+	if (command == "FILE") {
+		_files.push_back(CueFile());
+
+		_currentFile++;
+
+		_files[_currentFile].name = nexttok(s, &s);
+
+		String type = nexttok(s, &s);
+
+		_files[_currentFile].type = kCueFileTypeBinary;
+		_files[_currentFile].type = (CueFileType)lookupInTable(fileTypes, type.c_str());
+
+		_context = kCueContextFiles;
+	}
 }
 
 void CueSheet::parseFilesContext(const char *line) {
diff --git a/common/formats/cue.h b/common/formats/cue.h
index 5aae53d995d..85af559162a 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -22,9 +22,7 @@
 #ifndef COMMON_FORMATS_CUE_H
 #define COMMON_FORMATS_CUE_H
 
-#include "common/hash-str.h"
-#include "common/str.h"
-#include "common/types.h"
+#include "common/array.h"
 
 namespace Common {
 
@@ -37,6 +35,20 @@ class CueSheet {
 public:
 	CueSheet(const char *sheet);
 
+public:
+	enum CueFileType {
+		kCueFileTypeBinary,
+		kCueFileTypeAIFF,
+		kCueFileTypeWave,
+		kCueFileTypeMP3,
+		kCueFileTypeMotorola,
+	};
+
+	struct CueFile {
+		String name;
+		CueFileType type = kCueFileTypeBinary;
+	};
+
 private:
 	void parseHeaderContext(const char *line);
 	void parseFilesContext(const char *line);
@@ -44,6 +56,9 @@ private:
 
 private:
 	int _context;
+	int _currentFile = -1;
+
+	Common::Array<CueFile> _files;
 };
 
 } // End of namespace Common


Commit: 7c2514fe1dde6933b5c286173c085789d562c025
    https://github.com/scummvm/scummvm/commit/7c2514fe1dde6933b5c286173c085789d562c025
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Added parsing of cue sheet metadata to the CueSheet

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 6302f61ff09..9ba0438b1ef 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -19,7 +19,7 @@
  *
  */
 
-#include "common/str.h"
+#include "common/debug.h"
 #include "common/formats/cue.h"
 
 namespace Common {
@@ -150,9 +150,42 @@ void CueSheet::parseHeaderContext(const char *line) {
 		_files[_currentFile].type = (CueFileType)lookupInTable(fileTypes, type.c_str());
 
 		_context = kCueContextFiles;
+
+		debug(5, "File: %s, type: %s (%d)", _files[_currentFile].name.c_str(), type.c_str(), _files[_currentFile].type);
+	} else if (command == "TITLE") {
+		_metadata.title = nexttok(s, &s);
+
+		debug(5, "Title: %s", _metadata.title.c_str());
+	} else if (command == "REM") {
+		String subcommand = nexttok(s, &s);
+
+		if (subcommand == "DATE") {
+			_metadata.date = nexttok(s, &s);
+			debug(5, "Date: %s", _metadata.date.c_str());
+		} else if (subcommand == "GENRE") {
+			_metadata.genre = nexttok(s, &s);
+			debug(5, "Genre: %s", _metadata.genre.c_str());
+		} else {
+			warning("Unprocessed REM subcommand %s", subcommand.c_str());
+		}
 	}
 }
 
+LookupTable trackTypes[] = {
+	{ "AUDIO",      CueSheet::kCueFileTypeAudio }, // Audio (sector size: 2352)
+	{ "CDG",        CueSheet::kCueFileTypeCDG }, // Karaoke CD+G (sector size: 2448)
+	{ "MODE1_RAW",  CueSheet::kCueFileTypeMode1_Raw }, // CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
+	{ "MODE1/2048", CueSheet::kCueFileTypeMode1_2048 }, // CD-ROM Mode 1 data (cooked) (sector size: 2048)
+	{ "MODE1/2352", CueSheet::kCueFileTypeMode1_2352 }, // CD-ROM Mode 1 data (raw) (sector size: 2352)
+	{ "MODE2_RAW",  CueSheet::kCueFileTypeMode2_Raw }, // CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
+	{ "MODE2/2048", CueSheet::kCueFileTypeMode2_2048 }, // CD-ROM Mode 2 XA form-1 data (sector size: 2048)
+	{ "MODE2/2324", CueSheet::kCueFileTypeMode2_2324 }, // CD-ROM Mode 2 XA form-2 data (sector size: 2324)
+	{ "MODE2/2336", CueSheet::kCueFileTypeMode2_2366 }, // CD-ROM Mode 2 data (sector size: 2336)
+	{ "MODE2/2352", CueSheet::kCueFileTypeMode2_2352 }, // CD-ROM Mode 2 data (raw) (sector size: 2352)
+	{ "CDI/2336",   CueSheet::kCueFileTypeCDI_2336 }, // CDI Mode 2 data
+	{ "CDI/2352",   CueSheet::kCueFileTypeCDI_2352 }, // CDI Mode 2 data
+};
+
 void CueSheet::parseFilesContext(const char *line) {
 }
 
diff --git a/common/formats/cue.h b/common/formats/cue.h
index 85af559162a..bdf0c48f6b3 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -44,11 +44,38 @@ public:
 		kCueFileTypeMotorola,
 	};
 
+	enum CueTrackType {
+		kCueFileTypeAudio,
+		kCueFileTypeCDG,
+		kCueFileTypeMode1_Raw,
+		kCueFileTypeMode1_2048,
+		kCueFileTypeMode1_2352,
+		kCueFileTypeMode2_Raw,
+		kCueFileTypeMode2_2048,
+		kCueFileTypeMode2_2324,
+		kCueFileTypeMode2_2366,
+		kCueFileTypeMode2_2352,
+		kCueFileTypeCDI_2336,
+		kCueFileTypeCDI_2352,
+	};
+
+	struct CueTrack {
+		int number = 0;
+		CueTrackType type;
+		String title;
+	};
+
 	struct CueFile {
 		String name;
 		CueFileType type = kCueFileTypeBinary;
 	};
 
+	struct CueMetadate {
+		String title;
+		String date;
+		String genre;
+	};
+
 private:
 	void parseHeaderContext(const char *line);
 	void parseFilesContext(const char *line);
@@ -58,7 +85,8 @@ private:
 	int _context;
 	int _currentFile = -1;
 
-	Common::Array<CueFile> _files;
+	Array<CueFile> _files;
+	CueMetadate _metadata;
 };
 
 } // End of namespace Common


Commit: fef7a4b72dcf0effe52da872b154177fb6cfc2f6
    https://github.com/scummvm/scummvm/commit/fef7a4b72dcf0effe52da872b154177fb6cfc2f6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Added track parsing to the CueSheet

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 9ba0438b1ef..312fc3ea522 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -61,7 +61,6 @@ CueSheet::CueSheet(const char *sheet) {
 	String line;
 	_context = kCueContextHeader;
 	const char *s = sheet;
-	int lineNum = 0;
 
 	while (*s) {
 		line.clear();
@@ -73,7 +72,7 @@ CueSheet::CueSheet(const char *sheet) {
 		// Skip any newlines and line feeds
 		while (*s == '\n' || *s == '\r') {
 			if (*s == '\n')
-				lineNum++;
+				_lineNum++;
 
 			s++;
 		}
@@ -102,7 +101,7 @@ CueSheet::CueSheet(const char *sheet) {
 			break;
 
 		default:
-			error("CueSheet: bad context %d at line %d", _context, lineNum);
+			error("CueSheet: bad context %d at line %d", _context, _lineNum);
 		}
 	}
 }
@@ -123,6 +122,15 @@ static int lookupInTable(LookupTable *table, const char *key) {
 	error("CueSheet::lookupInTable(): Unknown token %s", key);
 }
 
+int CueSheet::parseMSF(const char *str) {
+	int min = 0, sec = 0, frm = 0;
+
+	if (sscanf(str, "%d:%d:%d", &min, &sec, &frm) != 3)
+		warning("Malformed MSF at line %d: %s", _lineNum, str);
+
+	return frm + 75 * sec + 75 * 60 * min;
+}
+
 LookupTable fileTypes[] = {
 	{ "BINARY",   CueSheet::kCueFileTypeBinary },
 	{ "AIFF",     CueSheet::kCueFileTypeAIFF },
@@ -151,11 +159,17 @@ void CueSheet::parseHeaderContext(const char *line) {
 
 		_context = kCueContextFiles;
 
+		_currentTrack = -1;
+
 		debug(5, "File: %s, type: %s (%d)", _files[_currentFile].name.c_str(), type.c_str(), _files[_currentFile].type);
 	} else if (command == "TITLE") {
 		_metadata.title = nexttok(s, &s);
 
 		debug(5, "Title: %s", _metadata.title.c_str());
+	} else if (command == "PERFORMER") {
+		_metadata.performer = nexttok(s, &s);
+
+		debug(5, "Performer: %s", _metadata.performer.c_str());
 	} else if (command == "REM") {
 		String subcommand = nexttok(s, &s);
 
@@ -166,8 +180,10 @@ void CueSheet::parseHeaderContext(const char *line) {
 			_metadata.genre = nexttok(s, &s);
 			debug(5, "Genre: %s", _metadata.genre.c_str());
 		} else {
-			warning("Unprocessed REM subcommand %s", subcommand.c_str());
+			warning("CueSheet: Unprocessed REM subcommand %s", subcommand.c_str());
 		}
+	} else {
+		warning("CueSheet: Unprocessed command %s", command.c_str());
 	}
 }
 
@@ -187,9 +203,59 @@ LookupTable trackTypes[] = {
 };
 
 void CueSheet::parseFilesContext(const char *line) {
+	const char *s = line;
+
+	String command = nexttok(s, &s);
+
+	if (command == "TRACK") {
+		int trackNum = atoi(nexttok(s, &s).c_str());
+		String trackType = nexttok(s, &s);
+
+		if (trackNum < 0 || (_currentTrack > 0 && _currentTrack + 1 != trackNum)) {
+			warning("CueSheet: Incorrect track number. Expected %d but got %d", _currentTrack + 1, trackNum);
+		} else {
+			for (int i = _files[_currentFile].tracks.size(); i <= trackNum; i++)
+				_files[_currentFile].tracks.push_back(CueTrack());
+
+			_currentTrack = trackNum;
+			_files[_currentFile].tracks[_currentTrack].type = (CueTrackType)lookupInTable(trackTypes, trackType.c_str());
+
+			debug(5, "Track: %d type: %s (%d)", trackNum, trackType.c_str(), _files[_currentFile].tracks[_currentTrack].type);
+		}
+
+		_context = kCueContextTracks;
+	} else {
+		warning("CueSheet: Unprocessed file command %s", command.c_str());
+	}
+
 }
 
 void CueSheet::parseTracksContext(const char *line) {
+	const char *s = line;
+
+	String command = nexttok(s, &s);
+
+	if (command == "TRACK") {
+		parseFilesContext(line);
+	} else if (command == "TITLE") {
+		_files[_currentFile].tracks[_currentTrack].title = nexttok(s, &s);
+
+		debug(5, "Track title: %s", _files[_currentFile].tracks[_currentTrack].title.c_str());
+	} else if (command == "INDEX") {
+		int indexNum = atoi(nexttok(s, &s).c_str());
+		int frames = parseMSF(nexttok(s, &s).c_str());
+
+		for (int i = _files[_currentFile].tracks[_currentTrack].indices.size(); i <= indexNum; i++)
+			_files[_currentFile].tracks[_currentTrack].indices.push_back(0);
+
+		_files[_currentFile].tracks[_currentTrack].indices[indexNum] = frames;
+
+		debug(5, "Index: %d, frames: %d", indexNum, frames);
+	} else if (command == "FILE") {
+		parseHeaderContext(line);
+	} else {
+		warning("CueSheet: Unprocessed track command %s", command.c_str());
+	}
 }
 
 } // End of namespace Common
diff --git a/common/formats/cue.h b/common/formats/cue.h
index bdf0c48f6b3..4b28554d151 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -63,30 +63,38 @@ public:
 		int number = 0;
 		CueTrackType type;
 		String title;
+		Array<int> indices;
 	};
 
 	struct CueFile {
 		String name;
 		CueFileType type = kCueFileTypeBinary;
+		Array<CueTrack> tracks;
 	};
 
-	struct CueMetadate {
+	struct CueMetadata {
 		String title;
 		String date;
 		String genre;
+		String performer;
 	};
 
 private:
+	int parseMSF(const char *str);
+
 	void parseHeaderContext(const char *line);
 	void parseFilesContext(const char *line);
 	void parseTracksContext(const char *line);
 
 private:
+	int _lineNum = 0;
 	int _context;
 	int _currentFile = -1;
+	int _currentTrack = -1;
 
 	Array<CueFile> _files;
-	CueMetadate _metadata;
+	CueMetadata _metadata;
+
 };
 
 } // End of namespace Common


Commit: 41d7ca4c193a4b0d984d80cb3358ab3b1b2bce3c
    https://github.com/scummvm/scummvm/commit/41d7ca4c193a4b0d984d80cb3358ab3b1b2bce3c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Skip comments in CueSheets

Changed paths:
    common/formats/cue.cpp


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 312fc3ea522..7476eb99c48 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -179,6 +179,8 @@ void CueSheet::parseHeaderContext(const char *line) {
 		} else if (subcommand == "GENRE") {
 			_metadata.genre = nexttok(s, &s);
 			debug(5, "Genre: %s", _metadata.genre.c_str());
+		} else if (subcommand == "COMMENT") {
+			debug(5, "Skipping Comment: %s", s);
 		} else {
 			warning("CueSheet: Unprocessed REM subcommand %s", subcommand.c_str());
 		}


Commit: 9c0eb812d07f8eb28bab169c67c5869b8f31e365
    https://github.com/scummvm/scummvm/commit/9c0eb812d07f8eb28bab169c67c5869b8f31e365
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
DIRECTOR: Added test for parsing Cue Sheets

Changed paths:
    engines/director/tests.cpp


diff --git a/engines/director/tests.cpp b/engines/director/tests.cpp
index faf3df885de..d3785d24dee 100644
--- a/engines/director/tests.cpp
+++ b/engines/director/tests.cpp
@@ -25,6 +25,7 @@
 
 #include "common/memstream.h"
 #include "common/macresman.h"
+#include "common/formats/cue.h"
 
 #include "graphics/fonts/macfont.h"
 #include "graphics/macgui/macfontmanager.h"
@@ -301,6 +302,25 @@ void Window::runTests() {
 	Common::MemoryReadStream *movie = new Common::MemoryReadStream(testMovie, ARRAYSIZE(testMovie));
 	Common::SeekableReadStream *stream = Common::wrapCompressedReadStream(movie);
 
+	const char *cueTest =
+"PERFORMER \"Bloc Party\"\n"
+"TITLE \"Silent Alarm\"\n"
+"FILE \"Bloc Party - Silent Alarm.flac\" WAVE\n"
+   "TRACK 01 AUDIO\n"
+      "TITLE \"Like Eating Glass\"\n"
+      "PERFORMER \"Bloc Party\"\n"
+      "INDEX 00 00:00:00\n"
+      "INDEX 01 03:22:70\n"
+   "TRACK 02 AUDIO\n"
+      "TITLE \"Helicopter\"\n"
+      "PERFORMER \"Bloc Party\"\n"
+      "INDEX 00 07:42:69\n"
+      "INDEX 01 07:44:69\n"
+"";
+
+
+	Common::CueSheet cue(cueTest);
+
 	initGraphics(640, 480);
 
 	_mainArchive = new RIFXArchive();


Commit: 4bd9e71f59440a6fc94f175bd1fdf2ecb3c402f9
    https://github.com/scummvm/scummvm/commit/4bd9e71f59440a6fc94f175bd1fdf2ecb3c402f9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Parse track performer in cue sheets

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 7476eb99c48..60c154e0059 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -128,7 +128,7 @@ int CueSheet::parseMSF(const char *str) {
 	if (sscanf(str, "%d:%d:%d", &min, &sec, &frm) != 3)
 		warning("Malformed MSF at line %d: %s", _lineNum, str);
 
-	return frm + 75 * sec + 75 * 60 * min;
+	return frm + 75 * (sec + 60 * min);
 }
 
 LookupTable fileTypes[] = {
@@ -255,6 +255,10 @@ void CueSheet::parseTracksContext(const char *line) {
 		debug(5, "Index: %d, frames: %d", indexNum, frames);
 	} else if (command == "FILE") {
 		parseHeaderContext(line);
+	} else if (command == "PERFORMER") {
+		_files[_currentFile].tracks[_currentTrack].performer = nexttok(s, &s);
+
+		debug(5, "Track performer: %s", _files[_currentFile].tracks[_currentTrack].performer.c_str());
 	} else {
 		warning("CueSheet: Unprocessed track command %s", command.c_str());
 	}
diff --git a/common/formats/cue.h b/common/formats/cue.h
index 4b28554d151..3c206ec1ff1 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -63,6 +63,7 @@ public:
 		int number = 0;
 		CueTrackType type;
 		String title;
+		String performer;
 		Array<int> indices;
 	};
 


Commit: 824d28ff5e88a1756eaeb9d3420b206004a930b9
    https://github.com/scummvm/scummvm/commit/824d28ff5e88a1756eaeb9d3420b206004a930b9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Parse pregap for tracks in cue sheet

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 60c154e0059..adb2f663e62 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -253,6 +253,10 @@ void CueSheet::parseTracksContext(const char *line) {
 		_files[_currentFile].tracks[_currentTrack].indices[indexNum] = frames;
 
 		debug(5, "Index: %d, frames: %d", indexNum, frames);
+	} else if (command == "PREGAP") {
+		_files[_currentFile].tracks[_currentTrack].pregap = parseMSF(nexttok(s, &s).c_str());
+
+		debug(5, "Track pregap: %d", _files[_currentFile].tracks[_currentTrack].pregap);
 	} else if (command == "FILE") {
 		parseHeaderContext(line);
 	} else if (command == "PERFORMER") {
diff --git a/common/formats/cue.h b/common/formats/cue.h
index 3c206ec1ff1..b5ec6295f87 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -65,6 +65,7 @@ public:
 		String title;
 		String performer;
 		Array<int> indices;
+		int pregap = 0;
 	};
 
 	struct CueFile {


Commit: c5a71570f00cce101d3b88ad3932f0772e5fc3d6
    https://github.com/scummvm/scummvm/commit/c5a71570f00cce101d3b88ad3932f0772e5fc3d6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Added parsing of catalog and Cue track flags

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index adb2f663e62..7c3c703d68e 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -170,6 +170,10 @@ void CueSheet::parseHeaderContext(const char *line) {
 		_metadata.performer = nexttok(s, &s);
 
 		debug(5, "Performer: %s", _metadata.performer.c_str());
+	} else if (command == "CATALOG") {
+		_metadata.catalog = nexttok(s, &s);
+
+		debug(5, "Catalog: %s", _metadata.catalog.c_str());
 	} else if (command == "REM") {
 		String subcommand = nexttok(s, &s);
 
@@ -190,18 +194,19 @@ void CueSheet::parseHeaderContext(const char *line) {
 }
 
 LookupTable trackTypes[] = {
-	{ "AUDIO",      CueSheet::kCueFileTypeAudio }, // Audio (sector size: 2352)
-	{ "CDG",        CueSheet::kCueFileTypeCDG }, // Karaoke CD+G (sector size: 2448)
-	{ "MODE1_RAW",  CueSheet::kCueFileTypeMode1_Raw }, // CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
-	{ "MODE1/2048", CueSheet::kCueFileTypeMode1_2048 }, // CD-ROM Mode 1 data (cooked) (sector size: 2048)
-	{ "MODE1/2352", CueSheet::kCueFileTypeMode1_2352 }, // CD-ROM Mode 1 data (raw) (sector size: 2352)
-	{ "MODE2_RAW",  CueSheet::kCueFileTypeMode2_Raw }, // CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
-	{ "MODE2/2048", CueSheet::kCueFileTypeMode2_2048 }, // CD-ROM Mode 2 XA form-1 data (sector size: 2048)
-	{ "MODE2/2324", CueSheet::kCueFileTypeMode2_2324 }, // CD-ROM Mode 2 XA form-2 data (sector size: 2324)
-	{ "MODE2/2336", CueSheet::kCueFileTypeMode2_2366 }, // CD-ROM Mode 2 data (sector size: 2336)
-	{ "MODE2/2352", CueSheet::kCueFileTypeMode2_2352 }, // CD-ROM Mode 2 data (raw) (sector size: 2352)
-	{ "CDI/2336",   CueSheet::kCueFileTypeCDI_2336 }, // CDI Mode 2 data
-	{ "CDI/2352",   CueSheet::kCueFileTypeCDI_2352 }, // CDI Mode 2 data
+	{ "AUDIO",      CueSheet::kCueFileTypeAudio },		// Audio (sector size: 2352)
+	{ "CDG",        CueSheet::kCueFileTypeCDG },		// Karaoke CD+G (sector size: 2448)
+	{ "MODE1_RAW",  CueSheet::kCueFileTypeMode1_Raw },	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
+	{ "MODE1/2048", CueSheet::kCueFileTypeMode1_2048 },	// CD-ROM Mode 1 data (cooked) (sector size: 2048)
+	{ "MODE1/2352", CueSheet::kCueFileTypeMode1_2352 },	// CD-ROM Mode 1 data (raw) (sector size: 2352)
+	{ "MODE2_RAW",  CueSheet::kCueFileTypeMode2_Raw },	// CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
+	{ "MODE2/2048", CueSheet::kCueFileTypeMode2_2048 },	// CD-ROM Mode 2 XA form-1 data (sector size: 2048)
+	{ "MODE2/2324", CueSheet::kCueFileTypeMode2_2324 },	// CD-ROM Mode 2 XA form-2 data (sector size: 2324)
+	{ "MODE2/2336", CueSheet::kCueFileTypeMode2_2366 },	// CD-ROM Mode 2 data (sector size: 2336)
+	{ "MODE2/2352", CueSheet::kCueFileTypeMode2_2352 },	// CD-ROM Mode 2 data (raw) (sector size: 2352)
+	{ "CDI/2336",   CueSheet::kCueFileTypeCDI_2336 },	// CDI Mode 2 data
+	{ "CDI/2352",   CueSheet::kCueFileTypeCDI_2352 },	// CDI Mode 2 data
+	{ 0, 0 }
 };
 
 void CueSheet::parseFilesContext(const char *line) {
@@ -232,6 +237,14 @@ void CueSheet::parseFilesContext(const char *line) {
 
 }
 
+LookupTable trackFlags[] = {
+	{ "4CH",  CueSheet::kCueTrackFlag4ch  },
+	{ "DCP",  CueSheet::kCueTrackFlagDCP  },
+	{ "PRE",  CueSheet::kCueTrackFlagPre  },
+	{ "SCMS", CueSheet::kCueTrackFlagSCMS },
+	{ 0, 0 }
+};
+
 void CueSheet::parseTracksContext(const char *line) {
 	const char *s = line;
 
@@ -257,6 +270,19 @@ void CueSheet::parseTracksContext(const char *line) {
 		_files[_currentFile].tracks[_currentTrack].pregap = parseMSF(nexttok(s, &s).c_str());
 
 		debug(5, "Track pregap: %d", _files[_currentFile].tracks[_currentTrack].pregap);
+	} else if (command == "FLAGS") {
+		String flag;
+		uint32 flags = 0;
+
+		while (*s) {
+			flag = nexttok(s, &s);
+
+			flags |= lookupInTable(trackFlags, flag.c_str());
+		}
+
+		_files[_currentFile].tracks[_currentTrack].flags = flags;
+
+		debug(5, "Track flags: %d", _files[_currentFile].tracks[_currentTrack].flags);
 	} else if (command == "FILE") {
 		parseHeaderContext(line);
 	} else if (command == "PERFORMER") {
diff --git a/common/formats/cue.h b/common/formats/cue.h
index b5ec6295f87..df23769609e 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -45,18 +45,25 @@ public:
 	};
 
 	enum CueTrackType {
-		kCueFileTypeAudio,
-		kCueFileTypeCDG,
-		kCueFileTypeMode1_Raw,
-		kCueFileTypeMode1_2048,
-		kCueFileTypeMode1_2352,
-		kCueFileTypeMode2_Raw,
-		kCueFileTypeMode2_2048,
-		kCueFileTypeMode2_2324,
-		kCueFileTypeMode2_2366,
-		kCueFileTypeMode2_2352,
-		kCueFileTypeCDI_2336,
-		kCueFileTypeCDI_2352,
+		kCueFileTypeAudio,		// Audio (sector size: 2352)
+		kCueFileTypeCDG,		// Karaoke CD+G (sector size: 2448)
+		kCueFileTypeMode1_Raw,	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
+		kCueFileTypeMode1_2048,	// CD-ROM Mode 1 data (cooked) (sector size: 2048)
+		kCueFileTypeMode1_2352,	// CD-ROM Mode 1 data (raw) (sector size: 2352)
+		kCueFileTypeMode2_Raw,	// CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
+		kCueFileTypeMode2_2048,	// CD-ROM Mode 2 XA form-1 data (sector size: 2048)
+		kCueFileTypeMode2_2324,	// CD-ROM Mode 2 XA form-2 data (sector size: 2324)
+		kCueFileTypeMode2_2366,	// CD-ROM Mode 2 data (sector size: 2336)
+		kCueFileTypeMode2_2352,	// CD-ROM Mode 2 data (raw) (sector size: 2352)
+		kCueFileTypeCDI_2336,	// CDI Mode 2 data
+		kCueFileTypeCDI_2352,	// CDI Mode 2 data
+	};
+
+	enum CueTrackFlags {
+		kCueTrackFlag4ch  = 1 << 0, // Four channel audio
+		kCueTrackFlagDCP  = 1 << 1, // Digital copy permitted
+		kCueTrackFlagPre  = 1 << 2, // Pre-emphasis enabled, for audio tracks only
+		kCueTrackFlagSCMS = 1 << 3, // Serial copy management system
 	};
 
 	struct CueTrack {
@@ -66,6 +73,7 @@ public:
 		String performer;
 		Array<int> indices;
 		int pregap = 0;
+		uint32 flags;
 	};
 
 	struct CueFile {
@@ -79,6 +87,7 @@ public:
 		String date;
 		String genre;
 		String performer;
+		String catalog;
 	};
 
 private:


Commit: 462870c64db39c3103ea6a73ef63b5c3c8339440
    https://github.com/scummvm/scummvm/commit/462870c64db39c3103ea6a73ef63b5c3c8339440
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Lookup track sector sizes for CueSheet

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 7c3c703d68e..1607447e2d2 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -209,6 +209,22 @@ LookupTable trackTypes[] = {
 	{ 0, 0 }
 };
 
+LookupTable trackTypesSectorSizes[] = {
+	{ "AUDIO",      2352 },
+	{ "CDG",        2448 },
+	{ "MODE1_RAW",  2352 },
+	{ "MODE1/2048", 2048 },
+	{ "MODE1/2352", 2352 },
+	{ "MODE2_RAW",  2352 },
+	{ "MODE2/2048", 2048 },
+	{ "MODE2/2324", 2324 },
+	{ "MODE2/2336", 2336 },
+	{ "MODE2/2352", 2352 },
+	{ "CDI/2336",   2336 },
+	{ "CDI/2352",   2352 },
+	{ 0, 0 }
+};
+
 void CueSheet::parseFilesContext(const char *line) {
 	const char *s = line;
 
@@ -226,6 +242,7 @@ void CueSheet::parseFilesContext(const char *line) {
 
 			_currentTrack = trackNum;
 			_files[_currentFile].tracks[_currentTrack].type = (CueTrackType)lookupInTable(trackTypes, trackType.c_str());
+			_files[_currentFile].tracks[_currentTrack].size = lookupInTable(trackTypesSectorSizes, trackType.c_str());
 
 			debug(5, "Track: %d type: %s (%d)", trackNum, trackType.c_str(), _files[_currentFile].tracks[_currentTrack].type);
 		}
diff --git a/common/formats/cue.h b/common/formats/cue.h
index df23769609e..67d6a4b0807 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -74,6 +74,7 @@ public:
 		Array<int> indices;
 		int pregap = 0;
 		uint32 flags;
+		int size = 2352;
 	};
 
 	struct CueFile {


Commit: 12cf6c998892f41aca213d0ad75e00a327b3a443
    https://github.com/scummvm/scummvm/commit/12cf6c998892f41aca213d0ad75e00a327b3a443
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Improve debug output in CueSheet

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 1607447e2d2..099e330a532 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -106,12 +106,12 @@ CueSheet::CueSheet(const char *sheet) {
 	}
 }
 
-struct LookupTable {
+struct CueLookupTable {
 	const char *key;
 	int value;
 };
 
-static int lookupInTable(LookupTable *table, const char *key) {
+int CueSheet::lookupInTable(CueLookupTable *table, const char *key) {
 	while (table->key) {
 		if (!strcmp(key, table->key))
 			return table->value;
@@ -119,7 +119,7 @@ static int lookupInTable(LookupTable *table, const char *key) {
 		table++;
 	}
 
-	error("CueSheet::lookupInTable(): Unknown token %s", key);
+	error("CueSheet::lookupInTable(): Unknown lookup token %s at line %d", key, _lineNum);
 }
 
 int CueSheet::parseMSF(const char *str) {
@@ -131,7 +131,7 @@ int CueSheet::parseMSF(const char *str) {
 	return frm + 75 * (sec + 60 * min);
 }
 
-LookupTable fileTypes[] = {
+CueLookupTable fileTypes[] = {
 	{ "BINARY",   CueSheet::kCueFileTypeBinary },
 	{ "AIFF",     CueSheet::kCueFileTypeAIFF },
 	{ "WAVE",     CueSheet::kCueFileTypeWave },
@@ -186,14 +186,14 @@ void CueSheet::parseHeaderContext(const char *line) {
 		} else if (subcommand == "COMMENT") {
 			debug(5, "Skipping Comment: %s", s);
 		} else {
-			warning("CueSheet: Unprocessed REM subcommand %s", subcommand.c_str());
+			warning("CueSheet: Unprocessed REM subcommand %s at line %d", subcommand.c_str(), _lineNum);
 		}
 	} else {
-		warning("CueSheet: Unprocessed command %s", command.c_str());
+		warning("CueSheet: Unprocessed command %s at line %d", command.c_str(), _lineNum);
 	}
 }
 
-LookupTable trackTypes[] = {
+CueLookupTable trackTypes[] = {
 	{ "AUDIO",      CueSheet::kCueFileTypeAudio },		// Audio (sector size: 2352)
 	{ "CDG",        CueSheet::kCueFileTypeCDG },		// Karaoke CD+G (sector size: 2448)
 	{ "MODE1_RAW",  CueSheet::kCueFileTypeMode1_Raw },	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
@@ -209,7 +209,7 @@ LookupTable trackTypes[] = {
 	{ 0, 0 }
 };
 
-LookupTable trackTypesSectorSizes[] = {
+CueLookupTable trackTypesSectorSizes[] = {
 	{ "AUDIO",      2352 },
 	{ "CDG",        2448 },
 	{ "MODE1_RAW",  2352 },
@@ -235,7 +235,7 @@ void CueSheet::parseFilesContext(const char *line) {
 		String trackType = nexttok(s, &s);
 
 		if (trackNum < 0 || (_currentTrack > 0 && _currentTrack + 1 != trackNum)) {
-			warning("CueSheet: Incorrect track number. Expected %d but got %d", _currentTrack + 1, trackNum);
+			warning("CueSheet: Incorrect track number. Expected %d but got %d at line %d", _currentTrack + 1, trackNum, _lineNum);
 		} else {
 			for (int i = _files[_currentFile].tracks.size(); i <= trackNum; i++)
 				_files[_currentFile].tracks.push_back(CueTrack());
@@ -249,12 +249,12 @@ void CueSheet::parseFilesContext(const char *line) {
 
 		_context = kCueContextTracks;
 	} else {
-		warning("CueSheet: Unprocessed file command %s", command.c_str());
+		warning("CueSheet: Unprocessed file command %s at line %d", command.c_str(), _lineNum);
 	}
 
 }
 
-LookupTable trackFlags[] = {
+CueLookupTable trackFlags[] = {
 	{ "4CH",  CueSheet::kCueTrackFlag4ch  },
 	{ "DCP",  CueSheet::kCueTrackFlagDCP  },
 	{ "PRE",  CueSheet::kCueTrackFlagPre  },
@@ -307,7 +307,7 @@ void CueSheet::parseTracksContext(const char *line) {
 
 		debug(5, "Track performer: %s", _files[_currentFile].tracks[_currentTrack].performer.c_str());
 	} else {
-		warning("CueSheet: Unprocessed track command %s", command.c_str());
+		warning("CueSheet: Unprocessed track command %s at line %d", command.c_str(), _lineNum);
 	}
 }
 
diff --git a/common/formats/cue.h b/common/formats/cue.h
index 67d6a4b0807..b7d28b3ee1f 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -27,6 +27,7 @@
 namespace Common {
 
 class SeekableReadStream;
+struct CueLookupTable;
 
 /**
  * A class able to load and parse Cue sheets
@@ -92,6 +93,7 @@ public:
 	};
 
 private:
+	int lookupInTable(CueLookupTable *table, const char *key);
 	int parseMSF(const char *str);
 
 	void parseHeaderContext(const char *line);


Commit: 3e32fd37760c01f121b3dd09c06475f25f5806b8
    https://github.com/scummvm/scummvm/commit/3e32fd37760c01f121b3dd09c06475f25f5806b8
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Added another constructor for CueSheet

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 099e330a532..81eae4bea8b 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "common/debug.h"
+#include "common/stream.h"
 #include "common/formats/cue.h"
 
 namespace Common {
@@ -58,6 +59,21 @@ static String nexttok(const char *s, const char **newP = nullptr) {
 
 
 CueSheet::CueSheet(const char *sheet) {
+	parse(sheet);
+}
+
+CueSheet::CueSheet(SeekableReadStream *stream) {
+	int size = stream->size();
+	char *data = (char *)calloc(size + 1, 1); // null-terminated string
+
+	stream->read(data, size);
+
+	parse(data);
+
+	free(data);
+}
+
+void CueSheet::parse(const char *sheet) {
 	String line;
 	_context = kCueContextHeader;
 	const char *s = sheet;
diff --git a/common/formats/cue.h b/common/formats/cue.h
index b7d28b3ee1f..7d83f4628cb 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -35,6 +35,7 @@ struct CueLookupTable;
 class CueSheet {
 public:
 	CueSheet(const char *sheet);
+	CueSheet(SeekableReadStream *stream);
 
 public:
 	enum CueFileType {
@@ -93,6 +94,8 @@ public:
 	};
 
 private:
+	void parse(const char *sheet);
+
 	int lookupInTable(CueLookupTable *table, const char *key);
 	int parseMSF(const char *str);
 


Commit: 587d77078630a7a9cccaa25f352f6e051f7e6506
    https://github.com/scummvm/scummvm/commit/587d77078630a7a9cccaa25f352f6e051f7e6506
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Shortened constant names in CueSheet class

Changed paths:
    common/formats/cue.cpp
    common/formats/cue.h


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index 81eae4bea8b..ff8afd31bb7 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -26,9 +26,9 @@
 namespace Common {
 
 enum {
-	kCueContextHeader,
-	kCueContextFiles,
-	kCueContextTracks,
+	kContextHeader,
+	kContextFiles,
+	kContextTracks,
 };
 
 static String nexttok(const char *s, const char **newP = nullptr) {
@@ -75,7 +75,7 @@ CueSheet::CueSheet(SeekableReadStream *stream) {
 
 void CueSheet::parse(const char *sheet) {
 	String line;
-	_context = kCueContextHeader;
+	_context = kContextHeader;
 	const char *s = sheet;
 
 	while (*s) {
@@ -104,15 +104,15 @@ void CueSheet::parse(const char *sheet) {
 			continue;
 
 		switch (_context) {
-		case kCueContextHeader:
+		case kContextHeader:
 			parseHeaderContext(line.c_str());
 			break;
 
-		case kCueContextFiles:
+		case kContextFiles:
 			parseFilesContext(line.c_str());
 			break;
 
-		case kCueContextTracks:
+		case kContextTracks:
 			parseTracksContext(line.c_str());
 			break;
 
@@ -122,12 +122,12 @@ void CueSheet::parse(const char *sheet) {
 	}
 }
 
-struct CueLookupTable {
+struct CueSheet::LookupTable {
 	const char *key;
 	int value;
 };
 
-int CueSheet::lookupInTable(CueLookupTable *table, const char *key) {
+int CueSheet::lookupInTable(LookupTable *table, const char *key) {
 	while (table->key) {
 		if (!strcmp(key, table->key))
 			return table->value;
@@ -147,12 +147,12 @@ int CueSheet::parseMSF(const char *str) {
 	return frm + 75 * (sec + 60 * min);
 }
 
-CueLookupTable fileTypes[] = {
-	{ "BINARY",   CueSheet::kCueFileTypeBinary },
-	{ "AIFF",     CueSheet::kCueFileTypeAIFF },
-	{ "WAVE",     CueSheet::kCueFileTypeWave },
-	{ "MP3",      CueSheet::kCueFileTypeMP3 },
-	{ "MOTOROLA", CueSheet::kCueFileTypeMotorola },
+CueSheet::LookupTable fileTypes[] = {
+	{ "BINARY",   CueSheet::kFileTypeBinary },
+	{ "AIFF",     CueSheet::kFileTypeAIFF },
+	{ "WAVE",     CueSheet::kFileTypeWave },
+	{ "MP3",      CueSheet::kFileTypeMP3 },
+	{ "MOTOROLA", CueSheet::kFileTypeMotorola },
 	{ 0, 0 }
 };
 
@@ -170,10 +170,10 @@ void CueSheet::parseHeaderContext(const char *line) {
 
 		String type = nexttok(s, &s);
 
-		_files[_currentFile].type = kCueFileTypeBinary;
-		_files[_currentFile].type = (CueFileType)lookupInTable(fileTypes, type.c_str());
+		_files[_currentFile].type = kFileTypeBinary;
+		_files[_currentFile].type = (FileType)lookupInTable(fileTypes, type.c_str());
 
-		_context = kCueContextFiles;
+		_context = kContextFiles;
 
 		_currentTrack = -1;
 
@@ -209,23 +209,23 @@ void CueSheet::parseHeaderContext(const char *line) {
 	}
 }
 
-CueLookupTable trackTypes[] = {
-	{ "AUDIO",      CueSheet::kCueFileTypeAudio },		// Audio (sector size: 2352)
-	{ "CDG",        CueSheet::kCueFileTypeCDG },		// Karaoke CD+G (sector size: 2448)
-	{ "MODE1_RAW",  CueSheet::kCueFileTypeMode1_Raw },	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
-	{ "MODE1/2048", CueSheet::kCueFileTypeMode1_2048 },	// CD-ROM Mode 1 data (cooked) (sector size: 2048)
-	{ "MODE1/2352", CueSheet::kCueFileTypeMode1_2352 },	// CD-ROM Mode 1 data (raw) (sector size: 2352)
-	{ "MODE2_RAW",  CueSheet::kCueFileTypeMode2_Raw },	// CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
-	{ "MODE2/2048", CueSheet::kCueFileTypeMode2_2048 },	// CD-ROM Mode 2 XA form-1 data (sector size: 2048)
-	{ "MODE2/2324", CueSheet::kCueFileTypeMode2_2324 },	// CD-ROM Mode 2 XA form-2 data (sector size: 2324)
-	{ "MODE2/2336", CueSheet::kCueFileTypeMode2_2366 },	// CD-ROM Mode 2 data (sector size: 2336)
-	{ "MODE2/2352", CueSheet::kCueFileTypeMode2_2352 },	// CD-ROM Mode 2 data (raw) (sector size: 2352)
-	{ "CDI/2336",   CueSheet::kCueFileTypeCDI_2336 },	// CDI Mode 2 data
-	{ "CDI/2352",   CueSheet::kCueFileTypeCDI_2352 },	// CDI Mode 2 data
+CueSheet::LookupTable trackTypes[] = {
+	{ "AUDIO",      CueSheet::kTrackTypeAudio },		// Audio (sector size: 2352)
+	{ "CDG",        CueSheet::kTrackTypeCDG },			// Karaoke CD+G (sector size: 2448)
+	{ "MODE1_RAW",  CueSheet::kTrackTypeMode1_Raw },	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
+	{ "MODE1/2048", CueSheet::kTrackTypeMode1_2048 },	// CD-ROM Mode 1 data (cooked) (sector size: 2048)
+	{ "MODE1/2352", CueSheet::kTrackTypeMode1_2352 },	// CD-ROM Mode 1 data (raw) (sector size: 2352)
+	{ "MODE2_RAW",  CueSheet::kTrackTypeMode2_Raw },	// CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
+	{ "MODE2/2048", CueSheet::kTrackTypeMode2_2048 },	// CD-ROM Mode 2 XA form-1 data (sector size: 2048)
+	{ "MODE2/2324", CueSheet::kTrackTypeMode2_2324 },	// CD-ROM Mode 2 XA form-2 data (sector size: 2324)
+	{ "MODE2/2336", CueSheet::kTrackTypeMode2_2366 },	// CD-ROM Mode 2 data (sector size: 2336)
+	{ "MODE2/2352", CueSheet::kTrackTypeMode2_2352 },	// CD-ROM Mode 2 data (raw) (sector size: 2352)
+	{ "CDI/2336",   CueSheet::kTrackTypeCDI_2336 },		// CDI Mode 2 data
+	{ "CDI/2352",   CueSheet::kTrackTypeCDI_2352 },		// CDI Mode 2 data
 	{ 0, 0 }
 };
 
-CueLookupTable trackTypesSectorSizes[] = {
+CueSheet::LookupTable trackTypesSectorSizes[] = {
 	{ "AUDIO",      2352 },
 	{ "CDG",        2448 },
 	{ "MODE1_RAW",  2352 },
@@ -257,24 +257,24 @@ void CueSheet::parseFilesContext(const char *line) {
 				_files[_currentFile].tracks.push_back(CueTrack());
 
 			_currentTrack = trackNum;
-			_files[_currentFile].tracks[_currentTrack].type = (CueTrackType)lookupInTable(trackTypes, trackType.c_str());
+			_files[_currentFile].tracks[_currentTrack].type = (TrackType)lookupInTable(trackTypes, trackType.c_str());
 			_files[_currentFile].tracks[_currentTrack].size = lookupInTable(trackTypesSectorSizes, trackType.c_str());
 
 			debug(5, "Track: %d type: %s (%d)", trackNum, trackType.c_str(), _files[_currentFile].tracks[_currentTrack].type);
 		}
 
-		_context = kCueContextTracks;
+		_context = kContextTracks;
 	} else {
 		warning("CueSheet: Unprocessed file command %s at line %d", command.c_str(), _lineNum);
 	}
 
 }
 
-CueLookupTable trackFlags[] = {
-	{ "4CH",  CueSheet::kCueTrackFlag4ch  },
-	{ "DCP",  CueSheet::kCueTrackFlagDCP  },
-	{ "PRE",  CueSheet::kCueTrackFlagPre  },
-	{ "SCMS", CueSheet::kCueTrackFlagSCMS },
+CueSheet::LookupTable trackFlags[] = {
+	{ "4CH",  CueSheet::kTrackFlag4ch  },
+	{ "DCP",  CueSheet::kTrackFlagDCP  },
+	{ "PRE",  CueSheet::kTrackFlagPre  },
+	{ "SCMS", CueSheet::kTrackFlagSCMS },
 	{ 0, 0 }
 };
 
diff --git a/common/formats/cue.h b/common/formats/cue.h
index 7d83f4628cb..95d8ce9acf8 100644
--- a/common/formats/cue.h
+++ b/common/formats/cue.h
@@ -27,7 +27,6 @@
 namespace Common {
 
 class SeekableReadStream;
-struct CueLookupTable;
 
 /**
  * A class able to load and parse Cue sheets
@@ -38,39 +37,39 @@ public:
 	CueSheet(SeekableReadStream *stream);
 
 public:
-	enum CueFileType {
-		kCueFileTypeBinary,
-		kCueFileTypeAIFF,
-		kCueFileTypeWave,
-		kCueFileTypeMP3,
-		kCueFileTypeMotorola,
+	enum FileType {
+		kFileTypeBinary,
+		kFileTypeAIFF,
+		kFileTypeWave,
+		kFileTypeMP3,
+		kFileTypeMotorola,
 	};
 
-	enum CueTrackType {
-		kCueFileTypeAudio,		// Audio (sector size: 2352)
-		kCueFileTypeCDG,		// Karaoke CD+G (sector size: 2448)
-		kCueFileTypeMode1_Raw,	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
-		kCueFileTypeMode1_2048,	// CD-ROM Mode 1 data (cooked) (sector size: 2048)
-		kCueFileTypeMode1_2352,	// CD-ROM Mode 1 data (raw) (sector size: 2352)
-		kCueFileTypeMode2_Raw,	// CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
-		kCueFileTypeMode2_2048,	// CD-ROM Mode 2 XA form-1 data (sector size: 2048)
-		kCueFileTypeMode2_2324,	// CD-ROM Mode 2 XA form-2 data (sector size: 2324)
-		kCueFileTypeMode2_2366,	// CD-ROM Mode 2 data (sector size: 2336)
-		kCueFileTypeMode2_2352,	// CD-ROM Mode 2 data (raw) (sector size: 2352)
-		kCueFileTypeCDI_2336,	// CDI Mode 2 data
-		kCueFileTypeCDI_2352,	// CDI Mode 2 data
+	enum TrackType {
+		kTrackTypeAudio,		// Audio (sector size: 2352)
+		kTrackTypeCDG,			// Karaoke CD+G (sector size: 2448)
+		kTrackTypeMode1_Raw,	// CD-ROM Mode 1 data (raw) (sector size: 2352), used by cdrdao
+		kTrackTypeMode1_2048,	// CD-ROM Mode 1 data (cooked) (sector size: 2048)
+		kTrackTypeMode1_2352,	// CD-ROM Mode 1 data (raw) (sector size: 2352)
+		kTrackTypeMode2_Raw,	// CD-ROM Mode 2 data (raw) (sector size: 2352), used by cdrdao
+		kTrackTypeMode2_2048,	// CD-ROM Mode 2 XA form-1 data (sector size: 2048)
+		kTrackTypeMode2_2324,	// CD-ROM Mode 2 XA form-2 data (sector size: 2324)
+		kTrackTypeMode2_2366,	// CD-ROM Mode 2 data (sector size: 2336)
+		kTrackTypeMode2_2352,	// CD-ROM Mode 2 data (raw) (sector size: 2352)
+		kTrackTypeCDI_2336,		// CDI Mode 2 data
+		kTrackTypeCDI_2352,		// CDI Mode 2 data
 	};
 
-	enum CueTrackFlags {
-		kCueTrackFlag4ch  = 1 << 0, // Four channel audio
-		kCueTrackFlagDCP  = 1 << 1, // Digital copy permitted
-		kCueTrackFlagPre  = 1 << 2, // Pre-emphasis enabled, for audio tracks only
-		kCueTrackFlagSCMS = 1 << 3, // Serial copy management system
+	enum TrackFlags {
+		kTrackFlag4ch  = 1 << 0, // Four channel audio
+		kTrackFlagDCP  = 1 << 1, // Digital copy permitted
+		kTrackFlagPre  = 1 << 2, // Pre-emphasis enabled, for audio tracks only
+		kTrackFlagSCMS = 1 << 3, // Serial copy management system
 	};
 
 	struct CueTrack {
 		int number = 0;
-		CueTrackType type;
+		TrackType type;
 		String title;
 		String performer;
 		Array<int> indices;
@@ -81,7 +80,7 @@ public:
 
 	struct CueFile {
 		String name;
-		CueFileType type = kCueFileTypeBinary;
+		FileType type = kFileTypeBinary;
 		Array<CueTrack> tracks;
 	};
 
@@ -93,10 +92,12 @@ public:
 		String catalog;
 	};
 
+	struct LookupTable;
+
 private:
 	void parse(const char *sheet);
 
-	int lookupInTable(CueLookupTable *table, const char *key);
+	int lookupInTable(LookupTable *table, const char *key);
 	int parseMSF(const char *str);
 
 	void parseHeaderContext(const char *line);


Commit: dea1412b3b4ab05fc8bce00b5f16fd3f21ffc503
    https://github.com/scummvm/scummvm/commit/dea1412b3b4ab05fc8bce00b5f16fd3f21ffc503
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2023-10-12T23:54:48+02:00

Commit Message:
COMMON: Fix warnings

Changed paths:
    common/formats/cue.cpp


diff --git a/common/formats/cue.cpp b/common/formats/cue.cpp
index ff8afd31bb7..ed73721068e 100644
--- a/common/formats/cue.cpp
+++ b/common/formats/cue.cpp
@@ -170,7 +170,6 @@ void CueSheet::parseHeaderContext(const char *line) {
 
 		String type = nexttok(s, &s);
 
-		_files[_currentFile].type = kFileTypeBinary;
 		_files[_currentFile].type = (FileType)lookupInTable(fileTypes, type.c_str());
 
 		_context = kContextFiles;
@@ -253,7 +252,7 @@ void CueSheet::parseFilesContext(const char *line) {
 		if (trackNum < 0 || (_currentTrack > 0 && _currentTrack + 1 != trackNum)) {
 			warning("CueSheet: Incorrect track number. Expected %d but got %d at line %d", _currentTrack + 1, trackNum, _lineNum);
 		} else {
-			for (int i = _files[_currentFile].tracks.size(); i <= trackNum; i++)
+			for (uint i = _files[_currentFile].tracks.size(); i <= trackNum; i++)
 				_files[_currentFile].tracks.push_back(CueTrack());
 
 			_currentTrack = trackNum;
@@ -293,7 +292,7 @@ void CueSheet::parseTracksContext(const char *line) {
 		int indexNum = atoi(nexttok(s, &s).c_str());
 		int frames = parseMSF(nexttok(s, &s).c_str());
 
-		for (int i = _files[_currentFile].tracks[_currentTrack].indices.size(); i <= indexNum; i++)
+		for (uint i = _files[_currentFile].tracks[_currentTrack].indices.size(); i <= indexNum; i++)
 			_files[_currentFile].tracks[_currentTrack].indices.push_back(0);
 
 		_files[_currentFile].tracks[_currentTrack].indices[indexNum] = frames;




More information about the Scummvm-git-logs mailing list