catch jack shutdown (from server) and handle it better then we used to in terms of...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 29 Apr 2009 02:14:35 +0000 (02:14 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 29 Apr 2009 02:14:35 +0000 (02:14 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@5006 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/session.h
libs/ardour/audioengine.cc
libs/ardour/session_transport.cc

index b2f9197a4de297188d674d600b98d94c010505bd..42095004fcd9980e03f8bd354000a83939087c8d 100644 (file)
@@ -1090,7 +1090,7 @@ class Session : public PBD::StatefulDestructible
 
        void reset_slave_state ();
        bool follow_slave (nframes_t);
-       void set_slave_source (SlaveSource);
+       void set_slave_source (SlaveSource, bool stop_transport = true);
 
        bool _exporting;
        int  prepare_to_export (ARDOUR::AudioExportSpecification&);
index c31ce98a37e71dcf2f3487e48db17b9ca40f956d..c7932daeecbf40674f2e6c2413e5bc23384d4872 100644 (file)
@@ -819,6 +819,7 @@ AudioEngine::halted (void *arg)
        ae->_running = false;
        ae->_buffer_size = 0;
        ae->_frame_rate = 0;
+       ae->_jack = 0;
 
        if (was_running) {
                ae->Halted(); /* EMIT SIGNAL */
@@ -962,8 +963,7 @@ nframes_t
 AudioEngine::get_port_total_latency (const Port& port)
 {
        if (!_jack) {
-               fatal << _("get_port_total_latency() called with no JACK client connection") << endmsg;
-               /*NOTREACHED*/
+               return 0;
        }
 
        return jack_port_get_total_latency (_jack, port._port);
index 280189241ca1aaf04dcc869eb8bf9dfff2be46ce..3d5e7a30acc16656bd7aae9360ad5b837cc41946 100644 (file)
@@ -1016,7 +1016,7 @@ Session::reset_rf_scale (nframes_t motion)
 }
 
 void
-Session::set_slave_source (SlaveSource src)
+Session::set_slave_source (SlaveSource src, bool stop_the_transport)
 {
        bool reverse = false;
        bool non_rt_required = false;
@@ -1041,7 +1041,9 @@ Session::set_slave_source (SlaveSource src)
 
        switch (src) {
        case None:
-               stop_transport ();
+               if (stop_the_transport) {
+                       stop_transport ();
+               }
                break;
                
        case MTC:
@@ -1233,11 +1235,16 @@ Session::engine_halted ()
        g_atomic_int_set (&butler_should_do_transport_work, 0);
        post_transport_work = PostTransportWork (0);
        stop_butler ();
-       
+
        realtime_stop (false);
        non_realtime_stop (false, 0, ignored);
        transport_sub_state = 0;
 
+       if (synced_to_jack()) {
+               /* transport is already stopped, hence the second argument */
+               set_slave_source (None, false);
+       }
+
        TransportStateChange (); /* EMIT SIGNAL */
 }