From c422a5d50c65321f3ee4396db1566e40fd344d1c Mon Sep 17 00:00:00 2001 From: petern Date: Mon, 30 Nov 2009 18:10:03 +0000 Subject: [PATCH] Add support for jack2 rename callback (not yet optional) git-svn-id: file:///home/vcs/svn/jsweeper/trunk@20 6611ac79-6612-48ef-a1e9-b906f853523e --- src/jack.cpp | 23 +++++++++++++++++++++++ src/jack.h | 9 ++++++++- src/portmanager.cpp | 6 ++++++ src/portmanager.h | 2 ++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/jack.cpp b/src/jack.cpp index a628bd5..941e801 100644 --- a/src/jack.cpp +++ b/src/jack.cpp @@ -37,6 +37,9 @@ void JackDriver::Connect() jack_on_shutdown(m_client, &ShutdownCallbackHandler, this); jack_set_port_registration_callback(m_client, &PortRegistrationCallbackHandler, this); jack_set_port_connect_callback(m_client, &PortConnectCallbackHandler, this); + if (jack_set_port_rename_callback) { + jack_set_port_rename_callback(m_client, &PortRenameCallbackHandler, this); + } jack_activate(m_client); @@ -96,6 +99,21 @@ void JackDriver::PortConnectCallback(jack_port_id_t port_id_a, jack_port_id_t po } } +int JackDriver::PortRenameCallback(jack_port_id_t port_id, const char * /*name*/) +{ + PortEvent pe; + pe.type = PET_RENAME; + pe.port_id_a = port_id; + + if (jack_ringbuffer_write_space(m_buffer) < sizeof pe) { + std::cerr << "Ringbuffer full!" << std::endl; + } else { + jack_ringbuffer_write(m_buffer, (const char *)&pe, sizeof pe); + } + + return 0; +} + bool JackDriver::ProcessEvents() { bool ret = false; @@ -125,6 +143,11 @@ bool JackDriver::ProcessEvents() pm.Disconnect(jack_port_by_id(m_client, pe.port_id_a), jack_port_by_id(m_client, pe.port_id_b)); ret = true; break; + + case PET_RENAME: + pm.Rename(jack_port_by_id(m_client, pe.port_id_a)); + ret = true; + break; } } diff --git a/src/jack.h b/src/jack.h index 40889d5..566e6dd 100644 --- a/src/jack.h +++ b/src/jack.h @@ -10,7 +10,8 @@ enum PortEventType PET_REGISTER, PET_UNREGISTER, PET_CONNECT, - PET_DISCONNECT + PET_DISCONNECT, + PET_RENAME }; struct PortEvent @@ -42,9 +43,15 @@ private: ((JackDriver *)arg)->PortConnectCallback(port_id_a, port_id_b, connect); } + static int PortRenameCallbackHandler(jack_port_id_t port_id, const char *name, void *arg) + { + return ((JackDriver *)arg)->PortRenameCallback(port_id, name); + } + void ShutdownCallback(); void PortRegistrationCallback(jack_port_id_t port, int reg); void PortConnectCallback(jack_port_id_t a, jack_port_id_t b, int connect); + int PortRenameCallback(jack_port_id_t port_id, const char *name); public: JackDriver(); diff --git a/src/portmanager.cpp b/src/portmanager.cpp index 5a93466..963cb5e 100644 --- a/src/portmanager.cpp +++ b/src/portmanager.cpp @@ -192,6 +192,12 @@ void PortManager::Disconnect(jack_port_t *port_a, jack_port_t *port_b) //std::clog << "Disconnecting '" << jack_port_name(port_a) << "' from '" << jack_port_name(port_b) << "'" << std::endl; } +void PortManager::Rename(jack_port_t *port) +{ + Delete(port); + Add(port); +} + Client *PortManager::FindOrMakeClient(std::string name, bool is_input, bool is_midi) { ClientList::iterator it; diff --git a/src/portmanager.h b/src/portmanager.h index cc7f4b7..c18e504 100644 --- a/src/portmanager.h +++ b/src/portmanager.h @@ -31,6 +31,8 @@ public: void Connect(jack_port_t *port_a, jack_port_t *port_b); void Disconnect(jack_port_t *port_a, jack_port_t *port_b); + void Rename(jack_port_t *port); + Client *FindOrMakeClient(std::string name, bool is_input, bool is_midi); PortGroup *FindOrMakeGroup(Client *client, JackPortFlags flags, std::string name); Port *FindPort(jack_port_t *port);