#include "ardour/export_handler.h"
#include "ardour/export_failed.h"
#include "ardour/filename_extensions.h"
+#include "ardour/route.h"
#include "ardour/session.h"
+#include "ardour/broadcast_info.h"
#include "i18n.h"
namespace ARDOUR
{
-ExportProfileManager::ExportProfileManager (Session & s) :
- handler (s.get_export_handler()),
- session (s),
+ExportProfileManager::ExportProfileManager (Session & s, std::string xml_node_name)
+ : xml_node_name (xml_node_name)
+ , handler (s.get_export_handler())
+ , session (s)
- session_range (new Location ()),
- ranges (new LocationList ()),
- single_range_mode (false),
+ , session_range (new Location (s))
+ , ranges (new LocationList ())
+ , single_range_mode (false)
- format_list (new FormatList ())
+ , format_list (new FormatList ())
{
/* Initialize path variables */
search_path += export_config_dir;
search_path += ardour_search_path().add_subdirectory_to_paths("export");
- search_path += system_config_search_path().add_subdirectory_to_paths("export");;
+
+ sys::path sys_export = ardour_module_directory();
+ sys_export /= "export";
+
+ search_path += sys_export;
+
+ info << string_compose (_("Searching for export formats in %1"), search_path.to_string()) << endmsg;
+ cerr << string_compose (_("Searching for export formats in %1"), search_path.to_string()) << endl;
/* create export config directory if necessary */
{
if (single_range_mode) { return; }
- XMLNode * instant_xml (new XMLNode ("ExportProfile"));
+ XMLNode * instant_xml (new XMLNode (xml_node_name));
serialize_profile (*instant_xml);
session.add_instant_xml (*instant_xml, false);
}
void
ExportProfileManager::load_profile ()
{
- XMLNode * instant_node = session.instant_xml ("ExportProfile");
+ XMLNode * instant_node = session.instant_xml (xml_node_name);
if (instant_node) {
set_state (*instant_node);
} else {
- XMLNode empty_node ("ExportProfile");
+ XMLNode empty_node (xml_node_name);
set_state (empty_node);
}
}
void
ExportProfileManager::prepare_for_export ()
{
- ChannelConfigPtr channel_config = channel_configs.front()->config;
TimespanListPtr ts_list = timespans.front()->timespans;
FormatStateList::const_iterator format_it;
FilenameStateList::const_iterator filename_it;
+ // For each timespan
for (TimespanList::iterator ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
+ // ..., each format-filename pair
for (format_it = formats.begin(), filename_it = filenames.begin();
format_it != formats.end() && filename_it != filenames.end();
++format_it, ++filename_it) {
+ FilenamePtr filename = (*filename_it)->filename;
// filename->include_timespan = (ts_list->size() > 1); Disabled for now...
- handler->add_export_config (*ts_it, channel_config, (*format_it)->format, (*filename_it)->filename);
+
+ boost::shared_ptr<BroadcastInfo> b;
+ if ((*format_it)->format->has_broadcast_info()) {
+ b.reset (new BroadcastInfo);
+ b->set_from_session (session, (*ts_it)->get_start());
+ }
+
+ // ...and each channel config
+ filename->include_channel_config = (channel_configs.size() > 1);
+ for(ChannelConfigStateList::iterator cc_it = channel_configs.begin(); cc_it != channel_configs.end(); ++cc_it) {
+ handler->add_export_config (*ts_it, (*cc_it)->config, (*format_it)->format, filename, b);
+ }
}
}
}
bool
ExportProfileManager::set_state (XMLNode const & root)
{
- return set_global_state (root) && set_local_state (root);
+ return set_global_state (root) & set_local_state (root);
}
bool
ExportProfileManager::set_global_state (XMLNode const & root)
{
- return init_filenames (root.children ("ExportFilename")) &&
+ return init_filenames (root.children ("ExportFilename")) &
init_formats (root.children ("ExportFormat"));
}
bool
ExportProfileManager::set_local_state (XMLNode const & root)
{
- return init_timespans (root.children ("ExportTimespan")) &&
+ return init_timespans (root.children ("ExportTimespan")) &
init_channel_configs (root.children ("ExportChannelConfiguration"));
}
}
void
-ExportProfileManager::set_selection_range (nframes_t start, nframes_t end)
+ExportProfileManager::set_selection_range (framepos_t start, framepos_t end)
{
if (start || end) {
- selection_range.reset (new Location());
+ selection_range.reset (new Location (session));
selection_range->set_name (_("Selection"));
selection_range->set (start, end);
} else {
}
std::string
-ExportProfileManager::set_single_range (nframes_t start, nframes_t end, Glib::ustring name)
+ExportProfileManager::set_single_range (framepos_t start, framepos_t end, string name)
{
single_range_mode = true;
- single_range.reset (new Location());
+ single_range.reset (new Location (session));
single_range->set_name (name);
single_range->set (start, end);
}
if (timespans.empty()) {
- TimespanStatePtr timespan (new TimespanState (session_range, selection_range, ranges));
- timespans.push_back (timespan);
+ TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges));
+ timespans.push_back (state);
+
+ // Add session as default selection
+ TimespanPtr timespan = handler->add_timespan();
+ timespan->set_name (session_range->name());
+ timespan->set_range_id ("session");
+ timespan->set_range (session_range->start(), session_range->end());
+ state->timespans->push_back (timespan);
return false;
}
prop = (*node_it)->property ("id");
if (!prop) { continue; }
- ustring id = prop->value();
+ string id = prop->value();
for (LocationList::iterator it = ranges->begin(); it != ranges->end(); ++it) {
if ((!id.compare ("session") && *it == session_range.get()) ||
}
}
+ExportProfileManager::ChannelConfigStatePtr
+ExportProfileManager::add_channel_config ()
+{
+ ChannelConfigStatePtr ptr(new ChannelConfigState(handler->add_channel_config()));
+ channel_configs.push_back(ptr);
+ return ptr;
+}
+
bool
ExportProfileManager::init_channel_configs (XMLNodeList nodes)
{
if (nodes.empty()) {
ChannelConfigStatePtr config (new ChannelConfigState (handler->add_channel_config()));
channel_configs.push_back (config);
+
+ // Add master outs as default
+ IO* master_out = session.master_out()->output().get();
+ if (!master_out) { return false; }
+
+ for (uint32_t n = 0; n < master_out->n_ports().n_audio(); ++n) {
+ PortExportChannel * channel = new PortExportChannel ();
+ channel->add_port (master_out->audio (n));
+
+ ExportChannelPtr chan_ptr (channel);
+ config->config->register_channel (chan_ptr);
+ }
return false;
}
/* Get filename for file */
- Glib::ustring new_name = format->name();
+ string new_name = format->name();
new_name += export_format_suffix;
sys::path new_path (export_config_dir);
for (uint32_t chan = 1; chan <= channel_config->get_n_chans(); ++chan) {
filename->set_channel (chan);
- Glib::ustring path = filename->get_path (format);
+ string path = filename->get_path (format);
if (sys::exists (sys::path (path))) {
warnings->conflicting_filenames.push_back (path);
}
} else {
- Glib::ustring path = filename->get_path (format);
+ string path = filename->get_path (format);
if (sys::exists (sys::path (path))) {
warnings->conflicting_filenames.push_back (path);