cd marker export patch from Andreas Ruge modified for 3.0
authorSakari Bergen <sakari.bergen@beatwaves.net>
Thu, 11 Jun 2009 19:50:24 +0000 (19:50 +0000)
committerSakari Bergen <sakari.bergen@beatwaves.net>
Thu, 11 Jun 2009 19:50:24 +0000 (19:50 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5173 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/export_handler.cc

index d80001ac8822855285481260f4e14eb30fb6dd6f..59da803ac9de98bfad570d9a0304e0617e523824 100644 (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;