On Sun, Mar 28, 2010 at 04:14:29PM +0200, hermann wrote:
> guitarix is a simple Linux Rock Guitar amplifier and is designed 
> to achieve nice thrash/metal/rock/blues guitar sounds. 
> Guitarix uses the Jack Audio Connection Kit as its audio backend 
> and brings in one input and two output ports to the jack graph. 

cool.

here is a jack-session patch. 


-- 
torben Hohn
diff --git a/src/gx_engine.cpp b/src/gx_engine.cpp
index daf8957..eb10c0a 100644
--- a/src/gx_engine.cpp
+++ b/src/gx_engine.cpp
@@ -63,7 +63,7 @@ float ffuse;
 float fskin;
 
 /* --- forward definition of useful namespace functions --- */
-void gx_engine_init()
+void gx_engine_init( const string *optvar )
 {
 	//----- lock the buffer for the oscilloscope
 	const int frag = (const int)gx_jack::jack_bs;
@@ -95,7 +95,11 @@ void gx_engine_init()
 
 	midi.init(gx_jack::jack_sr);
 	faust_init(gx_jack::jack_sr);
-	gx_preset::gx_recall_main_setting(NULL, NULL);
+	if( !optvar[LOAD_FILE].empty() )
+		gx_preset::gx_recall_settings_file( optvar[LOAD_FILE] );
+	else
+		gx_preset::gx_recall_main_setting(NULL, NULL);
+
 	initialized = true;
 }
 
diff --git a/src/gx_globals.cpp b/src/gx_globals.cpp
index c93af1e..b09f0bf 100644
--- a/src/gx_globals.cpp
+++ b/src/gx_globals.cpp
@@ -237,7 +237,9 @@ const char* shell_var_name[] =
 	"GUITARIX2JACK_OUTPUTS1",
 	"GUITARIX2JACK_OUTPUTS2",
 	"GUITARIX2JACK_MIDI",
-	"GUITARIX_RC_STYLE"
+	"GUITARIX_RC_STYLE",
+	"GUITARIX2JACK_UUID",
+	"GUITARIX_LOAD_FILE"
 };
 }
 
diff --git a/src/gx_jack.cpp b/src/gx_jack.cpp
index 8073492..3f26845 100644
--- a/src/gx_jack.cpp
+++ b/src/gx_jack.cpp
@@ -53,6 +53,10 @@ using namespace std;
 
 #include "guitarix.h"
 
+#ifdef HAVE_JACK_SESSION
+#include <jack/session.h>
+#endif
+
 using namespace gx_system;
 using namespace gx_engine;
 using namespace gx_jconv;
