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:
parent
7ccc494c37
commit
e2601b67ff
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user