Browse Source

jack-session support for catia, jackmeter and xycontroller

tags/v0.9.0
falkTX 13 years ago
parent
commit
2880da5b1f
4 changed files with 71 additions and 8 deletions
  1. +19
    -1
      src/catia.py
  2. +10
    -5
      src/jacklib.py
  3. +24
    -1
      src/jackmeter.py
  4. +18
    -1
      src/xycontroller.py

+ 19
- 1
src/catia.py View File

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


+ 10
- 5
src/jacklib.py View File

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


+ 24
- 1
src/jackmeter.py View File

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


+ 18
- 1
src/xycontroller.py View File

@@ -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)



Loading…
Cancel
Save