@@ -62,7 +66,7 @@ namespace gx_jack
 {
 
 //----- pop up a dialog for starting jack
-bool gx_jack_init()
+bool gx_jack_init( const string *optvar )
 {
 	jack_status_t jackstat;
 	client_name = "guitarix";
@@ -73,8 +77,14 @@ bool gx_jack_init()
 
 	AVOIDDENORMALS;
 
+#ifdef HAVE_JACK_SESSION
 	// try to open jack client
-	client = jack_client_open (client_name.c_str(), JackNoStartServer, &jackstat);
+	if (! optvar[JACK_UUID].empty())
+
+	    client = jack_client_open (client_name.c_str(), jack_options_t(JackNoStartServer | JackSessionID), &jackstat, optvar[JACK_UUID].c_str());
+	else
+#endif
+	    client = jack_client_open (client_name.c_str(), JackNoStartServer, &jackstat);
 
 	if (client == 0)
 	{
@@ -85,7 +95,7 @@ bool gx_jack_init()
 		{
 			gx_print_warning("Jack Init", "jackd OK, trying to be a client");
 			usleep(500000);
-			return gx_jack_init();
+			return gx_jack_init( optvar );
 		}
 
 		// start a dialog
@@ -163,6 +173,10 @@ void gx_jack_callbacks_and_activate()
 	jack_set_process_callback(client, gx_jack_process, 0);
 	jack_set_port_registration_callback(client, gx_jack_portreg_callback, 0);
 	jack_set_client_registration_callback(client, gx_jack_clientreg_callback, 0);
+#ifdef HAVE_JACK_SESSION
+	if (jack_set_session_callback)
+		jack_set_session_callback (client, gx_jack_session_callback, 0);
+#endif
 
 	//----- register the midi input channel
 	midi_input_port =
@@ -355,16 +369,18 @@ void gx_jack_connection(GtkCheckMenuItem *menuitem, gpointer arg)
 {
 	if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM (menuitem)) == TRUE) {
 		if (!client) {
-			if (gx_jack_init()) {
-				string optvar[NUM_SHELL_VAR];
-				gx_assign_shell_var(shell_var_name[JACK_INP],  optvar[JACK_INP] );
-				gx_assign_shell_var(shell_var_name[JACK_MIDI], optvar[JACK_MIDI] );
-				gx_assign_shell_var(shell_var_name[JACK_OUT1], optvar[JACK_OUT1]);
-				gx_assign_shell_var(shell_var_name[JACK_OUT2], optvar[JACK_OUT2]);
+			string optvar[NUM_SHELL_VAR];
+			gx_assign_shell_var(shell_var_name[JACK_INP],  optvar[JACK_INP] );
+			gx_assign_shell_var(shell_var_name[JACK_MIDI], optvar[JACK_MIDI] );
+			gx_assign_shell_var(shell_var_name[JACK_OUT1], optvar[JACK_OUT1]);
+			gx_assign_shell_var(shell_var_name[JACK_OUT2], optvar[JACK_OUT2]);
+			gx_assign_shell_var(shell_var_name[JACK_UUID], optvar[JACK_UUID]);
+
+			if (gx_jack_init(optvar)) {
 
 				// initialize guitarix engine if necessary
 				if (!gx_engine::initialized) {
-					gx_engine::gx_engine_init();
+					gx_engine::gx_engine_init( optvar );
 				}
 				gx_jack_callbacks_and_activate();
 				gx_jack_init_port_connection(optvar);
@@ -855,6 +871,32 @@ void gx_jack_clientreg_callback(const char* name, int reg, void* arg)
 	}
 }
 
+#ifdef HAVE_JACK_SESSION
+static int gx_jack_session_callback_helper(gpointer data) {
+    jack_session_event_t *event = (jack_session_event_t *) data;
+    string fname( event->session_dir );
+    fname += "guitarix.state";
+    string cmd( "guitarix -U " );
+    cmd += event->client_uuid;
+    cmd += " -f ${SESSION_DIR}guitarix.state";
+
+    saveStateToFile( fname );
+
+    event->command_line = strdup( cmd.c_str() );
+
+    jack_session_reply( client, event );
+
+    jack_session_event_free( event );
+
+    return 0;
+}
+
+void gx_jack_session_callback(jack_session_event_t *event, void *arg)
+{
+    gtk_idle_add(gx_jack_session_callback_helper, (void *)event); 
+}
+#endif
+
 //---- GTK callback from port item for port connection
 void gx_jack_port_connect(GtkWidget* wd, gpointer data)
 {
diff --git a/src/gx_main.cpp b/src/gx_main.cpp
index a10d0da..e8d5d4c 100644
--- a/src/gx_main.cpp
+++ b/src/gx_main.cpp
@@ -130,10 +130,10 @@ int main(int argc, char *argv[])
 	gui->setup();
 
 	// ---------------------- initialize jack client ------------------
-	if (gx_jack::gx_jack_init())
+	if (gx_jack::gx_jack_init(optvar))
 	{
 		// -------- initialize guitarix engine --------------------------
-		gx_engine::gx_engine_init();
+		gx_engine::gx_engine_init(optvar);
 
 		// -------- set jack callbacks and activation -------------------
 		gx_jack::gx_jack_callbacks_and_activate();
diff --git a/src/gx_preset.cpp b/src/gx_preset.cpp
index 8218c85..b46e7ab 100644
--- a/src/gx_preset.cpp
+++ b/src/gx_preset.cpp
@@ -802,7 +802,7 @@ void gx_recall_main_setting(GtkMenuItem* item, gpointer)
 {
 	string jname = gx_jack::client_name;
 
-	gx_system::recallState();
+	gx_system::recallState(gx_user_dir + jname + "_rc");
 	gtk_window_set_title(GTK_WINDOW(gx_gui::fWindow), jname.c_str());
 
 	gx_print_info("Main Setting recalling","Called back main setting");
@@ -811,12 +811,25 @@ void gx_recall_main_setting(GtkMenuItem* item, gpointer)
 	gx_current_preset = "";
 }
 
+void gx_recall_settings_file( const string & filename )
+{
+	string jname = gx_jack::client_name;
+
+	gx_system::recallState(filename);
+	gtk_window_set_title(GTK_WINDOW(gx_gui::fWindow), jname.c_str());
+
+	gx_print_info("loading Settings file","loaded settings file");
+
+	setting_is_preset = false;
+	gx_current_preset = "";
+}
+
 // ----- save current setting as main setting
 void gx_save_main_setting(GtkMenuItem* item, gpointer arg)
 {
 	string jname = gx_jack::client_name;
 
-	if (!saveStateToFile()) {
+	if (! saveStateToFile(gx_user_dir + jname + "_rc")) {
 		gx_print_error("Main Setting","can't save main setting");
 	} else if (setting_is_preset) {
 		gx_print_info("Main Setting",
diff --git a/src/gx_system.cpp b/src/gx_system.cpp
index 34ea62e..d97eefa 100644
--- a/src/gx_system.cpp
+++ b/src/gx_system.cpp
@@ -595,9 +595,9 @@ void write_jack_connections(JsonWriter& w)
 }
 
 // -- save state including current preset data
-bool saveStateToFile()
+bool saveStateToFile( const string &filename )
 {
-	string filename = gx_user_dir + client_name + "_rc";
+    printf( "wrinting to %s\n", filename.c_str() );
 	string tmpfile = filename + "_tmp";
 	ofstream f(tmpfile.c_str());
 	JsonWriter w(f);
@@ -663,9 +663,8 @@ static void read_jack_connections(JsonParser& jp)
 }
 
 // -- recallState(filename) : load state from file
-bool recallState()
+bool recallState( const string &filename )
 {
-	string filename = gx_user_dir + client_name + "_rc";
 	ifstream f(filename.c_str());
 	if (!f.good()) {
 		return false;
@@ -827,7 +826,8 @@ void gx_signal_handler(int sig)
 gboolean  gx_ladi_handler(gpointer)
 {
 	gx_print_warning("signal_handler", "signal USR1 received, save settings");
-	saveStateToFile();
+	
+	saveStateToFile(gx_user_dir + client_name + "_rc");
 	return false;
 }
 
@@ -896,6 +896,7 @@ void gx_process_cmdline_options(int& argc, char**& argv, string* optvar)
 		gchar* jack_input = NULL;
 		gchar* jack_midi = NULL;
 		gchar** jack_outputs = NULL;
+		gchar* jack_uuid = NULL;
 		GOptionGroup* optgroup_jack = g_option_group_new("jack",
 		                                                 "\033[1;32mJACK configuration options\033[0m",
 		                                                 "\033[1;32mJACK configuration options\033[0m",
@@ -905,10 +906,25 @@ void gx_process_cmdline_options(int& argc, char**& argv, string* optvar)
 				{ "jack-input", 'i', 0, G_OPTION_ARG_STRING, &jack_input, "Guitarix JACK input", "PORT" },
 				{"jack-output", 'o', 0, G_OPTION_ARG_STRING_ARRAY, &jack_outputs, "Guitarix JACK outputs", "PORT" },
 				{ "jack-midi",  'm', 0, G_OPTION_ARG_STRING, &jack_midi, "Guitarix JACK midi control", "PORT" },
+				{ "jack-uuid",  'U', 0, G_OPTION_ARG_STRING, &jack_uuid, "JackSession ID", NULL },
 				{ NULL }
 			};
 		g_option_group_add_entries(optgroup_jack, opt_entries_jack);
 
+		// FILE options
+		gchar* load_file = NULL;
+
+		GOptionGroup* optgroup_file = g_option_group_new("file",
+		                                                "\033[1;32mFile options\033[0m",
+		                                                "\033[1;32mFile options\033[0m",
+		                                                NULL, NULL);
+		GOptionEntry opt_entries_file[] =
+			{
+				{ "load-file", 'f', 0, G_OPTION_ARG_STRING, &load_file, "load state file on startup", "FILE" },
+				{ NULL }
+			};
+		g_option_group_add_entries(optgroup_file, opt_entries_file);
+
 		// DEBUG options
 		gchar* builder_dir = NULL;
 		gboolean lterminal = FALSE;
@@ -928,6 +944,7 @@ void gx_process_cmdline_options(int& argc, char**& argv, string* optvar)
 		// collecting all option groups
 		g_option_context_add_group(opt_context, optgroup_gtk);
 		g_option_context_add_group(opt_context, optgroup_jack);
+		g_option_context_add_group(opt_context, optgroup_file);
 		g_option_context_add_group(opt_context, optgroup_debug);
 
 		// parsing command options
@@ -1041,6 +1058,14 @@ void gx_process_cmdline_options(int& argc, char**& argv, string* optvar)
 			optvar[JACK_MIDI] = ""; // leads to no automatic connection
 		}
 
+		if (jack_uuid != NULL)
+		{
+			optvar[JACK_UUID] = jack_uuid;
+			g_free(jack_uuid);
+		} else {
+			optvar[JACK_UUID] = "";
+		}
+
 		// *** process jack outputs
 		if (jack_outputs != NULL) {
 			int idx = JACK_OUT1;
@@ -1062,6 +1087,13 @@ void gx_process_cmdline_options(int& argc, char**& argv, string* optvar)
 			if (!gx_shellvar_exists(optvar[JACK_OUT2])) optvar[JACK_OUT2] = "";
 		}
 
+		if (load_file != NULL) {
+			optvar[LOAD_FILE] = load_file;
+			g_free(load_file);
+		} else {
+			optvar[LOAD_FILE] = "";
+		}
+
 
 		//
 		rcpath = GX_STYLE_DIR + string("/") + string("guitarix_") + optvar[RC_STYLE] + ".rc";
@@ -1435,7 +1467,7 @@ void gx_clean_exit(GtkWidget* widget, gpointer data)
 
 		// only save if we are not in a preset context
 		if (!setting_is_preset)
-			saveStateToFile();
+			saveStateToFile(gx_user_dir + client_name + "_rc");
 	}
 
 	gx_gui::shownote = -1;
diff --git a/src/headers/gx_engine.h b/src/headers/gx_engine.h
index 41ae6ae..7be25d7 100644
--- a/src/headers/gx_engine.h
+++ b/src/headers/gx_engine.h
@@ -300,7 +300,7 @@ inline void turnOffMidi() { audio.midistate = kMidiOff; }
 inline void turnOnMidi() { audio.midistate = kMidiOn; }
 
 /* function declarations  */
-void gx_engine_init();
+void gx_engine_init( const std::string *optvar );
 void gx_engine_reset();
 void faust_init(int samplingFreq);
 void compute_midi(int len);
diff --git a/src/headers/gx_jack.h b/src/headers/gx_jack.h
index 12d02f3..5ace5da 100644
--- a/src/headers/gx_jack.h
+++ b/src/headers/gx_jack.h
@@ -34,6 +34,10 @@
 #define AVOIDDENORMALS
 #endif
 
+#ifdef HAVE_JACK_SESSION
+#include <jack/session.h>
+#endif
+
 namespace gx_jack
 {
 #ifdef USE_RINGBUFFER
@@ -46,7 +50,7 @@ typedef struct
 #endif
 
 /* -------- functions ---------- */
-bool gx_jack_init();
+bool gx_jack_init( const string *optvar );
 void gx_jack_callbacks_and_activate();
 
 bool gx_start_jack_dialog();
@@ -66,6 +70,9 @@ int  gx_jack_buffersize_callback (jack_nframes_t, void*);
 void gx_jack_portreg_callback    (jack_port_id_t, int, void*);
 void gx_jack_clientreg_callback  (const char*, int, void*);
 void gx_jack_init_port_connection(const string*);
+#ifdef HAVE_JACK_SESSION
+void gx_jack_session_callback(jack_session_event_t *event, void *arg);
+#endif
 
 /* processing */
 int gx_jack_process (jack_nframes_t, void*);
diff --git a/src/headers/gx_preset.h b/src/headers/gx_preset.h
index 4191985..d84a521 100644
--- a/src/headers/gx_preset.h
+++ b/src/headers/gx_preset.h
@@ -44,6 +44,7 @@ void  gx_save_oldpreset (GtkMenuItem*, gpointer);
 
 void  gx_load_preset (GtkMenuItem*, gpointer);
 void  gx_recall_main_setting(GtkMenuItem*, gpointer);
+void  gx_recall_settings_file( const std::string & filename );
 void  gx_save_main_setting(GtkMenuItem*, gpointer);
 
 void  gx_rename_preset (GtkEntry*);
diff --git a/src/headers/gx_system.h b/src/headers/gx_system.h
index 4058485..76df93d 100644
--- a/src/headers/gx_system.h
+++ b/src/headers/gx_system.h
@@ -31,7 +31,10 @@
 #define JACK_MIDI     (3)
 #define RC_STYLE      (4)
 
-#define NUM_SHELL_VAR (5)
+#define JACK_UUID     (5)
+#define LOAD_FILE     (6)
+
+#define NUM_SHELL_VAR (7)
 
 namespace gx_system
 {
@@ -118,8 +121,8 @@ void writeHeader(JsonWriter& jw);
 bool readHeader(JsonParser& jp, int *major=0, int *minor=0);
 void write_preset(JsonWriter& w, bool write_midi = true);
 void read_preset(JsonParser &jp);
-bool saveStateToFile();
-bool recallState();
+bool saveStateToFile( const std::string & filename );
+bool recallState( const std::string & filename );
 
 // file format versions
 const int majorversion = 1;
diff --git a/wscript b/wscript
index b22b426..9b6a086 100644
--- a/wscript
+++ b/wscript
@@ -173,6 +173,7 @@ def configure(conf):
 
     conf.env['SHAREDIR'] = conf.env['PREFIX'] + '/share'
 
+    conf.check(header_name='jack/session.h', define_name='HAVE_JACK_SESSION')
 
     # defines for compilation
     conf.define('GX_STYLE_DIR', os.path.normpath(os.path.join(conf.env['SHAREDIR'], 'guitarix','skins')))
_______________________________________________
Linux-audio-dev mailing list
[email protected]
http://lists.linuxaudio.org/listinfo/linux-audio-dev

Reply via email to