| @@ -81,6 +81,8 @@ JackClient::JackClient(JackSynchro* table):fThread(this) | |||||
| fThreadFunArg = NULL; | fThreadFunArg = NULL; | ||||
| fSessionArg = NULL; | fSessionArg = NULL; | ||||
| fLatencyArg = NULL; | fLatencyArg = NULL; | ||||
| fSessionReply = kPendingSessionReply; | |||||
| } | } | ||||
| JackClient::~JackClient() | JackClient::~JackClient() | ||||
| @@ -284,17 +286,18 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, | |||||
| case kSessionCallback: | case kSessionCallback: | ||||
| jack_log("JackClient::kSessionCallback"); | jack_log("JackClient::kSessionCallback"); | ||||
| if (fSession) { | if (fSession) { | ||||
| jack_session_event_t *event = (jack_session_event_t *) malloc( sizeof(jack_session_event_t) ); | |||||
| jack_session_event_t* event = (jack_session_event_t*)malloc( sizeof(jack_session_event_t)); | |||||
| char uuid_buf[JACK_UUID_SIZE]; | char uuid_buf[JACK_UUID_SIZE]; | ||||
| event->type = (jack_session_event_type_t) value1; | |||||
| event->session_dir = strdup( message ); | |||||
| event->type = (jack_session_event_type_t)value1; | |||||
| event->session_dir = strdup(message); | |||||
| event->command_line = NULL; | event->command_line = NULL; | ||||
| event->flags = (jack_session_flags_t) 0; | |||||
| snprintf( uuid_buf, sizeof(uuid_buf), "%d", GetClientControl()->fSessionID ); | |||||
| event->client_uuid = strdup( uuid_buf ); | |||||
| fImmediateSessionReply = false; | |||||
| event->flags = (jack_session_flags_t)0; | |||||
| snprintf(uuid_buf, sizeof(uuid_buf), "%d", GetClientControl()->fSessionID); | |||||
| event->client_uuid = strdup(uuid_buf); | |||||
| fSessionReply = kPendingSessionReply; | |||||
| // Session callback may change fSessionReply by directly using jack_session_reply | |||||
| fSession(event, fSessionArg); | fSession(event, fSessionArg); | ||||
| res = (fImmediateSessionReply) ? 1 : 2; | |||||
| res = fSessionReply; | |||||
| } | } | ||||
| break; | break; | ||||
| @@ -1232,8 +1235,9 @@ int JackClient::SessionReply(jack_session_event_t* ev) | |||||
| jack_log("JackClient::SessionReply... we are here"); | jack_log("JackClient::SessionReply... we are here"); | ||||
| if (fChannel->IsChannelThread()) { | if (fChannel->IsChannelThread()) { | ||||
| jack_log( "JackClient::SessionReply... in callback reply"); | |||||
| fImmediateSessionReply = true; | |||||
| jack_log("JackClient::SessionReply... in callback reply"); | |||||
| // OK, immediate reply... | |||||
| fSessionReply = kImmediateSessionReply; | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -93,7 +93,7 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable | |||||
| JackSynchro* fSynchroTable; | JackSynchro* fSynchroTable; | ||||
| std::list<jack_port_id_t> fPortList; | std::list<jack_port_id_t> fPortList; | ||||
| bool fImmediateSessionReply; | |||||
| JackSessionReply fSessionReply; | |||||
| int StartThread(); | int StartThread(); | ||||
| void SetupDriverSync(bool freewheel); | void SetupDriverSync(bool freewheel); | ||||
| @@ -972,11 +972,11 @@ void JackEngine::SessionNotify(int refnum, const char *target, jack_session_even | |||||
| if (res) | if (res) | ||||
| jack_error("JackEngine::SessionNotify: can not create session directory '%s'", path_buf); | jack_error("JackEngine::SessionNotify: can not create session directory '%s'", path_buf); | ||||
| int result = client->ClientNotify(i, client->GetClientControl()->fName, kSessionCallback, true, path_buf, (int) type, 0); | |||||
| int result = client->ClientNotify(i, client->GetClientControl()->fName, kSessionCallback, true, path_buf, (int)type, 0); | |||||
| if (result == 2) { | |||||
| if (result == kPendingSessionReply) { | |||||
| fSessionPendingReplies += 1; | fSessionPendingReplies += 1; | ||||
| } else if (result == 1) { | |||||
| } else if (result == kImmediateSessionReply) { | |||||
| char uuid_buf[JACK_UUID_SIZE]; | char uuid_buf[JACK_UUID_SIZE]; | ||||
| snprintf(uuid_buf, sizeof(uuid_buf), "%d", client->GetClientControl()->fSessionID); | snprintf(uuid_buf, sizeof(uuid_buf), "%d", client->GetClientControl()->fSessionID); | ||||
| fSessionResult->fCommandList.push_back(JackSessionCommand(uuid_buf, | fSessionResult->fCommandList.push_back(JackSessionCommand(uuid_buf, | ||||
| @@ -1000,7 +1000,7 @@ void JackEngine::SessionReply(int refnum) | |||||
| { | { | ||||
| JackClientInterface* client = fClientTable[refnum]; | JackClientInterface* client = fClientTable[refnum]; | ||||
| char uuid_buf[JACK_UUID_SIZE]; | char uuid_buf[JACK_UUID_SIZE]; | ||||
| snprintf( uuid_buf, sizeof(uuid_buf), "%d", client->GetClientControl()->fSessionID); | |||||
| snprintf(uuid_buf, sizeof(uuid_buf), "%d", client->GetClientControl()->fSessionID); | |||||
| fSessionResult->fCommandList.push_back(JackSessionCommand(uuid_buf, | fSessionResult->fCommandList.push_back(JackSessionCommand(uuid_buf, | ||||
| client->GetClientControl()->fName, | client->GetClientControl()->fName, | ||||
| client->GetClientControl()->fSessionCommand, | client->GetClientControl()->fSessionCommand, | ||||
| @@ -54,8 +54,8 @@ class SERVER_EXPORT JackEngine : public JackLockAble | |||||
| jack_time_t fLastSwitchUsecs; | jack_time_t fLastSwitchUsecs; | ||||
| int fSessionPendingReplies; | int fSessionPendingReplies; | ||||
| JackChannelTransaction *fSessionTransaction; | |||||
| JackSessionNotifyResult *fSessionResult; | |||||
| JackChannelTransaction* fSessionTransaction; | |||||
| JackSessionNotifyResult* fSessionResult; | |||||
| std::map<int,std::string> fReservationMap; | std::map<int,std::string> fReservationMap; | ||||
| int fMaxUUID; | int fMaxUUID; | ||||
| @@ -31,7 +31,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| namespace Jack | namespace Jack | ||||
| { | { | ||||
| #define CheckRes(exp) { if ((exp) < 0) return -1;} | |||||
| #define CheckRes(exp) { if ((exp) < 0) return -1; } | |||||
| /*! | |||||
| \brief Session API constants. | |||||
| */ | |||||
| enum JackSessionReply { | |||||
| kImmediateSessionReply = 1, | |||||
| kPendingSessionReply = 2 | |||||
| }; | |||||
| /*! | /*! | ||||
| \brief Request from client to server. | \brief Request from client to server. | ||||
| @@ -1119,11 +1130,11 @@ struct JackSessionCommand | |||||
| JackSessionCommand() | JackSessionCommand() | ||||
| {} | {} | ||||
| JackSessionCommand( const char *uuid, const char *clientname, const char *command, jack_session_flags_t flags ) | |||||
| JackSessionCommand(const char *uuid, const char *clientname, const char *command, jack_session_flags_t flags) | |||||
| { | { | ||||
| strncpy( fUUID, uuid, sizeof(fUUID)); | |||||
| strncpy( fClientName, clientname, sizeof(fClientName)); | |||||
| strncpy( fCommand, command, sizeof(fCommand)); | |||||
| strncpy(fUUID, uuid, sizeof(fUUID)); | |||||
| strncpy(fClientName, clientname, sizeof(fClientName)); | |||||
| strncpy(fCommand, command, sizeof(fCommand)); | |||||
| fFlags = flags; | fFlags = flags; | ||||
| } | } | ||||
| }; | }; | ||||
| @@ -1184,19 +1195,20 @@ struct JackSessionNotifyRequest : public JackRequest | |||||
| { | { | ||||
| char fPath[JACK_MESSAGE_SIZE + 1]; | char fPath[JACK_MESSAGE_SIZE + 1]; | ||||
| char fDst[JACK_CLIENT_NAME_SIZE + 1]; | char fDst[JACK_CLIENT_NAME_SIZE + 1]; | ||||
| jack_session_event_type_t fEventType; | |||||
| int fRefNum; | |||||
| jack_session_event_type_t fEventType; | |||||
| int fRefNum; | |||||
| JackSessionNotifyRequest() | JackSessionNotifyRequest() | ||||
| {} | {} | ||||
| JackSessionNotifyRequest(int refnum, const char *path, jack_session_event_type_t type, const char *dst) | |||||
| JackSessionNotifyRequest(int refnum, const char* path, jack_session_event_type_t type, const char* dst) | |||||
| : JackRequest(JackRequest::kSessionNotify), fEventType(type), fRefNum(refnum) | : JackRequest(JackRequest::kSessionNotify), fEventType(type), fRefNum(refnum) | ||||
| { | { | ||||
| snprintf(fPath, sizeof(fPath), "%s", path); | snprintf(fPath, sizeof(fPath), "%s", path); | ||||
| if (dst) | |||||
| if (dst) { | |||||
| snprintf(fDst, sizeof(fDst), "%s", dst); | snprintf(fDst, sizeof(fDst), "%s", dst); | ||||
| else | |||||
| } else { | |||||
| fDst[0] = '\0'; | fDst[0] = '\0'; | ||||
| } | |||||
| } | } | ||||
| int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
| @@ -1276,7 +1288,6 @@ struct JackClientNameResult : public JackResult | |||||
| struct JackUUIDResult : public JackResult | struct JackUUIDResult : public JackResult | ||||
| { | { | ||||
| char fUUID[JACK_UUID_SIZE]; | char fUUID[JACK_UUID_SIZE]; | ||||
| JackUUIDResult(): JackResult() | JackUUIDResult(): JackResult() | ||||
| @@ -2,7 +2,7 @@ | |||||
| * session_notify.c -- ultra minimal session manager | * session_notify.c -- ultra minimal session manager | ||||
| * | * | ||||
| * Copyright (C) 2010 Torben Hohn. | * Copyright (C) 2010 Torben Hohn. | ||||
| * | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | * 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 | * it under the terms of the GNU General Public License as published by | ||||
| * the Free Software Foundation; either version 2 of the License, or | * the Free Software Foundation; either version 2 of the License, or | ||||
| @@ -141,15 +141,15 @@ int main(int argc, char *argv[]) | |||||
| retval = jack_session_notify( client, NULL, notify_type, save_path ); | retval = jack_session_notify( client, NULL, notify_type, save_path ); | ||||
| for(i=0; retval[i].uuid; i++ ) { | |||||
| for (i = 0; retval[i].uuid; i++) { | |||||
| printf( "export SESSION_DIR=\"%s%s/\"\n", save_path, retval[i].client_name ); | printf( "export SESSION_DIR=\"%s%s/\"\n", save_path, retval[i].client_name ); | ||||
| printf( "%s &\n", retval[i].command ); | printf( "%s &\n", retval[i].command ); | ||||
| add_uuid_mapping(retval[i].uuid); | |||||
| add_uuid_mapping(retval[i].uuid); | |||||
| } | } | ||||
| printf( "sleep 10\n" ); | printf( "sleep 10\n" ); | ||||
| for(k=0; retval[k].uuid; k++ ) { | |||||
| for (k = 0; retval[k].uuid; k++) { | |||||
| char* port_regexp = alloca( jack_client_name_size()+3 ); | char* port_regexp = alloca( jack_client_name_size()+3 ); | ||||
| char* client_name = jack_get_client_name_by_uuid( client, retval[k].uuid ); | char* client_name = jack_get_client_name_by_uuid( client, retval[k].uuid ); | ||||
| @@ -163,12 +163,12 @@ int main(int argc, char *argv[]) | |||||
| const char **connections; | const char **connections; | ||||
| if ((connections = jack_port_get_all_connections (client, jack_port_by_name(client, ports[i]))) != 0) { | if ((connections = jack_port_get_all_connections (client, jack_port_by_name(client, ports[i]))) != 0) { | ||||
| for (j = 0; connections[j]; j++) { | for (j = 0; connections[j]; j++) { | ||||
| char *src = map_port_name_to_uuid_port( ports[i] ); | |||||
| char *dst = map_port_name_to_uuid_port( connections[j] ); | |||||
| char *src = map_port_name_to_uuid_port( ports[i] ); | |||||
| char *dst = map_port_name_to_uuid_port( connections[j] ); | |||||
| printf( "jack_connect -u \"%s\" \"%s\"\n", src, dst ); | printf( "jack_connect -u \"%s\" \"%s\"\n", src, dst ); | ||||
| } | } | ||||
| jack_free (connections); | jack_free (connections); | ||||
| } | |||||
| } | |||||
| } | } | ||||
| jack_free(ports); | jack_free(ports); | ||||
| @@ -426,7 +426,6 @@ bool JackSocketServerChannel::HandleRequest(int fd) | |||||
| case JackRequest::kSessionNotify: { | case JackRequest::kSessionNotify: { | ||||
| jack_log("JackRequest::SessionNotify"); | jack_log("JackRequest::SessionNotify"); | ||||
| JackSessionNotifyRequest req; | JackSessionNotifyRequest req; | ||||
| JackSessionNotifyResult res; | |||||
| if (req.Read(socket) == 0) { | if (req.Read(socket) == 0) { | ||||
| fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket); | fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket); | ||||
| } | } | ||||
| @@ -263,10 +263,10 @@ void JackWinNamedPipeClientChannel::SessionNotify(int refnum, const char* target | |||||
| jack_session_command_t* session_command = (jack_session_command_t *)malloc(sizeof(jack_session_command_t) * (res.fCommandList.size() + 1)); | jack_session_command_t* session_command = (jack_session_command_t *)malloc(sizeof(jack_session_command_t) * (res.fCommandList.size() + 1)); | ||||
| int i = 0; | int i = 0; | ||||
| for (std::list<JackSessionCommand>::iterator ci=res.fCommandList.begin(); ci!=res.fCommandList.end(); ci++) { | |||||
| session_command[i].uuid = strdup( ci->fUUID ); | |||||
| session_command[i].client_name = strdup( ci->fClientName ); | |||||
| session_command[i].command = strdup( ci->fCommand ); | |||||
| for (std::list<JackSessionCommand>::iterator ci = res.fCommandList.begin(); ci != res.fCommandList.end(); ci++) { | |||||
| session_command[i].uuid = strdup(ci->fUUID); | |||||
| session_command[i].client_name = strdup(ci->fClientName); | |||||
| session_command[i].command = strdup(ci->fCommand); | |||||
| session_command[i].flags = ci->fFlags; | session_command[i].flags = ci->fFlags; | ||||
| i += 1; | i += 1; | ||||
| } | } | ||||
| @@ -339,7 +339,6 @@ bool JackClientPipeThread::HandleRequest() | |||||
| case JackRequest::kSessionNotify: { | case JackRequest::kSessionNotify: { | ||||
| jack_log("JackRequest::SessionNotify"); | jack_log("JackRequest::SessionNotify"); | ||||
| JackSessionNotifyRequest req; | JackSessionNotifyRequest req; | ||||
| JackSessionNotifyResult res; | |||||
| if (req.Read(fPipe) == 0) { | if (req.Read(fPipe) == 0) { | ||||
| fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, fPipe); | fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, fPipe); | ||||
| } | } | ||||