6 #include "pbd/event_loop.h"
8 #include "pbd/failed_constructor.h"
9 #include "pbd/pthread_utils.h"
11 #include "ardour/audioengine.h"
12 #include "ardour/filename_extensions.h"
13 #include "ardour/types.h"
18 using namespace ARDOUR;
21 static const char* localedir = LOCALEDIR;
22 TestReceiver test_receiver;
25 TestReceiver::receive (Transmitter::Channel chn, const char * str)
27 const char *prefix = "";
30 case Transmitter::Error:
31 prefix = ": [ERROR]: ";
33 case Transmitter::Info:
36 case Transmitter::Warning:
37 prefix = ": [WARNING]: ";
39 case Transmitter::Fatal:
40 prefix = ": [FATAL]: ";
42 case Transmitter::Throw:
43 /* this isn't supposed to happen */
47 /* note: iostreams are already thread-safe: no external
51 std::cout << prefix << str << std::endl;
53 if (chn == Transmitter::Fatal) {
58 /* temporarily required due to some code design confusion (Feb 2014) */
60 #include "ardour/vst_types.h"
62 int vstfx_init (void*) { return 0; }
64 void vstfx_destroy_editor (VSTState*) {}
66 class MyEventLoop : public sigc::trackable, public EventLoop
69 MyEventLoop (std::string const& name) : EventLoop (name) {
70 run_loop_thread = Glib::Threads::Thread::self();
73 void call_slot (InvalidationRecord*, const boost::function<void()>& f) {
74 if (Glib::Threads::Thread::self() == run_loop_thread) {
79 Glib::Threads::Mutex& slot_invalidation_mutex() { return request_buffer_map_lock; }
80 Glib::Threads::Mutex& request_invalidation_mutex() { return request_invalidation_lock; }
83 Glib::Threads::Thread* run_loop_thread;
84 Glib::Threads::Mutex request_buffer_map_lock;
85 Glib::Threads::Mutex request_invalidation_lock;
88 static MyEventLoop *event_loop;
91 SessionUtils::init (bool print_log)
93 if (!ARDOUR::init (false, true, localedir)) {
94 cerr << "Ardour failed to initialize\n" << endl;
95 ::exit (EXIT_FAILURE);
98 event_loop = new MyEventLoop ("util");
99 EventLoop::set_event_loop_for_thread (event_loop);
100 SessionEvent::create_per_thread_pool ("util", 512);
103 test_receiver.listen_to (error);
104 test_receiver.listen_to (info);
105 test_receiver.listen_to (fatal);
106 test_receiver.listen_to (warning);
110 // TODO return NULL, rather than exit() ?!
111 static Session * _load_session (string dir, string state)
113 AudioEngine* engine = AudioEngine::create ();
115 if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) {
116 std::cerr << "Cannot create Audio/MIDI engine\n";
117 ::exit (EXIT_FAILURE);
120 engine->set_input_channels (256);
121 engine->set_output_channels (256);
126 std::string s = Glib::build_filename (dir, state + statefile_suffix);
127 if (Session::get_info_from_path (s, sr, sf) == 0) {
128 if (engine->set_sample_rate (sr)) {
129 std::cerr << "Cannot set session's samplerate.\n";
133 std::cerr << "Cannot get samplerate from session.\n";
139 if (engine->start () != 0) {
140 std::cerr << "Cannot start Audio/MIDI engine\n";
144 Session* session = new Session (*engine, dir, state);
145 engine->set_session (session);
150 SessionUtils::load_session (string dir, string state, bool exit_at_failure)
154 s = _load_session (dir, state);
155 } catch (failed_constructor& e) {
156 cerr << "failed_constructor: " << e.what() << "\n";
157 ::exit (EXIT_FAILURE);
158 } catch (AudioEngine::PortRegistrationFailure& e) {
159 cerr << "PortRegistrationFailure: " << e.what() << "\n";
160 ::exit (EXIT_FAILURE);
161 } catch (exception& e) {
162 cerr << "exception: " << e.what() << "\n";
163 ::exit (EXIT_FAILURE);
165 cerr << "unknown exception.\n";
166 ::exit (EXIT_FAILURE);
168 if (!s && exit_at_failure) {
169 ::exit (EXIT_FAILURE);
175 SessionUtils::unload_session (Session *s)
178 AudioEngine::instance()->stop ();
179 AudioEngine::destroy ();
183 SessionUtils::cleanup ()
187 pthread_cancel_all ();