#ifndef JACK_H #define JACK_H #include #include #ifndef HAVE_RENAME typedef int (*JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void *arg); int jack_set_port_rename_callback (jack_client_t *, JackPortRenameCallback rename_callback, void *arg) __attribute__((__weak__)); #endif enum PortEventType { PET_REGISTER, PET_UNREGISTER, PET_CONNECT, PET_DISCONNECT, PET_RENAME }; struct PortEvent { PortEventType type; jack_port_id_t port_id_a; jack_port_id_t port_id_b; }; class JackDriver { private: bool m_connected; jack_client_t *m_client; jack_ringbuffer_t *m_buffer; static void ShutdownCallbackHandler(void *arg) { ((JackDriver *)arg)->ShutdownCallback(); } static void PortRegistrationCallbackHandler(jack_port_id_t port_id, int reg, void *arg) { ((JackDriver *)arg)->PortRegistrationCallback(port_id, reg); } static void PortConnectCallbackHandler(jack_port_id_t port_id_a, jack_port_id_t port_id_b, int connect, void *arg) { ((JackDriver *)arg)->PortConnectCallback(port_id_a, port_id_b, connect); } static int PortRenameCallbackHandler(jack_port_id_t port_id, const char * /*old_name*/, const char * /*new_name*/, void *arg) { return ((JackDriver *)arg)->PortRenameCallback(port_id); } 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); public: JackDriver(); ~JackDriver(); void Connect(); void Disconnect(); bool IsConnected() const { return m_connected; } bool ProcessEvents(); void Connect(jack_port_t *a, jack_port_t *b); void Disconnect(jack_port_t *a, jack_port_t *b); jack_client_t *GetClient() { return m_client; } }; extern JackDriver jack; #endif // JACK_H