restore ability to create TOC and CUE files during export. this is an option in a given export format, not a per-export choice. so you need export formats with them set (or not) in order to utilize this choice. the resulting CUE/TOC files have not been checked with a burner (e.g. cdrdao) and testing of them would be appreciated - i (paul) have no CD burner h/w

git-svn-id: svn://localhost/ardour2/branches/3.0@11266 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2012-01-18 21:56:06 +00:00
parent 577469a06a
commit 65c8d673a2
9 changed files with 99 additions and 10 deletions

View File

@ -64,6 +64,9 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
sample_format_label (_("Sample Format"), Gtk::ALIGN_LEFT),
dither_label (_("Dithering"), Gtk::ALIGN_LEFT),
with_cue (_("Create CUE file for disk-at-once CD/DVD creation")),
with_toc (_("Create TOC file for disk-at-once CD/DVD creation")),
tag_checkbox (_("Tag file with session's metadata"))
{
@ -73,6 +76,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
get_vbox()->pack_start (silence_table, false, false, 6);
get_vbox()->pack_start (format_table, false, false, 6);
get_vbox()->pack_start (encoding_options_vbox, false, false, 0);
get_vbox()->pack_start (cue_toc_vbox, false, false, 0);
/* Name, new and remove */
@ -129,6 +133,12 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
close_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportFormatDialog::end_dialog));
manager.CompleteChanged.connect (*this, invalidator (*this), ui_bind (&Gtk::Button::set_sensitive, close_button, _1), gui_context());
with_cue.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_with_cue));
with_toc.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_with_toc));
cue_toc_vbox.pack_start (with_cue, false, false);
cue_toc_vbox.pack_start (with_toc, false, false);
/* Load state before hooking up the rest of the signals */
load_state (format);
@ -234,6 +244,9 @@ ExportFormatDialog::load_state (FormatPtr spec)
silence_end = spec->silence_end_time();
silence_end_checkbox.set_active (spec->silence_end_time().not_zero());
with_cue.set_active (spec->with_cue());
with_toc.set_active (spec->with_toc());
for (Gtk::ListStore::Children::iterator it = src_quality_list->children().begin(); it != src_quality_list->children().end(); ++it) {
if (it->get_value (src_quality_cols.id) == spec->src_quality()) {
src_quality_combo.set_active (it);
@ -685,6 +698,18 @@ ExportFormatDialog::change_compatibility (bool compatibility, boost::weak_ptr<T>
}
}
void
ExportFormatDialog::update_with_cue ()
{
manager.select_with_cue (with_cue.get_active());
}
void
ExportFormatDialog::update_with_toc ()
{
manager.select_with_toc (with_toc.get_active());
}
void
ExportFormatDialog::update_name ()
{

View File

@ -297,6 +297,14 @@ class ExportFormatDialog : public ArdourDialog, public PBD::ScopedConnectionList
Gtk::Label sample_format_label;
Gtk::Label dither_label;
Gtk::CheckButton with_cue;
Gtk::CheckButton with_toc;
Gtk::VBox cue_toc_vbox;
void update_with_toc ();
void update_with_cue ();
Gtk::TreeView sample_format_view;
Gtk::TreeView dither_type_view;

View File

@ -97,6 +97,8 @@ class ExportFormatManager : public PBD::ScopedConnectionList
void set_name (std::string name);
void select_with_cue (bool);
void select_with_toc (bool);
void select_src_quality (ExportFormatBase::SRCQuality value);
void select_trim_beginning (bool value);
void select_silence_beginning (AnyTime const & time);

View File

@ -93,6 +93,8 @@ class ExportFormatSpecification : public ExportFormatBase {
void set_normalize_target (float value) { _normalize_target = value; }
void set_tag (bool tag_it) { _tag = tag_it; }
void set_with_cue (bool yn) { _with_cue = yn; }
void set_with_toc (bool yn) { _with_toc = yn; }
void set_silence_beginning (AnyTime const & value) { _silence_beginning = value; }
void set_silence_end (AnyTime const & value) { _silence_end = value; }
@ -120,6 +122,8 @@ class ExportFormatSpecification : public ExportFormatBase {
bool trim_end () const { return _trim_end; }
bool normalize () const { return _normalize; }
float normalize_target () const { return _normalize_target; }
bool with_toc() const { return _with_toc; }
bool with_cue() const { return _with_cue; }
bool tag () const { return _tag && supports_tagging; }
@ -167,6 +171,8 @@ class ExportFormatSpecification : public ExportFormatBase {
bool _normalize;
float _normalize_target;
bool _with_toc;
bool _with_cue;
/* serialization helpers */

View File

@ -264,6 +264,18 @@ ExportFormatManager::select_src_quality (ExportFormatBase::SRCQuality value)
current_selection->set_src_quality (value);
}
void
ExportFormatManager::select_with_cue (bool value)
{
current_selection->set_with_cue (value);
}
void
ExportFormatManager::select_with_toc (bool value)
{
current_selection->set_with_toc (value);
}
void
ExportFormatManager::select_trim_beginning (bool value)
{

View File

@ -167,6 +167,8 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
, _normalize (false)
, _normalize_target (1.0)
, _with_toc (false)
, _with_cue (false)
{
format_ids.insert (F_None);
endiannesses.insert (E_FileDefault);
@ -235,6 +237,8 @@ ExportFormatSpecification::get_state ()
root->add_property ("name", _name);
root->add_property ("id", _id.to_s());
root->add_property ("with-cue", _with_cue ? "true" : "false");
root->add_property ("with-toc", _with_toc ? "true" : "false");
node = root->add_child ("Encoding");
node->add_property ("id", enum_2_string (format_id()));
@ -300,6 +304,18 @@ ExportFormatSpecification::set_state (const XMLNode & root)
_id = prop->value();
}
if ((prop = root.property ("with-cue"))) {
_with_cue = string_is_affirmative (prop->value());
} else {
_with_cue = false;
}
if ((prop = root.property ("with-toc"))) {
_with_toc = string_is_affirmative (prop->value());
} else {
_with_toc = false;
}
/* Encoding and SRC */
if ((child = root.child ("Encoding"))) {
@ -320,7 +336,11 @@ ExportFormatSpecification::set_state (const XMLNode & root)
}
if ((prop = child->property ("has-sample-format"))) {
has_sample_format = !prop->value().compare ("true");
has_sample_format = string_is_affirmative (prop->value());
}
if ((prop = child->property ("has-sample-format"))) {
has_sample_format = string_is_affirmative (prop->value());
}
if ((prop = child->property ("channel-limit"))) {

View File

@ -237,6 +237,17 @@ void
ExportHandler::finish_timespan ()
{
while (config_map.begin() != timespan_bounds.second) {
ExportFormatSpecPtr fmt = config_map.begin()->second.format;
if (fmt->with_cue()) {
export_cd_marker_file (current_timespan, fmt, config_map.begin()->second.filename->get_path(fmt), CDMarkerCUE);
}
if (fmt->with_toc()) {
export_cd_marker_file (current_timespan, fmt, config_map.begin()->second.filename->get_path(fmt), CDMarkerTOC);
}
config_map.erase (config_map.begin());
}
@ -256,12 +267,11 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp
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 */
}
/* do not strip file suffix because there may be more than one format,
and we do not want the CD marker file from one format to overwrite
another (e.g. foo.wav.cue > foo.aiff.cue)
*/
void (ExportHandler::*header_func) (CDMarkerStatus &);
void (ExportHandler::*track_func) (CDMarkerStatus &);
@ -269,13 +279,15 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp
switch (format) {
case CDMarkerTOC:
filepath = Glib::build_filename(Glib::path_get_dirname(filename), basename + ".toc");
filepath = filename;
filepath += ".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 = Glib::build_filename(Glib::path_get_dirname(filename), basename + ".cue");
filepath = filename;
filepath += ".cue";
header_func = &ExportHandler::write_cue_header;
track_func = &ExportHandler::write_track_info_cue;
index_func = &ExportHandler::write_index_info_cue;

View File

@ -178,7 +178,7 @@ Session::process_export (pframes_t nframes)
ProcessExport (nframes);
} catch (std::exception & e) {
std::cout << e.what() << std::endl;
error << string_compose (_("Export ended unexpectedly: %1"), e.what()) << endmsg;
export_status->abort (true);
}
}
@ -222,6 +222,9 @@ Session::finalize_audio_export ()
_engine.freewheel (false);
export_freewheel_connection.disconnect();
/* maybe write CUE/TOC */
export_handler.reset();
export_status.reset();

View File

@ -643,7 +643,8 @@ string_is_affirmative (const std::string& str)
* in the way we desire when doing it in C.
*/
return str == "1" || str == "y" || str == "Y" || (!g_strncasecmp(str.c_str(), "yes", str.length()));
return str == "1" || str == "y" || str == "Y" || (!g_strncasecmp(str.c_str(), "yes", str.length())) ||
(!g_strncasecmp(str.c_str(), "true", str.length()));
}
const char*