summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorSakari Bergen <sakari.bergen@beatwaves.net>2009-06-11 19:50:24 +0000
committerSakari Bergen <sakari.bergen@beatwaves.net>2009-06-11 19:50:24 +0000
commite2601b67ff8b183546ab7fbf0c00af8cdb4b15b0 (patch)
treec78ba71fcab7369b5019bd4702d1d5d8478fb79e /libs
parent7ccc494c37623d1c937e18510b1217f927f85760 (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.cc75
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;