#define __ardour_export_channel_configuration_h__
#include <list>
-
#include <glibmm/ustring.h>
+#include <boost/enable_shared_from_this.hpp>
#include "ardour/export_channel.h"
#include "ardour/export_status.h"
class ExportTimespan;
class Session;
-class ExportChannelConfiguration
+class ExportChannelConfiguration : public boost::enable_shared_from_this<ExportChannelConfiguration>
{
private:
void register_channel (ExportChannelPtr channel) { channels.push_back (channel); }
void clear_channels () { channels.clear (); }
+
+ /** Returns a list of channel configurations that match the files created.
+ * I.e. many configurations if splitting is enabled, one if not. */
+ void configurations_for_files (std::list<boost::shared_ptr<ExportChannelConfiguration> > & configs);
private:
TimeFormat time_format;
Glib::ustring get_formatted_time (Glib::ustring const & format) const;
- struct tm * time_struct; // Due to static allocation no destructor or copy-ctor is needed because of this
+ // Due to the static allocation used in strftime(), no destructor or copy-ctor is needed for this
+ struct tm * time_struct;
TimespanPtr timespan;
ChannelConfigPtr channel_config;
private:
+ void add_split_config (FileSpec const & config);
+
class Encoder : public sigc::trackable {
public:
template <typename T> boost::shared_ptr<AudioGrapher::Sink<T> > init (FileSpec const & new_config);
return true;
}
+void
+ExportChannelConfiguration::configurations_for_files (std::list<boost::shared_ptr<ExportChannelConfiguration> > & configs)
+{
+ configs.clear ();
+
+ if (!split) {
+ configs.push_back (shared_from_this ());
+ return;
+ }
+
+ for (ChannelList::const_iterator it = channels.begin (); it != channels.end (); ++it) {
+ boost::shared_ptr<ExportChannelConfiguration> config (new ExportChannelConfiguration (session));
+ config->set_name (_name);
+ config->register_channel (*it);
+ configs.push_back (config);
+ }
+}
+
} // namespace ARDOUR
void
ExportGraphBuilder::add_config (FileSpec const & config)
+{
+ if (!config.channel_config->get_split ()) {
+ add_split_config (config);
+ return;
+ }
+
+ // Split channel configurations are split into several channel configurations,
+ // each corresponding to a file, at this stage
+ typedef std::list<boost::shared_ptr<ExportChannelConfiguration> > ConfigList;
+ ConfigList file_configs;
+ config.channel_config->configurations_for_files (file_configs);
+
+ unsigned chan = 1;
+ for (ConfigList::iterator it = file_configs.begin(); it != file_configs.end(); ++it, ++chan) {
+ FileSpec copy = config;
+ copy.channel_config = *it;
+
+ copy.filename.reset (new ExportFilename (*copy.filename));
+ copy.filename->include_channel = true;
+ copy.filename->set_channel (chan);
+
+ add_split_config (copy);
+ }
+}
+
+void
+ExportGraphBuilder::add_split_config (FileSpec const & config)
{
for (ChannelConfigList::iterator it = channel_configs.begin(); it != channel_configs.end(); ++it) {
if (*it == config) {