@@ -390,6 +390,7 @@ class CatiaMainW(QMainWindow, ui_catia.Ui_CatiaMainW): | |||||
jacklib.set_xrun_callback(jack.client, self.JackXRunCallback, None) | jacklib.set_xrun_callback(jack.client, self.JackXRunCallback, None) | ||||
jacklib.set_port_registration_callback(jack.client, self.JackPortRegistrationCallback, None) | jacklib.set_port_registration_callback(jack.client, self.JackPortRegistrationCallback, None) | ||||
jacklib.set_port_connect_callback(jack.client, self.JackPortConnectCallback, 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) | jacklib.on_shutdown(jack.client, self.JackShutdownCallback, None) | ||||
if (JACK2): | if (JACK2): | ||||
@@ -611,7 +612,7 @@ class CatiaMainW(QMainWindow, ui_catia.Ui_CatiaMainW): | |||||
def jackStarted(self, autoStop=False): | def jackStarted(self, autoStop=False): | ||||
if (not jack.client): | 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): | if (autoStop and not jack.client): | ||||
self.jackStopped() | self.jackStopped() | ||||
return | 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")) | self.emit(SIGNAL("PortRenameCallback(int, QString, QString)"), port_id, str(old_name, encoding="ascii"), str(new_name, encoding="ascii")) | ||||
return 0 | 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): | def JackShutdownCallback(self, arg=None): | ||||
if (DEBUG): print("JackShutdownCallback()") | if (DEBUG): print("JackShutdownCallback()") | ||||
self.emit(SIGNAL("ShutdownCallback()")) | 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) | JackPortRegistrationCallback = CFUNCTYPE(None, jack_port_id_t, c_int, c_void_p) | ||||
JackClientRegistrationCallback = CFUNCTYPE(None, c_char_p, 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) | 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) | JackFreewheelCallback = CFUNCTYPE(None, c_int, c_void_p) | ||||
JackThreadCallback = CFUNCTYPE(c_void_p, c_void_p) | JackThreadCallback = CFUNCTYPE(c_void_p, c_void_p) | ||||
JackShutdownCallback = CFUNCTYPE(None, 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) | jacklib.jack_client_open.restype = POINTER(jack_client_t) | ||||
return jacklib.jack_client_open(client_name.encode("ascii"), options, status) | 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): | def client_new(client_name): | ||||
jacklib.jack_client_new.argtypes = [c_char_p] | jacklib.jack_client_new.argtypes = [c_char_p] | ||||
jacklib.jack_client_new.restype = POINTER(jack_client_t) | 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 | jacklib.jack_set_port_connect_callback.restype = c_int | ||||
return jacklib.jack_set_port_connect_callback(client, _connect_callback, arg) | 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 | global _rename_callback | ||||
_rename_callback = JackPortRenameCallback(rename_callback) | _rename_callback = JackPortRenameCallback(rename_callback) | ||||
jacklib.jack_set_port_rename_callback.argtypes = [POINTER(jack_client_t), JackPortRenameCallback, c_void_p] | 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 | jacklib.jack_session_reply.restype = c_int | ||||
return jacklib.jack_session_reply(client, event) | 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 | 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): | def client_get_uuid(client): | ||||
jacklib.jack_client_get_uuid.argtypes = [POINTER(jack_client_t)] | 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 | need_reconnect = True | ||||
return 0 | 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(): | def reconnect_inputs(): | ||||
play_port_1 = jacklib.port_by_name(client, "system:playback_1") | play_port_1 = jacklib.port_by_name(client, "system:playback_1") | ||||
play_port_2 = jacklib.port_by_name(client, "system:playback_2") | play_port_2 = jacklib.port_by_name(client, "system:playback_2") | ||||
@@ -113,13 +130,19 @@ if __name__ == '__main__': | |||||
app = QApplication(sys.argv) | app = QApplication(sys.argv) | ||||
# JACK initialization | # 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_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) | 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_process_callback(client, process_callback, None) | ||||
jacklib.set_port_connect_callback(client, port_callback, None) | jacklib.set_port_connect_callback(client, port_callback, None) | ||||
jacklib.set_session_callback(client, session_callback, None) | |||||
jacklib.activate(client) | jacklib.activate(client) | ||||
reconnect_inputs() | reconnect_inputs() | ||||
@@ -564,6 +564,22 @@ def jack_process_callback(nframes, arg): | |||||
return 0 | 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 ------------------ | #--------------- main ------------------ | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
@@ -577,7 +593,7 @@ if __name__ == '__main__': | |||||
# Start jack | # Start jack | ||||
jack_status = jacklib.jack_status_t(0) | 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: | 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)))) | 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_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) | 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.set_process_callback(jack_client, jack_process_callback, None) | ||||
jacklib.activate(jack_client) | jacklib.activate(jack_client) | ||||