fix newly-appearing crash-at-close caused by muddled thinking in pbd/pthread_utils
[ardour.git] / gtk2_ardour / engine_dialog.cc
index 615e79e184402b39d53a86a2a871f5f327671c67..05cd9a661ed8bae19245759ae54fef19380a4431 100644 (file)
@@ -35,7 +35,7 @@
 #include <CoreFoundation/CFString.h>
 #include <sys/param.h>
 #include <mach-o/dyld.h>
-#else
+#elif !defined(__FreeBSD__)
 #include <alsa/asoundlib.h>
 #endif
 
@@ -44,6 +44,8 @@
 #include <gtkmm/stock.h>
 #include <gtkmm2ext/utils.h>
 
+#include "ardour/rc_configuration.h"
+
 #include "pbd/convert.h"
 #include "pbd/error.h"
 #include "pbd/pathscanner.h"
@@ -81,7 +83,7 @@ EngineControl::EngineControl ()
          verbose_output_button (_("Verbose output")),
          start_button (_("Start")),
          stop_button (_("Stop")),
-#ifdef __APPLE__
+#ifdef __APPLE___
          basic_packer (5, 2),
          options_packer (4, 2),
          device_packer (4, 2)
@@ -137,7 +139,9 @@ EngineControl::EngineControl ()
 #ifdef __APPLE__
        strings.push_back (X_("CoreAudio"));
 #else
+#ifndef __FreeBSD__
        strings.push_back (X_("ALSA"));
+#endif
        strings.push_back (X_("OSS"));
        strings.push_back (X_("FreeBoB"));
        strings.push_back (X_("FFADO"));
@@ -163,8 +167,12 @@ EngineControl::EngineControl ()
 
        strings.clear ();
        strings.push_back (_("None"));
+#ifdef __APPLE__
+       strings.push_back (_("coremidi"));
+#else
        strings.push_back (_("seq"));
        strings.push_back (_("raw"));
+#endif
        set_popdown_strings (midi_driver_combo, strings);
        midi_driver_combo.set_active_text (strings.front ());
 
