diff options
author | Sakari Bergen <sakari.bergen@beatwaves.net> | 2009-06-11 19:50:24 +0000 |
---|---|---|
committer | Sakari Bergen <sakari.bergen@beatwaves.net> | 2009-06-11 19:50:24 +0000 |
commit | e2601b67ff8b183546ab7fbf0c00af8cdb4b15b0 (patch) | |
tree | c78ba71fcab7369b5019bd4702d1d5d8478fb79e /libs | |
parent | 7ccc494c37623d1c937e18510b1217f927f85760 (diff) |
cd marker export patch from Andreas Ruge modified for 3.0
git-svn-id: svn://localhost/ardour2/branches/3.0@5173 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/export_handler.cc | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index d80001ac88..59da803ac9 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -20,6 +20,8 @@ #include "ardour/export_handler.h" +#include <glibmm.h> + #include "pbd/convert.h" #include "pbd/filesystem.h" @@ -174,19 +176,26 @@ void ExportHandler::export_cd_marker_file (TimespanPtr timespan, FormatPtr file_format, std::string filename, CDMarkerFormat format) { string filepath; + string basename = Glib::path_get_basename(filename); + + size_t ext_pos = basename.rfind('.'); + if (ext_pos != string::npos) { + basename = basename.substr(0, ext_pos); /* strip file extension, if there is one */ + } + void (ExportHandler::*header_func) (CDMarkerStatus &); void (ExportHandler::*track_func) (CDMarkerStatus &); void (ExportHandler::*index_func) (CDMarkerStatus &); switch (format) { case CDMarkerTOC: - filepath = filename + ".toc"; + filepath = Glib::build_filename(Glib::path_get_dirname(filename), basename + ".toc"); header_func = &ExportHandler::write_toc_header; track_func = &ExportHandler::write_track_info_toc; index_func = &ExportHandler::write_index_info_toc; break; case CDMarkerCUE: - filepath = filename + ".cue"; + filepath = Glib::build_filename(Glib::path_get_dirname(filename), basename + ".cue"); header_func = &ExportHandler::write_cue_header; track_func = &ExportHandler::write_track_info_cue; index_func = &ExportHandler::write_index_info_cue; @@ -288,12 +297,39 @@ ExportHandler::write_cue_header (CDMarkerStatus & status) status.out << "REM Cue file generated by Ardour" << endl; status.out << "TITLE \"" << title << "\"" << endl; - // TODO + /* 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 << "FILE \"" << Glib::path_get_basename(status.filename) << "\" "; if (!status.format->format_name().compare ("WAV")) { - status.out << "FILE " << status.filename << " WAVE" << endl; + status.out << "WAVE"; + } else if (status.format->format_name() == ExportFormatBase::F_RAW && + status.format->sample_format() == ExportFormatBase::SF_16 && + status.format->sample_rate() == ExportFormatBase::SR_44_1) { + // Format is RAW 16bit 44.1kHz + if (status.format->endianness() == ExportFormatBase::E_Little) { + status.out << "BINARY"; + } else { + status.out << "MOTOROLA"; + } } else { - status.out << "FILE \"" << status.filename << "\" " << status.format->format_name() << endl; + // AIFF should return "AIFF" + status.out << status.format->format_name(); } + status.out << endl; } void @@ -311,41 +347,44 @@ ExportHandler::write_track_info_cue (CDMarkerStatus & status) { gchar buf[18]; - status.out << endl << "TRACK " << status.track_number << " AUDIO" << endl; - status.out << "FLAGS " ; + snprintf (buf, sizeof(buf), " TRACK %02d AUDIO", status.track_number); + status.out << buf << endl; + status.out << " FLAGS" ; if (status.marker->cd_info.find("scms") != status.marker->cd_info.end()) { - status.out << "SCMS "; + status.out << " SCMS "; } else { - status.out << "DCP "; + status.out << " DCP "; } if (status.marker->cd_info.find("preemph") != status.marker->cd_info.end()) { - status.out << "PRE"; + status.out << " PRE"; } status.out << endl; if (status.marker->cd_info.find("isrc") != status.marker->cd_info.end()) { - status.out << "ISRC " << status.marker->cd_info["isrc"] << endl; + status.out << " ISRC " << status.marker->cd_info["isrc"] << endl; } if (status.marker->name() != "") { - status.out << "TITLE \"" << status.marker->name() << "\"" << endl; + status.out << " TITLE \"" << 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; + status.out << " PERFORMER \"" << status.marker->cd_info["performer"] << "\"" << endl; } if (status.marker->cd_info.find("string_composer") != status.marker->cd_info.end()) { - status.out << "SONGWRITER \"" << status.marker->cd_info["string_composer"] << "\"" << endl; + status.out << " SONGWRITER \"" << status.marker->cd_info["string_composer"] << "\"" << endl; } - frames_to_cd_frames_string (buf, status.track_position); - status.out << "INDEX 00" << buf << endl; + if (status.track_position != status.track_start_frame) { + frames_to_cd_frames_string (buf, status.track_position); + status.out << " INDEX 00" << buf << endl; + } frames_to_cd_frames_string (buf, status.track_start_frame); - status.out << "INDEX 01" << buf << endl; + status.out << " INDEX 01" << buf << endl; status.index_number = 2; status.track_number++; @@ -406,7 +445,7 @@ ExportHandler::write_index_info_cue (CDMarkerStatus & status) { gchar buf[18]; - snprintf (buf, sizeof(buf), "INDEX %02d", cue_indexnum); + snprintf (buf, sizeof(buf), " INDEX %02d", cue_indexnum); status.out << buf; frames_to_cd_frames_string (buf, status.index_position); status.out << buf << endl; |