Fix 64bit OSX/MacOS builds
[ardour.git] / session_utils / common.cc
index 9353c760bdc07c1a4d67efb353808dc7691d037a..3d197181cd037d756200c26682962692055fff80 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ * Copyright (C) 2015-2017 Robin Gareus <robin@gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
 #include <iostream>
 #include <cstdlib>
 #include <glibmm.h>
@@ -86,7 +104,7 @@ class MyEventLoop : public sigc::trackable, public EventLoop
 static MyEventLoop *event_loop;
 
 void
-SessionUtils::init ()
+SessionUtils::init (bool print_log)
 {
        if (!ARDOUR::init (false, true, localedir)) {
                cerr << "Ardour failed to initialize\n" << endl;
@@ -97,10 +115,12 @@ SessionUtils::init ()
        EventLoop::set_event_loop_for_thread (event_loop);
        SessionEvent::create_per_thread_pool ("util", 512);
 
-       test_receiver.listen_to (error);
-       test_receiver.listen_to (info);
-       test_receiver.listen_to (fatal);
-       test_receiver.listen_to (warning);
+       if (print_log) {
+               test_receiver.listen_to (error);
+               test_receiver.listen_to (info);
+               test_receiver.listen_to (fatal);
+               test_receiver.listen_to (warning);
+       }
 }
 
 // TODO return NULL, rather than exit() ?!
@@ -113,25 +133,33 @@ static Session * _load_session (string dir, string state)
                ::exit (EXIT_FAILURE);
        }
 
+       engine->set_input_channels (256);
+       engine->set_output_channels (256);
+
        float sr;
        SampleFormat sf;
+       std::string v;
 
        std::string s = Glib::build_filename (dir, state + statefile_suffix);
-       if (Session::get_info_from_path (s, sr, sf) == 0) {
+
+       if (!Glib::file_test (s, Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR)) {
+               std::cerr << "Cannot read session '"<< s << "'\n";
+               return 0;
+       }
+
+       if (Session::get_info_from_path (s, sr, sf, v) == 0) {
                if (engine->set_sample_rate (sr)) {
                        std::cerr << "Cannot set session's samplerate.\n";
-                       ::exit (EXIT_FAILURE);
+                       return 0;
                }
        } else {
                std::cerr << "Cannot get samplerate from session.\n";
-               ::exit (EXIT_FAILURE);
+               return 0;
        }
 
-       init_post_engine ();
-
        if (engine->start () != 0) {
                std::cerr << "Cannot start Audio/MIDI engine\n";
-               ::exit (EXIT_FAILURE);
+               return 0;
        }
 
        Session* session = new Session (*engine, dir, state);
@@ -140,7 +168,7 @@ static Session * _load_session (string dir, string state)
 }
 
 Session *
-SessionUtils::load_session (string dir, string state)
+SessionUtils::load_session (string dir, string state, bool exit_at_failure)
 {
        Session* s = 0;
        try {
@@ -158,9 +186,50 @@ SessionUtils::load_session (string dir, string state)
                cerr << "unknown exception.\n";
                ::exit (EXIT_FAILURE);
        }
+       if (!s && exit_at_failure) {
+               ::exit (EXIT_FAILURE);
+       }
        return s;
 }
 
+Session *
+SessionUtils::create_session (string dir, string state, float sample_rate)
+{
+       AudioEngine* engine = AudioEngine::create ();
+
+       if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) {
+               std::cerr << "Cannot create Audio/MIDI engine\n";
+               ::exit (EXIT_FAILURE);
+       }
+
+       engine->set_input_channels (256);
+       engine->set_output_channels (256);
+
+       if (engine->set_sample_rate (sample_rate)) {
+               std::cerr << "Cannot set session's samplerate.\n";
+               return 0;
+       }
+
+       if (engine->start () != 0) {
+               std::cerr << "Cannot start Audio/MIDI engine\n";
+               return 0;
+       }
+
+       std::string s = Glib::build_filename (dir, state + statefile_suffix);
+
+       if (Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
+               std::cerr << "Session folder already exists '"<< dir << "'\n";
+       }
+       if (Glib::file_test (s, Glib::FILE_TEST_EXISTS)) {
+               std::cerr << "Session file exists '"<< s << "'\n";
+               return 0;
+       }
+
+       Session* session = new Session (*engine, dir, state);
+       engine->set_session (session);
+       return session;
+}
+
 void
 SessionUtils::unload_session (Session *s)
 {