@@ -190,7 +198,7 @@ EngineControl::EngineControl ()
        basic_packer.attach (period_size_combo, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
        row++;
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
        label = manage (left_aligned_label (_("Number of buffers:")));
        basic_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
        basic_packer.attach (periods_spinner, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
@@ -210,7 +218,7 @@ EngineControl::EngineControl ()
        row++;
        /* no audio mode with CoreAudio, its duplex or nuthin' */
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
        label = manage (left_aligned_label (_("Audio mode:")));
        basic_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
        basic_packer.attach (audio_mode_combo, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
@@ -250,7 +258,7 @@ EngineControl::EngineControl ()
 
 #if PROVIDE_TOO_MANY_OPTIONS
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
        options_packer.attach (no_memory_lock_button, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
        ++row;
        options_packer.attach (unlock_memory_button, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
@@ -298,7 +306,7 @@ EngineControl::EngineControl ()
        options_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
        ++row;
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
        label = manage (left_aligned_label (_("Dither:")));
        options_packer.attach (dither_mode_combo, 1, 2, row, row + 1, FILL|EXPAND, AttachOptions(0));
        options_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
@@ -327,7 +335,7 @@ EngineControl::EngineControl ()
        device_packer.set_spacings (6);
        row = 0;
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
        label = manage (left_aligned_label (_("Input device:")));
        device_packer.attach (*label, 0, 1, row, row+1, FILL|EXPAND, (AttachOptions) 0);
        device_packer.attach (input_device_combo, 1, 2, row, row+1, FILL|EXPAND, (AttachOptions) 0);
@@ -364,6 +372,14 @@ EngineControl::EngineControl ()
 
        set_border_width (12);
        pack_start (notebook);
+
+       /* Pick up any existing audio setup configuration, if appropriate */
+
+       XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioSetup");
+       
+       if (audio_setup) {
+               set_state (*audio_setup);
+       }
 }
 
 EngineControl::~EngineControl ()
@@ -427,6 +443,12 @@ EngineControl::build_command_line (vector<string>& cmd)
 
        cmd.push_back ("-T"); // temporary */
 
+       /* setup coremidi before the driver, otherwise jack won't start */
+
+       if (midi_driver_combo.get_active_text() == _("coremidi")) {
+               cmd.push_back ("-X coremidi");
+       }
+
        /* next the driver */
 
        cmd.push_back ("-d");
@@ -458,11 +480,11 @@ EngineControl::build_command_line (vector<string>& cmd)
        if (!using_coreaudio) {
                str = audio_mode_combo.get_active_text();
 
-               if (str == _("Playback/Recording on 1 Device")) {
+               if (str == _("Playback/recording on 1 device")) {
 
                        /* relax */
 
-               } else if (str == _("Playback/Recording on 2 Devices")) {
+               } else if (str == _("Playback/recording on 2 devices")) {
 
                        string input_device = get_device_name (driver, input_device_combo.get_active_text());
                        string output_device = get_device_name (driver, output_device_combo.get_active_text());
@@ -515,7 +537,7 @@ EngineControl::build_command_line (vector<string>& cmd)
 
        if (using_alsa) {
 
-               if (audio_mode_combo.get_active_text() != _("Playback/Recording on 2 Devices")) {
+               if (audio_mode_combo.get_active_text() != _("Playback/recording on 2 devices")) {
 
                        string device = get_device_name (driver, interface_combo.get_active_text());
                        if (device.empty()) {
@@ -579,13 +601,21 @@ EngineControl::build_command_line (vector<string>& cmd)
        }
 }
 
+bool
+EngineControl::need_setup ()
+{
+       return !engine_running();
+}
+
 bool
 EngineControl::engine_running ()
 {
         EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
         boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
 
-        /* revert all environment settings back to whatever they were when ardour started
+        /* revert all environment settings back to whatever they were when
+        * ardour started, because ardour's startup script may have reset
+        * something in ways that interfere with finding/starting JACK.
          */
 
         if (global_epa) {
@@ -623,12 +653,11 @@ EngineControl::setup_engine ()
                error << string_compose (_("cannot open JACK rc file %1 to store parameters"), jackdrc_path) << endmsg;
                return -1;
        }
-       cerr << "JACK COMMAND: ";
+
        for (vector<string>::iterator i = args.begin(); i != args.end(); ++i) {
-               cerr << (*i) << ' ';
                jackdrc << (*i) << ' ';
        }
-       cerr << endl;
+
        jackdrc << endl;
        jackdrc.close ();
 
@@ -647,7 +676,7 @@ EngineControl::enumerate_devices (const string& driver)
                devices[driver] = enumerate_coreaudio_devices ();
 #endif
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
        } else if (driver == "ALSA") {
                devices[driver] = enumerate_alsa_devices ();
        } else if (driver == "FreeBOB") {
@@ -755,7 +784,7 @@ EngineControl::enumerate_coreaudio_devices ()
 
 
        if (devs.size() == 0) {
-               MessageDialog msg (_("\
+               MessageDialog msg (string_compose (_("\
 You do not have any audio devices capable of\n\
 simultaneous playback and recording.\n\n\
 Please use Applications -> Utilities -> Audio MIDI Setup\n\
@@ -765,8 +794,8 @@ Please send email to Apple and ask them why new Macs\n\
 have no duplex audio device.\n\n\
 Alternatively, if you really want just playback\n\
 or recording but not both, start JACK before running\n\
-Ardour and choose the relevant device then."
-                                          ),
+%1 and choose the relevant device then."
+                                                          ), PROGRAM_NAME),
                                   true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK);
                msg.set_title (_("No suitable audio devices"));
                msg.set_position (Gtk::WIN_POS_MOUSE);
@@ -778,6 +807,8 @@ Ardour and choose the relevant device then."
        return devs;
 }
 #else
+
+#if !defined(__FreeBSD__)
 vector<string>
 EngineControl::enumerate_alsa_devices ()
 {
@@ -821,6 +852,7 @@ EngineControl::enumerate_alsa_devices ()
 
        return devs;
 }
+#endif
 
 vector<string>
 EngineControl::enumerate_ffado_devices ()
@@ -920,7 +952,7 @@ void
 EngineControl::redisplay_latency ()
 {
        uint32_t rate = get_rate();
-#ifdef __APPLE_
+#if defined(__APPLE__) || defined(__FreeBSD__)
        float periods = 2;
 #else
        float periods = periods_adjustment.get_value();
@@ -939,10 +971,10 @@ EngineControl::audio_mode_changed ()
 {
        std::string str = audio_mode_combo.get_active_text();
 
-       if (str == _("Playback/Recording on 1 Device")) {
+       if (str == _("Playback/recording on 1 device")) {
                input_device_combo.set_sensitive (false);
                output_device_combo.set_sensitive (false);
-       } else if (str == _("Playback/Recording on 2 Devices")) {
+       } else if (str == _("Playback/recording on 2 devices")) {
                input_device_combo.set_sensitive (true);
                output_device_combo.set_sensitive (true);
        } else if (str == _("Playback only")) {