/* -*- mode: c; c-file-style: "bsd"; -*- */
/*
    JACK control API

    Copyright (C) 2008 Nedko Arnaudov
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED
#define JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED

/** Parameter types, intentionally similar to jack_driver_param_type_t */
typedef enum
{
  JackParamInt = 1,
  JackParamUInt,
  JackParamChar,
  JackParamString,
  JackParamBool,
} jackctl_param_type_t;

#define JACK_PARAM_MAX (JackParamBool + 1)

/** max length of string parameter value, excluding terminating nul char */
#define JACK_PARAM_STRING_MAX  63

/** Parameter value, intentionally similar to jack_driver_param_value_t */
union jackctl_parameter_value
{
  uint32_t ui;
  int32_t i;
  char c;
  char str[JACK_PARAM_STRING_MAX + 1];
  bool b;
};

/** handle to server object */
typedef struct { int unused; } * jackctl_server;

/** handle to driver object */
typedef struct { int unused; } * jackctl_driver;

/** handle to parameter object */
typedef struct { int unused; } * jackctl_parameter;

typedef
void *
(* jackctl_client_appeared_callback)(
	void * server_context,
	uint64_t client_id,
	const char * client_name);

typedef
void
(* jackctl_client_disappeared_callback)(
	void * server_context,
	uint64_t client_id,
	void * client_context);

typedef
void *
(* jackctl_port_appeared_callback)(
	void * server_context,
	uint64_t client_id,
	void * client_context,
	uint64_t port_id,
	const char * port_name,
	uint32_t port_flags,
	uint32_t port_type);

typedef
void
(* jackctl_port_disappeared_callback)(
	void * server_context,
	uint64_t client_id,
	void * client_context,
	uint64_t port_id,
	void * port_context);

typedef
void *
(* jackctl_ports_connected_callback)(
	void * server_context,
	uint64_t client1_id,
	void * client1_context,
	uint64_t port1_id,
	void * port1_context,
	uint64_t client2_id,
	void * client2_context,
	uint64_t port2_id,
	void * port2_context,
	uint64_t connection_id);

typedef
void
(* jackctl_ports_disconnected_callback)(
	void * server_context,
	uint64_t client1_id,
	void * client1_context,
	uint64_t port1_id,
	void * port1_context,
	uint64_t client2_id,
	void * client2_context,
	uint64_t port2_id,
	void * port2_context,
	uint64_t connection_id,
	void * connection_context);

#ifdef __cplusplus
extern "C" {
#endif
#if 0
} /* Adjust editor indent */
#endif

/**
 * Create server object
 *
 */
jackctl_server jackctl_server_create(const char * name);
void jackctl_server_destroy(jackctl_server server);

const JSList * jackctl_server_get_drivers_list(jackctl_server server);

bool
jackctl_server_start(
	jackctl_server server,
	jackctl_driver driver,
	void * context,
	jackctl_client_appeared_callback client_appeared_callback,
	jackctl_client_disappeared_callback client_disappeared_callback,
	jackctl_port_appeared_callback port_appeared_callback,
	jackctl_port_disappeared_callback port_disappeared_callback,
	jackctl_ports_connected_callback ports_connected_callback,
	jackctl_ports_disconnected_callback ports_disconnected_callback);

bool jackctl_server_stop(jackctl_server server);

double jackctl_server_get_load(jackctl_server server);
unsigned int jackctl_server_get_sample_rate(jackctl_server server);
double jackctl_server_get_latency(jackctl_server server);
unsigned int jackctl_server_get_buffer_size(jackctl_server server);
bool jackctl_server_set_buffer_size(jackctl_server server, unsigned int nframes);
bool jackctl_server_is_realtime(jackctl_server server);
unsigned int jackctl_server_get_xruns(jackctl_server server);
void jackctl_server_reset_xruns(jackctl_server server);

const JSList * jackctl_server_get_parameters(jackctl_server server);

const char * jackctl_driver_get_name(jackctl_driver driver);

const JSList * jackctl_driver_get_parameters(jackctl_driver driver);

const char * jackctl_parameter_get_name(jackctl_parameter parameter);
const char * jackctl_parameter_get_short_description(jackctl_parameter parameter);
const char * jackctl_parameter_get_long_description(jackctl_parameter parameter);
jackctl_param_type_t jackctl_parameter_get_type(jackctl_parameter parameter);
bool jackctl_parameter_is_set(jackctl_parameter parameter);

union jackctl_parameter_value jackctl_parameter_get_value(jackctl_parameter parameter);
bool jackctl_parameter_set_value(jackctl_parameter parameter, const union jackctl_parameter_value * value_ptr);
union jackctl_parameter_value jackctl_parameter_get_default_value(jackctl_parameter parameter);

bool
jackctl_connect_ports_by_name(
	jackctl_server server,
	const char * client1_name,
	const char * port1_name,
	const char * client2_name,
	const char * port2_name);

bool
jackctl_connect_ports_by_id(
	jackctl_server server,
	const char * port1_id,
	const char * port2_id);

bool
jackctl_disconnect_ports_by_name(
	jackctl_server server,
	const char * client1_name,
	const char * port1_name,
	const char * client2_name,
	const char * port2_name);

bool
jackctl_disconnect_ports_by_id(
	jackctl_server server,
	const char * port1_id,
	const char * port2_id);

bool
jackctl_disconnect_ports_by_connection_id(
	jackctl_server server,
	const char * connection_id);

#if 0
{ /* Adjust editor indent */
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* #ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED */

