From d17918e32e36011cff47405243a320197f72c564 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 27 Jan 2012 19:15:47 +0000 Subject: patch for CUE file formatting from Andreas Ruge git-svn-id: svn://localhost/ardour2/branches/3.0@11368 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/export_handler.h | 1 + libs/ardour/export_handler.cc | 59 +++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/libs/ardour/ardour/export_handler.h b/libs/ardour/ardour/export_handler.h index 7af4755350..c4061684eb 100644 --- a/libs/ardour/ardour/export_handler.h +++ b/libs/ardour/ardour/export_handler.h @@ -187,6 +187,7 @@ class ExportHandler : public ExportElementFactory void frames_to_cd_frames_string (char* buf, framepos_t when); std::string toc_escape_cdtext (const std::string&); std::string toc_escape_filename (const std::string&); + std::string cue_escape_cdtext (const std::string& txt); int cue_tracknum; int cue_indexnum; diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index ead665eff5..ef9d32474a 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -425,26 +425,19 @@ ExportHandler::write_cue_header (CDMarkerStatus & status) string title = status.timespan->name().compare ("Session") ? status.timespan->name() : (string) session.name(); status.out << "REM Cue file generated by Ardour" << endl; - status.out << "TITLE \"" << title << "\"" << endl; - - /* The cue sheet syntax has originally five file types: - WAVE : 44.1 kHz, 16 Bit (little endian) - AIFF : 44.1 kHz, 16 Bit (big endian) - BINARY : 44.1 kHz, 16 Bit (little endian) - MOTOROLA : 44.1 kHz, 16 Bit (big endian) - MP3 - - We want to use cue sheets not only as CD images but also as general playlyist - format, thus for WAVE and AIFF we don't care if it's really 44.1 kHz/16 Bit, the - soundfile's header shows it anyway. But for the raw formats, i.e. BINARY - and MOTOROLA we do care, because no header would tell us about a different format. - - For all other formats we just make up our own file type. MP3 is not supported - at the moment. + status.out << "TITLE " << cue_escape_cdtext (title) << endl; + + /* The original cue sheet sepc metions five file types + WAVE, AIFF, + BINARY = "header-less" audio (44.1 kHz, 16 Bit, little endian), + MOTOROLA = "header-less" audio (44.1 kHz, 16 Bit, big endian), + and MP3 + + We try to use these file types whenever appropriate and + default to our own names otherwise. */ - status.out << "FILE \"" << Glib::path_get_basename(status.filename) << "\" "; - if (!status.format->format_name().compare ("WAV")) { + if (!status.format->format_name().compare ("WAV") || !status.format->format_name().compare ("BWF")) { status.out << "WAVE"; } else if (status.format->format_id() == ExportFormatBase::F_RAW && status.format->sample_format() == ExportFormatBase::SF_16 && @@ -456,7 +449,7 @@ ExportHandler::write_cue_header (CDMarkerStatus & status) status.out << "MOTOROLA"; } } else { - // AIFF should return "AIFF" + // no special case for AIFF format it's name is already "AIFF" status.out << status.format->format_name(); } status.out << endl; @@ -495,21 +488,18 @@ ExportHandler::write_track_info_cue (CDMarkerStatus & status) if (status.marker->cd_info.find("isrc") != status.marker->cd_info.end()) { status.out << " ISRC " << status.marker->cd_info["isrc"] << endl; - } if (status.marker->name() != "") { - status.out << " TITLE \"" << status.marker->name() << '"' << endl; + status.out << " TITLE " << cue_escape_cdtext (status.marker->name()) << endl; } if (status.marker->cd_info.find("performer") != status.marker->cd_info.end()) { - status.out << " PERFORMER \"" << status.marker->cd_info["performer"] << '"' << endl; - } else { - status.out << " PERFORMER \"\"" << endl; + status.out << " PERFORMER " << cue_escape_cdtext (status.marker->cd_info["performer"]) << endl; } if (status.marker->cd_info.find("composer") != status.marker->cd_info.end()) { - status.out << " SONGWRITER \"" << status.marker->cd_info["composer"] << '"' << endl; + status.out << " SONGWRITER " << cue_escape_cdtext (status.marker->cd_info["composer"]) << endl; } if (status.track_position != status.track_start_frame) { @@ -677,4 +667,23 @@ ExportHandler::toc_escape_filename (const std::string& txt) return out; } +std::string +ExportHandler::cue_escape_cdtext (const std::string& txt) +{ + std::string latin1_txt; + std::string out; + + try { + latin1_txt = Glib::convert (txt, "ISO-8859-1", "UTF-8"); + } catch (Glib::ConvertError& err) { + throw Glib::ConvertError (err.code(), string_compose (_("Cannot convert %1 to Latin-1 text"), txt)); + } + + // does not do much mor than UTF-8 to Latin1 translation yet, but + // that may have to change if cue parsers in burning programs change + out = '"' + latin1_txt + '"'; + + return out; +} + } // namespace ARDOUR -- cgit v1.2.3