#ifndef __jack_libjack_local_h__
#define __jack_libjack_local_h__

/* Client data structure, in the client address space. */
struct _jack_client {

	jack_control_t        *engine;
	jack_client_control_t *control;
	jack_shm_info_t engine_shm;
	jack_shm_info_t control_shm;

	struct pollfd*  pollfd;
	int pollmax;
	int graph_next_fd;
	int request_fd;
	int upstream_is_jackd;

	/* these two are copied from the engine when the
	 * client is created.
	 */

	jack_port_type_id_t n_port_types;
	jack_shm_info_t*    port_segment;

	JSList *ports;
	JSList *ports_ext;

	pthread_t thread;
	char fifo_prefix[PATH_MAX + 1];
	void (*on_shutdown)(void *arg);
	void *on_shutdown_arg;
	void (*on_info_shutdown)(jack_status_t, const char*, void *arg);
	void *on_info_shutdown_arg;
	char thread_ok : 1;
	char first_active : 1;
	pthread_t thread_id;
	char name[JACK_CLIENT_NAME_SIZE];
	int session_cb_immediate_reply;

#ifdef JACK_USE_MACH_THREADS
	/* specific ressources for server/client real-time thread communication */
	mach_port_t clienttask, bp, serverport, replyport;
	trivial_message message;
	pthread_t process_thread;
	char rt_thread_ok : 1;
#endif

	/* callbacks
	 */
	JackProcessCallback process;
	void *process_arg;
	JackThreadInitCallback thread_init;
	void *thread_init_arg;
	JackBufferSizeCallback bufsize;
	void *bufsize_arg;
	JackSampleRateCallback srate;
	void *srate_arg;
	JackPortRegistrationCallback port_register;
	void *port_register_arg;
	JackPortConnectCallback port_connect;
	void *port_connect_arg;
	JackGraphOrderCallback graph_order;
	void *graph_order_arg;
	JackXRunCallback xrun;
	void *xrun_arg;
	JackSyncCallback sync_cb;
	void *sync_arg;
	JackTimebaseCallback timebase_cb;
	void *timebase_arg;
	JackFreewheelCallback freewheel_cb;
	void *freewheel_arg;
	JackClientRegistrationCallback client_register;
	void *client_register_arg;
	JackThreadCallback thread_cb;
	void *thread_cb_arg;
	JackSessionCallback session_cb;
	void *session_cb_arg;
	JackLatencyCallback latency_cb;
	void *latency_cb_arg;
	JackPropertyChangeCallback property_cb;
	void *property_cb_arg;
	JackPortRenameCallback port_rename_cb;
	void *port_rename_arg;

	/* external clients: set by libjack
	 * internal clients: set by engine */
	int (*deliver_request)(void*, jack_request_t*); /* JOQ: 64/32 bug! */
	void *deliver_arg;

};

extern int jack_client_deliver_request(const jack_client_t *client,
				       jack_request_t *req);
extern jack_port_t *jack_port_new(const jack_client_t *client,
				  jack_port_id_t port_id,
				  jack_control_t *control);

extern void *jack_zero_filled_buffer;

extern void jack_set_clock_source (jack_timer_type_t);
extern char* jack_server_dir(const char* server_name, char* server_dir);

#endif /* __jack_libjack_local_h__ */
