From 7f1bd3c94126026deb17d8b043aa90a6ad10c6ec Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 28 Apr 2016 21:38:09 +0200 Subject: [PATCH] consolidate and re-order luasession code --- tools/luadevel/luasession.cc | 162 ++++++++++++++++++++--------------- 1 file changed, 95 insertions(+), 67 deletions(-) diff --git a/tools/luadevel/luasession.cc b/tools/luadevel/luasession.cc index 54a78abdd0..a131bb443f 100644 --- a/tools/luadevel/luasession.cc +++ b/tools/luadevel/luasession.cc @@ -40,8 +40,14 @@ using namespace PBD; static const char* localedir = LOCALEDIR; static PBD::ScopedConnectionList engine_connections; static PBD::ScopedConnectionList session_connections; -static Session *_session = NULL; -static LuaState *lua; +static Session* session = NULL; +static LuaState* lua; +static bool keep_running = true; + +/* extern VST functions */ +int vstfx_init (void*) { return 0; } +void vstfx_exit () {} +void vstfx_destroy_editor (VSTState*) {} class LuaReceiver : public Receiver { @@ -89,10 +95,10 @@ class MyEventLoop : public sigc::trackable, public EventLoop void call_slot (InvalidationRecord* ir, const boost::function& f) { if (Glib::Threads::Thread::self () == run_loop_thread) { - //cout << string_compose ("%1/%2 direct dispatch of call slot via functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir); + cout << string_compose ("%1/%2 direct dispatch of call slot via functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir); f (); } else { - //cout << string_compose ("%1/%2 queue call-slot using functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir); + cout << string_compose ("%1/%2 queue call-slot using functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir); assert (!ir); f (); // XXX TODO, queue and process during run () } @@ -109,13 +115,16 @@ class MyEventLoop : public sigc::trackable, public EventLoop Glib::Threads::Mutex request_buffer_map_lock; }; +static MyEventLoop *event_loop = NULL; + +/* ****************************************************************************/ +/* internal helper fn and callbacks */ + static int do_audio_midi_setup (uint32_t desired_sample_rate) { return AudioEngine::instance ()->start (); } -static MyEventLoop *event_loop = NULL; - static void init () { if (!ARDOUR::init (false, true, localedir)) { @@ -140,10 +149,10 @@ static void init () static void set_session (ARDOUR::Session *s) { - _session = s; + session = s; assert (lua); lua_State* L = lua->getState (); - LuaBindings::set_session (L, _session); + LuaBindings::set_session (L, session); lua->collect_garbage (); // drop references } @@ -153,25 +162,51 @@ static void unset_session () set_session (NULL); } -static Session * _create_session (string dir, string state, uint32_t rate) +static int prepare_engine () { AudioEngine* engine = AudioEngine::instance (); if (!engine->current_backend ()) { if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) { std::cerr << "Cannot create Audio/MIDI engine\n"; - return 0; + return -1; } } if (!engine->current_backend ()) { std::cerr << "Cannot create Audio/MIDI engine\n"; - return 0; + return -1; } if (engine->running ()) { engine->stop (); } + return 0; +} + +static int start_engine (uint32_t rate) +{ + AudioEngine* engine = AudioEngine::instance (); + + if (engine->set_sample_rate (rate)) { + std::cerr << "Cannot set session's samplerate.\n"; + return -1; + } + + if (engine->start () != 0) { + std::cerr << "Cannot start Audio/MIDI engine\n"; + return -1; + } + + init_post_engine (); + return 0; +} + +static Session * _create_session (string dir, string state, uint32_t rate) // throws +{ + if (prepare_engine ()) { + return 0; + } std::string s = Glib::build_filename (dir, state + statefile_suffix); if (Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) { @@ -179,12 +214,7 @@ static Session * _create_session (string dir, string state, uint32_t rate) return 0; } - engine->set_sample_rate (rate); - - init_post_engine (); - - if (engine->start () != 0) { - std::cerr << "Cannot start Audio/MIDI engine\n"; + if (start_engine (rate)) { return 0; } @@ -196,64 +226,46 @@ static Session * _create_session (string dir, string state, uint32_t rate) bus_profile.requested_physical_in = 0; // use all available bus_profile.requested_physical_out = 0; // use all available + AudioEngine* engine = AudioEngine::instance (); Session* session = new Session (*engine, dir, state, &bus_profile); return session; } -static Session * _load_session (string dir, string state) +static Session * _load_session (string dir, string state) // throws { - AudioEngine* engine = AudioEngine::instance (); - - if (!engine->current_backend ()) { - if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) { - std::cerr << "Cannot create Audio/MIDI engine\n"; - return 0; - } - } - - if (!engine->current_backend ()) { - std::cerr << "Cannot create Audio/MIDI engine\n"; + if (prepare_engine ()) { return 0; } - if (engine->running ()) { - engine->stop (); - } - float sr; SampleFormat sf; - std::string s = Glib::build_filename (dir, state + statefile_suffix); if (!Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) { std::cerr << "Cannot find session: " << s << "\n"; return 0; } - if (Session::get_info_from_path (s, sr, sf) == 0) { - if (engine->set_sample_rate (sr)) { - std::cerr << "Cannot set session's samplerate.\n"; - return 0; - } - } else { + if (Session::get_info_from_path (s, sr, sf) != 0) { std::cerr << "Cannot get samplerate from session.\n"; return 0; } - init_post_engine (); - - if (engine->start () != 0) { - std::cerr << "Cannot start Audio/MIDI engine\n"; + if (start_engine (sr)) { return 0; } + AudioEngine* engine = AudioEngine::instance (); Session* session = new Session (*engine, dir, state); return session; } +/* ****************************************************************************/ +/* lua bound functions */ + static Session* create_session (string dir, string state, uint32_t rate) { Session* s = 0; - if (_session) { + if (session) { cerr << "Session already open" << "\n"; return 0; } @@ -284,7 +296,7 @@ static Session* create_session (string dir, string state, uint32_t rate) static Session* load_session (string dir, string state) { Session* s = 0; - if (_session) { + if (session) { cerr << "Session already open" << "\n"; return 0; } @@ -312,15 +324,20 @@ static Session* load_session (string dir, string state) return s; } +static int set_debug_options (const char *opts) +{ + return PBD::parse_debug_options (opts); +} + static void close_session () { - delete _session; - assert (!_session); + delete session; + assert (!session); } static int close_session_lua (lua_State *L) { - if (!_session) { + if (!session) { cerr << "No open session" << "\n"; return 0; } @@ -328,21 +345,24 @@ static int close_session_lua (lua_State *L) return 0; } -/* extern VST functions */ -int vstfx_init (void*) { return 0; } -void vstfx_exit () {} -void vstfx_destroy_editor (VSTState*) {} - -static void my_lua_print (std::string s) { - std::cout << s << "\n"; -} - static void delay (float d) { if (d > 0) { Glib::usleep (d * 1000000); } } +static int do_quit (lua_State *L) +{ + keep_running = false; + return 0; +} + +/* ****************************************************************************/ + +static void my_lua_print (std::string s) { + std::cout << s << "\n"; +} + static void setup_lua () { assert (!lua); @@ -362,8 +382,11 @@ static void setup_lua () .addFunction ("load_session", &load_session) .addFunction ("close_session", &close_session) .addFunction ("sleep", &delay) + .addFunction ("quit", &do_quit) + .addFunction ("set_debug_options", &set_debug_options) .endNamespace (); + // add a Session::close() method luabridge::getGlobalNamespace (L) .beginNamespace ("ARDOUR") .beginClass ("Session") @@ -374,6 +397,8 @@ static void setup_lua () // push instance to global namespace (C++ lifetime) luabridge::push (L, AudioEngine::create ()); lua_setglobal (L, "AudioEngine"); + + AudioEngine::instance ()->stop (); } int main (int argc, char **argv) @@ -386,28 +411,31 @@ int main (int argc, char **argv) read_history (histfile.c_str()); - char *line; - while ((line = readline ("> "))) { + char *line = NULL; + while (keep_running && (line = readline ("> "))) { event_loop->run(); if (!strcmp (line, "quit")) { + free (line); line = NULL; break; } + if (strlen (line) == 0) { - free (line); + free (line); line = NULL; continue; } - if (!lua->do_command (line)) { - add_history (line); // OK - } else { - add_history (line); // :) + + if (lua->do_command (line)) { + // error } + + add_history (line); event_loop->run(); - free (line); + free (line); line = NULL; } free (line); printf ("\n"); - if (_session) { + if (session) { close_session (); }