/*
* Simple CUE sheet parser suitable for embedded systems.
*
* Copyright (c) 2023 Rabbit Hole Computing
*
* 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 .
*/
#pragma once
#include
#ifndef CUE_MAX_FILENAME
#define CUE_MAX_FILENAME 64
#endif
enum CUEFileMode
{
CUEFile_BINARY = 0,
CUEFile_MOTOROLA,
CUEFile_MP3,
CUEFile_WAVE,
CUEFile_AIFF,
};
enum CUETrackMode
{
CUETrack_AUDIO = 0,
CUETrack_CDG,
CUETrack_MODE1_2048,
CUETrack_MODE1_2352,
CUETrack_MODE2_2048,
CUETrack_MODE2_2324,
CUETrack_MODE2_2336,
CUETrack_MODE2_2352,
CUETrack_CDI_2336,
CUETrack_CDI_2352,
};
struct CUETrackInfo
{
char filename[CUE_MAX_FILENAME+1];
CUEFileMode file_mode;
int track_number;
CUETrackMode track_mode;
uint32_t unstored_pregap_length;
uint32_t pregap_start;
uint32_t data_start;
};
class CUEParser
{
public:
// Initialize the class to parse data from string.
// The string must remain valid for the lifetime of this object.
CUEParser(const char *cue_sheet);
// Restart parsing from beginning of file
void restart();
// Get information for next track.
// Returns nullptr when there are no more tracks.
// The returned pointer remains valid until next call to next_track()
// or destruction of this object.
const CUETrackInfo *next_track();
protected:
const char *m_cue_sheet;
const char *m_parse_pos;
CUETrackInfo m_track_info;
// Skip any whitespace at beginning of line.
// Returns false if at end of string.
bool start_line();
// Advance parser to next line
void next_line();
// Skip spaces in string, return pointer to first non-space character
const char *skip_space(const char *p) const;
// Read text starting with " and ending with next "
// Returns pointer to character after ending quote.
const char *read_quoted(const char *src, char *dest, int dest_size);
// Parse time from MM:SS:FF format to frame number
uint32_t parse_time(const char *src);
// Parse file mode into enum
CUEFileMode parse_file_mode(const char *src);
// Parse track mode into enum
CUETrackMode parse_track_mode(const char *src);
};