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
This commit is contained in:
Sakari Bergen 2009-06-11 19:50:24 +00:00
parent 7ccc494c37
commit e2601b67ff

View File

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