Provide dialogs to edit pan values numerically, at least for
[ardour.git] / libs / ardour / audioengine.cc
index abf4999e7f9c7aec41292517de829dc71f1405f0..7c3beb6c13d795bf8cd26a7b745e95c251766891 100644 (file)
 #include <jack/weakjack.h>
 
 #include "midi++/port.h"
+#include "midi++/jack_midi_port.h"
 #include "midi++/mmc.h"
 #include "midi++/manager.h"
 
-#include "ardour/amp.h"
 #include "ardour/audio_port.h"
 #include "ardour/audioengine.h"
 #include "ardour/buffer.h"
-#include "ardour/buffer_set.h"
 #include "ardour/cycle_timer.h"
-#include "ardour/event_type_map.h"
-#include "ardour/internal_return.h"
 #include "ardour/internal_send.h"
-#include "ardour/io.h"
 #include "ardour/meter.h"
 #include "ardour/midi_port.h"
-#include "ardour/process_thread.h"
 #include "ardour/port.h"
-#include "ardour/port_set.h"
+#include "ardour/process_thread.h"
 #include "ardour/session.h"
-#include "ardour/timestamps.h"
-#include "ardour/utils.h"
 
 #include "i18n.h"
 
@@ -84,6 +77,7 @@ AudioEngine::AudioEngine (string client_name, string session_uuid)
        _frame_rate = 0;
        _buffer_size = 0;
        _freewheeling = false;
+       _pre_freewheel_mmc_enabled = false;
         _main_thread = 0;
        port_remove_in_progress = false;
 
@@ -132,7 +126,7 @@ _thread_init_callback (void * /*arg*/)
 
        SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
 
-       MIDI::Port::set_process_thread (pthread_self());
+       MIDI::JackMIDIPort::set_process_thread (pthread_self());
 }
 
 static void
@@ -232,7 +226,7 @@ AudioEngine::stop (bool forever)
                } else {
                        jack_deactivate (_priv_jack);
                        Stopped(); /* EMIT SIGNAL */
-                       MIDI::Port::JackHalted (); /* EMIT SIGNAL */
+                       MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
                }
        }
 
@@ -344,7 +338,20 @@ AudioEngine::_process_thread (void *arg)
 void
 AudioEngine::_freewheel_callback (int onoff, void *arg)
 {
-       static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
+       static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
+}
+
+void
+AudioEngine::freewheel_callback (int onoff)
+{
+       _freewheeling = onoff;
+
+       if (onoff) {
+               _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
+               MIDI::Manager::instance()->mmc()->enable_send (false);
+       } else {
+               MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
+       }
 }
 
 void
@@ -462,12 +469,21 @@ AudioEngine::process_callback (pframes_t nframes)
                next_processed_frames = _processed_frames + nframes;
        }
 
-       if (!tm.locked() || _session == 0) {
+       if (!tm.locked()) {
                /* return having done nothing */
                _processed_frames = next_processed_frames;
                return 0;
        }
 
+       if (_session == 0) {
+               if (!_freewheeling) {
+                       MIDI::Manager::instance()->cycle_start(nframes);
+                       MIDI::Manager::instance()->cycle_end();
+               }
+               _processed_frames = next_processed_frames;
+               return 0;
+       }
+
        if (session_remove_pending) {
                /* perform the actual session removal */
                _session = 0;
@@ -504,9 +520,13 @@ AudioEngine::process_callback (pframes_t nframes)
                }
 
        } else {
+               MIDI::Manager::instance()->cycle_start(nframes);
+
                if (_session) {
                        _session->process (nframes);
                }
+
+               MIDI::Manager::instance()->cycle_end();
        }
 
        if (_freewheeling) {
@@ -762,7 +782,7 @@ AudioEngine::port_registration_failure (const std::string& portname)
        if (p) {
                reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
        } else {
-               reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME);
+               reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with more ports if you need this many tracks."), PROGRAM_NAME);
        }
 
        throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
@@ -1079,7 +1099,7 @@ AudioEngine::halted (void *arg)
 
        if (was_running) {
                ae->Halted(""); /* EMIT SIGNAL */
-               MIDI::Port::JackHalted (); /* EMIT SIGNAL */
+               MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
        }
 }
 
@@ -1329,7 +1349,7 @@ AudioEngine::disconnect_from_jack ()
        if (_running) {
                _running = false;
                Stopped(); /* EMIT SIGNAL */
-               MIDI::Port::JackHalted (); /* EMIT SIGNAL */
+               MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
        }
 
        return 0;