diff options
-rw-r--r-- | configure.ac | 19 | ||||
-rw-r--r-- | raul/LashClient.h | 60 | ||||
-rw-r--r-- | raul/LashProject.h | 60 | ||||
-rw-r--r-- | raul/LashServerInterface.h | 63 | ||||
-rw-r--r-- | raul/Makefile.am | 3 | ||||
-rw-r--r-- | src/LashClient.cpp | 80 | ||||
-rw-r--r-- | src/LashProject.cpp | 83 | ||||
-rw-r--r-- | src/LashServerInterface.cpp | 164 | ||||
-rw-r--r-- | src/Makefile.am | 8 |
9 files changed, 537 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac index 62f93af..e567dbb 100644 --- a/configure.ac +++ b/configure.ac @@ -112,6 +112,22 @@ if test "$build_liblo" = "yes"; then fi AM_CONDITIONAL(WITH_LIBLO, [test "$build_liblo" = "yes"]) +build_lash="yes" +AC_ARG_ENABLE(lash, + [AS_HELP_STRING(--enable-lash, [Enable LASH session management support (yes)])], + [ if test x$enable_lash = xno ; then build_lash=no ; fi ]) +if test "$build_lash" = "yes"; then + PKG_CHECK_MODULES(LASH, lash-1.0 >= 0.5.0, have_lash="yes", have_lash="no") + if test "$have_lash" = "yes"; then + AC_DEFINE(HAVE_LASH, 1, [Has lash.h]) + else + AC_MSG_WARN([LASH not found, session support will not be built.]) + build_lash="no" + fi +fi +AM_CONDITIONAL(WITH_LASH, [test "$build_lash" = "yes"]) + + AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([raul/Makefile]) @@ -128,10 +144,11 @@ AC_MSG_RESULT([Raul build configuration:]) AC_MSG_RESULT([]) AC_MSG_RESULT([Building unit tests: $build_unit_tests]) AC_MSG_RESULT([]) +AC_MSG_RESULT([Jack support: $build_jack]) +AC_MSG_RESULT([LASH support: $build_lash]) AC_MSG_RESULT([OSC (Liblo) support: $build_liblo]) AC_MSG_RESULT([RDF Serialization (Raptor) support: $build_raptor]) AC_MSG_RESULT([RDF Querying (Rasqal) support: $build_rasqal]) -AC_MSG_RESULT([Jack support: $build_jack]) AC_MSG_RESULT([Smart Pointers (Boost): $build_smart_pointers]) AC_MSG_RESULT([**********************************************************************]) AC_MSG_RESULT([]) diff --git a/raul/LashClient.h b/raul/LashClient.h new file mode 100644 index 0000000..1325bc8 --- /dev/null +++ b/raul/LashClient.h @@ -0,0 +1,60 @@ +/* This file is part of Raul. + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * 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 + */ + +#ifndef RAUL_LASH_CLIENT_H +#define RAUL_LASH_CLIENT_H + +#include <string> +#include <boost/enable_shared_from_this.hpp> +#include <lash/lash.h> +#include <raul/SharedPtr.h> + +namespace Raul { + + +class LashClient : public boost::enable_shared_from_this<LashClient> { +public: + virtual ~LashClient(); + + static SharedPtr<LashClient> create( + lash_args_t* args, + const std::string& name, + int flags); + + lash_client_t* lash_client() { return _lash_client; }; + + bool enabled() { return lash_enabled(_lash_client); } + + void process_events(); + +protected: + LashClient(lash_client_t* client); + + virtual void handle_event(lash_event_t*) {} + virtual void handle_config(lash_config_t*) {} + + friend class LashProject; + virtual void project_closed(const std::string& /*name*/) {} + + lash_client_t* _lash_client; +}; + + +} // namespace Raul + +#endif // RAUL_LASH_CLIENT_H + diff --git a/raul/LashProject.h b/raul/LashProject.h new file mode 100644 index 0000000..93a2163 --- /dev/null +++ b/raul/LashProject.h @@ -0,0 +1,60 @@ +/* This file is part of Raul. + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * 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 + */ + +#ifndef RAUL_LASH_PROJECT_H +#define RAUL_LASH_PROJECT_H + +#include <string> +#include <sigc++/sigc++.h> +#include <raul/SharedPtr.h> +#include <raul/WeakPtr.h> +#include <raul/LashClient.h> + +namespace Raul { + + +class LashProject : public sigc::trackable { +public: + LashProject(SharedPtr<LashClient> client, const std::string& name); + + void save(); + void close(); + + const std::string& name() { return _name; } + const std::string& directory() { return _directory; } + + void set_directory(const std::string& filename); + void set_name(const std::string& name); + + sigc::signal<void, const std::string&> signal_name; + sigc::signal<void, const std::string&> signal_directory; + sigc::signal<void, const std::string&> signal_save_file; + sigc::signal<void, const std::string&> signal_restore_file; + + bool operator==(const std::string& name) { return _name == name; } + +private: + WeakPtr<LashClient> _client; + std::string _name; + std::string _directory; +}; + + +} // namespace Raul + +#endif // RAUL_LASH_PROJECT_H + diff --git a/raul/LashServerInterface.h b/raul/LashServerInterface.h new file mode 100644 index 0000000..9a2d332 --- /dev/null +++ b/raul/LashServerInterface.h @@ -0,0 +1,63 @@ +/* This file is part of Raul. + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * 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 + */ + +#ifndef RAUL_LASH_SERVER_INTERFACE_H +#define RAUL_LASH_SERVER_INTERFACE_H + +#include <string> +#include <list> +#include <lash/lash.h> +#include <raul/LashClient.h> +#include <raul/LashProject.h> +#include <raul/SharedPtr.h> +#include <sigc++/sigc++.h> + + +namespace Raul { + + +class LashServerInterface : public LashClient, public sigc::trackable { +public: + static SharedPtr<LashServerInterface> create( + lash_args_t* args, + const std::string& name, + int flags); + + sigc::signal<void> signal_quit; + sigc::signal<void, const SharedPtr<LashProject> > signal_project_add; + sigc::signal<void, const SharedPtr<LashProject> > signal_project_remove; + + void restore_project(const std::string& filename); + + typedef std::list<SharedPtr<LashProject> > Projects; + Projects& projects() { return _projects; } + + SharedPtr<LashProject> project(const std::string& name); + +private: + LashServerInterface(lash_client_t* client); + void handle_event(lash_event_t* ev); + void project_closed(const std::string& name); + + Projects _projects; +}; + + +} // namespace Raul + +#endif // RAUL_LASH_SERVER_INTERFACE_H + diff --git a/raul/Makefile.am b/raul/Makefile.am index 9c9e71c..bc22299 100644 --- a/raul/Makefile.am +++ b/raul/Makefile.am @@ -45,3 +45,6 @@ if WITH_RAPTOR raulinclude_HEADERS += AtomRaptor.h endif +if WITH_LASH +raulinclude_HEADERS += LashClient.h LashServerInterface.h LashProject.h +endif 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 <http://drobilla.net> + * + * 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 <raul/LashClient.h> + +using namespace std; + +namespace Raul { + + +LashClient::LashClient(lash_client_t* lash_client) + : _lash_client(lash_client) +{ +} + + +LashClient::~LashClient() +{ + +} + + + +SharedPtr<LashClient> +LashClient::create( + lash_args_t* args, + const string& name, + int flags) +{ + SharedPtr<LashClient> result; + + lash_client_t* client = lash_init(args, name.c_str(), + flags, LASH_PROTOCOL(2, 0)); + + if (client) + result = SharedPtr<LashClient>(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 <http://drobilla.net> + * + * 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 <raul/LashProject.h> + +using namespace std; + +namespace Raul { + +LashProject::LashProject(SharedPtr<LashClient> client, const string& name) + : _client(client) + , _name(name) +{ +} + + +void +LashProject::save() +{ + SharedPtr<LashClient> 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<LashClient> 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<LashClient> 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<LashClient> 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 <http://drobilla.net> + * + * 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 <iostream> +#include <raul/LashServerInterface.h> + +using namespace std; + +namespace Raul { + + +LashServerInterface::LashServerInterface(lash_client_t* lash_client) + : LashClient(lash_client) +{ +} + + +SharedPtr<LashServerInterface> +LashServerInterface::create( + lash_args_t* args, + const string& name, + int flags) +{ + SharedPtr<LashServerInterface> result; + + lash_client_t* client = lash_init(args, name.c_str(), + flags | LASH_Server_Interface, LASH_PROTOCOL(2, 0)); + + if (client) + result = SharedPtr<LashServerInterface>(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<LashProject> p; + + //cout << "[LashDriver] LASH Event. Type = " << (unsigned int)type << ", string = " << str << "**********" << endl; + + switch (type) { + case LASH_Project_Add: + p = project(str); + if (!p) { + SharedPtr<LashProject> 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<LashProject> project, const std::string& name) +{ + return (project->name() == name); +} + + +SharedPtr<LashProject> +LashServerInterface::project(const std::string& name) +{ + for (Projects::iterator p = _projects.begin(); p != _projects.end(); ++p) + if ((*p)->name() == name) + return *p; + + return SharedPtr<LashProject>(); +} + + +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 |