@@ -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()")) | |||
@@ -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)] | |||
@@ -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() | |||
@@ -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) | |||