Add support for jack2 rename callback (not yet optional)

git-svn-id: file:///home/vcs/svn/jsweeper/trunk@20 6611ac79-6612-48ef-a1e9-b906f853523e
master
petern 2009-11-30 18:10:03 +00:00
parent 363d5ae27c
commit c422a5d50c
4 changed files with 39 additions and 1 deletions

View File

@ -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;
}
}

View File

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

View File

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

View File

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