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
, int uuid
, jack_options_t options
, jack_status_t
* status
)
69 char name_res
[JACK_CLIENT_NAME_SIZE
+ 1];
70 jack_log("JackInternalClient::Open name = %s", name
);
72 strncpy(fServerName
, server_name
, sizeof(fServerName
));
74 fChannel
->ClientCheck(name
, uuid
, name_res
, JACK_PROTOCOL_VERSION
, (int)options
, (int*)status
, &result
, false);
76 int status1
= *status
;
77 if (status1
& JackVersionError
) {
78 jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION
);
80 jack_error("Client name = %s conflits with another running client", name
);
85 strcpy(fClientControl
.fName
, name_res
);
88 fChannel
->ClientOpen(name_res
, &fClientControl
.fRefNum
, &fEngineControl
, &fGraphManager
, this, &result
);
90 jack_error("Cannot open client name = %s", name_res
);
94 SetupDriverSync(false);
95 JackGlobals::fClientTable
[fClientControl
.fRefNum
] = this;
96 JackGlobals::fServerRunning
= true;
97 jack_log("JackInternalClient::Open name = %s refnum = %ld", name_res
, fClientControl
.fRefNum
);
105 void JackInternalClient::ShutDown()
107 jack_log("JackInternalClient::ShutDown");
108 JackClient::ShutDown();
111 JackGraphManager
* JackInternalClient::GetGraphManager() const
113 assert(fGraphManager
);
114 return fGraphManager
;
117 JackEngineControl
* JackInternalClient::GetEngineControl() const
119 assert(fEngineControl
);
120 return fEngineControl
;
123 JackClientControl
* JackInternalClient::GetClientControl() const
125 return const_cast<JackClientControl
*>(&fClientControl
);
128 int JackLoadableInternalClient::Init(const char* so_name
)
130 char path_to_so
[JACK_PATH_MAX
+ 1];
131 BuildClientPath(path_to_so
, sizeof(path_to_so
), so_name
);
133 fHandle
= LoadJackModule(path_to_so
);
134 jack_log("JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so
);
136 if (fHandle
== NULL
) {
137 PrintLoadError(so_name
);
141 fFinish
= (FinishCallback
)GetJackProc(fHandle
, "jack_finish");
142 if (fFinish
== NULL
) {
143 UnloadJackModule(fHandle
);
144 jack_error("symbol jack_finish cannot be found in %s", so_name
);
148 fDescriptor
= (JackDriverDescFunction
)GetJackProc(fHandle
, "jack_get_descriptor");
149 if (fDescriptor
== NULL
) {
150 jack_info("No jack_get_descriptor entry-point for %s", so_name
);
155 int JackLoadableInternalClient1::Init(const char* so_name
)
157 if (JackLoadableInternalClient::Init(so_name
) < 0) {
161 fInitialize
= (InitializeCallback
)GetJackProc(fHandle
, "jack_initialize");
162 if (fInitialize
== NULL
) {
163 UnloadJackModule(fHandle
);
164 jack_error("symbol jack_initialize cannot be found in %s", so_name
);
171 int JackLoadableInternalClient2::Init(const char* so_name
)
173 if (JackLoadableInternalClient::Init(so_name
) < 0) {
177 fInitialize
= (InternalInitializeCallback
)GetJackProc(fHandle
, "jack_internal_initialize");
178 if (fInitialize
== NULL
) {
179 UnloadJackModule(fHandle
);
180 jack_error("symbol jack_internal_initialize cannot be found in %s", so_name
);
187 JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer
* server
, JackSynchro
* table
, const char* object_data
)
188 : JackLoadableInternalClient(server
, table
)
190 strncpy(fObjectData
, object_data
, JACK_LOAD_INIT_LIMIT
);
193 JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer
* server
, JackSynchro
* table
, const JSList
* parameters
)
194 : JackLoadableInternalClient(server
, table
)
196 fParameters
= parameters
;
199 JackLoadableInternalClient::~JackLoadableInternalClient()
201 if (fFinish
!= NULL
) {
202 fFinish(fProcessArg
);
204 if (fHandle
!= NULL
) {
205 UnloadJackModule(fHandle
);
209 int JackLoadableInternalClient1::Open(const char* server_name
, const char* name
, int uuid
, jack_options_t options
, jack_status_t
* status
)
213 if (JackInternalClient::Open(server_name
, name
, uuid
, options
, status
) == 0) {
214 if (fInitialize((jack_client_t
*)this, fObjectData
) == 0) {
217 JackInternalClient::Close();
225 int JackLoadableInternalClient2::Open(const char* server_name
, const char* name
, int uuid
, jack_options_t options
, jack_status_t
* status
)
229 if (JackInternalClient::Open(server_name
, name
, uuid
, options
, status
) == 0) {
230 if (fInitialize((jack_client_t
*)this, fParameters
) == 0) {
233 JackInternalClient::Close();
241 } // end of namespace