From fcda4844451e7dac898a1bc29173fe0372f3f6d2 Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Wed, 4 Mar 2009 06:00:23 +0700 Subject: [PATCH] * Support for restarting jack server --- jackpanel/Jackpanel.vala | 28 ++++++++++++-- jackpanel/JackpanelBase.vala | 89 +++++++++++++++++++++++++++++++++++++++++--- jackpanel/wscript_build | 2 +- 3 files changed, 108 insertions(+), 11 deletions(-) diff --git a/jackpanel/Jackpanel.vala b/jackpanel/Jackpanel.vala index d471e82..c36c360 100644 --- a/jackpanel/Jackpanel.vala +++ b/jackpanel/Jackpanel.vala @@ -14,6 +14,8 @@ public class Jackpanel : JackpanelBase { TransportButton fast_forward; float acceleration = 1.0f; + + public bool initialized { get; set; } protected override void on_transport_stopped () { play.set_active_no_signals (false); @@ -24,6 +26,10 @@ public class Jackpanel : JackpanelBase { } private bool show_state () { + if (client == null) { + return false; + } + display.realtime = jack_is_realtime (client) != 0; display.sample_rate = jack_get_sample_rate (client); @@ -39,6 +45,8 @@ public class Jackpanel : JackpanelBase { } Jackpanel (string client_name) { + this.client_name = client_name; + var table = new Table (5, 2, false); display = new Display (); display.sample_rate_changed += (display, new_rate) => { @@ -131,8 +139,15 @@ public class Jackpanel : JackpanelBase { table.set_col_spacing (3, 4); add (table); - initialize_jack (client_name); - Timeout.add (200, show_state); + initialized = initialize_jack (); + if (initialized) { + Timeout.add (200, show_state); + } + } + + ~Jackpanel () { + stop_jack_client (); + stop_jack (); } private void wind_transport (float direction) { @@ -168,8 +183,13 @@ public class Jackpanel : JackpanelBase { window.add (panel); window.destroy += Gtk.main_quit; window.show_all (); - Gtk.main (); - return 0; + + if (panel.initialized) { + Gtk.main (); + return 0; + } else { + return 1; + } } } diff --git a/jackpanel/JackpanelBase.vala b/jackpanel/JackpanelBase.vala index ab7341f..c5518a0 100644 --- a/jackpanel/JackpanelBase.vala +++ b/jackpanel/JackpanelBase.vala @@ -13,18 +13,91 @@ public static int jackpanel_xrun_callback (void *panel) { public abstract class JackpanelBase : Alignment { // state + protected string client_name; protected jack_client_t* client; protected jack_status_t status; protected string time_in_frames; protected string time_in_bbt; protected string time_h_min_sec; + protected Pid jackd_pid; - protected void initialize_jack (string client_name) { - client = jack_client_open (client_name, jack_options_t.JackNullOption, ref status); - if (client == null) { - stderr.printf ("jack_client_open() failed, status = 0x%2.0x\n", status); - if ((status & jack_status_t.JackServerFailed) != 0) { - stderr.printf ("Unable to connect to JACK server\n"); + protected bool restart_jack () { + bool success = false; + stop_jack_client (); + stop_jack (); + return initialize_jack (); + } + + protected bool start_jack_client () { + client = jack_client_open (client_name, jack_options_t.JackNoStartServer, ref status); + + if (client == null) { + stderr.printf ("jack_client_open() failed, status = 0x%2.0x\n", status); + if ((status & jack_status_t.JackServerFailed) != 0) { + stderr.printf ("Unable to connect to JACK server\n"); + } + return false; + } else { + return true; + } + } + + protected void stop_jack_client () { + if (client != null) { + jack_deactivate (client); + jack_client_close (client); + client = null; + } + } + + protected void stop_jack () { + if (jackd_pid != (GLib.Pid)0) { + Posix.kill (jackd_pid, Posix.SIGTERM); + jackd_pid = (GLib.Pid)0; + } + } + + protected bool start_jack () { + string jackdrc_filename = Environment.get_home_dir () + Path.DIR_SEPARATOR_S + ".jackdrc"; + string jackdrc; + if (FileUtils.test (jackdrc_filename, FileTest.EXISTS) && + FileUtils.test (jackdrc_filename, FileTest.IS_REGULAR)) { + FileUtils.get_contents (jackdrc_filename, out jackdrc); + + string [] argv; + Shell.parse_argv (jackdrc, out argv); + + for (int i = 0; i < argv.length; i++) { + stdout.printf ("argument: %d: %s\n", i, argv[i]); + } + + bool jack_started = Process.spawn_async (null, argv, null, 0, null, out jackd_pid); + + ChildWatch.add (jackd_pid, (pid, status) => { + stdout.printf ("Process %d with status %d\n", (int)pid, (int)status); + }); + + if (!jack_started) { + return false; + } else { + return true; + } + } + + return false; + } + + protected bool initialize_jack () { + + if (!start_jack_client ()) { + if (start_jack ()) { + Thread.usleep (2000000); + + if (!start_jack_client ()) { + return false; + } + } else { + return false; } } @@ -35,12 +108,16 @@ public abstract class JackpanelBase : Alignment { client_name = jack_get_client_name(client); stderr.printf ("unique name `%s' assigned\n", client_name); } + no_xruns = 0; jack_set_xrun_callback (client, jackpanel_xrun_callback, (void *)this); if (jack_activate (client) != 0) { stderr.printf ("cannot activate client"); + return false; } + + return true; } protected abstract void on_transport_stopped (); diff --git a/jackpanel/wscript_build b/jackpanel/wscript_build index cf0835c..d909182 100644 --- a/jackpanel/wscript_build +++ b/jackpanel/wscript_build @@ -5,7 +5,7 @@ jackpanel.name = 'jackpanel' jackpanel.target = 'jackpanel' jackpanel.source = 'Jackpanel.vala JackpanelBase.vala Display.vala PanelDisplayBase.vala' jackpanel.uselib = 'PROLOOKS JACK CAIRO' -jackpanel.packages = 'prolooks jack' +jackpanel.packages = 'prolooks jack posix' jackpanel.vapi_dirs = '..' #jackpanel-applet = bld.new_task_gen ('cc', 'program') -- 2.11.4.GIT