patch for CUE file formatting from Andreas Ruge

git-svn-id: svn://localhost/ardour2/branches/3.0@11368 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2012-01-27 19:15:47 +00:00
parent f56bbe2799
commit d17918e32e
2 changed files with 34 additions and 24 deletions

View File

@ -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;

View File

@ -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;
status.out << "TITLE " << cue_escape_cdtext (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.
/* 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