Fix a memory leak.
[ardour.git] / libs / ardour / export_channel.cc
index dfe038734b60bbe77ebc9505b2092e39c3aa9ddf..9c0bc38792ea4be76b0507f205f4b134d712b6d7 100644 (file)
@@ -26,6 +26,8 @@
 #include "ardour/export_failed.h"
 #include "ardour/session.h"
 
+#include "pbd/error.h"
+
 using namespace ARDOUR;
 
 bool
@@ -39,13 +41,13 @@ PortExportChannel::operator< (ExportChannel const & other) const
 }
 
 void
-PortExportChannel::read (Sample * data, nframes_t frames) const
+PortExportChannel::read (Sample * data, framecnt_t frames) const
 {
        memset (data, 0, frames * sizeof (float));
 
        for (PortSet::const_iterator it = ports.begin(); it != ports.end(); ++it) {
                if (*it != 0) {
-                       Sample* port_buffer = (*it)->get_audio_buffer(frames, 0).data();
+                       Sample* port_buffer = (*it)->get_audio_buffer(frames).data();
 
                        for (uint32_t i = 0; i < frames; ++i) {
                                data[i] += (float) port_buffer[i];
@@ -72,7 +74,13 @@ PortExportChannel::set_state (XMLNode * node, Session & session)
        XMLNodeList xml_ports = node->children ("Port");
        for (XMLNodeList::iterator it = xml_ports.begin(); it != xml_ports.end(); ++it) {
                if ((prop = (*it)->property ("name"))) {
-                       ports.insert (dynamic_cast<AudioPort *> (session.engine().get_port_by_name (prop->value())));
+                       std::string const & name = prop->value();
+                       AudioPort * port = dynamic_cast<AudioPort *> (session.engine().get_port_by_name (name));
+                       if (port) {
+                               ports.insert (port);
+                       } else {
+                               PBD::warning << string_compose (_("Could not get port for export channel \"%1\", dropping the channel"), name) << endmsg;
+                       }
                }
        }
 }
@@ -108,10 +116,10 @@ RegionExportChannelFactory::RegionExportChannelFactory (Session * session, Audio
                throw ExportFailed ("Unhandled type in ExportChannelFactory constructor");
        }
 
-       session->ProcessExport.connect (export_connection, boost::bind (&RegionExportChannelFactory::new_cycle_started, this, _1));
+       session->ProcessExport.connect_same_thread (export_connection, boost::bind (&RegionExportChannelFactory::new_cycle_started, this, _1));
 
-       buffers.set_count (ChanCount (DataType::AUDIO, n_channels));
        buffers.ensure_buffers (DataType::AUDIO, n_channels, frames_per_cycle);
+       buffers.set_count (ChanCount (DataType::AUDIO, n_channels));
 }
 
 RegionExportChannelFactory::~RegionExportChannelFactory ()
@@ -128,7 +136,7 @@ RegionExportChannelFactory::create (uint32_t channel)
 }
 
 void
-RegionExportChannelFactory::read (uint32_t channel, Sample * data, nframes_t frames_to_read)
+RegionExportChannelFactory::read (uint32_t channel, Sample * data, framecnt_t frames_to_read)
 {
        assert (channel < n_channels);
        assert (frames_to_read <= frames_per_cycle);
@@ -142,7 +150,7 @@ RegionExportChannelFactory::read (uint32_t channel, Sample * data, nframes_t fra
 }
 
 void
-RegionExportChannelFactory::update_buffers (nframes_t frames)
+RegionExportChannelFactory::update_buffers (framecnt_t frames)
 {
        assert (frames <= frames_per_cycle);