From 15499616e93c99ed9836461e0ef4b1b76ad8933d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 6 Apr 2007 02:20:48 +0000 Subject: LASH project saving/restoring. git-svn-id: http://svn.drobilla.net/lad/raul@400 a436a847-0d15-0410-975c-d299462d15a1 --- src/LashClient.cpp | 80 +++++++++++++++++++++ src/LashProject.cpp | 83 ++++++++++++++++++++++ src/LashServerInterface.cpp | 164 ++++++++++++++++++++++++++++++++++++++++++++ src/Makefile.am | 8 ++- 4 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 src/LashClient.cpp create mode 100644 src/LashProject.cpp create mode 100644 src/LashServerInterface.cpp (limited to 'src') diff --git a/src/LashClient.cpp b/src/LashClient.cpp new file mode 100644 index 0000000..aa035a5 --- /dev/null +++ b/src/LashClient.cpp @@ -0,0 +1,80 @@ +/* This file is part of Raul. + * Copyright (C) 2007 Dave Robillard + * + * Raul 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. + * + * Raul 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +using namespace std; + +namespace Raul { + + +LashClient::LashClient(lash_client_t* lash_client) + : _lash_client(lash_client) +{ +} + + +LashClient::~LashClient() +{ + +} + + + +SharedPtr +LashClient::create( + lash_args_t* args, + const string& name, + int flags) +{ + SharedPtr result; + + lash_client_t* client = lash_init(args, name.c_str(), + flags, LASH_PROTOCOL(2, 0)); + + if (client) + result = SharedPtr(new LashClient(client)); + + return result; +} + + +/** Process all pending LASH events. + * + * This should be called regularly to keep track of LASH state. + */ +void +LashClient::process_events() +{ + lash_event_t* ev = NULL; + lash_config_t* conf = NULL; + + // Process events + while ((ev = lash_get_event(_lash_client)) != NULL) { + handle_event(ev); + lash_event_destroy(ev); + } + + // Process configs + while ((conf = lash_get_config(_lash_client)) != NULL) { + handle_config(conf); + lash_config_destroy(conf); + } +} + + +} // namespace Raul diff --git a/src/LashProject.cpp b/src/LashProject.cpp new file mode 100644 index 0000000..77f6d7d --- /dev/null +++ b/src/LashProject.cpp @@ -0,0 +1,83 @@ +/* This file is part of Raul. + * Copyright (C) 2007 Dave Robillard + * + * Raul 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. + * + * Raul 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +using namespace std; + +namespace Raul { + +LashProject::LashProject(SharedPtr client, const string& name) + : _client(client) + , _name(name) +{ +} + + +void +LashProject::save() +{ + SharedPtr client = _client.lock(); + if (client) { + lash_event_t* event = lash_event_new_with_type(LASH_Save); + lash_event_set_project(event, _name.c_str()); + lash_send_event(client->lash_client(), event); + } +} + + +void +LashProject::close() +{ + SharedPtr client = _client.lock(); + if (client) { + lash_event_t* event = lash_event_new_with_type(LASH_Project_Remove); + lash_event_set_project(event, _name.c_str()); + lash_send_event(client->lash_client(), event); + } +} + + +void +LashProject::set_directory(const string& filename) +{ + SharedPtr client = _client.lock(); + if (client) { + lash_event_t* event = lash_event_new_with_type(LASH_Project_Dir); + lash_event_set_project(event, _name.c_str()); + lash_event_set_string(event, filename.c_str()); + lash_send_event(client->lash_client(), event); + } +} + + +void +LashProject::set_name(const string& name) +{ + SharedPtr client = _client.lock(); + if (client) { + lash_event_t* event = lash_event_new_with_type(LASH_Project_Name); + lash_event_set_project(event, _name.c_str()); + lash_event_set_string(event, name.c_str()); + lash_send_event(client->lash_client(), event); + } + + _name = name; +} + + +} // namespace Raul diff --git a/src/LashServerInterface.cpp b/src/LashServerInterface.cpp new file mode 100644 index 0000000..07a50c3 --- /dev/null +++ b/src/LashServerInterface.cpp @@ -0,0 +1,164 @@ +/* This file is part of Raul. + * Copyright (C) 2007 Dave Robillard + * + * Raul 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. + * + * Raul 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include + +using namespace std; + +namespace Raul { + + +LashServerInterface::LashServerInterface(lash_client_t* lash_client) + : LashClient(lash_client) +{ +} + + +SharedPtr +LashServerInterface::create( + lash_args_t* args, + const string& name, + int flags) +{ + SharedPtr result; + + lash_client_t* client = lash_init(args, name.c_str(), + flags | LASH_Server_Interface, LASH_PROTOCOL(2, 0)); + + if (client) + result = SharedPtr(new LashServerInterface(client)); + + return result; +} + + +void +LashServerInterface::handle_event(lash_event_t* ev) +{ + LASH_Event_Type type = lash_event_get_type(ev); + const char* c_str = lash_event_get_string(ev); + const string str = (c_str == NULL) ? "" : c_str; + + SharedPtr p; + + //cout << "[LashDriver] LASH Event. Type = " << (unsigned int)type << ", string = " << str << "**********" << endl; + + switch (type) { + case LASH_Project_Add: + p = project(str); + if (!p) { + SharedPtr project(new LashProject(shared_from_this(), str)); + _projects.push_back(project); + signal_project_add.emit(project); + } + break; + case LASH_Project_Remove: + p = project(lash_event_get_project(ev)); + if (p) { + signal_project_remove.emit(p); + _projects.remove(p); + } + break; + case LASH_Project_Dir: + p = project(lash_event_get_project(ev)); + if (p) { + p->set_directory(str); + p->signal_directory.emit(str); + } + break; + case LASH_Project_Name: + p = project(lash_event_get_project(ev)); + if (p) { + p->set_name(str); + p->signal_name.emit(str); + } + break; + case LASH_Client_Add: + break; + case LASH_Client_Name: + break; + case LASH_Jack_Client_Name: + break; + case LASH_Alsa_Client_ID: + break; + case LASH_Percentage: + break; + case LASH_Save: + break; + case LASH_Restore_Data_Set: + break; + case LASH_Server_Lost: + break; + case LASH_Client_Remove: + break; + case LASH_Save_File: + break; + case LASH_Restore_File: + break; + case LASH_Save_Data_Set: + break; + case LASH_Quit: + _lash_client = NULL; + signal_quit.emit(); + break; + } + + LashClient::handle_event(ev); +} + + +void +LashServerInterface::restore_project(const std::string& filename) +{ + lash_event_t* event = lash_event_new_with_type(LASH_Project_Add); + lash_event_set_string(event, filename.c_str()); + lash_send_event(lash_client(), event); +} + + +bool +project_comparator(SharedPtr project, const std::string& name) +{ + return (project->name() == name); +} + + +SharedPtr +LashServerInterface::project(const std::string& name) +{ + for (Projects::iterator p = _projects.begin(); p != _projects.end(); ++p) + if ((*p)->name() == name) + return *p; + + return SharedPtr(); +} + + +void +LashServerInterface::project_closed(const string& name) +{ + for (Projects::iterator p = _projects.begin(); p != _projects.end(); ++p) { + if ((*p)->name() == name) { + _projects.erase(p); + break; + } + } +} + + +} // namespace Raul diff --git a/src/Makefile.am b/src/Makefile.am index 646eacc..ce58a21 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ -libraul_la_CXXFLAGS = -I$(top_srcdir) @RAPTOR_CFLAGS@ @RASQAL_CFLAGS@ @GLIBMM_CFLAGS@ @JACK_CFLAGS@ -libraul_la_LIBADD = @RAPTOR_LIBS@ @RASQAL_LIBS@ @GLIBMM_LIBS@ @JACK_LIBS@ +libraul_la_CXXFLAGS = -I$(top_srcdir) @RAPTOR_CFLAGS@ @RASQAL_CFLAGS@ @GLIBMM_CFLAGS@ @JACK_CFLAGS@ @LASH_CFLAGS@ +libraul_la_LIBADD = @RAPTOR_LIBS@ @RASQAL_LIBS@ @GLIBMM_LIBS@ @JACK_LIBS@ @LASH_LIBS@ lib_LTLIBRARIES = libraul.la @@ -22,3 +22,7 @@ endif if WITH_JACK libraul_la_SOURCES += JackDriver.cpp endif + +if WITH_LASH +libraul_la_SOURCES += LashClient.cpp LashServerInterface.cpp LashProject.cpp +endif -- cgit v1.2.1