From 2880da5b1f10f55954c748edff71223e8ab9c504 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 13 Mar 2012 01:34:36 +0000 Subject: [PATCH] jack-session support for catia, jackmeter and xycontroller --- src/catia.py | 20 +++++++++++++++++++- src/jacklib.py | 15 ++++++++++----- src/jackmeter.py | 25 ++++++++++++++++++++++++- src/xycontroller.py | 19 ++++++++++++++++++- 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/catia.py b/src/catia.py index 5ef8ffb..6407ef4 100755 --- a/src/catia.py +++ b/src/catia.py @@ -390,6 +390,7 @@ class CatiaMainW(QMainWindow, ui_catia.Ui_CatiaMainW): jacklib.set_xrun_callback(jack.client, self.JackXRunCallback, None) jacklib.set_port_registration_callback(jack.client, self.JackPortRegistrationCallback, None) jacklib.set_port_connect_callback(jack.client, self.JackPortConnectCallback, None) + jacklib.set_session_callback(jack.client, self.JackSessionCallback, None) jacklib.on_shutdown(jack.client, self.JackShutdownCallback, None) if (JACK2): @@ -611,7 +612,7 @@ class CatiaMainW(QMainWindow, ui_catia.Ui_CatiaMainW): def jackStarted(self, autoStop=False): if (not jack.client): - jack.client = jacklib.client_open("catia", jacklib.JackNoStartServer, None) + jack.client = jacklib.client_open_uuid("catia", jacklib.JackNoStartServer, None, "") if (autoStop and not jack.client): self.jackStopped() return @@ -748,6 +749,23 @@ class CatiaMainW(QMainWindow, ui_catia.Ui_CatiaMainW): self.emit(SIGNAL("PortRenameCallback(int, QString, QString)"), port_id, str(old_name, encoding="ascii"), str(new_name, encoding="ascii")) return 0 + def JackSessionCallback(self, event, arg): + if (WINDOWS): + filepath = os.path.join(sys.argv[0]) + else: + if (sys.argv[0].startswith("/")): + filepath = "catia" + else: + filepath = os.path.join(sys.path[0], "catia.py") + + event.command_line = str(filepath).encode("ascii") + jacklib.session_reply(jack.client, event) + + if (event.type == jacklib.JackSessionSaveAndQuit): + app.quit() + + #jacklib.session_event_free(event) + def JackShutdownCallback(self, arg=None): if (DEBUG): print("JackShutdownCallback()") self.emit(SIGNAL("ShutdownCallback()")) diff --git a/src/jacklib.py b/src/jacklib.py index ecc6cfe..ee8973a 100644 --- a/src/jacklib.py +++ b/src/jacklib.py @@ -236,7 +236,7 @@ JackSampleRateCallback = CFUNCTYPE(c_int, jack_nframes_t, c_void_p) JackPortRegistrationCallback = CFUNCTYPE(None, jack_port_id_t, c_int, c_void_p) JackClientRegistrationCallback = CFUNCTYPE(None, c_char_p, c_int, c_void_p) JackPortConnectCallback = CFUNCTYPE(None, jack_port_id_t, jack_port_id_t, c_int, c_void_p) -JackPortRenameCallback = CFUNCTYPE(c_int, jack_port_id_t, c_char_p, c_char_p, c_void_p) +JackPortRenameCallback = CFUNCTYPE(c_int, jack_port_id_t, c_char_p, c_char_p, c_void_p) # JACK2 only JackFreewheelCallback = CFUNCTYPE(None, c_int, c_void_p) JackThreadCallback = CFUNCTYPE(c_void_p, c_void_p) JackShutdownCallback = CFUNCTYPE(None, c_void_p) @@ -258,6 +258,11 @@ def client_open(client_name, options, status): jacklib.jack_client_open.restype = POINTER(jack_client_t) return jacklib.jack_client_open(client_name.encode("ascii"), options, status) +def client_open_uuid(client_name, options, status, uuid): # Extra function for jack-session support + jacklib.jack_client_open.argtypes = [c_char_p, jack_options_t, POINTER(jack_status_t), c_char_p] + jacklib.jack_client_open.restype = POINTER(jack_client_t) + return jacklib.jack_client_open(client_name.encode("ascii"), options, status, uuid.encode("ascii")) + def client_new(client_name): jacklib.jack_client_new.argtypes = [c_char_p] jacklib.jack_client_new.restype = POINTER(jack_client_t) @@ -411,7 +416,7 @@ def set_port_connect_callback(client, connect_callback, arg): jacklib.jack_set_port_connect_callback.restype = c_int return jacklib.jack_set_port_connect_callback(client, _connect_callback, arg) -def set_port_rename_callback(client, rename_callback, arg): +def set_port_rename_callback(client, rename_callback, arg): # JACK2 only global _rename_callback _rename_callback = JackPortRenameCallback(rename_callback) jacklib.jack_set_port_rename_callback.argtypes = [POINTER(jack_client_t), JackPortRenameCallback, c_void_p] @@ -849,10 +854,10 @@ def session_reply(client, event): jacklib.jack_session_reply.restype = c_int return jacklib.jack_session_reply(client, event) -def session_event_free(client, event): - jacklib.jack_session_event_free.argtypes = [POINTER(jack_client_t), POINTER(jack_session_event_t)] +def session_event_free(event): + jacklib.jack_session_event_free.argtypes = [POINTER(jack_session_event_t)] jacklib.jack_session_event_free.restype = c_int - return jacklib.jack_session_event_free(client, event) + return jacklib.jack_session_event_free(event) def client_get_uuid(client): jacklib.jack_client_get_uuid.argtypes = [POINTER(jack_client_t)] diff --git a/src/jackmeter.py b/src/jackmeter.py index fe1cc38..85f796f 100755 --- a/src/jackmeter.py +++ b/src/jackmeter.py @@ -54,6 +54,23 @@ def port_callback(port_a, port_b, connect_yesno, arg): need_reconnect = True return 0 +def session_callback(event, arg): + if (WINDOWS): + filepath = os.path.join(sys.argv[0]) + else: + if (sys.argv[0].startswith("/")): + filepath = "jack_meter" + else: + filepath = os.path.join(sys.path[0], "jackmeter.py") + + event.command_line = str(filepath).encode("ascii") + jacklib.session_reply(client, event) + + if (event.type == jacklib.JackSessionSaveAndQuit): + app.quit() + + #jacklib.session_event_free(event) + def reconnect_inputs(): play_port_1 = jacklib.port_by_name(client, "system:playback_1") play_port_2 = jacklib.port_by_name(client, "system:playback_2") @@ -113,13 +130,19 @@ if __name__ == '__main__': app = QApplication(sys.argv) # JACK initialization - client = jacklib.client_open("M", jacklib.JackNullOption, None) + jack_status = jacklib.jack_status_t(0) + client = jacklib.client_open_uuid("M", jacklib.JackSessionID, jacklib.pointer(jack_status), "") + + if not client: + QMessageBox.critical(None, app.translate("XYControllerW", "Error"), app.translate("XYControllerW", "Could not connect to JACK, possible errors:\n%s" % (get_jack_status_error_string(jack_status)))) + sys.exit(1) port_1 = jacklib.port_register(client, "in1", jacklib.JACK_DEFAULT_AUDIO_TYPE, jacklib.JackPortIsInput, 0) port_2 = jacklib.port_register(client, "in2", jacklib.JACK_DEFAULT_AUDIO_TYPE, jacklib.JackPortIsInput, 0) jacklib.set_process_callback(client, process_callback, None) jacklib.set_port_connect_callback(client, port_callback, None) + jacklib.set_session_callback(client, session_callback, None) jacklib.activate(client) reconnect_inputs() diff --git a/src/xycontroller.py b/src/xycontroller.py index 89abaf6..d261f48 100755 --- a/src/xycontroller.py +++ b/src/xycontroller.py @@ -564,6 +564,22 @@ def jack_process_callback(nframes, arg): return 0 +def jack_session_callback(event, arg): + if (WINDOWS): + filepath = os.path.join(sys.argv[0]) + else: + if (sys.argv[0].startswith("/")): + filepath = "jack_xycontroller" + else: + filepath = os.path.join(sys.path[0], "xycontroller.py") + + event.command_line = str(filepath).encode("ascii") + jacklib.session_reply(jack_client, event) + + if (event.type == jacklib.JackSessionSaveAndQuit): + app.quit() + + #jacklib.session_event_free(event) #--------------- main ------------------ if __name__ == '__main__': @@ -577,7 +593,7 @@ if __name__ == '__main__': # Start jack jack_status = jacklib.jack_status_t(0) - jack_client = jacklib.client_open("XY-Controller", jacklib.JackNullOption, jacklib.pointer(jack_status)) + jack_client = jacklib.client_open_uuid("XY-Controller", jacklib.JackSessionID, jacklib.pointer(jack_status), "") if not jack_client: QMessageBox.critical(None, app.translate("XYControllerW", "Error"), app.translate("XYControllerW", "Could not connect to JACK, possible errors:\n%s" % (get_jack_status_error_string(jack_status)))) @@ -585,6 +601,7 @@ if __name__ == '__main__': jack_midi_in_port = jacklib.port_register(jack_client, "midi_in", jacklib.JACK_DEFAULT_MIDI_TYPE, jacklib.JackPortIsInput, 0) jack_midi_out_port = jacklib.port_register(jack_client, "midi_out", jacklib.JACK_DEFAULT_MIDI_TYPE, jacklib.JackPortIsOutput, 0) + jacklib.set_session_callback(jack_client, jack_session_callback, None) jacklib.set_process_callback(jack_client, jack_process_callback, None) jacklib.activate(jack_client)