|
|
|
@@ -0,0 +1,178 @@ |
|
|
|
/* |
|
|
|
Copyright (C) 2001 Paul Davis |
|
|
|
Copyright (C) 2004 Jack O'Quin |
|
|
|
Copyright (C) 2010 Torben Hohn |
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify |
|
|
|
it under the terms of the GNU Lesser General Public License as published by |
|
|
|
the Free Software Foundation; either version 2.1 of the License, or |
|
|
|
(at your option) any later version. |
|
|
|
|
|
|
|
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 Lesser General Public License for more details. |
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License |
|
|
|
along with this program; if not, write to the Free Software |
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
#ifndef __jack_session_h__ |
|
|
|
#define __jack_session_h__ |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
extern "C" { |
|
|
|
#endif |
|
|
|
|
|
|
|
#include <jack/weakmacros.h> |
|
|
|
|
|
|
|
/** |
|
|
|
* @defgroup SessionClientFunctions Session API for clients. |
|
|
|
* @{ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* session event types. |
|
|
|
* |
|
|
|
* if a client cant save templates, i might just do a normal save. |
|
|
|
* |
|
|
|
* the rationale, why there is no quit without save, is that a client |
|
|
|
* might refuse to quit when it has unsaved data. |
|
|
|
* however some other clients might have already quit. |
|
|
|
* this results in too much confusion, so we just dont support that. |
|
|
|
* the session manager can check, if the saved state is different from a previous |
|
|
|
* save, and just remove the saved stuff. |
|
|
|
* |
|
|
|
* (an inquiry function, whether a quit is ok, followed by a quit event |
|
|
|
* would have a race) |
|
|
|
*/ |
|
|
|
enum JackSessionEventType { |
|
|
|
JackSessionSave = 1, |
|
|
|
JackSessionSaveAndQuit = 2, |
|
|
|
JackSessionSaveTemplate = 3 |
|
|
|
}; |
|
|
|
|
|
|
|
typedef enum JackSessionEvent jack_session_event_type_t; |
|
|
|
|
|
|
|
struct _jack_session_event { |
|
|
|
/** |
|
|
|
* the actual type of this session event. |
|
|
|
*/ |
|
|
|
jack_session_event_type_t type; |
|
|
|
|
|
|
|
/** |
|
|
|
* session_directory with trailing separator |
|
|
|
* this is per client. so the client can do whatever it likes in here. |
|
|
|
*/ |
|
|
|
const char *session_dir; |
|
|
|
|
|
|
|
/** |
|
|
|
* client_uuid which must be specified to jack_client_open on session reload. |
|
|
|
* client can specify it in the returned commandline as an option, or just save it |
|
|
|
* with the state file. |
|
|
|
*/ |
|
|
|
const char *client_uuid; |
|
|
|
|
|
|
|
/** |
|
|
|
* the command_line is the reply of the client. |
|
|
|
* it specifies in a platform dependent way, how the client must be restarted upon session reload. |
|
|
|
* |
|
|
|
* probably it should contain ${SESSION_DIR} instead of the actual session dir. |
|
|
|
* this would basically make the session dir moveable. |
|
|
|
* |
|
|
|
* ownership of the memory is handed to jack. |
|
|
|
* initially set to NULL by jack; |
|
|
|
*/ |
|
|
|
char *command_line; |
|
|
|
}; |
|
|
|
|
|
|
|
typedef struct _jack_session_event jack_session_event_t; |
|
|
|
|
|
|
|
/** |
|
|
|
* Prototype for the client supplied function that is called |
|
|
|
* whenever a session notification is sent via jack_session_notify(). |
|
|
|
* |
|
|
|
* The session_id must be passed to jack_client_open on session reload (this can be |
|
|
|
* done by specifying it somehow on the returned command line). |
|
|
|
* |
|
|
|
* @param event the event_structure. |
|
|
|
* @param arg pointer to a client supplied structure |
|
|
|
*/ |
|
|
|
typedef void (*JackSessionCallback)(jack_session_event_t *event, void *arg); |
|
|
|
|
|
|
|
/** |
|
|
|
* Tell the JACK server to call @a save_callback the session handler wants |
|
|
|
* to save. |
|
|
|
* |
|
|
|
* @return 0 on success, otherwise a non-zero error code |
|
|
|
*/ |
|
|
|
int jack_set_session_callback(jack_client_t *client, |
|
|
|
JackSessionCallback session_callback, |
|
|
|
void *arg) JACK_WEAK_EXPORT; |
|
|
|
|
|
|
|
/** |
|
|
|
* reply to a session_event |
|
|
|
* |
|
|
|
* this can either be called directly from the callback, or later from a different thread. |
|
|
|
* so its possible to just stick the event pointer into a pipe and execute the save code |
|
|
|
* from the gui thread. |
|
|
|
* |
|
|
|
* @return 0 on success, otherwise a non-zero error code |
|
|
|
*/ |
|
|
|
|
|
|
|
int jack_session_reply( jack_client_t *client, jack_session_event_t *event ) JACK_WEAK_EXPORT; |
|
|
|
|
|
|
|
|
|
|
|
/*@}*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* @defgroup JackSessionManagerAPI this API is intended for a sessionmanager. |
|
|
|
* this API could be server specific. if we dont reach consensus here, |
|
|
|
* we can just drop it. |
|
|
|
* i know its a bit clumsy. |
|
|
|
* but this api isnt required to be as stable as the client api. |
|
|
|
* @{ |
|
|
|
*/ |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
char uuid[16]; |
|
|
|
char client_name[33]; |
|
|
|
char command[256]; |
|
|
|
} jack_session_command_t; |
|
|
|
|
|
|
|
/** |
|
|
|
* send a save or quit event, to all clients listening for session |
|
|
|
* callbacks. the returned strings of the clients are accumulated and |
|
|
|
* returned as an array of jack_session_command_t. |
|
|
|
* its terminated by ret[i].uuid[0]='\0' |
|
|
|
* target == NULL means send to all interested clients. otherwise a clientname |
|
|
|
*/ |
|
|
|
|
|
|
|
jack_session_command_t *jack_session_notify (jack_client_t* client, |
|
|
|
const char *target, |
|
|
|
jack_session_event_type_t type, |
|
|
|
const char *path ) JACK_WEAK_EXPORT; |
|
|
|
|
|
|
|
/** |
|
|
|
* get the sessionid for a client name. |
|
|
|
* the sessionmanager needs this to reassociate a client_name to the session_id. |
|
|
|
*/ |
|
|
|
|
|
|
|
char *jack_get_uuid_for_client_name( jack_client_t *client, const char *client_name ) JACK_WEAK_EXPORT; |
|
|
|
|
|
|
|
/** |
|
|
|
* get the client name for a session_id. |
|
|
|
* in order to snapshot the graph connections, the sessionmanager needs to map |
|
|
|
* session_ids to client names. |
|
|
|
*/ |
|
|
|
|
|
|
|
char *jack_get_client_name_for_uuid( jack_client_t *client, const char *client_uuid ) JACK_WEAK_EXPORT; |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |