Fix merge regression: use TempoLines class instead of same built in to editor.
[ardour.git] / libs / ardour / auditioner.cc
index 7bbc4cd0ba3534a4022ba3b22f63e0b5dfb1d0c4..d6f63c2f9da410183e4e180672016ef4d9cec87d 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <glibmm/thread.h>
@@ -65,7 +64,7 @@ Auditioner::Auditioner (Session& s)
        }
 
        if (right.length()) {
-               audio_diskstream()->add_channel();
+               audio_diskstream()->add_channel (1);
                add_output_port (right, this, DataType::AUDIO);
        }
 
@@ -111,7 +110,7 @@ Auditioner::audition_current_playlist ()
 
        /* force a panner reset now that we have all channels */
 
-       _panner->reset (n_outputs().get(DataType::AUDIO), _diskstream->n_channels().get(DataType::AUDIO));
+       _panner->reset (n_outputs().n_audio(), _diskstream->n_channels().n_audio());
 
        g_atomic_int_set (&_active, 1);
 }
@@ -138,15 +137,13 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
        boost::shared_ptr<AudioRegion> the_region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (region)));
        the_region->set_position (0, this);
 
-       _diskstream->playlist()->clear ();
+       _diskstream->playlist()->drop_regions ();
        _diskstream->playlist()->add_region (the_region, 0, 1);
 
-       while (_diskstream->n_channels().get(DataType::AUDIO) < the_region->n_channels()) {
-               audio_diskstream()->add_channel ();
-       }
-
-       while (_diskstream->n_channels().get(DataType::AUDIO) > the_region->n_channels()) {
-               audio_diskstream()->remove_channel ();
+       if (_diskstream->n_channels().n_audio() < the_region->n_channels()) {
+               audio_diskstream()->add_channel (the_region->n_channels() - _diskstream->n_channels().n_audio());
+       } else if (_diskstream->n_channels().n_audio() > the_region->n_channels()) {
+               audio_diskstream()->remove_channel (_diskstream->n_channels().n_audio() - the_region->n_channels());
        }
 
        /* force a panner reset now that we have all channels */
@@ -154,8 +151,19 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
        reset_panner();
 
        length = the_region->length();
-       _diskstream->seek (0);
-       current_frame = 0;
+
+       int dir;
+       nframes_t offset = the_region->sync_offset (dir);
+
+       /* can't audition from a negative sync point */
+
+       if (dir < 0) {
+               offset = 0;
+       }
+
+       _diskstream->seek (offset);
+       current_frame = offset;
+
        g_atomic_int_set (&_active, 1);
 }
 
@@ -197,29 +205,27 @@ Auditioner::output_changed (IOChange change, void* src)
        string phys;
 
        if (change & ConnectionsChanged) {
-               const char ** connections;
-               connections =  output (0)->get_connections ();
-               if (connections) {
+               vector<string> connections;
+               if (output (0)->get_connections (connections)) {
                        phys = _session.engine().get_nth_physical_output (DataType::AUDIO, 0);
                        if (phys != connections[0]) {
                                Config->set_auditioner_output_left (connections[0]);
                        } else {
                                Config->set_auditioner_output_left ("default");
                        }
-                       free (connections);
                } else {
                        Config->set_auditioner_output_left ("");
                }
                
-               connections = output (1)->get_connections ();
-               if (connections) {
+               connections.clear ();
+
+               if (output (1)->get_connections (connections)) {
                        phys = _session.engine().get_nth_physical_output (DataType::AUDIO, 1);
                        if (phys != connections[0]) {
                                Config->set_auditioner_output_right (connections[0]);
                        } else {
                                Config->set_auditioner_output_right ("default");
                        }
-                       free (connections);
                } else {
                        Config->set_auditioner_output_right ("");
                }