2 Copyright (C) 2001 Paul Davis
3 Copyright (C) 2004-2008 Grame
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "JackSystemDeps.h"
22 #include "JackServerGlobals.h"
23 #include "JackGraphManager.h"
24 #include "JackConstants.h"
25 #include "JackInternalClient.h"
26 #include "JackLockedEngine.h"
27 #include "JackServer.h"
28 #include "JackEngineControl.h"
29 #include "JackClientControl.h"
30 #include "JackInternalClientChannel.h"
31 #include "JackTools.h"
37 JackGraphManager
* JackInternalClient::fGraphManager
= NULL
;
38 JackEngineControl
* JackInternalClient::fEngineControl
= NULL
;
40 // Used for external C API (JackAPI.cpp)
41 SERVER_EXPORT JackGraphManager
* GetGraphManager()
43 return JackServerGlobals::fInstance
->GetGraphManager();
46 SERVER_EXPORT JackEngineControl
* GetEngineControl()
48 return JackServerGlobals::fInstance
->GetEngineControl();
51 SERVER_EXPORT JackSynchro
* GetSynchroTable()
53 return JackServerGlobals::fInstance
->GetSynchroTable();
56 JackInternalClient::JackInternalClient(JackServer
* server
, JackSynchro
* table
): JackClient(table
)
58 fChannel
= new JackInternalClientChannel(server
);
61 JackInternalClient::~JackInternalClient()
66 int JackInternalClient::Open(const char* server_name
, const char* name
, jack_uuid_t uuid
, jack_options_t options
, jack_status_t
* status
)
69 jack_log("JackInternalClient::Open name = %s", name
);
71 if (strlen(name
) >= JACK_CLIENT_NAME_SIZE
) {
72 jack_error("\"%s\" is too long to be used as a JACK client name.\n"
73 "Please use %lu characters or less",
75 JACK_CLIENT_NAME_SIZE
- 1);
79 strncpy(fServerName
, server_name
, sizeof(fServerName
));
80 fServerName
[sizeof(fServerName
) - 1] = 0;
82 // Open server/client direct channel
83 char name_res
[JACK_CLIENT_NAME_SIZE
+ 1];
84 fChannel
->ClientCheck(name
, uuid
, name_res
, JACK_PROTOCOL_VERSION
, (int)options
, (int*)status
, &result
, false);
86 int status1
= *status
;
87 if (status1
& JackVersionError
) {
88 jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION
);
90 jack_error("Client name = %s conflits with another running client", name
);
95 strcpy(fClientControl
.fName
, name_res
);
98 fChannel
->ClientOpen(name_res
, &fClientControl
.fRefNum
, &fEngineControl
, &fGraphManager
, this, &result
);
100 jack_error("Cannot open client name = %s", name_res
);
104 SetupDriverSync(false);
105 JackGlobals::fClientTable
[fClientControl
.fRefNum
] = this;
106 JackGlobals::fServerRunning
= true;
107 jack_log("JackInternalClient::Open name = %s refnum = %ld", name_res
, fClientControl
.fRefNum
);
115 void JackInternalClient::ShutDown(jack_status_t code
, const char* message
)
117 jack_log("JackInternalClient::ShutDown");
118 JackClient::ShutDown(code
, message
);
121 JackGraphManager
* JackInternalClient::GetGraphManager() const
123 assert(fGraphManager
);
124 return fGraphManager
;
127 JackEngineControl
* JackInternalClient::GetEngineControl() const
129 assert(fEngineControl
);
130 return fEngineControl
;
133 JackClientControl
* JackInternalClient::GetClientControl() const
135 return const_cast<JackClientControl
*>(&fClientControl
);
138 int JackLoadableInternalClient::Init(const char* so_name
)
140 char path_to_so
[JACK_PATH_MAX
+ 1];
141 BuildClientPath(path_to_so
, sizeof(path_to_so
), so_name
);
143 fHandle
= LoadJackModule(path_to_so
);
144 jack_log("JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so
);
146 if (fHandle
== NULL
) {
147 PrintLoadError(so_name
);
151 fFinish
= (FinishCallback
)GetJackProc(fHandle
, "jack_finish");
152 if (fFinish
== NULL
) {
153 UnloadJackModule(fHandle
);
154 jack_error("symbol jack_finish cannot be found in %s", so_name
);
158 fDescriptor
= (JackDriverDescFunction
)GetJackProc(fHandle
, "jack_get_descriptor");
159 if (fDescriptor
== NULL
) {
160 jack_info("No jack_get_descriptor entry-point for %s", so_name
);
165 int JackLoadableInternalClient1::Init(const char* so_name
)
167 if (JackLoadableInternalClient::Init(so_name
) < 0) {
171 fInitialize
= (InitializeCallback
)GetJackProc(fHandle
, "jack_initialize");
172 if (fInitialize
== NULL
) {
173 UnloadJackModule(fHandle
);
174 jack_error("symbol jack_initialize cannot be found in %s", so_name
);
181 int JackLoadableInternalClient2::Init(const char* so_name
)
183 if (JackLoadableInternalClient::Init(so_name
) < 0) {
187 fInitialize
= (InternalInitializeCallback
)GetJackProc(fHandle
, "jack_internal_initialize");
188 if (fInitialize
== NULL
) {
189 UnloadJackModule(fHandle
);
190 jack_error("symbol jack_internal_initialize cannot be found in %s", so_name
);
197 JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer
* server
, JackSynchro
* table
, const char* object_data
)
198 : JackLoadableInternalClient(server
, table
)
200 if (object_data
!= NULL
)
201 strncpy(fObjectData
, object_data
, JACK_LOAD_INIT_LIMIT
);
203 memset(fObjectData
, 0, sizeof(fObjectData
));
206 JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer
* server
, JackSynchro
* table
, const JSList
* parameters
)
207 : JackLoadableInternalClient(server
, table
)
209 fParameters
= parameters
;
212 JackLoadableInternalClient::~JackLoadableInternalClient()
214 if (fFinish
!= NULL
) {
215 fFinish(fProcessArg
);
217 if (fHandle
!= NULL
) {
218 UnloadJackModule(fHandle
);
222 int JackLoadableInternalClient1::Open(const char* server_name
, const char* name
, jack_uuid_t uuid
, jack_options_t options
, jack_status_t
* status
)
226 if (JackInternalClient::Open(server_name
, name
, uuid
, options
, status
) == 0) {
227 if (fInitialize((jack_client_t
*)this, fObjectData
) == 0) {
230 JackInternalClient::Close();
238 int JackLoadableInternalClient2::Open(const char* server_name
, const char* name
, jack_uuid_t uuid
, jack_options_t options
, jack_status_t
* status
)
242 if (JackInternalClient::Open(server_name
, name
, uuid
, options
, status
) == 0) {
243 if (fInitialize((jack_client_t
*)this, fParameters
) == 0) {
246 JackInternalClient::Close();
254 } // end of namespace