From svn at zhevny.com Fri Mar 26 12:23:04 2010 From: svn at zhevny.com (svn at zhevny.com) Date: Fri, 26 Mar 2010 12:23:04 -0500 Subject: [specimen-svn] r89 - in trunk: . src Message-ID: <20100326172304.E11F0396478@mail.zhevny.com> Author: eric Date: 2010-03-26 12:23:04 -0500 (Fri, 26 Mar 2010) New Revision: 89 Added: trunk/src/jackdriver.h Modified: trunk/configure.ac trunk/src/jackdriver.c trunk/src/specimen.c Log: applied jack session patch from Torben Hohn. Modified: trunk/configure.ac =================================================================== --- trunk/configure.ac 2009-01-17 15:14:01 UTC (rev 88) +++ trunk/configure.ac 2010-03-26 17:23:04 UTC (rev 89) @@ -5,7 +5,6 @@ AM_INIT_AUTOMAKE(specimen, 0.5.1+svn) AM_CONFIG_HEADER(src/config.h) - # compilation with_debug="no" AC_ARG_ENABLE([debug], @@ -38,6 +37,7 @@ # standard autoconf checks AC_PROG_CC +AM_PROG_CC_C_O AC_PROG_CPP AC_PROG_RANLIB AC_HEADER_STDC @@ -104,6 +104,10 @@ fi fi fi + AC_CHECK_HEADER( jack/session.h, HAVE_JACK_SESSION="yes", HAVE_JACK_SESSION="no" ) + if test "x$HAVE_JACK_SESSION" = xyes; then + AC_DEFINE([HAVE_JACK_SESSION], [], [Define if we have jack session support.]) + fi fi AC_SUBST(JACK_CFLAGS) AC_SUBST(JACK_LIBS) Modified: trunk/src/jackdriver.c =================================================================== --- trunk/src/jackdriver.c 2009-01-17 15:14:01 UTC (rev 88) +++ trunk/src/jackdriver.c 2010-03-26 17:23:04 UTC (rev 89) @@ -6,6 +6,9 @@ #if defined HAVE_JACK_MIDI || defined HAVE_OLD_JACK_MIDI || defined HAVE_OLDEST_JACK_MIDI #include #endif /* HAVE_JACK_MIDI || HAVE_OLD_JACK_MIDI || HAVE_OLDEST_JACK_MIDI */ +#ifdef HAVE_JACK_SESSION +#include +#endif /* HAVE_JACK_SESSION */ #include #include #include @@ -17,6 +20,7 @@ #include "mixer.h" #include "sync.h" #include "lfo.h" +#include "beef.h" #include "gui/gui.h" /* prototypes */ @@ -30,12 +34,16 @@ #if defined HAVE_JACK_MIDI || defined HAVE_OLD_JACK_MIDI || defined HAVE_OLDEST_JACK_MIDI static jack_port_t* midiport; #endif +#ifdef HAVE_JACK_SESSION +static jack_session_event_t *session_event; +#endif static jack_client_t* client; static float* buffer; static int rate = 44100; static int periodsize = 2048; static int running = 0; static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER; +static char* session_uuid = NULL; /* working together to stop CTS */ typedef jack_default_audio_sample_t jack_sample_t; @@ -69,7 +77,36 @@ } #endif /* HAVE_JACK_MIDI || HAVE_OLD_JACK_MIDI || HAVE_OLDEST_JACK_MIDI */ +#if defined HAVE_JACK_SESSION +static int session_callback( void *arg ) +{ + char filename[256]; + char command[256]; + snprintf( filename, sizeof(filename), "%sbank.beef", session_event->session_dir ); + snprintf( command, sizeof(command), "specimen -U %s ${SESSION_DIR}bank.beef", session_event->client_uuid ); + + beef_write(filename); + + session_event->command_line = strdup( command ); + + jack_session_reply( client, session_event ); + + if (session_event->type == JackSessionSaveAndQuit) + gtk_main_quit(); + + jack_session_event_free (session_event); + + return 0; +} + +static void session_callback_aux( jack_session_event_t *event, void *arg ) +{ + session_event = event; + g_idle_add( session_callback, arg ); +} +#endif + static int process (jack_nframes_t frames, void* arg) { int i; @@ -278,7 +315,12 @@ debug ("Initializing Jack Driver...\n"); pthread_mutex_lock (&running_mutex); running = 0; - if ((client = jack_client_open (instancename, JackNullOption, NULL)) == 0) +#ifdef HAVE_JACK_SESSION + client = jack_client_open (instancename, JackSessionID, NULL, session_uuid); +#else + client = jack_client_open (instancename, JackNullOption, NULL); +#endif + if (client == 0) { errmsg ("Failed to open new jack client: %s\n", instancename); pthread_mutex_unlock (&running_mutex); @@ -286,6 +328,10 @@ } jack_set_process_callback (client, process, 0); +#ifdef HAVE_JACK_SESSION + if (jack_set_session_callback) + jack_set_session_callback (client, session_callback_aux, 0); +#endif jack_on_shutdown (client, shutdown, 0); lport = @@ -401,6 +447,11 @@ return (void*) jack_get_client_name(client); } +void jackdriver_set_uuid (char *uuid) +{ + session_uuid = uuid; +} + Driver jack_driver = { init, start, Added: trunk/src/jackdriver.h =================================================================== --- trunk/src/jackdriver.h (rev 0) +++ trunk/src/jackdriver.h 2010-03-26 17:23:04 UTC (rev 89) @@ -0,0 +1,9 @@ +#ifndef __JACKDRIVER_H__ +#define __JACKDRIVER_H__ + +#include "config.h" + +void jackdriver_set_uuid (char *uuid); + + +#endif /* __JACKDRIVER_H__ */ Modified: trunk/src/specimen.c =================================================================== --- trunk/src/specimen.c 2009-01-17 15:14:01 UTC (rev 88) +++ trunk/src/specimen.c 2010-03-26 17:23:04 UTC (rev 89) @@ -17,6 +17,8 @@ #include "lashdriver.h" #endif +#include "jackdriver.h" + void show_usage (void) { printf ("Usage: specimen [options] [bankname]\n\n"); @@ -44,12 +46,13 @@ static struct option long_options[] = { { "name", 1, 0, 'n'}, + { "uuid", 1, 0, 'U'}, { "help", 0, 0, 'h'}, { 0, 0, 0, 0} }; /* command line argument processing */ - while((opt = getopt_long(argc, argv, "n:h", long_options, + while((opt = getopt_long(argc, argv, "n:U:h", long_options, &longopt_index)) > 0) { switch (opt) @@ -57,6 +60,9 @@ case 'n': instance_name = strdup(optarg); break; + case 'U': + jackdriver_set_uuid( strdup(optarg) ); + break; case 'h': show_usage(); return 0;